2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/file.c
5 * PURPOSE: Directory functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
7 GetTempFileName is modified from WINE [ Alexandre Juiliard ]
14 #undef WIN32_LEAN_AND_MEAN
16 #include <ddk/ntddk.h>
19 #include <kernel32/li.h>
22 #define LPPROGRESS_ROUTINE void*
29 LPCWSTR lpExistingFileName
,
30 LPCWSTR lpNewFileName
,
31 LPPROGRESS_ROUTINE lpProgressRoutine
,
39 LPCSTR lpExistingFileName
,
41 LPPROGRESS_ROUTINE lpProgressRoutine
,
50 BOOLEAN bIsFileApiAnsi
; // set the file api to ansi or oem
56 SetFileApisToOEM(VOID
)
58 bIsFileApiAnsi
= FALSE
;
62 HANDLE STDCALL
CreateFileA(LPCSTR lpFileName
,
63 DWORD dwDesiredAccess
,
65 LPSECURITY_ATTRIBUTES lpSecurityAttributes
,
66 DWORD dwCreationDisposition
,
67 DWORD dwFlagsAndAttributes
,
71 WCHAR FileNameW
[MAX_PATH
];
74 OutputDebugStringA("CreateFileA\n");
76 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
78 FileNameW
[i
] = *lpFileName
;
84 return CreateFileW(FileNameW
,dwDesiredAccess
,dwShareMode
, lpSecurityAttributes
,
85 dwCreationDisposition
,dwFlagsAndAttributes
, hTemplateFile
);
89 HANDLE STDCALL
CreateFileW(LPCWSTR lpFileName
,
90 DWORD dwDesiredAccess
,
92 LPSECURITY_ATTRIBUTES lpSecurityAttributes
,
93 DWORD dwCreationDisposition
,
94 DWORD dwFlagsAndAttributes
,
100 OBJECT_ATTRIBUTES ObjectAttributes
;
101 IO_STATUS_BLOCK IoStatusBlock
;
102 UNICODE_STRING FileNameString
;
104 WCHAR PathNameW
[MAX_PATH
];
108 OutputDebugStringA("CreateFileW\n");
110 if (!(dwFlagsAndAttributes
& FILE_FLAG_OVERLAPPED
))
112 Flags
|= FILE_SYNCHRONOUS_IO_ALERT
;
117 if ( ( ( dwCreationDisposition
& OPEN_EXISTING
) == OPEN_EXISTING
) ||
118 ( ( dwCreationDisposition
& TRUNCATE_EXISTING
) == TRUNCATE_EXISTING
) )
119 Len
= SearchPathW(NULL
,lpFileName
,NULL
,MAX_PATH
,PathNameW
,&FilePart
);
123 Len
= GetCurrentDirectoryW(MAX_PATH
,PathNameW
);
126 if ( PathNameW
[Len
-1] != L
'\\' ) {
127 PathNameW
[Len
] = L
'\\';
128 PathNameW
[Len
+1] = 0;
130 lstrcatW(PathNameW
,lpFileName
);
132 FileNameString
.Length
= lstrlenW( PathNameW
)*sizeof(WCHAR
);
134 if ( FileNameString
.Length
== 0 )
137 if ( FileNameString
.Length
> MAX_PATH
)
140 FileNameString
.Buffer
= (WCHAR
*)PathNameW
;
141 FileNameString
.MaximumLength
= FileNameString
.Length
;
144 FileNameString
.Buffer
= lpFileName
;
145 FileNameString
.Length
=
146 FileNameString
.MaximumLength
= lstrlenW(lpFileName
) * sizeof(WCHAR
);
148 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
149 ObjectAttributes
.RootDirectory
= NULL
;
150 ObjectAttributes
.ObjectName
= &FileNameString
;
151 ObjectAttributes
.Attributes
= OBJ_CASE_INSENSITIVE
;
152 ObjectAttributes
.SecurityDescriptor
= NULL
;
153 ObjectAttributes
.SecurityQualityOfService
= NULL
;
155 Status
= NtCreateFile(&FileHandle
,
160 dwFlagsAndAttributes
,
162 dwCreationDisposition
,
173 SetFileApisToANSI(VOID
)
175 bIsFileApiAnsi
= TRUE
;
183 AreFileApisANSI(VOID
)
185 return bIsFileApiAnsi
;
192 WINBOOL STDCALL
WriteFile(HANDLE hFile
,
194 DWORD nNumberOfBytesToWrite
,
195 LPDWORD lpNumberOfBytesWritten
,
196 LPOVERLAPPED lpOverLapped
)
199 LARGE_INTEGER Offset
;
200 HANDLE hEvent
= NULL
;
203 if (lpOverLapped
!= NULL
)
205 Offset
.LowPart
= lpOverLapped
->Offset
;
206 Offset
.HighPart
= lpOverLapped
->OffsetHigh
;
207 lpOverLapped
->Internal
= STATUS_PENDING
;
208 hEvent
= lpOverLapped
->hEvent
;
210 errCode
= NtWriteFile(hFile
,hEvent
,NULL
,NULL
,
211 (PIO_STATUS_BLOCK
)lpOverLapped
,
213 nNumberOfBytesToWrite
,
216 if (!NT_SUCCESS(errCode
))
218 SetLastError(RtlNtStatusToDosError(errCode
));
225 WINBOOL STDCALL
ReadFile(HANDLE hFile
,
227 DWORD nNumberOfBytesToRead
,
228 LPDWORD lpNumberOfBytesRead
,
229 LPOVERLAPPED lpOverLapped
)
232 HANDLE hEvent
= NULL
;
233 LARGE_INTEGER Offset
;
235 PIO_STATUS_BLOCK IoStatusBlock
;
236 IO_STATUS_BLOCK IIosb
;
239 if ( lpOverLapped
!= NULL
)
241 Offset
.LowPart
= lpOverLapped
->Offset
;
242 Offset
.HighPart
= lpOverLapped
->OffsetHigh
;
243 lpOverLapped
->Internal
= STATUS_PENDING
;
244 hEvent
= lpOverLapped
->hEvent
;
245 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
249 IoStatusBlock
= &IIosb
;
252 errCode
= NtReadFile(hFile
,
258 nNumberOfBytesToRead
,
261 if ( !NT_SUCCESS(errCode
) )
263 SetLastError(RtlNtStatusToDosError(errCode
));
274 DWORD nNumberOfBytesToRead
,
275 LPOVERLAPPED lpOverLapped
,
276 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
279 HANDLE hEvent
= NULL
;
280 LARGE_INTEGER Offset
;
282 IO_STATUS_BLOCK IIosb
;
283 PIO_STATUS_BLOCK IoStatusBlock
;
286 if ( lpOverLapped
!= NULL
) {
287 Offset
.LowPart
= lpOverLapped
->Offset
;
288 Offset
.HighPart
= lpOverLapped
->OffsetHigh
;
289 lpOverLapped
->Internal
= STATUS_PENDING
;
290 hEvent
= lpOverLapped
->hEvent
;
291 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
296 IoStatusBlock
= &IIosb
;
302 errCode
= NtReadFile(hFile
,
304 (PIO_APC_ROUTINE
)lpCompletionRoutine
,
308 nNumberOfBytesToRead
,
311 if ( !NT_SUCCESS(errCode
) ) {
312 SetLastError(RtlNtStatusToDosError(errCode
));
323 DWORD dwFileOffsetLow
,
324 DWORD dwFileOffsetHigh
,
325 DWORD nNumberOfBytesToLockLow
,
326 DWORD nNumberOfBytesToLockHigh
330 OVERLAPPED Overlapped
;
332 Overlapped
.Offset
= dwFileOffsetLow
;
333 Overlapped
.OffsetHigh
= dwFileOffsetHigh
;
336 return LockFileEx(hFile
, LOCKFILE_FAIL_IMMEDIATELY
|LOCKFILE_EXCLUSIVE_LOCK
,dwReserved
,nNumberOfBytesToLockLow
, nNumberOfBytesToLockHigh
, &Overlapped
) ;
346 DWORD nNumberOfBytesToLockLow
,
347 DWORD nNumberOfBytesToLockHigh
,
348 LPOVERLAPPED lpOverlapped
351 LARGE_INTEGER BytesToLock
;
355 LARGE_INTEGER Offset
;
359 SetLastError(ERROR_INVALID_PARAMETER
);
363 lpOverlapped
->Internal
= STATUS_PENDING
;
365 Offset
.LowPart
= lpOverlapped
->Offset
;
366 Offset
.HighPart
= lpOverlapped
->OffsetHigh
;
368 if ( (dwFlags
& LOCKFILE_FAIL_IMMEDIATELY
) == LOCKFILE_FAIL_IMMEDIATELY
)
369 LockImmediate
= TRUE
;
371 LockImmediate
= FALSE
;
373 if ( (dwFlags
& LOCKFILE_EXCLUSIVE_LOCK
) == LOCKFILE_EXCLUSIVE_LOCK
)
374 LockExclusive
= TRUE
;
376 LockExclusive
= FALSE
;
378 BytesToLock
.LowPart
= nNumberOfBytesToLockLow
;
379 BytesToLock
.HighPart
= nNumberOfBytesToLockHigh
;
381 errCode
= NtLockFile(hFile
,
385 (PIO_STATUS_BLOCK
)lpOverlapped
,
391 if ( !NT_SUCCESS(errCode
) )
393 SetLastError(RtlNtStatusToDosError(errCode
));
405 DWORD dwFileOffsetLow
,
406 DWORD dwFileOffsetHigh
,
407 DWORD nNumberOfBytesToUnlockLow
,
408 DWORD nNumberOfBytesToUnlockHigh
412 OVERLAPPED Overlapped
;
413 Overlapped
.Offset
= dwFileOffsetLow
;
414 Overlapped
.OffsetHigh
= dwFileOffsetHigh
;
416 return UnlockFileEx(hFile
, dwReserved
, nNumberOfBytesToUnlockLow
, nNumberOfBytesToUnlockHigh
, &Overlapped
);
427 DWORD nNumberOfBytesToUnLockLow
,
428 DWORD nNumberOfBytesToUnLockHigh
,
429 LPOVERLAPPED lpOverlapped
432 LARGE_INTEGER BytesToUnLock
;
433 LARGE_INTEGER StartAddress
;
438 SetLastError(ERROR_INVALID_PARAMETER
);
441 if ( lpOverlapped
== NULL
)
443 SetLastError(ERROR_INVALID_PARAMETER
);
447 BytesToUnLock
.LowPart
= nNumberOfBytesToUnLockLow
;
448 BytesToUnLock
.HighPart
= nNumberOfBytesToUnLockHigh
;
450 StartAddress
.LowPart
= lpOverlapped
->Offset
;
451 StartAddress
.HighPart
= lpOverlapped
->OffsetHigh
;
453 errCode
= NtUnlockFile(hFile
,
454 (PIO_STATUS_BLOCK
)lpOverlapped
,
458 if ( !NT_SUCCESS(errCode
) ) {
459 SetLastError(RtlNtStatusToDosError(errCode
));
475 LPCSTR lpExistingFileName
,
476 LPCSTR lpNewFileName
,
477 WINBOOL bFailIfExists
480 return CopyFileExA(lpExistingFileName
,lpNewFileName
,NULL
,NULL
,FALSE
,bFailIfExists
);
486 LPCSTR lpExistingFileName
,
487 LPCSTR lpNewFileName
,
488 LPPROGRESS_ROUTINE lpProgressRoutine
,
495 WCHAR ExistingFileNameW
[MAX_PATH
];
496 WCHAR NewFileNameW
[MAX_PATH
];
501 while ((*lpExistingFileName
)!=0 && i
< MAX_PATH
)
503 ExistingFileNameW
[i
] = *lpExistingFileName
;
504 lpExistingFileName
++;
507 ExistingFileNameW
[i
] = 0;
510 while ((*lpNewFileName
)!=0 && i
< MAX_PATH
)
512 NewFileNameW
[i
] = *lpNewFileName
;
518 return CopyFileExW(ExistingFileNameW
,NewFileNameW
,lpProgressRoutine
,lpData
,pbCancel
,dwCopyFlags
);
525 LPCWSTR lpExistingFileName
,
526 LPCWSTR lpNewFileName
,
527 WINBOOL bFailIfExists
530 return CopyFileExW(lpExistingFileName
,lpNewFileName
,NULL
,NULL
,NULL
,bFailIfExists
);
540 LPCWSTR lpExistingFileName
,
541 LPCWSTR lpNewFileName
,
542 LPPROGRESS_ROUTINE lpProgressRoutine
,
549 NTSTATUS errCode
= 0;
550 HANDLE FileHandleSource
, FileHandleDest
;
551 IO_STATUS_BLOCK IoStatusBlock
;
553 FILE_STANDARD_INFORMATION FileStandard
;
554 FILE_BASIC_INFORMATION FileBasic
;
555 FILE_POSITION_INFORMATION FilePosition
;
557 UCHAR
*lpBuffer
= NULL
;
561 ULONG RegionSize
= 0x1000000;
563 BOOL bCancel
= FALSE
;
567 FileHandleSource
= CreateFileW(
573 FILE_ATTRIBUTE_NORMAL
|FILE_FLAG_NO_BUFFERING
,
579 if ( !NT_SUCCESS(errCode
) ) {
580 SetLastError(RtlNtStatusToDosError(errCode
));
585 errCode
= NtQueryInformationFile(FileHandleSource
,
586 &IoStatusBlock
,&FileStandard
, sizeof(FILE_STANDARD_INFORMATION
),
587 FileStandardInformation
);
588 if ( !NT_SUCCESS(errCode
) ) {
589 NtClose(FileHandleSource
);
590 SetLastError(RtlNtStatusToDosError(errCode
));
594 errCode
= NtQueryInformationFile(FileHandleSource
,
595 &IoStatusBlock
,&FileBasic
, sizeof(FILE_BASIC_INFORMATION
),
596 FileBasicInformation
);
597 if ( !NT_SUCCESS(errCode
) ) {
598 NtClose(FileHandleSource
);
599 SetLastError(RtlNtStatusToDosError(errCode
));
608 FileHandleDest
= CreateFileW(
613 dwCopyFlags
? CREATE_NEW
: CREATE_ALWAYS
,
614 FileBasic
.FileAttributes
|FILE_FLAG_NO_BUFFERING
,
618 if ( !NT_SUCCESS(errCode
) ) {
619 NtClose(FileHandleSource
);
620 SetLastError(RtlNtStatusToDosError(errCode
));
627 FilePosition
.CurrentByteOffset
.LowPart
= 0;
628 FilePosition
.CurrentByteOffset
.HighPart
= 0;
630 errCode
= NtSetInformationFile(FileHandleSource
,
631 &IoStatusBlock
,&FilePosition
, sizeof(FILE_POSITION_INFORMATION
),
632 FilePositionInformation
);
633 if ( !NT_SUCCESS(errCode
) ) {
634 NtClose(FileHandleSource
);
635 NtClose(FileHandleDest
);
636 SetLastError(RtlNtStatusToDosError(errCode
));
640 errCode
= NtSetInformationFile(FileHandleDest
,
641 &IoStatusBlock
,&FilePosition
, sizeof(FILE_POSITION_INFORMATION
),
642 FilePositionInformation
);
644 if ( !NT_SUCCESS(errCode
) ) {
645 NtClose(FileHandleSource
);
646 NtClose(FileHandleDest
);
647 SetLastError(RtlNtStatusToDosError(errCode
));
653 errCode
= NtAllocateVirtualMemory(
662 if ( !NT_SUCCESS(errCode
) ) {
663 NtClose(FileHandleSource
);
664 NtClose(FileHandleDest
);
665 SetLastError(RtlNtStatusToDosError(errCode
));
676 errCode
= NtReadFile(
681 (PIO_STATUS_BLOCK
)&IoStatusBlock
,
686 if ( pbCancel
!= NULL
)
690 if ( !NT_SUCCESS(errCode
) || bCancel
) {
691 NtFreeVirtualMemory(NtCurrentProcess(),(PVOID
*)&lpBuffer
, &RegionSize
,MEM_RELEASE
);
692 NtClose(FileHandleSource
);
693 NtClose(FileHandleDest
);
694 if ( errCode
== STATUS_END_OF_FILE
)
701 errCode
= NtWriteFile(FileHandleDest
,
705 (PIO_STATUS_BLOCK
)&IoStatusBlock
,
713 if ( !NT_SUCCESS(errCode
) ) {
714 NtFreeVirtualMemory(NtCurrentProcess(),(PVOID
*)&lpBuffer
, &RegionSize
,MEM_RELEASE
);
715 NtClose(FileHandleSource
);
716 NtClose(FileHandleDest
);
732 LPOFSTRUCT lpReOpenBuff
,
737 HANDLE FileHandle
= NULL
;
738 UNICODE_STRING FileNameString
;
739 WCHAR FileNameW
[MAX_PATH
];
740 WCHAR PathNameW
[MAX_PATH
];
742 OBJECT_ATTRIBUTES ObjectAttributes
;
743 IO_STATUS_BLOCK IoStatusBlock
;
747 if ( lpReOpenBuff
== NULL
) {
755 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
757 FileNameW
[i
] = *lpFileName
;
764 Len
= SearchPathW(NULL
,FileNameW
,NULL
,MAX_PATH
,PathNameW
,&FilePart
);
769 if ( Len
> MAX_PATH
)
772 FileNameString
.Length
= lstrlenW(PathNameW
)*sizeof(WCHAR
);
773 FileNameString
.Buffer
= PathNameW
;
774 FileNameString
.MaximumLength
= FileNameString
.Length
;
779 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
780 ObjectAttributes
.RootDirectory
= NULL
;
781 ObjectAttributes
.ObjectName
= &FileNameString
;
782 ObjectAttributes
.Attributes
= OBJ_CASE_INSENSITIVE
| OBJ_INHERIT
;
783 ObjectAttributes
.SecurityDescriptor
= NULL
;
784 ObjectAttributes
.SecurityQualityOfService
= NULL
;
787 // FILE_NO_INTERMEDIATE_BUFFERING
791 if ((uStyle
& OF_PARSE
) == OF_PARSE
)
795 errCode
= NtOpenFile(
797 GENERIC_READ
|SYNCHRONIZE
,
801 FILE_NON_DIRECTORY_FILE
804 lpReOpenBuff
->nErrCode
= RtlNtStatusToDosError(errCode
);
806 if ( !NT_SUCCESS(errCode
) ) {
807 SetLastError(RtlNtStatusToDosError(errCode
));
808 return (HFILE
)INVALID_HANDLE_VALUE
;
811 return (HFILE
)FileHandle
;
819 LPCSTR lpExistingFileName
,
823 return MoveFileExA(lpExistingFileName
,lpNewFileName
,MOVEFILE_COPY_ALLOWED
);
829 LPCSTR lpExistingFileName
,
830 LPCSTR lpNewFileName
,
835 WCHAR ExistingFileNameW
[MAX_PATH
];
836 WCHAR NewFileNameW
[MAX_PATH
];
841 while ((*lpExistingFileName
)!=0 && i
< MAX_PATH
)
843 ExistingFileNameW
[i
] = *lpExistingFileName
;
844 lpExistingFileName
++;
847 ExistingFileNameW
[i
] = 0;
850 while ((*lpNewFileName
)!=0 && i
< MAX_PATH
)
852 NewFileNameW
[i
] = *lpNewFileName
;
858 return MoveFileExW(ExistingFileNameW
,NewFileNameW
,dwFlags
);
867 LPCWSTR lpExistingFileName
,
868 LPCWSTR lpNewFileName
871 return MoveFileExW(lpExistingFileName
,lpNewFileName
,MOVEFILE_COPY_ALLOWED
);
874 #define FILE_RENAME_SIZE MAX_PATH +sizeof(FILE_RENAME_INFORMATION)
879 LPCWSTR lpExistingFileName
,
880 LPCWSTR lpNewFileName
,
885 IO_STATUS_BLOCK IoStatusBlock
;
886 FILE_RENAME_INFORMATION
*FileRename
;
887 USHORT Buffer
[FILE_RENAME_SIZE
];
893 FILE_SHARE_WRITE
|FILE_SHARE_READ
,
896 FILE_ATTRIBUTE_NORMAL
,
902 FileRename
= (FILE_RENAME_INFORMATION
*)Buffer
;
903 if ( ( dwFlags
& MOVEFILE_REPLACE_EXISTING
) == MOVEFILE_REPLACE_EXISTING
)
904 FileRename
->Replace
= TRUE
;
906 FileRename
->Replace
= FALSE
;
908 FileRename
->FileNameLength
= lstrlenW(lpNewFileName
);
909 memcpy(FileRename
->FileName
,lpNewFileName
,min(FileRename
->FileNameLength
,MAX_PATH
));
911 errCode
= NtSetInformationFile(hFile
,&IoStatusBlock
,FileRename
, FILE_RENAME_SIZE
, FileRenameInformation
);
912 if ( !NT_SUCCESS(errCode
) ) {
913 if ( CopyFileW(lpExistingFileName
,lpNewFileName
,FileRename
->Replace
) )
914 DeleteFileW(lpExistingFileName
);
929 WCHAR FileNameW
[MAX_PATH
];
934 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
936 FileNameW
[i
] = *lpFileName
;
941 return DeleteFileW(FileNameW
);
951 OBJECT_ATTRIBUTES ObjectAttributes
;
952 UNICODE_STRING FileNameString
;
954 WCHAR PathNameW
[MAX_PATH
];
957 Len
= GetCurrentDirectoryW(MAX_PATH
,PathNameW
);
960 if ( PathNameW
[Len
-1] != L
'\\' ) {
961 PathNameW
[Len
] = L
'\\';
962 PathNameW
[Len
+1] = 0;
964 lstrcatW(PathNameW
,lpFileName
);
965 FileNameString
.Length
= lstrlenW( PathNameW
)*sizeof(WCHAR
);
966 if ( FileNameString
.Length
== 0 )
969 if ( FileNameString
.Length
> MAX_PATH
)
975 FileNameString
.Buffer
= (WCHAR
*)PathNameW
;
976 FileNameString
.MaximumLength
= FileNameString
.Length
;
981 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
982 ObjectAttributes
.RootDirectory
= NULL
;
983 ObjectAttributes
.ObjectName
= &FileNameString
;
984 ObjectAttributes
.Attributes
= OBJ_CASE_INSENSITIVE
| OBJ_INHERIT
;
985 ObjectAttributes
.SecurityDescriptor
= NULL
;
986 ObjectAttributes
.SecurityQualityOfService
= NULL
;
991 errCode
= NtDeleteFile(&ObjectAttributes
);
992 if ( !NT_SUCCESS(errCode
) ) {
993 SetLastError(RtlNtStatusToDosError(errCode
));
1006 IO_STATUS_BLOCK IoStatusBlock
;
1008 errCode
= NtFlushBuffersFile(
1012 if ( !NT_SUCCESS(errCode
) ) {
1013 SetLastError(RtlNtStatusToDosError(errCode
));
1024 LONG lDistanceToMove
,
1025 PLONG lpDistanceToMoveHigh
,
1029 FILE_POSITION_INFORMATION FilePosition
;
1030 FILE_END_OF_FILE_INFORMATION FileEndOfFile
;
1032 IO_STATUS_BLOCK IoStatusBlock
;
1033 if ( dwMoveMethod
== FILE_CURRENT
) {
1034 NtQueryInformationFile(hFile
,&IoStatusBlock
,&FilePosition
, sizeof(FILE_POSITION_INFORMATION
),FilePositionInformation
);
1035 FilePosition
.CurrentByteOffset
.LowPart
+= lDistanceToMove
;
1036 if ( lpDistanceToMoveHigh
!= NULL
)
1037 FilePosition
.CurrentByteOffset
.HighPart
+= *lpDistanceToMoveHigh
;
1039 else if ( dwMoveMethod
== FILE_END
) {
1040 NtQueryInformationFile(hFile
,&IoStatusBlock
,&FileEndOfFile
, sizeof(FILE_END_OF_FILE_INFORMATION
),FileEndOfFileInformation
);
1041 FilePosition
.CurrentByteOffset
.LowPart
= FileEndOfFile
.EndOfFile
.LowPart
- lDistanceToMove
;
1042 if ( lpDistanceToMoveHigh
!= NULL
)
1043 FilePosition
.CurrentByteOffset
.HighPart
= FileEndOfFile
.EndOfFile
.HighPart
- *lpDistanceToMoveHigh
;
1045 FilePosition
.CurrentByteOffset
.HighPart
= FileEndOfFile
.EndOfFile
.HighPart
;
1047 else if ( dwMoveMethod
== FILE_CURRENT
) {
1048 FilePosition
.CurrentByteOffset
.LowPart
= lDistanceToMove
;
1049 if ( lpDistanceToMoveHigh
!= NULL
)
1050 FilePosition
.CurrentByteOffset
.HighPart
= *lpDistanceToMoveHigh
;
1052 FilePosition
.CurrentByteOffset
.HighPart
= 0;
1055 errCode
= NtSetInformationFile(hFile
,&IoStatusBlock
,&FilePosition
, sizeof(FILE_POSITION_INFORMATION
),FilePositionInformation
);
1056 if ( !NT_SUCCESS(errCode
) ) {
1057 SetLastError(RtlNtStatusToDosError(errCode
));
1061 if ( lpDistanceToMoveHigh
!= NULL
)
1062 lpDistanceToMoveHigh
= &FilePosition
.CurrentByteOffset
.HighPart
;
1063 return FilePosition
.CurrentByteOffset
.LowPart
;
1072 return FILE_TYPE_UNKNOWN
;
1080 LPDWORD lpFileSizeHigh
1084 FILE_STANDARD_INFORMATION FileStandard
;
1085 IO_STATUS_BLOCK IoStatusBlock
;
1088 errCode
= NtQueryInformationFile(hFile
,
1089 &IoStatusBlock
,&FileStandard
, sizeof(FILE_STANDARD_INFORMATION
),
1090 FileStandardInformation
);
1091 if ( !NT_SUCCESS(errCode
) ) {
1093 SetLastError(RtlNtStatusToDosError(errCode
));
1094 if ( lpFileSizeHigh
== NULL
) {
1100 if ( lpFileSizeHigh
!= NULL
)
1101 *lpFileSizeHigh
= FileStandard
.AllocationSize
.HighPart
;
1104 return FileStandard
.AllocationSize
.LowPart
;
1109 GetCompressedFileSizeA(
1111 LPDWORD lpFileSizeHigh
1114 WCHAR FileNameW
[MAX_PATH
];
1117 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
1119 FileNameW
[i
] = *lpFileName
;
1126 return GetCompressedFileSizeW(FileNameW
,lpFileSizeHigh
);
1132 GetCompressedFileSizeW(
1134 LPDWORD lpFileSizeHigh
1137 FILE_COMPRESSION_INFORMATION FileCompression
;
1139 IO_STATUS_BLOCK IoStatusBlock
;
1142 hFile
= CreateFileW(
1148 FILE_ATTRIBUTE_NORMAL
,
1152 errCode
= NtQueryInformationFile(hFile
,
1153 &IoStatusBlock
,&FileCompression
, sizeof(FILE_COMPRESSION_INFORMATION
),
1154 FileCompressionInformation
);
1155 if ( !NT_SUCCESS(errCode
) ) {
1157 SetLastError(RtlNtStatusToDosError(errCode
));
1169 GetFileInformationByHandle(
1171 LPBY_HANDLE_FILE_INFORMATION lpFileInformation
1174 FILE_DIRECTORY_INFORMATION FileDirectory
;
1175 FILE_INTERNAL_INFORMATION FileInternal
;
1176 FILE_FS_VOLUME_INFORMATION FileFsVolume
;
1177 FILE_STANDARD_INFORMATION FileStandard
;
1180 IO_STATUS_BLOCK IoStatusBlock
;
1181 errCode
= NtQueryInformationFile(hFile
,&IoStatusBlock
,&FileDirectory
, sizeof(FILE_DIRECTORY_INFORMATION
),FileDirectoryInformation
);
1182 if ( !NT_SUCCESS(errCode
) ) {
1183 SetLastError(RtlNtStatusToDosError(errCode
));
1186 lpFileInformation
->dwFileAttributes
= (DWORD
)FileDirectory
.FileAttributes
;
1187 memcpy(&lpFileInformation
->ftCreationTime
,&FileDirectory
.CreationTime
,sizeof(LARGE_INTEGER
));
1188 memcpy(&lpFileInformation
->ftLastAccessTime
,&FileDirectory
.LastAccessTime
,sizeof(LARGE_INTEGER
));
1189 memcpy(&lpFileInformation
->ftLastWriteTime
, &FileDirectory
.LastWriteTime
,sizeof(LARGE_INTEGER
));
1190 lpFileInformation
->nFileSizeHigh
= FileDirectory
.AllocationSize
.HighPart
;
1191 lpFileInformation
->nFileSizeLow
= FileDirectory
.AllocationSize
.LowPart
;
1195 errCode
= NtQueryInformationFile(hFile
,&IoStatusBlock
,&FileInternal
, sizeof(FILE_INTERNAL_INFORMATION
),FileInternalInformation
);
1196 if ( !NT_SUCCESS(errCode
) ) {
1197 SetLastError(RtlNtStatusToDosError(errCode
));
1200 lpFileInformation
->nFileIndexHigh
= FileInternal
.IndexNumber
.HighPart
;
1201 lpFileInformation
->nFileIndexLow
= FileInternal
.IndexNumber
.LowPart
;
1204 errCode
= NtQueryVolumeInformationFile(hFile
,&IoStatusBlock
,&FileFsVolume
, sizeof(FILE_FS_VOLUME_INFORMATION
),FileFsVolumeInformation
);
1205 if ( !NT_SUCCESS(errCode
) ) {
1206 SetLastError(RtlNtStatusToDosError(errCode
));
1209 lpFileInformation
->dwVolumeSerialNumber
= FileFsVolume
.VolumeSerialNumber
;
1212 errCode
= NtQueryInformationFile(hFile
,&IoStatusBlock
,&FileStandard
, sizeof(FILE_STANDARD_INFORMATION
),FileStandardInformation
);
1213 if ( !NT_SUCCESS(errCode
) ) {
1215 SetLastError(RtlNtStatusToDosError(errCode
));
1218 lpFileInformation
->nNumberOfLinks
= FileStandard
.NumberOfLinks
;
1236 WCHAR FileNameW
[MAX_PATH
];
1238 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
1240 FileNameW
[i
] = *lpFileName
;
1245 return GetFileAttributesW(FileNameW
);
1255 IO_STATUS_BLOCK IoStatusBlock
;
1256 FILE_BASIC_INFORMATION FileBasic
;
1261 hFile
= CreateFileW(
1267 FILE_ATTRIBUTE_NORMAL
,
1272 errCode
= NtQueryInformationFile(hFile
,&IoStatusBlock
,&FileBasic
, sizeof(FILE_BASIC_INFORMATION
),FileBasicInformation
);
1273 if ( !NT_SUCCESS(errCode
) ) {
1275 SetLastError(RtlNtStatusToDosError(errCode
));
1279 return (DWORD
)FileBasic
.FileAttributes
;
1286 GetCurrentTime(VOID
)
1289 FILETIME CurrentTime
;
1290 errCode
= NtQuerySystemTime (
1291 (TIME
*)&CurrentTime
1293 return CurrentTime
.dwLowDateTime
;
1300 LPCSTR lpPrefixString
,
1302 LPSTR lpTempFileName
1306 UINT unique
= uUnique
;
1308 if (lpPathName
== NULL
)
1312 uUnique
= GetCurrentTime();
1314 wsprintfA(lpTempFileName
,"%s\\%c%.3s%4.4x%s",
1315 lpPathName
,'~',lpPrefixString
,uUnique
,".tmp");
1320 while ((hFile
= CreateFileA(lpTempFileName
, GENERIC_WRITE
, 0, NULL
,
1321 CREATE_NEW
, FILE_ATTRIBUTE_TEMPORARY
,
1322 0)) == INVALID_HANDLE_VALUE
)
1324 wsprintfA(lpTempFileName
,"%s\\%c%.3s%4.4x%s",
1325 lpPathName
,'~',lpPrefixString
,++uUnique
,".tmp");
1328 CloseHandle((HANDLE
)hFile
);
1337 LPCWSTR lpPrefixString
,
1339 LPWSTR lpTempFileName
1343 UINT unique
= uUnique
;
1345 if (lpPathName
== NULL
)
1349 uUnique
= GetCurrentTime();
1351 wsprintfW(lpTempFileName
,L
"%s\\%c%.3s%4.4x%s",
1352 lpPathName
,'~',lpPrefixString
,uUnique
,L
".tmp");
1357 while ((hFile
= CreateFileW(lpTempFileName
, GENERIC_WRITE
, 0, NULL
,
1358 CREATE_NEW
, FILE_ATTRIBUTE_TEMPORARY
,
1359 0)) == INVALID_HANDLE_VALUE
)
1361 wsprintfW(lpTempFileName
,L
"%s\\%c%.3s%4.4x%s",
1362 lpPathName
,'~',lpPrefixString
,++uUnique
,L
".tmp");
1365 CloseHandle((HANDLE
)hFile
);
1373 LPFILETIME lpCreationTime
,
1374 LPFILETIME lpLastAccessTime
,
1375 LPFILETIME lpLastWriteTime
1378 IO_STATUS_BLOCK IoStatusBlock
;
1379 FILE_BASIC_INFORMATION FileBasic
;
1384 errCode
= NtQueryInformationFile(hFile
,&IoStatusBlock
,&FileBasic
, sizeof(FILE_BASIC_INFORMATION
),FileBasicInformation
);
1385 if ( !NT_SUCCESS(errCode
) ) {
1386 SetLastError(RtlNtStatusToDosError(errCode
));
1389 memcpy(lpCreationTime
,&FileBasic
.CreationTime
,sizeof(FILETIME
));
1390 memcpy(lpLastAccessTime
,&FileBasic
.LastAccessTime
,sizeof(FILETIME
));
1391 memcpy(lpLastWriteTime
,&FileBasic
.LastWriteTime
,sizeof(FILETIME
));
1399 CONST FILETIME
*lpCreationTime
,
1400 CONST FILETIME
*lpLastAccessTime
,
1401 CONST FILETIME
*lpLastWriteTime
1404 FILE_BASIC_INFORMATION FileBasic
;
1405 IO_STATUS_BLOCK IoStatusBlock
;
1410 memcpy(&FileBasic
.CreationTime
,lpCreationTime
,sizeof(FILETIME
));
1411 memcpy(&FileBasic
.LastAccessTime
,lpLastAccessTime
,sizeof(FILETIME
));
1412 memcpy(&FileBasic
.LastWriteTime
,lpLastWriteTime
,sizeof(FILETIME
));
1414 // shoud i initialize changetime ???
1416 errCode
= NtSetInformationFile(hFile
,&IoStatusBlock
,&FileBasic
, sizeof(FILE_BASIC_INFORMATION
),FileBasicInformation
);
1417 if ( !NT_SUCCESS(errCode
) ) {
1418 SetLastError(RtlNtStatusToDosError(errCode
));