2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
10 /* INCLUDES *****************************************************************/
14 /* GLOBALS ***************************************************************/
16 extern PEXT2_GLOBAL Ext2Global
;
18 /* DEFINITIONS *************************************************************/
21 #pragma alloc_text(PAGE, Ext2Sleep)
40 Ext2NtTime (IN ULONG i_time
)
42 LARGE_INTEGER SysTime
;
45 RtlSecondsSince1970ToTime(i_time
, &SysTime
);
51 Ext2LinuxTime (IN LARGE_INTEGER SysTime
)
55 if (!RtlTimeToSecondsSince1970(&SysTime
, &Ext2Time
)) {
57 KeQuerySystemTime(&NtTime
);
58 RtlTimeToSecondsSince1970(&NtTime
, &Ext2Time
);
67 struct nls_table
* PageTable
,
68 IN OUT PUNICODE_STRING Unicode
,
75 /* Count the length of the resulting Unicode. */
76 for (i
= 0; i
< Mbs
->Length
; i
+= mbc
) {
78 mbc
= PageTable
->char2uni(
79 (PUCHAR
)&(Mbs
->Buffer
[i
]),
86 /* invalid character. */
87 if (mbc
== 0 && Length
> 0) {
97 if (Unicode
->MaximumLength
< Length
) {
106 for (i
= 0; i
< Mbs
->Length
; i
+= mbc
) {
108 mbc
= PageTable
->char2uni(
109 (PUCHAR
)&(Mbs
->Buffer
[i
]),
113 Unicode
->Buffer
[Unicode
->Length
/2] = uc
;
114 Unicode
->Length
+= 2;
123 struct nls_table
* PageTable
,
124 IN OUT PANSI_STRING Mbs
,
125 IN PUNICODE_STRING Unicode
)
131 /* Count the length of the resulting mbc-8. */
132 for (i
= 0; i
< (Unicode
->Length
/ 2); i
++) {
134 RtlZeroMemory(mbs
, 0x10);
135 mbc
= PageTable
->uni2char(
143 /* Invalid character. */
152 if (Mbs
->MaximumLength
< Length
) {
160 for (i
= 0; i
< (Unicode
->Length
/ 2); i
++) {
162 mbc
= PageTable
->uni2char(
169 (PUCHAR
)&(Mbs
->Buffer
[Mbs
->Length
]),
174 Mbs
->Length
+= (USHORT
)mbc
;
183 Ext2OEMToUnicodeSize(
190 if (Vcb
->Codepage
.PageTable
) {
191 Length
= Ext2MbsToUnicode(Vcb
->Codepage
.PageTable
, NULL
, Oem
);
197 Length
= RtlOemStringToCountedUnicodeSize(Oem
);
208 IN OUT PUNICODE_STRING Unicode
,
215 if (Vcb
->Codepage
.PageTable
) {
216 Status
= Ext2MbsToUnicode(Vcb
->Codepage
.PageTable
,
219 if (Status
>0 && Status
== Unicode
->Length
) {
220 Status
= STATUS_SUCCESS
;
225 Status
= RtlOemStringToUnicodeString(
226 Unicode
, Oem
, FALSE
);
228 if (!NT_SUCCESS(Status
)) {
239 Ext2UnicodeToOEMSize(
241 IN PUNICODE_STRING Unicode
246 if (Vcb
->Codepage
.PageTable
) {
247 Length
= Ext2UnicodeToMbs(Vcb
->Codepage
.PageTable
,
256 return RtlxUnicodeStringToOemSize(Unicode
);
263 IN OUT POEM_STRING Oem
,
264 IN PUNICODE_STRING Unicode
)
268 if (Vcb
->Codepage
.PageTable
) {
270 Status
= Ext2UnicodeToMbs(Vcb
->Codepage
.PageTable
,
272 if (Status
> 0 && Status
== Oem
->Length
) {
273 Status
= STATUS_SUCCESS
;
275 Status
= STATUS_UNSUCCESSFUL
;
282 Status
= RtlUnicodeStringToOemString(
283 Oem
, Unicode
, FALSE
);
285 if (!NT_SUCCESS(Status
))
299 LARGE_INTEGER Timeout
;
300 Timeout
.QuadPart
= (LONGLONG
)ms
*1000*(-10); /* ms/1000 sec*/
301 KeDelayExecutionThread(KernelMode
, TRUE
, &Timeout
);
304 int Ext2LinuxError (NTSTATUS Status
)
307 case STATUS_ACCESS_DENIED
:
310 case STATUS_ACCESS_VIOLATION
:
313 case STATUS_BUFFER_TOO_SMALL
:
316 case STATUS_INVALID_PARAMETER
:
319 case STATUS_NOT_IMPLEMENTED
:
320 case STATUS_NOT_SUPPORTED
:
321 return (-EOPNOTSUPP
);
323 case STATUS_INVALID_ADDRESS
:
324 case STATUS_INVALID_ADDRESS_COMPONENT
:
325 return (-EADDRNOTAVAIL
);
327 case STATUS_NO_SUCH_DEVICE
:
328 case STATUS_NO_SUCH_FILE
:
329 case STATUS_OBJECT_NAME_NOT_FOUND
:
330 case STATUS_OBJECT_PATH_NOT_FOUND
:
331 case STATUS_NETWORK_BUSY
:
332 case STATUS_INVALID_NETWORK_RESPONSE
:
333 case STATUS_UNEXPECTED_NETWORK_ERROR
:
336 case STATUS_BAD_NETWORK_PATH
:
337 case STATUS_NETWORK_UNREACHABLE
:
338 case STATUS_PROTOCOL_UNREACHABLE
:
339 return (-ENETUNREACH
);
341 case STATUS_LOCAL_DISCONNECT
:
342 case STATUS_TRANSACTION_ABORTED
:
343 case STATUS_CONNECTION_ABORTED
:
344 return (-ECONNABORTED
);
346 case STATUS_REMOTE_DISCONNECT
:
347 case STATUS_LINK_FAILED
:
348 case STATUS_CONNECTION_DISCONNECTED
:
349 case STATUS_CONNECTION_RESET
:
350 case STATUS_PORT_UNREACHABLE
:
351 return (-ECONNRESET
);
353 case STATUS_INSUFFICIENT_RESOURCES
:
356 case STATUS_PAGEFILE_QUOTA
:
357 case STATUS_NO_MEMORY
:
358 case STATUS_CONFLICTING_ADDRESSES
:
359 case STATUS_QUOTA_EXCEEDED
:
360 case STATUS_TOO_MANY_PAGING_FILES
:
361 case STATUS_WORKING_SET_QUOTA
:
362 case STATUS_COMMITMENT_LIMIT
:
363 case STATUS_TOO_MANY_ADDRESSES
:
364 case STATUS_REMOTE_RESOURCES
:
367 case STATUS_INVALID_CONNECTION
:
370 case STATUS_PIPE_DISCONNECTED
:
374 case STATUS_IO_TIMEOUT
:
375 case STATUS_LINK_TIMEOUT
:
378 case STATUS_REMOTE_NOT_LISTENING
:
379 case STATUS_CONNECTION_REFUSED
:
380 return (-ECONNREFUSED
);
382 case STATUS_HOST_UNREACHABLE
:
383 return (-EHOSTUNREACH
);
386 case STATUS_DEVICE_NOT_READY
:
389 case STATUS_CANCELLED
:
390 case STATUS_REQUEST_ABORTED
:
393 case STATUS_BUFFER_OVERFLOW
:
394 case STATUS_INVALID_BUFFER_SIZE
:
397 case STATUS_ADDRESS_ALREADY_EXISTS
:
398 return (-EADDRINUSE
);
401 if (NT_SUCCESS (Status
))
407 NTSTATUS
Ext2WinntError(int rc
)
412 return STATUS_SUCCESS
;
416 return STATUS_ACCESS_DENIED
;
419 return STATUS_OBJECT_NAME_NOT_FOUND
;
422 return STATUS_ACCESS_VIOLATION
;
425 return STATUS_BUFFER_TOO_SMALL
;
431 return STATUS_INVALID_PARAMETER
;
434 return STATUS_DEVICE_BUSY
;
437 return STATUS_NOT_IMPLEMENTED
;
440 return STATUS_DISK_FULL
;
443 return STATUS_NOT_SUPPORTED
;
446 return STATUS_POSSIBLE_DEADLOCK
;
449 return STATUS_OBJECT_NAME_COLLISION
;
452 return STATUS_UNEXPECTED_IO_ERROR
;
455 return STATUS_NOT_A_DIRECTORY
;
458 return STATUS_FILE_IS_A_DIRECTORY
;
461 return STATUS_DIRECTORY_NOT_EMPTY
;
464 return STATUS_NO_SUCH_DEVICE
;
467 return STATUS_INVALID_ADDRESS
;
470 return STATUS_INVALID_ADDRESS
;
473 return STATUS_UNEXPECTED_NETWORK_ERROR
;
476 return STATUS_NETWORK_UNREACHABLE
;
479 return STATUS_CONNECTION_ABORTED
;
482 return STATUS_CONNECTION_RESET
;
485 return STATUS_INSUFFICIENT_RESOURCES
;
488 return STATUS_NO_MEMORY
;
491 return STATUS_INVALID_CONNECTION
;
494 return STATUS_CONNECTION_DISCONNECTED
;
497 return STATUS_TIMEOUT
;
500 return STATUS_CONNECTION_REFUSED
;
503 return STATUS_HOST_UNREACHABLE
;
506 return STATUS_DEVICE_NOT_READY
;
509 return STATUS_CANCELLED
;
512 return STATUS_INVALID_BUFFER_SIZE
;
515 return STATUS_ADDRESS_ALREADY_EXISTS
;
518 return STATUS_UNSUCCESSFUL
;
521 BOOLEAN
Ext2IsDot(PUNICODE_STRING name
)
523 return (name
->Length
== 2 && name
->Buffer
[0] == L
'.');
526 BOOLEAN
Ext2IsDotDot(PUNICODE_STRING name
)
528 return (name
->Length
== 4 && name
->Buffer
[0] == L
'.' &&
529 name
->Buffer
[1] == L
'.');