std: Nicer way to access the PEB

Use the NtCurrentTeb API instead of using some inline asm, this is much
nicer and also more portable.

Closes #4645
This commit is contained in:
LemonBoy 2020-03-06 00:02:45 +01:00
parent eaccfffe56
commit b9a1d67637
3 changed files with 15 additions and 16 deletions

View File

@ -1084,22 +1084,7 @@ pub fn SetFileTime(
}
pub fn peb() *PEB {
switch (builtin.arch) {
.i386 => {
return asm (
\\ mov %%fs:0x18, %[ptr]
\\ mov %%ds:0x30(%[ptr]), %[ptr]
: [ptr] "=r" (-> *PEB)
);
},
.x86_64 => {
return asm (
\\ mov %%gs:0x60, %[ptr]
: [ptr] "=r" (-> *PEB)
);
},
else => @compileError("unsupported architecture"),
}
return ntdll.NtCurrentTeb().ProcessEnvironmentBlock;
}
/// A file time is a 64-bit value that represents the number of 100-nanosecond

View File

@ -1154,6 +1154,19 @@ const RTL_BITMAP = @OpaqueType();
pub const PRTL_BITMAP = *RTL_BITMAP;
const KAFFINITY = usize;
pub const TEB = extern struct {
Reserved1: [12]PVOID,
ProcessEnvironmentBlock: *PEB,
Reserved2: [399]PVOID,
Reserved3: [1952]u8,
TlsSlots: [64]PVOID,
Reserved4: [8]u8,
Reserved5: [26]PVOID,
ReservedForOle: PVOID,
Reserved6: [4]PVOID,
TlsExpansionSlots: PVOID,
};
/// Process Environment Block
/// Microsoft documentation of this is incomplete, the fields here are taken from various resources including:
/// - https://github.com/wine-mirror/wine/blob/1aff1e6a370ee8c0213a0fd4b220d121da8527aa/include/winternl.h#L269

View File

@ -16,6 +16,7 @@ pub extern "NtDll" fn NtQueryInformationFile(
Length: ULONG,
FileInformationClass: FILE_INFORMATION_CLASS,
) callconv(.Stdcall) NTSTATUS;
pub extern "NtDll" fn NtCurrentTeb() callconv(.Stdcall) *TEB;
pub extern "NtDll" fn NtQueryAttributesFile(
ObjectAttributes: *OBJECT_ATTRIBUTES,