Merge pull request #4651 from LemonBoy/fix-4645

std: Nicer way to access the PEB
This commit is contained in:
Andrew Kelley 2020-03-06 17:33:05 -05:00 committed by GitHub
commit 7df9169081
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 16 deletions

View File

@ -1083,23 +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 {
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 teb().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