| ... | @@ -4634,25 +4634,28 @@ pub const TEB = extern struct { | ... | @@ -4634,25 +4634,28 @@ pub const TEB = extern struct { |
| 4634 | }; | 4634 | }; |
| 4635 | | 4635 | |
| 4636 | comptime { | 4636 | comptime { |
| 4637 | // Offsets taken from WinDbg info and Geoff Chappell[1] (RIP) | 4637 | // XXX: Without this check we cannot use `std.Io.Writer` on 16-bit platforms. `std.fmt.bufPrint` will hit the unreachable in `PEB.GdiHandleBuffer` without this guard. |
| 4638 | // [1]: https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/api/pebteb/teb/index.htm | 4638 | if (builtin.os.tag == .windows) { |
| 4639 | assert(@offsetOf(TEB, "NtTib") == 0x00); | 4639 | // Offsets taken from WinDbg info and Geoff Chappell[1] (RIP) |
| 4640 | if (@sizeOf(usize) == 4) { | 4640 | // [1]: https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/api/pebteb/teb/index.htm |
| 4641 | assert(@offsetOf(TEB, "EnvironmentPointer") == 0x1C); | 4641 | assert(@offsetOf(TEB, "NtTib") == 0x00); |
| 4642 | assert(@offsetOf(TEB, "ClientId") == 0x20); | 4642 | if (@sizeOf(usize) == 4) { |
| 4643 | assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x28); | 4643 | assert(@offsetOf(TEB, "EnvironmentPointer") == 0x1C); |
| 4644 | assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x2C); | 4644 | assert(@offsetOf(TEB, "ClientId") == 0x20); |
| 4645 | assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x30); | 4645 | assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x28); |
| 4646 | assert(@offsetOf(TEB, "LastErrorValue") == 0x34); | 4646 | assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x2C); |
| 4647 | assert(@offsetOf(TEB, "TlsSlots") == 0xe10); | 4647 | assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x30); |
| 4648 | } else if (@sizeOf(usize) == 8) { | 4648 | assert(@offsetOf(TEB, "LastErrorValue") == 0x34); |
| 4649 | assert(@offsetOf(TEB, "EnvironmentPointer") == 0x38); | 4649 | assert(@offsetOf(TEB, "TlsSlots") == 0xe10); |
| 4650 | assert(@offsetOf(TEB, "ClientId") == 0x40); | 4650 | } else if (@sizeOf(usize) == 8) { |
| 4651 | assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x50); | 4651 | assert(@offsetOf(TEB, "EnvironmentPointer") == 0x38); |
| 4652 | assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x58); | 4652 | assert(@offsetOf(TEB, "ClientId") == 0x40); |
| 4653 | assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x60); | 4653 | assert(@offsetOf(TEB, "ActiveRpcHandle") == 0x50); |
| 4654 | assert(@offsetOf(TEB, "LastErrorValue") == 0x68); | 4654 | assert(@offsetOf(TEB, "ThreadLocalStoragePointer") == 0x58); |
| 4655 | assert(@offsetOf(TEB, "TlsSlots") == 0x1480); | 4655 | assert(@offsetOf(TEB, "ProcessEnvironmentBlock") == 0x60); |
| | 4656 | assert(@offsetOf(TEB, "LastErrorValue") == 0x68); |
| | 4657 | assert(@offsetOf(TEB, "TlsSlots") == 0x1480); |
| | 4658 | } |
| 4656 | } | 4659 | } |
| 4657 | } | 4660 | } |
| 4658 | | 4661 | |