Skip to content

Commit 77de724

Browse files
committed
Distribute libntdll.a with windows-gnu toolchains
This allows loading some essential functions (e.g. read/write file) at load time instead of lazily.
1 parent 7e253a7 commit 77de724

File tree

2 files changed

+41
-47
lines changed

2 files changed

+41
-47
lines changed

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

+40-47
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@ pub const STATUS_INVALID_PARAMETER: NTSTATUS = 0xc000000d_u32 as _;
287287

288288
pub const STATUS_PENDING: NTSTATUS = 0x103 as _;
289289
pub const STATUS_END_OF_FILE: NTSTATUS = 0xC0000011_u32 as _;
290-
pub const STATUS_NOT_IMPLEMENTED: NTSTATUS = 0xC0000002_u32 as _;
291290

292291
// Equivalent to the `NT_SUCCESS` C preprocessor macro.
293292
// See: https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/using-ntstatus-values
@@ -1262,6 +1261,46 @@ extern "system" {
12621261
) -> NTSTATUS;
12631262
}
12641263

1264+
#[link(name = "ntdll")]
1265+
extern "system" {
1266+
pub fn NtCreateFile(
1267+
FileHandle: *mut HANDLE,
1268+
DesiredAccess: ACCESS_MASK,
1269+
ObjectAttributes: *const OBJECT_ATTRIBUTES,
1270+
IoStatusBlock: *mut IO_STATUS_BLOCK,
1271+
AllocationSize: *mut i64,
1272+
FileAttributes: ULONG,
1273+
ShareAccess: ULONG,
1274+
CreateDisposition: ULONG,
1275+
CreateOptions: ULONG,
1276+
EaBuffer: *mut c_void,
1277+
EaLength: ULONG,
1278+
) -> NTSTATUS;
1279+
pub fn NtReadFile(
1280+
FileHandle: BorrowedHandle<'_>,
1281+
Event: HANDLE,
1282+
ApcRoutine: Option<IO_APC_ROUTINE>,
1283+
ApcContext: *mut c_void,
1284+
IoStatusBlock: &mut IO_STATUS_BLOCK,
1285+
Buffer: *mut crate::mem::MaybeUninit<u8>,
1286+
Length: ULONG,
1287+
ByteOffset: Option<&LARGE_INTEGER>,
1288+
Key: Option<&ULONG>,
1289+
) -> NTSTATUS;
1290+
pub fn NtWriteFile(
1291+
FileHandle: BorrowedHandle<'_>,
1292+
Event: HANDLE,
1293+
ApcRoutine: Option<IO_APC_ROUTINE>,
1294+
ApcContext: *mut c_void,
1295+
IoStatusBlock: &mut IO_STATUS_BLOCK,
1296+
Buffer: *const u8,
1297+
Length: ULONG,
1298+
ByteOffset: Option<&LARGE_INTEGER>,
1299+
Key: Option<&ULONG>,
1300+
) -> NTSTATUS;
1301+
pub fn RtlNtStatusToDosError(Status: NTSTATUS) -> ULONG;
1302+
}
1303+
12651304
// Functions that aren't available on every version of Windows that we support,
12661305
// but we still use them and just provide some form of a fallback implementation.
12671306
compat_fn_with_fallback! {
@@ -1302,52 +1341,6 @@ compat_fn_optional! {
13021341
compat_fn_with_fallback! {
13031342
pub static NTDLL: &CStr = ansi_str!("ntdll");
13041343

1305-
pub fn NtCreateFile(
1306-
FileHandle: *mut HANDLE,
1307-
DesiredAccess: ACCESS_MASK,
1308-
ObjectAttributes: *const OBJECT_ATTRIBUTES,
1309-
IoStatusBlock: *mut IO_STATUS_BLOCK,
1310-
AllocationSize: *mut i64,
1311-
FileAttributes: ULONG,
1312-
ShareAccess: ULONG,
1313-
CreateDisposition: ULONG,
1314-
CreateOptions: ULONG,
1315-
EaBuffer: *mut c_void,
1316-
EaLength: ULONG
1317-
) -> NTSTATUS {
1318-
STATUS_NOT_IMPLEMENTED
1319-
}
1320-
pub fn NtReadFile(
1321-
FileHandle: BorrowedHandle<'_>,
1322-
Event: HANDLE,
1323-
ApcRoutine: Option<IO_APC_ROUTINE>,
1324-
ApcContext: *mut c_void,
1325-
IoStatusBlock: &mut IO_STATUS_BLOCK,
1326-
Buffer: *mut crate::mem::MaybeUninit<u8>,
1327-
Length: ULONG,
1328-
ByteOffset: Option<&LARGE_INTEGER>,
1329-
Key: Option<&ULONG>
1330-
) -> NTSTATUS {
1331-
STATUS_NOT_IMPLEMENTED
1332-
}
1333-
pub fn NtWriteFile(
1334-
FileHandle: BorrowedHandle<'_>,
1335-
Event: HANDLE,
1336-
ApcRoutine: Option<IO_APC_ROUTINE>,
1337-
ApcContext: *mut c_void,
1338-
IoStatusBlock: &mut IO_STATUS_BLOCK,
1339-
Buffer: *const u8,
1340-
Length: ULONG,
1341-
ByteOffset: Option<&LARGE_INTEGER>,
1342-
Key: Option<&ULONG>
1343-
) -> NTSTATUS {
1344-
STATUS_NOT_IMPLEMENTED
1345-
}
1346-
pub fn RtlNtStatusToDosError(
1347-
Status: NTSTATUS
1348-
) -> ULONG {
1349-
Status as ULONG
1350-
}
13511344
pub fn NtCreateKeyedEvent(
13521345
KeyedEventHandle: LPHANDLE,
13531346
DesiredAccess: ACCESS_MASK,

src/bootstrap/dist.rs

+1
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ fn make_win_dist(
234234
"libkernel32.a",
235235
"libmsimg32.a",
236236
"libmsvcrt.a",
237+
"libntdll.a",
237238
"libodbc32.a",
238239
"libole32.a",
239240
"liboleaut32.a",

0 commit comments

Comments
 (0)