Skip to content

Commit

Permalink
std: Nicer way to access the PEB
Browse files Browse the repository at this point in the history
Use the NtCurrentTeb API instead of using some inline asm, this is much
nicer and also more portable.

Closes ziglang#4645
  • Loading branch information
LemonBoy committed Mar 6, 2020
1 parent eaccfff commit b9a1d67
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 16 deletions.
17 changes: 1 addition & 16 deletions lib/std/os/windows.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 13 additions & 0 deletions lib/std/os/windows/bits.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions lib/std/os/windows/ntdll.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit b9a1d67

Please sign in to comment.