Skip to content

Commit 01c6da5

Browse files
committed
Reimplement Win32 APIs for GetFileInformationByHandleEx and SetFileInformationByHandle
Reimplement them on-top of native NT APIs as done in `fileextd.lib`. This allows more file system APIs to work on XP and below. Affected APIs: - File truncation (can now set end of file without multiple SetFilePointerEx calls on NT) - Cleaner fallback impl for reparse tags - remove_dir_all: Modern impl now supported on all NT-based systems
1 parent 44a13b9 commit 01c6da5

File tree

6 files changed

+301
-48
lines changed

6 files changed

+301
-48
lines changed

library/std/src/sys/pal/windows/c.rs

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use core::{mem, ptr};
1313
mod windows_sys;
1414
pub use windows_sys::*;
1515

16+
#[cfg(target_vendor = "rust9x")]
17+
pub(crate) mod fileextd;
1618
#[cfg(target_vendor = "rust9x")]
1719
pub(crate) mod wspiapi;
1820

@@ -436,29 +438,6 @@ compat_fn_with_fallback! {
436438
TRUE
437439
}
438440
}
439-
440-
// >= Vista / Server 2008 (XP / Server 2003 when linking a supported FileExtd.lib)
441-
// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfileinformationbyhandle
442-
pub fn SetFileInformationByHandle(
443-
hfile: HANDLE,
444-
fileinformationclass: FILE_INFO_BY_HANDLE_CLASS,
445-
lpfileinformation: *const ::core::ffi::c_void,
446-
dwbuffersize: u32,
447-
) -> BOOL {
448-
unsafe { SetLastError(ERROR_CALL_NOT_IMPLEMENTED as u32); };
449-
FALSE
450-
}
451-
// >= Vista / Server 2008 (XP / Server 2003 when linking a supported FileExtd.lib)
452-
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getfileinformationbyhandleex
453-
pub fn GetFileInformationByHandleEx(
454-
hfile: HANDLE,
455-
fileinformationclass: FILE_INFO_BY_HANDLE_CLASS,
456-
lpfileinformation: *mut ::core::ffi::c_void,
457-
dwbuffersize: u32,
458-
) -> BOOL {
459-
unsafe { SetLastError(ERROR_CALL_NOT_IMPLEMENTED as u32); };
460-
FALSE
461-
}
462441
}
463442

464443
#[cfg(target_vendor = "rust9x")]
@@ -704,3 +683,51 @@ compat_fn_with_fallback! {
704683
FALSE
705684
}
706685
}
686+
687+
#[cfg(target_vendor = "rust9x")]
688+
pub(crate) use fileextd::{
689+
get_file_information_by_handle_ex as GetFileInformationByHandleEx,
690+
set_file_information_by_handle as SetFileInformationByHandle,
691+
};
692+
#[cfg(target_vendor = "rust9x")]
693+
compat_fn_with_fallback! {
694+
pub static NTDLL: &CStr = c"ntdll" => { load: true, unicows: false };
695+
// all NT only
696+
fn NtQueryDirectoryFile(
697+
filehandle: HANDLE,
698+
event: HANDLE,
699+
apcroutine: PIO_APC_ROUTINE,
700+
apccontext: *const core::ffi::c_void,
701+
iostatusblock: *mut IO_STATUS_BLOCK,
702+
fileinformation: *mut core::ffi::c_void,
703+
length: u32,
704+
fileinformationclass: FILE_INFORMATION_CLASS,
705+
returnsingleentry: BOOLEAN,
706+
filename: *const UNICODE_STRING,
707+
restartscan: BOOLEAN
708+
) -> NTSTATUS {
709+
rtabort!("unimplemented")
710+
}
711+
fn NtQueryInformationFile(filehandle: HANDLE,
712+
iostatusblock: *mut IO_STATUS_BLOCK,
713+
fileinformation: *mut core::ffi::c_void,
714+
length: u32,
715+
fileinformationclass: FILE_INFORMATION_CLASS
716+
) -> NTSTATUS {
717+
rtabort!("unimplemented")
718+
}
719+
fn NtSetInformationFile(filehandle: HANDLE,
720+
iostatusblock: *mut IO_STATUS_BLOCK,
721+
fileinformation: *const core::ffi::c_void,
722+
length: u32,
723+
fileinformationclass: FILE_INFORMATION_CLASS
724+
) -> NTSTATUS {
725+
rtabort!("unimplemented")
726+
}
727+
fn NtWaitForSingleObject(handle: HANDLE,
728+
alertable: BOOLEAN,
729+
timeout: *mut i64
730+
) -> NTSTATUS {
731+
rtabort!("unimplemented")
732+
}
733+
}

library/std/src/sys/pal/windows/c/bindings.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Windows.Wdk.Storage.FileSystem.FILE_CREATE_TREE_CONNECTION
99
Windows.Wdk.Storage.FileSystem.FILE_DELETE_ON_CLOSE
1010
Windows.Wdk.Storage.FileSystem.FILE_DIRECTORY_FILE
1111
Windows.Wdk.Storage.FileSystem.FILE_DISALLOW_EXCLUSIVE
12+
Windows.Wdk.Storage.FileSystem.FILE_INFORMATION_CLASS
1213
Windows.Wdk.Storage.FileSystem.FILE_NO_COMPRESSION
1314
Windows.Wdk.Storage.FileSystem.FILE_NO_EA_KNOWLEDGE
1415
Windows.Wdk.Storage.FileSystem.FILE_NO_INTERMEDIATE_BUFFERING
@@ -31,13 +32,25 @@ Windows.Wdk.Storage.FileSystem.FILE_SUPERSEDE
3132
Windows.Wdk.Storage.FileSystem.FILE_SYNCHRONOUS_IO_ALERT
3233
Windows.Wdk.Storage.FileSystem.FILE_SYNCHRONOUS_IO_NONALERT
3334
Windows.Wdk.Storage.FileSystem.FILE_WRITE_THROUGH
35+
Windows.Wdk.Storage.FileSystem.FileAttributeTagInformation
36+
Windows.Wdk.Storage.FileSystem.FileBasicInformation
37+
Windows.Wdk.Storage.FileSystem.FileDispositionInformation
38+
Windows.Wdk.Storage.FileSystem.FileDispositionInformationEx
39+
Windows.Wdk.Storage.FileSystem.FileEndOfFileInformation
40+
Windows.Wdk.Storage.FileSystem.FileFullDirectoryInformation
41+
Windows.Wdk.Storage.FileSystem.FileFullDirectoryInformation
42+
Windows.Wdk.Storage.FileSystem.FileNameInformation
3443
Windows.Wdk.Storage.FileSystem.NtCreateFile
3544
Windows.Wdk.Storage.FileSystem.NTCREATEFILE_CREATE_DISPOSITION
3645
Windows.Wdk.Storage.FileSystem.NTCREATEFILE_CREATE_OPTIONS
3746
Windows.Wdk.Storage.FileSystem.NtOpenFile
47+
Windows.Wdk.Storage.FileSystem.NtQueryDirectoryFile
48+
Windows.Wdk.Storage.FileSystem.NtQueryInformationFile
3849
Windows.Wdk.Storage.FileSystem.NtReadFile
50+
Windows.Wdk.Storage.FileSystem.NtSetInformationFile
3951
Windows.Wdk.Storage.FileSystem.NtWriteFile
4052
Windows.Wdk.Storage.FileSystem.SYMLINK_FLAG_RELATIVE
53+
Windows.Wdk.System.Threading.NtWaitForSingleObject
4154
Windows.Win32.Foundation.BOOL
4255
Windows.Win32.Foundation.BOOLEAN
4356
Windows.Win32.Foundation.CloseHandle
@@ -2295,13 +2308,15 @@ Windows.Win32.Storage.FileSystem.FILE_FLAG_SEQUENTIAL_SCAN
22952308
Windows.Win32.Storage.FileSystem.FILE_FLAG_SESSION_AWARE
22962309
Windows.Win32.Storage.FileSystem.FILE_FLAG_WRITE_THROUGH
22972310
Windows.Win32.Storage.FileSystem.FILE_FLAGS_AND_ATTRIBUTES
2311+
Windows.Win32.Storage.FileSystem.FILE_FULL_DIR_INFO
22982312
Windows.Win32.Storage.FileSystem.FILE_GENERIC_EXECUTE
22992313
Windows.Win32.Storage.FileSystem.FILE_GENERIC_READ
23002314
Windows.Win32.Storage.FileSystem.FILE_GENERIC_WRITE
23012315
Windows.Win32.Storage.FileSystem.FILE_ID_BOTH_DIR_INFO
23022316
Windows.Win32.Storage.FileSystem.FILE_INFO_BY_HANDLE_CLASS
23032317
Windows.Win32.Storage.FileSystem.FILE_IO_PRIORITY_HINT_INFO
23042318
Windows.Win32.Storage.FileSystem.FILE_LIST_DIRECTORY
2319+
Windows.Win32.Storage.FileSystem.FILE_NAME_INFO
23052320
Windows.Win32.Storage.FileSystem.FILE_NAME_NORMALIZED
23062321
Windows.Win32.Storage.FileSystem.FILE_NAME_OPENED
23072322
Windows.Win32.Storage.FileSystem.FILE_READ_ATTRIBUTES
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
//! Manual implementation of a subset of `GetFileInformationByHandleEx` and
2+
//! `SetFileInformationByHandle` based on `fileextd.lib` from Microsoft. Many of their later-added
3+
//! APIs do exist all the way back to NT3.1, but were not exposed via a Win32 API until later.
4+
5+
use super::*;
6+
7+
pub(crate) unsafe fn get_file_information_by_handle_ex(
8+
file_handle: HANDLE,
9+
fileinformationclass: FILE_INFO_BY_HANDLE_CLASS,
10+
lpfileinformation: *mut core::ffi::c_void,
11+
dwbuffersize: u32,
12+
) -> BOOL {
13+
if !crate::sys::compat::checks::is_windows_nt() {
14+
unsafe { SetLastError(ERROR_CALL_NOT_IMPLEMENTED) };
15+
return FALSE;
16+
}
17+
18+
unsafe {
19+
#[allow(non_upper_case_globals)]
20+
let (class, min_buffer_size, use_directory_api_info): (
21+
FILE_INFORMATION_CLASS,
22+
u32,
23+
Option<bool>,
24+
) = match fileinformationclass {
25+
FileBasicInfo => {
26+
(FileBasicInformation, core::mem::size_of::<FILE_BASIC_INFO>() as u32, None)
27+
}
28+
FileNameInfo => {
29+
(FileNameInformation, core::mem::size_of::<FILE_NAME_INFO>() as u32, None)
30+
}
31+
FileAttributeTagInfo => (
32+
// NT API: 2000 and up
33+
FileAttributeTagInformation,
34+
core::mem::size_of::<FILE_ATTRIBUTE_TAG_INFO>() as u32,
35+
None,
36+
),
37+
// rust9x: replaced with the following two
38+
// FileIdBothDirectoryInfo => (
39+
// // NT API: XP/2003 and up; exposed via Win32 API since Vista
40+
// FileIdBothDirectoryInformation,
41+
// core::mem::size_of::<FILE_ID_BOTH_DIR_INFO>() as u32,
42+
// Some(false),
43+
// ),
44+
// FileIdBothDirectoryRestartInfo => (
45+
// // NT API: XP/2003 and up; exposed via Win32 API since Vista
46+
// FileIdBothDirectoryInformation,
47+
// core::mem::size_of::<FILE_ID_BOTH_DIR_INFO>() as u32,
48+
// Some(true),
49+
// ),
50+
FileFullDirectoryInfo => (
51+
// NT API: at least NT4 but likely 3.1+; exposed via Win32 API since Win8
52+
FileFullDirectoryInformation,
53+
core::mem::size_of::<FILE_FULL_DIR_INFO>() as u32,
54+
Some(false),
55+
),
56+
FileFullDirectoryRestartInfo => (
57+
// NT API: at least NT4 but likely 3.1+; exposed via Win32 API since Win8
58+
FileFullDirectoryInformation,
59+
core::mem::size_of::<FILE_FULL_DIR_INFO>() as u32,
60+
Some(true),
61+
),
62+
_ => {
63+
SetLastError(ERROR_INVALID_PARAMETER);
64+
return FALSE;
65+
}
66+
};
67+
68+
if dwbuffersize < min_buffer_size {
69+
SetLastError(ERROR_BAD_LENGTH);
70+
return FALSE;
71+
}
72+
73+
let mut io_status_block: IO_STATUS_BLOCK = core::mem::zeroed();
74+
let mut status = if let Some(restart_scan) = use_directory_api_info {
75+
NtQueryDirectoryFile(
76+
file_handle,
77+
core::ptr::null_mut(),
78+
None,
79+
core::ptr::null(),
80+
&mut io_status_block,
81+
lpfileinformation,
82+
dwbuffersize,
83+
class,
84+
false as BOOLEAN,
85+
core::ptr::null(),
86+
restart_scan as BOOLEAN,
87+
)
88+
} else {
89+
NtQueryInformationFile(
90+
file_handle,
91+
&mut io_status_block,
92+
lpfileinformation,
93+
dwbuffersize,
94+
class,
95+
)
96+
};
97+
98+
if status == STATUS_PENDING {
99+
status = NtWaitForSingleObject(file_handle, false as BOOLEAN, core::ptr::null_mut());
100+
}
101+
102+
if status < 0 {
103+
set_last_error_from_ntstatus(status);
104+
return FALSE;
105+
}
106+
107+
// keeping for reference; FileStreamInformation is not used by the standard library
108+
// currently if class == FileStreamInformation && io_status_block.Information == 0 {
109+
// set_last_error_from_ntstatus(STATUS_END_OF_FILE); return FALSE; }
110+
}
111+
TRUE
112+
}
113+
114+
pub(crate) unsafe fn set_file_information_by_handle(
115+
file_handle: HANDLE,
116+
fileinformationclass: FILE_INFO_BY_HANDLE_CLASS,
117+
lpfileinformation: *const core::ffi::c_void,
118+
dwbuffersize: u32,
119+
) -> BOOL {
120+
if !crate::sys::compat::checks::is_windows_nt() {
121+
unsafe { SetLastError(ERROR_CALL_NOT_IMPLEMENTED) };
122+
return FALSE;
123+
}
124+
125+
unsafe {
126+
#[allow(non_upper_case_globals)]
127+
let (class, min_buffer_size): (FILE_INFORMATION_CLASS, u32) = match fileinformationclass {
128+
FileBasicInfo => (FileBasicInformation, core::mem::size_of::<FILE_BASIC_INFO>() as u32),
129+
FileEndOfFileInfo => {
130+
(FileEndOfFileInformation, core::mem::size_of::<FILE_END_OF_FILE_INFO>() as u32)
131+
}
132+
FileDispositionInfo => {
133+
(FileDispositionInformation, core::mem::size_of::<FILE_DISPOSITION_INFO>() as u32)
134+
}
135+
FileDispositionInfoEx => (
136+
// NT API: some Windows 10 version
137+
FileDispositionInformationEx,
138+
core::mem::size_of::<FILE_DISPOSITION_INFO_EX>() as u32,
139+
),
140+
_ => {
141+
SetLastError(ERROR_INVALID_PARAMETER);
142+
return FALSE;
143+
}
144+
};
145+
146+
if dwbuffersize < min_buffer_size {
147+
SetLastError(ERROR_BAD_LENGTH);
148+
return FALSE;
149+
}
150+
151+
let mut io_status_block: IO_STATUS_BLOCK = core::mem::zeroed();
152+
let status = NtSetInformationFile(
153+
file_handle,
154+
&mut io_status_block,
155+
lpfileinformation,
156+
dwbuffersize,
157+
class,
158+
);
159+
160+
if status < 0 {
161+
set_last_error_from_ntstatus(status);
162+
return FALSE;
163+
}
164+
}
165+
166+
TRUE
167+
}
168+
169+
fn set_last_error_from_ntstatus(status: NTSTATUS) {
170+
unsafe {
171+
let error = RtlNtStatusToDosError(status);
172+
SetLastError(error);
173+
}
174+
}

library/std/src/sys/pal/windows/c/windows_sys.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,11 @@ windows_targets::link!("kernel32.dll" "system" fn WriteFile(hfile : HANDLE, lpbu
132132
windows_targets::link!("kernel32.dll" "system" fn WriteFileEx(hfile : HANDLE, lpbuffer : *const u8, nnumberofbytestowrite : u32, lpoverlapped : *mut OVERLAPPED, lpcompletionroutine : LPOVERLAPPED_COMPLETION_ROUTINE) -> BOOL);
133133
windows_targets::link!("ntdll.dll" "system" fn NtCreateFile(filehandle : *mut HANDLE, desiredaccess : FILE_ACCESS_RIGHTS, objectattributes : *const OBJECT_ATTRIBUTES, iostatusblock : *mut IO_STATUS_BLOCK, allocationsize : *const i64, fileattributes : FILE_FLAGS_AND_ATTRIBUTES, shareaccess : FILE_SHARE_MODE, createdisposition : NTCREATEFILE_CREATE_DISPOSITION, createoptions : NTCREATEFILE_CREATE_OPTIONS, eabuffer : *const core::ffi::c_void, ealength : u32) -> NTSTATUS);
134134
windows_targets::link!("ntdll.dll" "system" fn NtOpenFile(filehandle : *mut HANDLE, desiredaccess : u32, objectattributes : *const OBJECT_ATTRIBUTES, iostatusblock : *mut IO_STATUS_BLOCK, shareaccess : u32, openoptions : u32) -> NTSTATUS);
135+
windows_targets::link!("ntdll.dll" "system" fn NtQueryDirectoryFile(filehandle : HANDLE, event : HANDLE, apcroutine : PIO_APC_ROUTINE, apccontext : *const core::ffi::c_void, iostatusblock : *mut IO_STATUS_BLOCK, fileinformation : *mut core::ffi::c_void, length : u32, fileinformationclass : FILE_INFORMATION_CLASS, returnsingleentry : BOOLEAN, filename : *const UNICODE_STRING, restartscan : BOOLEAN) -> NTSTATUS);
136+
windows_targets::link!("ntdll.dll" "system" fn NtQueryInformationFile(filehandle : HANDLE, iostatusblock : *mut IO_STATUS_BLOCK, fileinformation : *mut core::ffi::c_void, length : u32, fileinformationclass : FILE_INFORMATION_CLASS) -> NTSTATUS);
135137
windows_targets::link!("ntdll.dll" "system" fn NtReadFile(filehandle : HANDLE, event : HANDLE, apcroutine : PIO_APC_ROUTINE, apccontext : *const core::ffi::c_void, iostatusblock : *mut IO_STATUS_BLOCK, buffer : *mut core::ffi::c_void, length : u32, byteoffset : *const i64, key : *const u32) -> NTSTATUS);
138+
windows_targets::link!("ntdll.dll" "system" fn NtSetInformationFile(filehandle : HANDLE, iostatusblock : *mut IO_STATUS_BLOCK, fileinformation : *const core::ffi::c_void, length : u32, fileinformationclass : FILE_INFORMATION_CLASS) -> NTSTATUS);
139+
windows_targets::link!("ntdll.dll" "system" fn NtWaitForSingleObject(handle : HANDLE, alertable : BOOLEAN, timeout : *mut i64) -> NTSTATUS);
136140
windows_targets::link!("ntdll.dll" "system" fn NtWriteFile(filehandle : HANDLE, event : HANDLE, apcroutine : PIO_APC_ROUTINE, apccontext : *const core::ffi::c_void, iostatusblock : *mut IO_STATUS_BLOCK, buffer : *const core::ffi::c_void, length : u32, byteoffset : *const i64, key : *const u32) -> NTSTATUS);
137141
windows_targets::link!("ntdll.dll" "system" fn RtlNtStatusToDosError(status : NTSTATUS) -> u32);
138142
windows_targets::link!("userenv.dll" "system" fn GetUserProfileDirectoryW(htoken : HANDLE, lpprofiledir : PWSTR, lpcchsize : *mut u32) -> BOOL);
@@ -2477,6 +2481,22 @@ pub const FILE_FLAG_RANDOM_ACCESS: FILE_FLAGS_AND_ATTRIBUTES = 268435456u32;
24772481
pub const FILE_FLAG_SEQUENTIAL_SCAN: FILE_FLAGS_AND_ATTRIBUTES = 134217728u32;
24782482
pub const FILE_FLAG_SESSION_AWARE: FILE_FLAGS_AND_ATTRIBUTES = 8388608u32;
24792483
pub const FILE_FLAG_WRITE_THROUGH: FILE_FLAGS_AND_ATTRIBUTES = 2147483648u32;
2484+
#[repr(C)]
2485+
#[derive(Clone, Copy)]
2486+
pub struct FILE_FULL_DIR_INFO {
2487+
pub NextEntryOffset: u32,
2488+
pub FileIndex: u32,
2489+
pub CreationTime: i64,
2490+
pub LastAccessTime: i64,
2491+
pub LastWriteTime: i64,
2492+
pub ChangeTime: i64,
2493+
pub EndOfFile: i64,
2494+
pub AllocationSize: i64,
2495+
pub FileAttributes: u32,
2496+
pub FileNameLength: u32,
2497+
pub EaSize: u32,
2498+
pub FileName: [u16; 1],
2499+
}
24802500
pub const FILE_GENERIC_EXECUTE: FILE_ACCESS_RIGHTS = 1179808u32;
24812501
pub const FILE_GENERIC_READ: FILE_ACCESS_RIGHTS = 1179785u32;
24822502
pub const FILE_GENERIC_WRITE: FILE_ACCESS_RIGHTS = 1179926u32;
@@ -2499,13 +2519,20 @@ pub struct FILE_ID_BOTH_DIR_INFO {
24992519
pub FileId: i64,
25002520
pub FileName: [u16; 1],
25012521
}
2522+
pub type FILE_INFORMATION_CLASS = i32;
25022523
pub type FILE_INFO_BY_HANDLE_CLASS = i32;
25032524
#[repr(C)]
25042525
#[derive(Clone, Copy)]
25052526
pub struct FILE_IO_PRIORITY_HINT_INFO {
25062527
pub PriorityHint: PRIORITY_HINT,
25072528
}
25082529
pub const FILE_LIST_DIRECTORY: FILE_ACCESS_RIGHTS = 1u32;
2530+
#[repr(C)]
2531+
#[derive(Clone, Copy)]
2532+
pub struct FILE_NAME_INFO {
2533+
pub FileNameLength: u32,
2534+
pub FileName: [u16; 1],
2535+
}
25092536
pub const FILE_NAME_NORMALIZED: GETFINALPATHNAMEBYHANDLE_FLAGS = 0u32;
25102537
pub const FILE_NAME_OPENED: GETFINALPATHNAMEBYHANDLE_FLAGS = 8u32;
25112538
pub const FILE_NON_DIRECTORY_FILE: NTCREATEFILE_CREATE_OPTIONS = 64u32;
@@ -2602,13 +2629,19 @@ pub const FSCTL_SET_REPARSE_POINT: u32 = 589988u32;
26022629
pub const FileAlignmentInfo: FILE_INFO_BY_HANDLE_CLASS = 17i32;
26032630
pub const FileAllocationInfo: FILE_INFO_BY_HANDLE_CLASS = 5i32;
26042631
pub const FileAttributeTagInfo: FILE_INFO_BY_HANDLE_CLASS = 9i32;
2632+
pub const FileAttributeTagInformation: FILE_INFORMATION_CLASS = 35i32;
26052633
pub const FileBasicInfo: FILE_INFO_BY_HANDLE_CLASS = 0i32;
2634+
pub const FileBasicInformation: FILE_INFORMATION_CLASS = 4i32;
26062635
pub const FileCaseSensitiveInfo: FILE_INFO_BY_HANDLE_CLASS = 23i32;
26072636
pub const FileCompressionInfo: FILE_INFO_BY_HANDLE_CLASS = 8i32;
26082637
pub const FileDispositionInfo: FILE_INFO_BY_HANDLE_CLASS = 4i32;
26092638
pub const FileDispositionInfoEx: FILE_INFO_BY_HANDLE_CLASS = 21i32;
2639+
pub const FileDispositionInformation: FILE_INFORMATION_CLASS = 13i32;
2640+
pub const FileDispositionInformationEx: FILE_INFORMATION_CLASS = 64i32;
26102641
pub const FileEndOfFileInfo: FILE_INFO_BY_HANDLE_CLASS = 6i32;
2642+
pub const FileEndOfFileInformation: FILE_INFORMATION_CLASS = 20i32;
26112643
pub const FileFullDirectoryInfo: FILE_INFO_BY_HANDLE_CLASS = 14i32;
2644+
pub const FileFullDirectoryInformation: FILE_INFORMATION_CLASS = 2i32;
26122645
pub const FileFullDirectoryRestartInfo: FILE_INFO_BY_HANDLE_CLASS = 15i32;
26132646
pub const FileIdBothDirectoryInfo: FILE_INFO_BY_HANDLE_CLASS = 10i32;
26142647
pub const FileIdBothDirectoryRestartInfo: FILE_INFO_BY_HANDLE_CLASS = 11i32;
@@ -2617,6 +2650,7 @@ pub const FileIdExtdDirectoryRestartInfo: FILE_INFO_BY_HANDLE_CLASS = 20i32;
26172650
pub const FileIdInfo: FILE_INFO_BY_HANDLE_CLASS = 18i32;
26182651
pub const FileIoPriorityHintInfo: FILE_INFO_BY_HANDLE_CLASS = 12i32;
26192652
pub const FileNameInfo: FILE_INFO_BY_HANDLE_CLASS = 2i32;
2653+
pub const FileNameInformation: FILE_INFORMATION_CLASS = 9i32;
26202654
pub const FileNormalizedNameInfo: FILE_INFO_BY_HANDLE_CLASS = 24i32;
26212655
pub const FileRemoteProtocolInfo: FILE_INFO_BY_HANDLE_CLASS = 13i32;
26222656
pub const FileRenameInfo: FILE_INFO_BY_HANDLE_CLASS = 3i32;

0 commit comments

Comments
 (0)