1 // Copyright © 2015-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms.
7 //! ApiSet Contract for api-ms-win-core-file-l1
8 use shared::minwindef::{
9     BOOL, DWORD, FILETIME, LPCVOID, LPDWORD, LPFILETIME, LPVOID, PDWORD, PUCHAR, UCHAR, UINT,
10     ULONG, WORD,
11 };
12 use um::minwinbase::{
13     FILE_INFO_BY_HANDLE_CLASS, FINDEX_INFO_LEVELS, FINDEX_SEARCH_OPS, GET_FILEEX_INFO_LEVELS,
14     LPOVERLAPPED, LPOVERLAPPED_COMPLETION_ROUTINE, LPSECURITY_ATTRIBUTES, LPWIN32_FIND_DATAA,
15     LPWIN32_FIND_DATAW
16 };
17 use um::winnt::{
18     BOOLEAN, CCHAR, FILE_ID_128, FILE_SEGMENT_ELEMENT, HANDLE, LARGE_INTEGER, LONG, LONGLONG,
19     LPCSTR, LPCWSTR, LPSTR, LPWCH, LPWSTR, PLARGE_INTEGER, PLONG, PULARGE_INTEGER, PWSTR,
20     ULONGLONG, WCHAR,
21 };
22 pub const CREATE_NEW: DWORD = 1;
23 pub const CREATE_ALWAYS: DWORD = 2;
24 pub const OPEN_EXISTING: DWORD = 3;
25 pub const OPEN_ALWAYS: DWORD = 4;
26 pub const TRUNCATE_EXISTING: DWORD = 5;
27 pub const INVALID_FILE_SIZE: DWORD = 0xFFFFFFFF;
28 pub const INVALID_SET_FILE_POINTER: DWORD = 0xFFFFFFFF;
29 pub const INVALID_FILE_ATTRIBUTES: DWORD = 0xFFFFFFFF;
30 STRUCT!{struct WIN32_FILE_ATTRIBUTE_DATA {
31     dwFileAttributes: DWORD,
32     ftCreationTime: FILETIME,
33     ftLastAccessTime: FILETIME,
34     ftLastWriteTime: FILETIME,
35     nFileSizeHigh: DWORD,
36     nFileSizeLow: DWORD,
37 }}
38 pub type LPWIN32_FILE_ATTRIBUTE_DATA = *mut WIN32_FILE_ATTRIBUTE_DATA;
39 STRUCT!{struct BY_HANDLE_FILE_INFORMATION {
40     dwFileAttributes: DWORD,
41     ftCreationTime: FILETIME,
42     ftLastAccessTime: FILETIME,
43     ftLastWriteTime: FILETIME,
44     dwVolumeSerialNumber: DWORD,
45     nFileSizeHigh: DWORD,
46     nFileSizeLow: DWORD,
47     nNumberOfLinks: DWORD,
48     nFileIndexHigh: DWORD,
49     nFileIndexLow: DWORD,
50 }}
51 pub type PBY_HANDLE_FILE_INFORMATION = *mut BY_HANDLE_FILE_INFORMATION;
52 pub type LPBY_HANDLE_FILE_INFORMATION = *mut BY_HANDLE_FILE_INFORMATION;
53 STRUCT!{struct CREATEFILE2_EXTENDED_PARAMETERS {
54     dwSize: DWORD,
55     dwFileAttributes: DWORD,
56     dwFileFlags: DWORD,
57     dwSecurityQosFlags: DWORD,
58     lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
59     hTemplateFile: HANDLE,
60 }}
61 pub type PCREATEFILE2_EXTENDED_PARAMETERS = *mut CREATEFILE2_EXTENDED_PARAMETERS;
62 pub type LPCREATEFILE2_EXTENDED_PARAMETERS = *mut CREATEFILE2_EXTENDED_PARAMETERS;
63 ENUM!{enum PRIORITY_HINT {
64     IoPriorityHintVeryLow = 0,
65     IoPriorityHintLow = 1,
66     IoPriorityHintNormal = 2,
67     MaximumIoPriorityHintType = 3,
68 }}
69 STRUCT!{struct FILE_BASIC_INFO {
70     CreationTime: LARGE_INTEGER,
71     LastAccessTime: LARGE_INTEGER,
72     LastWriteTime: LARGE_INTEGER,
73     ChangeTime: LARGE_INTEGER,
74     FileAttributes: DWORD,
75 }}
76 STRUCT!{struct FILE_STANDARD_INFO {
77     AllocationSize: LARGE_INTEGER,
78     EndOfFile: LARGE_INTEGER,
79     NumberOfLinks: DWORD,
80     DeletePending: BOOLEAN,
81     Directory: BOOLEAN,
82 }}
83 STRUCT!{struct FILE_NAME_INFO {
84     FileNameLength: DWORD,
85     FileName: [WCHAR; 1],
86 }}
87 STRUCT!{struct FILE_RENAME_INFO {
88     ReplaceIfExists: BOOL,
89     RootDirectory: HANDLE,
90     FileNameLength: DWORD,
91     FileName: [WCHAR; 1],
92 }}
93 STRUCT!{struct FILE_DISPOSITION_INFO {
94     DeleteFile: BOOLEAN,
95 }}
96 STRUCT!{struct FILE_ALLOCATION_INFO {
97     AllocationSize: LARGE_INTEGER,
98 }}
99 STRUCT!{struct FILE_END_OF_FILE_INFO {
100     EndOfFile: LARGE_INTEGER,
101 }}
102 STRUCT!{struct FILE_STREAM_INFO {
103     NextEntryOffset: DWORD,
104     StreamNameLength: DWORD,
105     StreamSize: LARGE_INTEGER,
106     StreamAllocationSize: LARGE_INTEGER,
107     StreamName: [WCHAR; 1],
108 }}
109 STRUCT!{struct FILE_COMPRESSION_INFO {
110     CompressedFileSize: LARGE_INTEGER,
111     CompressionFormat: WORD,
112     CompressionUnitShift: UCHAR,
113     ChunkShift: UCHAR,
114     ClusterShift: UCHAR,
115     Reserved: [UCHAR; 3],
116 }}
117 STRUCT!{struct FILE_ATTRIBUTE_TAG_INFO {
118     NextEntryOffset: DWORD,
119     ReparseTag: DWORD,
120 }}
121 STRUCT!{struct FILE_ID_BOTH_DIR_INFO {
122     NextEntryOffset: DWORD,
123     FileIndex: DWORD,
124     CreationTime: LARGE_INTEGER,
125     LastAccessTime: LARGE_INTEGER,
126     LastWriteTime: LARGE_INTEGER,
127     ChangeTime: LARGE_INTEGER,
128     EndOfFile: LARGE_INTEGER,
129     AllocationSize: LARGE_INTEGER,
130     FileAttributes: DWORD,
131     FileNameLength: DWORD,
132     EaSize: DWORD,
133     ShortNameLength: CCHAR,
134     ShortName: [WCHAR; 12],
135     FileId: LARGE_INTEGER,
136     FileName: [WCHAR; 1],
137 }}
138 STRUCT!{struct FILE_IO_PRIORITY_HINT_INFO {
139     PriorityHint: PRIORITY_HINT,
140 }}
141 STRUCT!{struct FILE_FULL_DIR_INFO {
142     NextEntryOffset: ULONG,
143     FileIndex: ULONG,
144     CreationTime: LARGE_INTEGER,
145     LastAccessTime: LARGE_INTEGER,
146     LastWriteTime: LARGE_INTEGER,
147     ChangeTime: LARGE_INTEGER,
148     EndOfFile: LARGE_INTEGER,
149     AllocationSize: LARGE_INTEGER,
150     FileAttributes: ULONG,
151     FileNameLength: ULONG,
152     EaSize: ULONG,
153     FileName: [WCHAR; 1],
154 }}
155 STRUCT!{struct FILE_STORAGE_INFO {
156     LogicalBytesPerSector: ULONG,
157     PhysicalBytesPerSectorForAtomicity: ULONG,
158     PhysicalBytesPerSectorForPerformance: ULONG,
159     FileSystemEffectivePhysicalBytesPerSectorForAtomicity: ULONG,
160     Flags: ULONG,
161     ByteOffsetForSectorAlignment: ULONG,
162     ByteOffsetForPartitionAlignment: ULONG,
163 }}
164 STRUCT!{struct FILE_ALIGNMENT_INFO {
165     AlignmentRequirement: ULONG,
166 }}
167 STRUCT!{struct FILE_ID_INFO {
168     VolumeSerialNumber: ULONGLONG,
169     FileId: FILE_ID_128,
170 }}
171 extern "system" {
CompareFileTime( lpFileTime1: *const FILETIME, lpFileTime2: *const FILETIME ) -> LONG172     pub fn CompareFileTime(
173         lpFileTime1: *const FILETIME,
174         lpFileTime2: *const FILETIME
175     ) -> LONG;
CreateDirectoryA( lpPathName: LPCSTR, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, ) -> BOOL176     pub fn CreateDirectoryA(
177         lpPathName: LPCSTR,
178         lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
179     ) -> BOOL;
CreateDirectoryW( lpPathName: LPCWSTR, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, ) -> BOOL180     pub fn CreateDirectoryW(
181         lpPathName: LPCWSTR,
182         lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
183     ) -> BOOL;
CreateFileA( lpFileName: LPCSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: DWORD, dwFlagsAndAttributes: DWORD, hTemplateFile: HANDLE, ) -> HANDLE184     pub fn CreateFileA(
185         lpFileName: LPCSTR,
186         dwDesiredAccess: DWORD,
187         dwShareMode: DWORD,
188         lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
189         dwCreationDisposition: DWORD,
190         dwFlagsAndAttributes: DWORD,
191         hTemplateFile: HANDLE,
192     ) -> HANDLE;
CreateFileW( lpFileName: LPCWSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD, lpSecurityAttributes: LPSECURITY_ATTRIBUTES, dwCreationDisposition: DWORD, dwFlagsAndAttributes: DWORD, hTemplateFile: HANDLE, ) -> HANDLE193     pub fn CreateFileW(
194         lpFileName: LPCWSTR,
195         dwDesiredAccess: DWORD,
196         dwShareMode: DWORD,
197         lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
198         dwCreationDisposition: DWORD,
199         dwFlagsAndAttributes: DWORD,
200         hTemplateFile: HANDLE,
201     ) -> HANDLE;
DefineDosDeviceW( dwFlags: DWORD, lpDeviceName: LPCWSTR, lpTargetPath: LPCWSTR ) -> BOOL202     pub fn DefineDosDeviceW(
203         dwFlags: DWORD,
204         lpDeviceName: LPCWSTR,
205         lpTargetPath: LPCWSTR
206     ) -> BOOL;
DeleteFileA( lpFileName: LPCSTR ) -> BOOL207     pub fn DeleteFileA(
208         lpFileName: LPCSTR
209     ) -> BOOL;
DeleteFileW( lpFileName: LPCWSTR ) -> BOOL210     pub fn DeleteFileW(
211         lpFileName: LPCWSTR
212     ) -> BOOL;
DeleteVolumeMountPointW( lpszVolumeMountPoint: LPCWSTR ) -> BOOL213     pub fn DeleteVolumeMountPointW(
214         lpszVolumeMountPoint: LPCWSTR
215     ) -> BOOL;
FileTimeToLocalFileTime( lpFileTime: *const FILETIME, lpLocalFileTime: LPFILETIME, ) -> BOOL216     pub fn FileTimeToLocalFileTime(
217         lpFileTime: *const FILETIME,
218         lpLocalFileTime: LPFILETIME,
219     ) -> BOOL;
FindClose( hFindFile: HANDLE ) -> BOOL220     pub fn FindClose(
221         hFindFile: HANDLE
222     ) -> BOOL;
FindCloseChangeNotification( hChangeHandle: HANDLE ) -> BOOL223     pub fn FindCloseChangeNotification(
224         hChangeHandle: HANDLE
225     ) -> BOOL;
FindFirstChangeNotificationA( lpPathName: LPCSTR, bWatchSubtree: BOOL, dwNotifyFilter: DWORD, ) -> HANDLE226     pub fn FindFirstChangeNotificationA(
227         lpPathName: LPCSTR,
228         bWatchSubtree: BOOL,
229         dwNotifyFilter: DWORD,
230     ) -> HANDLE;
FindFirstChangeNotificationW( lpPathName: LPCWSTR, bWatchSubtree: BOOL, dwNotifyFilter: DWORD, ) -> HANDLE231     pub fn FindFirstChangeNotificationW(
232         lpPathName: LPCWSTR,
233         bWatchSubtree: BOOL,
234         dwNotifyFilter: DWORD,
235     ) -> HANDLE;
FindFirstFileA( lpFileName: LPCSTR, lpFindFileData: LPWIN32_FIND_DATAA ) -> HANDLE236     pub fn FindFirstFileA(
237         lpFileName: LPCSTR,
238         lpFindFileData: LPWIN32_FIND_DATAA
239     ) -> HANDLE;
FindFirstFileW( lpFileName: LPCWSTR, lpFindFileData: LPWIN32_FIND_DATAW ) -> HANDLE240     pub fn FindFirstFileW(
241         lpFileName: LPCWSTR,
242         lpFindFileData: LPWIN32_FIND_DATAW
243     ) -> HANDLE;
FindFirstFileExA( lpFileName: LPCSTR, fInfoLevelId: FINDEX_INFO_LEVELS, lpFindFileData: LPVOID, fSearchOp: FINDEX_SEARCH_OPS, lpSearchFilter: LPVOID, dwAdditionalFlags: DWORD, ) -> HANDLE244     pub fn FindFirstFileExA(
245         lpFileName: LPCSTR,
246         fInfoLevelId: FINDEX_INFO_LEVELS,
247         lpFindFileData: LPVOID,
248         fSearchOp: FINDEX_SEARCH_OPS,
249         lpSearchFilter: LPVOID,
250         dwAdditionalFlags: DWORD,
251     ) -> HANDLE;
FindFirstFileExW( lpFileName: LPCWSTR, fInfoLevelId: FINDEX_INFO_LEVELS, lpFindFileData: LPVOID, fSearchOp: FINDEX_SEARCH_OPS, lpSearchFilter: LPVOID, dwAdditionalFlags: DWORD, ) -> HANDLE252     pub fn FindFirstFileExW(
253         lpFileName: LPCWSTR,
254         fInfoLevelId: FINDEX_INFO_LEVELS,
255         lpFindFileData: LPVOID,
256         fSearchOp: FINDEX_SEARCH_OPS,
257         lpSearchFilter: LPVOID,
258         dwAdditionalFlags: DWORD,
259     ) -> HANDLE;
FindFirstVolumeW( lpszVolumeName: LPWSTR, cchBufferLength: DWORD ) -> HANDLE260     pub fn FindFirstVolumeW(
261         lpszVolumeName: LPWSTR,
262         cchBufferLength: DWORD
263     ) -> HANDLE;
FindNextChangeNotification( hChangeHandle: HANDLE ) -> BOOL264     pub fn FindNextChangeNotification(
265         hChangeHandle: HANDLE
266     ) -> BOOL;
FindNextFileA( hFindFile: HANDLE, lpFindFileData: LPWIN32_FIND_DATAA ) -> BOOL267     pub fn FindNextFileA(
268         hFindFile: HANDLE,
269         lpFindFileData: LPWIN32_FIND_DATAA
270     ) -> BOOL;
FindNextFileW( hFindFile: HANDLE, lpFindFileData: LPWIN32_FIND_DATAW ) -> BOOL271     pub fn FindNextFileW(
272         hFindFile: HANDLE,
273         lpFindFileData: LPWIN32_FIND_DATAW
274     ) -> BOOL;
FindNextVolumeW( hFindVolume: HANDLE, lpszVolumeName: LPWSTR, cchBufferLength: DWORD, ) -> BOOL275     pub fn FindNextVolumeW(
276         hFindVolume: HANDLE,
277         lpszVolumeName: LPWSTR,
278         cchBufferLength: DWORD,
279     ) -> BOOL;
FindVolumeClose( hFindVolume: HANDLE ) -> BOOL280     pub fn FindVolumeClose(
281         hFindVolume: HANDLE
282     ) -> BOOL;
FlushFileBuffers( hFile: HANDLE ) -> BOOL283     pub fn FlushFileBuffers(
284         hFile: HANDLE
285     ) -> BOOL;
GetDiskFreeSpaceA( lpRootPathName: LPCSTR, lpSectorsPerCluster: LPDWORD, lpBytesPerSector: LPDWORD, lpNumberOfFreeClusters: LPDWORD, lpTotalNumberOfClusters: LPDWORD, ) -> BOOL286     pub fn GetDiskFreeSpaceA(
287         lpRootPathName: LPCSTR,
288         lpSectorsPerCluster: LPDWORD,
289         lpBytesPerSector: LPDWORD,
290         lpNumberOfFreeClusters: LPDWORD,
291         lpTotalNumberOfClusters: LPDWORD,
292     ) -> BOOL;
GetDiskFreeSpaceW( lpRootPathName: LPCWSTR, lpSectorsPerCluster: LPDWORD, lpBytesPerSector: LPDWORD, lpNumberOfFreeClusters: LPDWORD, lpTotalNumberOfClusters: LPDWORD, ) -> BOOL293     pub fn GetDiskFreeSpaceW(
294         lpRootPathName: LPCWSTR,
295         lpSectorsPerCluster: LPDWORD,
296         lpBytesPerSector: LPDWORD,
297         lpNumberOfFreeClusters: LPDWORD,
298         lpTotalNumberOfClusters: LPDWORD,
299     ) -> BOOL;
GetDiskFreeSpaceExA( lpDirectoryName: LPCSTR, lpFreeBytesAvailableToCaller: PULARGE_INTEGER, lpTotalNumberOfBytes: PULARGE_INTEGER, lpTotalNumberOfFreeBytes: PULARGE_INTEGER, ) -> BOOL300     pub fn GetDiskFreeSpaceExA(
301         lpDirectoryName: LPCSTR,
302         lpFreeBytesAvailableToCaller: PULARGE_INTEGER,
303         lpTotalNumberOfBytes: PULARGE_INTEGER,
304         lpTotalNumberOfFreeBytes: PULARGE_INTEGER,
305     ) -> BOOL;
GetDiskFreeSpaceExW( lpDirectoryName: LPCWSTR, lpFreeBytesAvailableToCaller: PULARGE_INTEGER, lpTotalNumberOfBytes: PULARGE_INTEGER, lpTotalNumberOfFreeBytes: PULARGE_INTEGER, ) -> BOOL306     pub fn GetDiskFreeSpaceExW(
307         lpDirectoryName: LPCWSTR,
308         lpFreeBytesAvailableToCaller: PULARGE_INTEGER,
309         lpTotalNumberOfBytes: PULARGE_INTEGER,
310         lpTotalNumberOfFreeBytes: PULARGE_INTEGER,
311     ) -> BOOL;
GetDriveTypeA( lpRootPathName: LPCSTR ) -> UINT312     pub fn GetDriveTypeA(
313         lpRootPathName: LPCSTR
314     ) -> UINT;
GetDriveTypeW( lpRootPathName: LPCWSTR ) -> UINT315     pub fn GetDriveTypeW(
316         lpRootPathName: LPCWSTR
317     ) -> UINT;
GetFileAttributesA( lpFileName: LPCSTR ) -> DWORD318     pub fn GetFileAttributesA(
319         lpFileName: LPCSTR
320     ) -> DWORD;
GetFileAttributesW( lpFileName: LPCWSTR ) -> DWORD321     pub fn GetFileAttributesW(
322         lpFileName: LPCWSTR
323     ) -> DWORD;
GetFileAttributesExA( lpFileName: LPCSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID, ) -> BOOL324     pub fn GetFileAttributesExA(
325         lpFileName: LPCSTR,
326         fInfoLevelId: GET_FILEEX_INFO_LEVELS,
327         lpFileInformation: LPVOID,
328     ) -> BOOL;
GetFileAttributesExW( lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID, ) -> BOOL329     pub fn GetFileAttributesExW(
330         lpFileName: LPCWSTR,
331         fInfoLevelId: GET_FILEEX_INFO_LEVELS,
332         lpFileInformation: LPVOID,
333     ) -> BOOL;
GetFileInformationByHandle( hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION, ) -> BOOL334     pub fn GetFileInformationByHandle(
335         hFile: HANDLE,
336         lpFileInformation: LPBY_HANDLE_FILE_INFORMATION,
337     ) -> BOOL;
GetFileSize( hFile: HANDLE, lpFileSizeHigh: LPDWORD ) -> DWORD338     pub fn GetFileSize(
339         hFile: HANDLE,
340         lpFileSizeHigh: LPDWORD
341     ) -> DWORD;
GetFileSizeEx( hFile: HANDLE, lpFileSize: PLARGE_INTEGER ) -> BOOL342     pub fn GetFileSizeEx(
343         hFile: HANDLE,
344         lpFileSize: PLARGE_INTEGER
345     ) -> BOOL;
GetFileType( hFile: HANDLE ) -> DWORD346     pub fn GetFileType(
347         hFile: HANDLE
348     ) -> DWORD;
GetFinalPathNameByHandleA( hFile: HANDLE, lpszFilePath: LPSTR, cchFilePath: DWORD, dwFlags: DWORD, ) -> DWORD349     pub fn GetFinalPathNameByHandleA(
350         hFile: HANDLE,
351         lpszFilePath: LPSTR,
352         cchFilePath: DWORD,
353         dwFlags: DWORD,
354     ) -> DWORD;
GetFinalPathNameByHandleW( hFile: HANDLE, lpszFilePath: LPWSTR, cchFilePath: DWORD, dwFlags: DWORD, ) -> DWORD355     pub fn GetFinalPathNameByHandleW(
356         hFile: HANDLE,
357         lpszFilePath: LPWSTR,
358         cchFilePath: DWORD,
359         dwFlags: DWORD,
360     ) -> DWORD;
GetFileTime( hFile: HANDLE, lpCreationTime: LPFILETIME, lpLastAccessTime: LPFILETIME, lpLastWriteTime: LPFILETIME, ) -> BOOL361     pub fn GetFileTime(
362         hFile: HANDLE,
363         lpCreationTime: LPFILETIME,
364         lpLastAccessTime: LPFILETIME,
365         lpLastWriteTime: LPFILETIME,
366     ) -> BOOL;
GetFullPathNameW( lpFileName: LPCWSTR, nBufferLength: DWORD, lpBuffer: LPWSTR, lpFilePart: *mut LPWSTR, ) -> DWORD367     pub fn GetFullPathNameW(
368         lpFileName: LPCWSTR,
369         nBufferLength: DWORD,
370         lpBuffer: LPWSTR,
371         lpFilePart: *mut LPWSTR,
372     ) -> DWORD;
GetFullPathNameA( lpFileName: LPCSTR, nBufferLength: DWORD, lpBuffer: LPSTR, lpFilePart: *mut LPSTR, ) -> DWORD373     pub fn GetFullPathNameA(
374         lpFileName: LPCSTR,
375         nBufferLength: DWORD,
376         lpBuffer: LPSTR,
377         lpFilePart: *mut LPSTR,
378     ) -> DWORD;
GetLogicalDrives() -> DWORD379     pub fn GetLogicalDrives() -> DWORD;
GetLogicalDriveStringsW( nBufferLength: DWORD, lpBuffer: LPWSTR ) -> DWORD380     pub fn GetLogicalDriveStringsW(
381         nBufferLength: DWORD,
382         lpBuffer: LPWSTR
383     ) -> DWORD;
GetLongPathNameA( lpszShortPath: LPCSTR, lpszLongPath: LPSTR, cchBuffer: DWORD ) -> DWORD384     pub fn GetLongPathNameA(
385         lpszShortPath: LPCSTR,
386         lpszLongPath: LPSTR,
387         cchBuffer: DWORD
388     ) -> DWORD;
GetLongPathNameW( lpszShortPath: LPCWSTR, lpszLongPath: LPWSTR, cchBuffer: DWORD, ) -> DWORD389     pub fn GetLongPathNameW(
390         lpszShortPath: LPCWSTR,
391         lpszLongPath: LPWSTR,
392         cchBuffer: DWORD,
393     ) -> DWORD;
GetShortPathNameW( lpszLongPath: LPCWSTR, lpszShortPath: LPWSTR, cchBuffer: DWORD, ) -> DWORD394     pub fn GetShortPathNameW(
395         lpszLongPath: LPCWSTR,
396         lpszShortPath: LPWSTR,
397         cchBuffer: DWORD,
398     ) -> DWORD;
GetTempFileNameW( lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: UINT, lpTempFileName: LPWSTR, ) -> UINT399     pub fn GetTempFileNameW(
400         lpPathName: LPCWSTR,
401         lpPrefixString: LPCWSTR,
402         uUnique: UINT,
403         lpTempFileName: LPWSTR,
404     ) -> UINT;
GetVolumeInformationByHandleW( hFile: HANDLE, lpVolumeNameBuffer: LPWSTR, nVolumeNameSize: DWORD, lpVolumeSerialNumber: LPDWORD, lpMaximumComponentLength: LPDWORD, lpFileSystemFlags: LPDWORD, lpFileSystemNameBuffer: LPWSTR, nFileSystemNameSize: DWORD, ) -> BOOL405     pub fn GetVolumeInformationByHandleW(
406         hFile: HANDLE,
407         lpVolumeNameBuffer: LPWSTR,
408         nVolumeNameSize: DWORD,
409         lpVolumeSerialNumber: LPDWORD,
410         lpMaximumComponentLength: LPDWORD,
411         lpFileSystemFlags: LPDWORD,
412         lpFileSystemNameBuffer: LPWSTR,
413         nFileSystemNameSize: DWORD,
414     ) -> BOOL;
GetVolumeInformationW( lpRootPathName: LPCWSTR, lpVolumeNameBuffer: LPWSTR, nVolumeNameSize: DWORD, lpVolumeSerialNumber: LPDWORD, lpMaximumComponentLength: LPDWORD, lpFileSystemFlags: LPDWORD, lpFileSystemNameBuffer: LPWSTR, nFileSystemNameSize: DWORD, ) -> BOOL415     pub fn GetVolumeInformationW(
416         lpRootPathName: LPCWSTR,
417         lpVolumeNameBuffer: LPWSTR,
418         nVolumeNameSize: DWORD,
419         lpVolumeSerialNumber: LPDWORD,
420         lpMaximumComponentLength: LPDWORD,
421         lpFileSystemFlags: LPDWORD,
422         lpFileSystemNameBuffer: LPWSTR,
423         nFileSystemNameSize: DWORD,
424     ) -> BOOL;
GetVolumePathNameW( lpszFileName: LPCWSTR, lpszVolumePathName: LPWSTR, cchBufferLength: DWORD, ) -> BOOL425     pub fn GetVolumePathNameW(
426         lpszFileName: LPCWSTR,
427         lpszVolumePathName: LPWSTR,
428         cchBufferLength: DWORD,
429     ) -> BOOL;
LocalFileTimeToFileTime( lpLocalFileTime: *const FILETIME, lpFileTime: LPFILETIME, ) -> BOOL430     pub fn LocalFileTimeToFileTime(
431         lpLocalFileTime: *const FILETIME,
432         lpFileTime: LPFILETIME,
433     ) -> BOOL;
LockFile( hFile: HANDLE, dwFileOffsetLow: DWORD, dwFileOffsetHigh: DWORD, nNumberOfBytesToLockLow: DWORD, nNumberOfBytesToLockHigh: DWORD, ) -> BOOL434     pub fn LockFile(
435         hFile: HANDLE,
436         dwFileOffsetLow: DWORD,
437         dwFileOffsetHigh: DWORD,
438         nNumberOfBytesToLockLow: DWORD,
439         nNumberOfBytesToLockHigh: DWORD,
440     ) -> BOOL;
LockFileEx( hFile: HANDLE, dwFlags: DWORD, dwReserved: DWORD, nNumberOfBytesToLockLow: DWORD, nNumberOfBytesToLockHigh: DWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL441     pub fn LockFileEx(
442         hFile: HANDLE,
443         dwFlags: DWORD,
444         dwReserved: DWORD,
445         nNumberOfBytesToLockLow: DWORD,
446         nNumberOfBytesToLockHigh: DWORD,
447         lpOverlapped: LPOVERLAPPED,
448     ) -> BOOL;
QueryDosDeviceW( lpDeviceName: LPCWSTR, lpTargetPath: LPWSTR, ucchMax: DWORD ) -> DWORD449     pub fn QueryDosDeviceW(
450         lpDeviceName: LPCWSTR,
451         lpTargetPath: LPWSTR,
452         ucchMax: DWORD
453     ) -> DWORD;
ReadFile( hFile: HANDLE, lpBuffer: LPVOID, nNumberOfBytesToRead: DWORD, lpNumberOfBytesRead: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL454     pub fn ReadFile(
455         hFile: HANDLE,
456         lpBuffer: LPVOID,
457         nNumberOfBytesToRead: DWORD,
458         lpNumberOfBytesRead: LPDWORD,
459         lpOverlapped: LPOVERLAPPED,
460     ) -> BOOL;
ReadFileEx( hFile: HANDLE, lpBuffer: LPVOID, nNumberOfBytesToRead: DWORD, lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, ) -> BOOL461     pub fn ReadFileEx(
462         hFile: HANDLE,
463         lpBuffer: LPVOID,
464         nNumberOfBytesToRead: DWORD,
465         lpOverlapped: LPOVERLAPPED,
466         lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
467     ) -> BOOL;
ReadFileScatter( hFile: HANDLE, aSegmentArray: *mut FILE_SEGMENT_ELEMENT, nNumberOfBytesToRead: DWORD, lpReserved: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL468     pub fn ReadFileScatter(
469         hFile: HANDLE,
470         aSegmentArray: *mut FILE_SEGMENT_ELEMENT,
471         nNumberOfBytesToRead: DWORD,
472         lpReserved: LPDWORD,
473         lpOverlapped: LPOVERLAPPED,
474     ) -> BOOL;
RemoveDirectoryA( lpPathName: LPCSTR ) -> BOOL475     pub fn RemoveDirectoryA(
476         lpPathName: LPCSTR
477     ) -> BOOL;
RemoveDirectoryW( lpPathName: LPCWSTR ) -> BOOL478     pub fn RemoveDirectoryW(
479         lpPathName: LPCWSTR
480     ) -> BOOL;
SetEndOfFile( hFile: HANDLE ) -> BOOL481     pub fn SetEndOfFile(
482         hFile: HANDLE
483     ) -> BOOL;
SetFileAttributesA( lpFileName: LPCSTR, dwFileAttributes: DWORD ) -> BOOL484     pub fn SetFileAttributesA(
485         lpFileName: LPCSTR,
486         dwFileAttributes: DWORD
487     ) -> BOOL;
SetFileAttributesW( lpFileName: LPCWSTR, dwFileAttributes: DWORD ) -> BOOL488     pub fn SetFileAttributesW(
489         lpFileName: LPCWSTR,
490         dwFileAttributes: DWORD
491     ) -> BOOL;
SetFileInformationByHandle( hFile: HANDLE, FileInformationClass: FILE_INFO_BY_HANDLE_CLASS, lpFileInformation: LPVOID, dwBufferSize: DWORD, ) -> BOOL492     pub fn SetFileInformationByHandle(
493         hFile: HANDLE,
494         FileInformationClass: FILE_INFO_BY_HANDLE_CLASS,
495         lpFileInformation: LPVOID,
496         dwBufferSize: DWORD,
497     ) -> BOOL;
SetFilePointer( hFile: HANDLE, lDistanceToMove: LONG, lpDistanceToMoveHigh: PLONG, dwMoveMethod: DWORD, ) -> DWORD498     pub fn SetFilePointer(
499         hFile: HANDLE,
500         lDistanceToMove: LONG,
501         lpDistanceToMoveHigh: PLONG,
502         dwMoveMethod: DWORD,
503     ) -> DWORD;
SetFilePointerEx( hFile: HANDLE, liDistanceToMove: LARGE_INTEGER, lpNewFilePointer: PLARGE_INTEGER, dwMoveMethod: DWORD, ) -> BOOL504     pub fn SetFilePointerEx(
505         hFile: HANDLE,
506         liDistanceToMove: LARGE_INTEGER,
507         lpNewFilePointer: PLARGE_INTEGER,
508         dwMoveMethod: DWORD,
509     ) -> BOOL;
SetFileTime( hFile: HANDLE, lpCreationTime: *const FILETIME, lpLastAccessTime: *const FILETIME, lpLastWriteTime: *const FILETIME, ) -> BOOL510     pub fn SetFileTime(
511         hFile: HANDLE,
512         lpCreationTime: *const FILETIME,
513         lpLastAccessTime: *const FILETIME,
514         lpLastWriteTime: *const FILETIME,
515     ) -> BOOL;
SetFileValidData( hFile: HANDLE, ValidDataLength: LONGLONG ) -> BOOL516     pub fn SetFileValidData(
517         hFile: HANDLE,
518         ValidDataLength: LONGLONG
519     ) -> BOOL;
UnlockFile( hFile: HANDLE, dwFileOffsetLow: DWORD, dwFileOffsetHigh: DWORD, nNumberOfBytesToUnlockLow: DWORD, nNumberOfBytesToUnlockHigh: DWORD, ) -> BOOL520     pub fn UnlockFile(
521         hFile: HANDLE,
522         dwFileOffsetLow: DWORD,
523         dwFileOffsetHigh: DWORD,
524         nNumberOfBytesToUnlockLow: DWORD,
525         nNumberOfBytesToUnlockHigh: DWORD,
526     ) -> BOOL;
UnlockFileEx( hFile: HANDLE, dwReserved: DWORD, nNumberOfBytesToUnlockLow: DWORD, nNumberOfBytesToUnlockHigh: DWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL527     pub fn UnlockFileEx(
528         hFile: HANDLE,
529         dwReserved: DWORD,
530         nNumberOfBytesToUnlockLow: DWORD,
531         nNumberOfBytesToUnlockHigh: DWORD,
532         lpOverlapped: LPOVERLAPPED,
533     ) -> BOOL;
WriteFile( hFile: HANDLE, lpBuffer: LPCVOID, nNumberOfBytesToWrite: DWORD, lpNumberOfBytesWritten: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL534     pub fn WriteFile(
535         hFile: HANDLE,
536         lpBuffer: LPCVOID,
537         nNumberOfBytesToWrite: DWORD,
538         lpNumberOfBytesWritten: LPDWORD,
539         lpOverlapped: LPOVERLAPPED,
540     ) -> BOOL;
WriteFileEx( hFile: HANDLE, lpBuffer: LPCVOID, nNumberOfBytesToWrite: DWORD, lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE, ) -> BOOL541     pub fn WriteFileEx(
542         hFile: HANDLE,
543         lpBuffer: LPCVOID,
544         nNumberOfBytesToWrite: DWORD,
545         lpOverlapped: LPOVERLAPPED,
546         lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE,
547     ) -> BOOL;
WriteFileGather( hFile: HANDLE, aSegmentArray: *mut FILE_SEGMENT_ELEMENT, nNumberOfBytesToWrite: DWORD, lpReserved: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL548     pub fn WriteFileGather(
549         hFile: HANDLE,
550         aSegmentArray: *mut FILE_SEGMENT_ELEMENT,
551         nNumberOfBytesToWrite: DWORD,
552         lpReserved: LPDWORD,
553         lpOverlapped: LPOVERLAPPED,
554     ) -> BOOL;
GetTempPathW( nBufferLength: DWORD, lpBuffer: LPWSTR ) -> DWORD555     pub fn GetTempPathW(
556         nBufferLength: DWORD,
557         lpBuffer: LPWSTR
558     ) -> DWORD;
GetVolumeNameForVolumeMountPointW( lpszVolumeMountPoint: LPCWSTR, lpszVolumeName: LPWSTR, cchBufferLength: DWORD, ) -> BOOL559     pub fn GetVolumeNameForVolumeMountPointW(
560         lpszVolumeMountPoint: LPCWSTR,
561         lpszVolumeName: LPWSTR,
562         cchBufferLength: DWORD,
563     ) -> BOOL;
GetVolumePathNamesForVolumeNameW( lpszVolumeName: LPCWSTR, lpszVolumePathNames: LPWCH, cchBufferLength: DWORD, lpcchReturnLength: PDWORD, ) -> BOOL564     pub fn GetVolumePathNamesForVolumeNameW(
565         lpszVolumeName: LPCWSTR,
566         lpszVolumePathNames: LPWCH,
567         cchBufferLength: DWORD,
568         lpcchReturnLength: PDWORD,
569     ) -> BOOL;
CreateFile2( lpFileName: LPCWSTR, dwDesiredAccess: DWORD, dwShareMode: DWORD, dwCreationDisposition: DWORD, pCreateExParams: LPCREATEFILE2_EXTENDED_PARAMETERS, ) -> HANDLE570     pub fn CreateFile2(
571         lpFileName: LPCWSTR,
572         dwDesiredAccess: DWORD,
573         dwShareMode: DWORD,
574         dwCreationDisposition: DWORD,
575         pCreateExParams: LPCREATEFILE2_EXTENDED_PARAMETERS,
576     ) -> HANDLE;
SetFileIoOverlappedRange( FileHandle: HANDLE, OverlappedRangeStart: PUCHAR, Length: ULONG, ) -> BOOL577     pub fn SetFileIoOverlappedRange(
578         FileHandle: HANDLE,
579         OverlappedRangeStart: PUCHAR,
580         Length: ULONG,
581     ) -> BOOL;
GetCompressedFileSizeA( lpFileName: LPCSTR, lpFileSizeHigh: LPDWORD ) -> DWORD582     pub fn GetCompressedFileSizeA(
583         lpFileName: LPCSTR,
584         lpFileSizeHigh: LPDWORD
585     ) -> DWORD;
GetCompressedFileSizeW( lpFileName: LPCWSTR, lpFileSizeHigh: LPDWORD ) -> DWORD586     pub fn GetCompressedFileSizeW(
587         lpFileName: LPCWSTR,
588         lpFileSizeHigh: LPDWORD
589     ) -> DWORD;
590 }
591 ENUM!{enum STREAM_INFO_LEVELS {
592     FindStreamInfoStandard,
593     FindStreamInfoMaxInfoLevel,
594 }}
595 extern "system" {
FindFirstStreamW( lpFileName: LPCWSTR, InfoLevel: STREAM_INFO_LEVELS, lpFindStreamData: LPVOID, dwFlags: DWORD, ) -> HANDLE596     pub fn FindFirstStreamW(
597         lpFileName: LPCWSTR,
598         InfoLevel: STREAM_INFO_LEVELS,
599         lpFindStreamData: LPVOID,
600         dwFlags: DWORD,
601     ) -> HANDLE;
FindNextStreamW( hFindStream: HANDLE, lpFindStreamData: LPVOID ) -> BOOL602     pub fn FindNextStreamW(
603         hFindStream: HANDLE,
604         lpFindStreamData: LPVOID
605     ) -> BOOL;
AreFileApisANSI() -> BOOL606     pub fn AreFileApisANSI() -> BOOL;
GetTempPathA( nBufferLength: DWORD, lpBuffer: LPSTR ) -> DWORD607     pub fn GetTempPathA(
608         nBufferLength: DWORD,
609         lpBuffer: LPSTR
610     ) -> DWORD;
FindFirstFileNameW( lpFileName: LPCWSTR, dwFlags: DWORD, StringLength: LPDWORD, LinkName: PWSTR, ) -> HANDLE611     pub fn FindFirstFileNameW(
612         lpFileName: LPCWSTR,
613         dwFlags: DWORD,
614         StringLength: LPDWORD,
615         LinkName: PWSTR,
616     ) -> HANDLE;
FindNextFileNameW( hFindStream: HANDLE, StringLength: LPDWORD, LinkName: PWSTR ) -> BOOL617     pub fn FindNextFileNameW(
618         hFindStream: HANDLE,
619         StringLength: LPDWORD,
620         LinkName: PWSTR
621     ) -> BOOL;
GetVolumeInformationA( lpRootPathName: LPCSTR, lpVolumeNameBuffer: LPSTR, nVolumeNameSize: DWORD, lpVolumeSerialNumber: LPDWORD, lpMaximumComponentLength: LPDWORD, lpFileSystemFlags: LPDWORD, lpFileSystemNameBuffer: LPSTR, nFileSystemNameSize: DWORD, ) -> BOOL622     pub fn GetVolumeInformationA(
623         lpRootPathName: LPCSTR,
624         lpVolumeNameBuffer: LPSTR,
625         nVolumeNameSize: DWORD,
626         lpVolumeSerialNumber: LPDWORD,
627         lpMaximumComponentLength: LPDWORD,
628         lpFileSystemFlags: LPDWORD,
629         lpFileSystemNameBuffer: LPSTR,
630         nFileSystemNameSize: DWORD,
631     ) -> BOOL;
GetTempFileNameA( lpPathName: LPCSTR, lpPrefixString: LPCSTR, uUnique: UINT, lpTempFileName: LPSTR, ) -> UINT632     pub fn GetTempFileNameA(
633         lpPathName: LPCSTR,
634         lpPrefixString: LPCSTR,
635         uUnique: UINT,
636         lpTempFileName: LPSTR,
637     ) -> UINT;
SetFileApisToOEM()638     pub fn SetFileApisToOEM();
SetFileApisToANSI()639     pub fn SetFileApisToANSI();
640 }
641