10#define UWOP_PUSH_NONVOL 0
11#define UWOP_ALLOC_LARGE 1
12#define UWOP_ALLOC_SMALL 2
13#define UWOP_SET_FPREG 3
14#define UWOP_SAVE_NONVOL 4
15#define UWOP_SAVE_NONVOL_FAR 5
17#define UWOP_SPARE_CODE 7
18#define UWOP_SAVE_XMM128 8
19#define UWOP_SAVE_XMM128_FAR 9
20#define UWOP_PUSH_MACHFRAME 10
67#define PARENT_OFFSET 0x100
69#define INIT_RAX 0xDEADBEEFDEADBEEFULL
85 Info->SizeOfProlog = SizeOfProlog;
86 Info->CountOfCodes = CountOfCodes;
94 Info->UnwindCode[
Index].CodeOffset = CodeOffset;
95 Info->UnwindCode[
Index].UnwindOp = UnwindOp;
109 PKNONVOLATILE_CONTEXT_POINTERS Pointers)
111 RUNTIME_FUNCTION
Func =
133 PKNONVOLATILE_CONTEXT_POINTERS Pointers)
146 g_StackBuffer[0] = 0x1111111122222222ULL;
147 g_StackBuffer[1] = 0xDEADC0DEDEADC0DEULL;
149 Info = ResetUnwindInfo(1, 1, 1);
165 g_StackBuffer[8] = 0xFEEDFACEFEEDFACEULL;
168 Info = ResetUnwindInfo(1, 4, 1);
183 g_StackBuffer[0x100 / 8] = 0x12345678ABCDEF00ULL;
186 Info = ResetUnwindInfo(1, 7, 2);
188 Info->UnwindCode[1].FrameOffset = 0x100 / 8;
203 g_StackBuffer[
Size / 8] = 0xAA55AA55AA55AA55ULL;
206 Info = ResetUnwindInfo(1, 7, 3);
225 g_StackBuffer[0x100 / 8] = 0x9999AAAA9999AAAAULL;
227 Info = ResetUnwindInfo(1, 4, 1);
229 Info->FrameOffset = 2;
233 Ctx.Rbp = FrameTop + 0x20;
248 g_StackBuffer[0x80 / 8] = 0x4242424242424242ULL;
249 g_StackBuffer[0] = 0xDEADC0DEDEADC0DEULL;
252 Info = ResetUnwindInfo(1, 8, 2);
254 Info->UnwindCode[1].FrameOffset = 0x10;
269 Expected.Low = 0x0011223344556677ULL;
270 Expected.High = 0x8899AABBCCDDEEFFULL;
276 Info = ResetUnwindInfo(1, 9, 2);
278 Info->UnwindCode[1].FrameOffset = 4;
293 g_StackBuffer[1] = 0xCAFEBABE00000000ULL;
294 g_StackBuffer[4] =
Stack + 0x100;
296 Info = ResetUnwindInfo(1, 1, 1);
317 g_StackBuffer[0x40 / 8] = 0x1111111111111111ULL;
318 g_StackBuffer[0x48 / 8] = 0x2222222222222222ULL;
319 g_StackBuffer[0x50 / 8] = 0x3333333333333333ULL;
320 g_StackBuffer[0x58 / 8] = 0x4444444444444444ULL;
322 Info = ResetUnwindInfo(1, 7, 4);
346 g_StackBuffer[0] = 0x2222222222222222ULL;
347 g_StackBuffer[1] = 0x3333333333333333ULL;
348 g_StackBuffer[2] = 0x4444444444444444ULL;
350 Info = ResetUnwindInfo(1, 7, 4);
367 KNONVOLATILE_CONTEXT_POINTERS Ptrs;
373 g_StackBuffer[0] = 0xAABBCCDDAABBCCDDULL;
375 Info = ResetUnwindInfo(1, 1, 1);
393 g_StackBuffer[0] = 0xAA00AA00AA00AA00ULL;
394 g_StackBuffer[1] = 0xBB00BB00BB00BB00ULL;
395 g_StackBuffer[2] = 0xCC00CC00CC00CC00ULL;
397 Child = ResetUnwindInfo(1, 1, 1);
398 Child->Flags = UNW_FLAG_CHAININFO;
431 g_StackBuffer[1] = 0xAAAAAAAABBBBBBBBULL;
432 g_StackBuffer[8] = 0xCCCCCCCCDDDDDDDDULL;
434 Info = ResetUnwindInfo(2, 0, 3);
440 ok(Ctx.Rbx != 0xCCCCCCCCDDDDDDDDULL,
441 "Rbx looks scaled-by-8: %I64x\n", Ctx.Rbx);
455 Expected.Low = 0x1111111122222222ULL;
456 Expected.High = 0x3333333344444444ULL;
457 Decoy.Low = 0x5555555566666666ULL;
458 Decoy.High = 0x7777777788888888ULL;
464 *(
M128A *)&g_StackBuffer[256 / 8] = Decoy;
466 Info = ResetUnwindInfo(2, 0, 3);
472 ok(Ctx.Xmm6.Low != Decoy.Low,
473 "Xmm6 looks scaled-by-16: %I64x\n", Ctx.Xmm6.Low);
488 g_StackBuffer[0] = 0xAAAAAAAAAAAAAAAAULL;
489 g_StackBuffer[1] = 0xBBBBBBBBBBBBBBBBULL;
491 Info = ResetUnwindInfo(2, 0, 3);
493 Info->UnwindCode[1].FrameOffset = 0;
511 g_StackBuffer[0] = 0xAAAAAAAAAAAAAAAAULL;
512 g_StackBuffer[1] = 0xBBBBBBBBBBBBBBBBULL;
514 Info = ResetUnwindInfo(2, 0, 4);
516 Info->UnwindCode[1].FrameOffset = 0;
517 Info->UnwindCode[2].FrameOffset = 0;
528 skip(
"UWOP_SPARE_CODE triggered exception 0x%08lx (debug build ASSERT)\n",
static VOID Test_TypicalProlog(VOID)
static VOID Test_SaveXmm128(VOID)
static VOID Test_PushNonvol(VOID)
static VOID Test_PartialProlog(VOID)
static VOID Test_PushMachframe(VOID)
static VOID Test_ContextPointers(VOID)
struct _TEST_UNWIND_INFO TEST_UNWIND_INFO
static VOID Test_Epilog(VOID)
static VOID SetCode(TEST_UNWIND_INFO *Info, ULONG Index, UCHAR CodeOffset, UCHAR UnwindOp, UCHAR OpInfo)
union _TEST_UNWIND_CODE TEST_UNWIND_CODE
static VOID Test_AllocLargeScaled(VOID)
#define UWOP_SAVE_NONVOL_FAR
static VOID Test_AllocSmall(VOID)
#define UWOP_PUSH_MACHFRAME
static VOID Test_SaveXmm128Far(VOID)
static ULONG_PTR RunUnwind(PCONTEXT Context, ULONG_PTR Rsp, ULONG CodeOffset, PKNONVOLATILE_CONTEXT_POINTERS Pointers)
static ULONG_PTR DoUnwind(PCONTEXT Context, ULONG CodeOffset, PKNONVOLATILE_CONTEXT_POINTERS Pointers)
static VOID Test_SpareCode(VOID)
struct _IMAGE_STRUCT IMAGE_STRUCT
#define UWOP_SAVE_XMM128_FAR
static VOID Test_SaveNonvolFar(VOID)
static VOID Test_ChainedInfo(VOID)
static VOID Test_SetFpReg(VOID)
static VOID Test_AllocLargeUnscaled(VOID)
static VOID InitContext(PCONTEXT Context, ULONG_PTR Rsp)
static VOID Test_SaveNonvol(VOID)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
#define ok_eq_pointer(value, expected)
#define ok_eq_hex64(value, expected)
#define ok_eq_xmm(value, expected)
#define DECLSPEC_ALIGN(x)
#define UNW_FLAG_NHANDLER
#define EXCEPTION_EXECUTE_HANDLER
static PRUNTIME_FUNCTION(WINAPI *pRtlLookupFunctionEntry)(ULONG_PTR
_IRQL_requires_same_ _In_ PVOID EstablisherFrame
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
NTSYSAPI PEXCEPTION_ROUTINE WINAPI RtlVirtualUnwind(ULONG, ULONG_PTR, ULONG_PTR, RUNTIME_FUNCTION *, CONTEXT *, void **, ULONG_PTR *, KNONVOLATILE_CONTEXT_POINTERS *)
TEST_UNWIND_CODE UnwindCode[32]
#define FIELD_OFFSET(t, f)
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack