@@ -31,6 +31,8 @@ pub const winmm = @import("windows/winmm.zig");
3131
3232pub const self_process_handle = @intToPtr (HANDLE , maxInt (usize ));
3333
34+ const Self = @This ();
35+
3436pub const OpenError = error {
3537 IsDir ,
3638 NotDir ,
@@ -3282,7 +3284,7 @@ pub usingnamespace switch (native_arch) {
32823284 };
32833285
32843286 pub const CONTEXT = extern struct {
3285- P1Home : DWORD64 ,
3287+ P1Home : DWORD64 align ( 16 ) ,
32863288 P2Home : DWORD64 ,
32873289 P3Home : DWORD64 ,
32883290 P4Home : DWORD64 ,
@@ -3352,9 +3354,28 @@ pub usingnamespace switch (native_arch) {
33523354 LastExceptionToRip : DWORD64 ,
33533355 LastExceptionFromRip : DWORD64 ,
33543356
3355- pub fn getRegs (ctx : * const CONTEXT ) struct { bp : usize , ip : usize } {
3356- return .{ .bp = ctx .Rbp , .ip = ctx .Rip };
3357+ pub fn getRegs (ctx : * const CONTEXT ) struct { bp : usize , ip : usize , sp : usize } {
3358+ return .{ .bp = ctx .Rbp , .ip = ctx .Rip , .sp = ctx .Rsp };
3359+ }
3360+
3361+ pub fn setIp (ctx : * CONTEXT , ip : usize ) void {
3362+ ctx .Rip = ip ;
33573363 }
3364+
3365+ pub fn setSp (ctx : * CONTEXT , sp : usize ) void {
3366+ ctx .Rsp = sp ;
3367+ }
3368+ };
3369+
3370+ pub const RUNTIME_FUNCTION = extern struct {
3371+ BeginAddress : DWORD ,
3372+ EndAddress : DWORD ,
3373+ UnwindData : DWORD ,
3374+ };
3375+
3376+ pub const KNONVOLATILE_CONTEXT_POINTERS = extern struct {
3377+ FloatingContext : [16 ]? * M128A ,
3378+ IntegerContext : [16 ]? * ULONG64 ,
33583379 };
33593380 },
33603381 .aarch64 = > struct {
@@ -3370,7 +3391,7 @@ pub usingnamespace switch (native_arch) {
33703391 };
33713392
33723393 pub const CONTEXT = extern struct {
3373- ContextFlags : ULONG ,
3394+ ContextFlags : ULONG align ( 16 ) ,
33743395 Cpsr : ULONG ,
33753396 DUMMYUNIONNAME : extern union {
33763397 DUMMYSTRUCTNAME : extern struct {
@@ -3418,12 +3439,60 @@ pub usingnamespace switch (native_arch) {
34183439 Wcr : [2 ]DWORD ,
34193440 Wvr : [2 ]DWORD64 ,
34203441
3421- pub fn getRegs (ctx : * const CONTEXT ) struct { bp : usize , ip : usize } {
3442+ pub fn getRegs (ctx : * const CONTEXT ) struct { bp : usize , ip : usize , sp : usize } {
34223443 return .{
34233444 .bp = ctx .DUMMYUNIONNAME .DUMMYSTRUCTNAME .Fp ,
34243445 .ip = ctx .Pc ,
3446+ .sp = ctx .Sp ,
34253447 };
34263448 }
3449+
3450+ pub fn setIp (ctx : * CONTEXT , ip : usize ) void {
3451+ ctx .Pc = ip ;
3452+ }
3453+
3454+ pub fn setSp (ctx : * CONTEXT , sp : usize ) void {
3455+ ctx .Sp = sp ;
3456+ }
3457+ };
3458+
3459+ pub const RUNTIME_FUNCTION = extern struct {
3460+ BeginAddress : DWORD ,
3461+ DUMMYUNIONNAME : extern union {
3462+ UnwindData : DWORD ,
3463+ DUMMYSTRUCTNAME : packed struct {
3464+ Flag : u2 ,
3465+ FunctionLength : u11 ,
3466+ RegF : u3 ,
3467+ RegI : u4 ,
3468+ H : u1 ,
3469+ CR : u2 ,
3470+ FrameSize : u9 ,
3471+ },
3472+ },
3473+ };
3474+
3475+ pub const KNONVOLATILE_CONTEXT_POINTERS = extern struct {
3476+ X19 : ? * DWORD64 ,
3477+ X20 : ? * DWORD64 ,
3478+ X21 : ? * DWORD64 ,
3479+ X22 : ? * DWORD64 ,
3480+ X23 : ? * DWORD64 ,
3481+ X24 : ? * DWORD64 ,
3482+ X25 : ? * DWORD64 ,
3483+ X26 : ? * DWORD64 ,
3484+ X27 : ? * DWORD64 ,
3485+ X28 : ? * DWORD64 ,
3486+ Fp : ? * DWORD64 ,
3487+ Lr : ? * DWORD64 ,
3488+ D8 : ? * DWORD64 ,
3489+ D9 : ? * DWORD64 ,
3490+ D10 : ? * DWORD64 ,
3491+ D11 : ? * DWORD64 ,
3492+ D12 : ? * DWORD64 ,
3493+ D13 : ? * DWORD64 ,
3494+ D14 : ? * DWORD64 ,
3495+ D15 : ? * DWORD64 ,
34273496 };
34283497 },
34293498 else = > struct {},
@@ -3436,6 +3505,36 @@ pub const EXCEPTION_POINTERS = extern struct {
34363505
34373506pub const VECTORED_EXCEPTION_HANDLER = * const fn (ExceptionInfo : * EXCEPTION_POINTERS ) callconv (WINAPI ) c_long ;
34383507
3508+ pub const EXCEPTION_DISPOSITION = i32 ;
3509+ pub const EXCEPTION_ROUTINE = * const fn (
3510+ ExceptionRecord : ? * EXCEPTION_RECORD ,
3511+ EstablisherFrame : PVOID ,
3512+ ContextRecord : * (Self.CONTEXT ),
3513+ DispatcherContext : PVOID ,
3514+ ) callconv (WINAPI ) EXCEPTION_DISPOSITION ;
3515+
3516+ pub const UNWIND_HISTORY_TABLE_SIZE = 12 ;
3517+ pub const UNWIND_HISTORY_TABLE_ENTRY = extern struct {
3518+ ImageBase : ULONG64 ,
3519+ FunctionEntry : * Self.RUNTIME_FUNCTION ,
3520+ };
3521+
3522+ pub const UNWIND_HISTORY_TABLE = extern struct {
3523+ Count : ULONG ,
3524+ LocalHint : BYTE ,
3525+ GlobalHint : BYTE ,
3526+ Search : BYTE ,
3527+ Once : BYTE ,
3528+ LowAddress : ULONG64 ,
3529+ HighAddress : ULONG64 ,
3530+ Entry : [UNWIND_HISTORY_TABLE_SIZE ]UNWIND_HISTORY_TABLE_ENTRY ,
3531+ };
3532+
3533+ pub const UNW_FLAG_NHANDLER = 0x0 ;
3534+ pub const UNW_FLAG_EHANDLER = 0x1 ;
3535+ pub const UNW_FLAG_UHANDLER = 0x2 ;
3536+ pub const UNW_FLAG_CHAININFO = 0x4 ;
3537+
34393538pub const OBJECT_ATTRIBUTES = extern struct {
34403539 Length : ULONG ,
34413540 RootDirectory : ? HANDLE ,
@@ -3494,6 +3593,21 @@ pub const TEB = extern struct {
34943593 TlsExpansionSlots : PVOID ,
34953594};
34963595
3596+ pub const EXCEPTION_REGISTRATION_RECORD = extern struct {
3597+ Next : ? * EXCEPTION_REGISTRATION_RECORD ,
3598+ Handler : ? * EXCEPTION_DISPOSITION ,
3599+ };
3600+
3601+ pub const NT_TIB = extern struct {
3602+ ExceptionList : ? * EXCEPTION_REGISTRATION_RECORD ,
3603+ StackBase : PVOID ,
3604+ StackLimit : PVOID ,
3605+ SubSystemTib : PVOID ,
3606+ DUMMYUNIONNAME : extern union { FiberData : PVOID , Version : DWORD },
3607+ ArbitraryUserPointer : PVOID ,
3608+ Self : ? * @This (),
3609+ };
3610+
34973611/// Process Environment Block
34983612/// Microsoft documentation of this is incomplete, the fields here are taken from various resources including:
34993613/// - https://github.com/wine-mirror/wine/blob/1aff1e6a370ee8c0213a0fd4b220d121da8527aa/include/winternl.h#L269
0 commit comments