@@ -31,6 +31,8 @@ pub const winmm = @import("windows/winmm.zig");
31
31
32
32
pub const self_process_handle = @intToPtr (HANDLE , maxInt (usize ));
33
33
34
+ const Self = @This ();
35
+
34
36
pub const OpenError = error {
35
37
IsDir ,
36
38
NotDir ,
@@ -3282,7 +3284,7 @@ pub usingnamespace switch (native_arch) {
3282
3284
};
3283
3285
3284
3286
pub const CONTEXT = extern struct {
3285
- P1Home : DWORD64 ,
3287
+ P1Home : DWORD64 align ( 16 ) ,
3286
3288
P2Home : DWORD64 ,
3287
3289
P3Home : DWORD64 ,
3288
3290
P4Home : DWORD64 ,
@@ -3352,9 +3354,28 @@ pub usingnamespace switch (native_arch) {
3352
3354
LastExceptionToRip : DWORD64 ,
3353
3355
LastExceptionFromRip : DWORD64 ,
3354
3356
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 ;
3357
3363
}
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 ,
3358
3379
};
3359
3380
},
3360
3381
.aarch64 = > struct {
@@ -3370,7 +3391,7 @@ pub usingnamespace switch (native_arch) {
3370
3391
};
3371
3392
3372
3393
pub const CONTEXT = extern struct {
3373
- ContextFlags : ULONG ,
3394
+ ContextFlags : ULONG align ( 16 ) ,
3374
3395
Cpsr : ULONG ,
3375
3396
DUMMYUNIONNAME : extern union {
3376
3397
DUMMYSTRUCTNAME : extern struct {
@@ -3418,12 +3439,60 @@ pub usingnamespace switch (native_arch) {
3418
3439
Wcr : [2 ]DWORD ,
3419
3440
Wvr : [2 ]DWORD64 ,
3420
3441
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 } {
3422
3443
return .{
3423
3444
.bp = ctx .DUMMYUNIONNAME .DUMMYSTRUCTNAME .Fp ,
3424
3445
.ip = ctx .Pc ,
3446
+ .sp = ctx .Sp ,
3425
3447
};
3426
3448
}
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 ,
3427
3496
};
3428
3497
},
3429
3498
else = > struct {},
@@ -3436,6 +3505,36 @@ pub const EXCEPTION_POINTERS = extern struct {
3436
3505
3437
3506
pub const VECTORED_EXCEPTION_HANDLER = * const fn (ExceptionInfo : * EXCEPTION_POINTERS ) callconv (WINAPI ) c_long ;
3438
3507
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
+
3439
3538
pub const OBJECT_ATTRIBUTES = extern struct {
3440
3539
Length : ULONG ,
3441
3540
RootDirectory : ? HANDLE ,
@@ -3494,6 +3593,21 @@ pub const TEB = extern struct {
3494
3593
TlsExpansionSlots : PVOID ,
3495
3594
};
3496
3595
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
+
3497
3611
/// Process Environment Block
3498
3612
/// Microsoft documentation of this is incomplete, the fields here are taken from various resources including:
3499
3613
/// - https://github.com/wine-mirror/wine/blob/1aff1e6a370ee8c0213a0fd4b220d121da8527aa/include/winternl.h#L269
0 commit comments