std: Work around unexported NtCurrentTeb

Apparently NtCurrentTeb is only exported for i386 and some other
platforms but not for x86_64 nor AArch64. Let's go with the flow and
provide our own NtCurrentTeb like the Windows headers do.

Thank you Microsoft.
This commit is contained in:
LemonBoy 2020-03-06 09:17:14 +01:00
parent b9a1d67637
commit 2e04b61275
2 changed files with 19 additions and 2 deletions

View File

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

View File

@ -16,7 +16,6 @@ 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,