#include <rtltests.h>
Go to the source code of this file.
|
| enum | {
REG_RAX = 0
, REG_RCX
, REG_RDX
, REG_RBX
,
REG_RSP
, REG_RBP
, REG_RSI
, REG_RDI
,
REG_R8
, REG_R9
, REG_R10
, REG_R11
,
REG_R12
, REG_R13
, REG_R14
, REG_R15
} |
| |
|
| static | DECLSPEC_ALIGN (16) |
| |
| static VOID | SetCode (TEST_UNWIND_INFO *Info, ULONG Index, UCHAR CodeOffset, UCHAR UnwindOp, UCHAR OpInfo) |
| |
| static VOID | InitContext (PCONTEXT Context, ULONG_PTR Rsp) |
| |
| static ULONG_PTR | DoUnwind (PCONTEXT Context, ULONG CodeOffset, PKNONVOLATILE_CONTEXT_POINTERS Pointers) |
| |
| static ULONG_PTR | RunUnwind (PCONTEXT Context, ULONG_PTR Rsp, ULONG CodeOffset, PKNONVOLATILE_CONTEXT_POINTERS Pointers) |
| |
| static VOID | Test_PushNonvol (VOID) |
| |
| static VOID | Test_AllocSmall (VOID) |
| |
| static VOID | Test_AllocLargeScaled (VOID) |
| |
| static VOID | Test_AllocLargeUnscaled (VOID) |
| |
| static VOID | Test_SetFpReg (VOID) |
| |
| static VOID | Test_SaveNonvol (VOID) |
| |
| static VOID | Test_SaveXmm128 (VOID) |
| |
| static VOID | Test_PushMachframe (VOID) |
| |
| static VOID | Test_TypicalProlog (VOID) |
| |
| static VOID | Test_PartialProlog (VOID) |
| |
| static VOID | Test_ContextPointers (VOID) |
| |
| static VOID | Test_ChainedInfo (VOID) |
| |
| static VOID | Test_SaveNonvolFar (VOID) |
| |
| static VOID | Test_SaveXmm128Far (VOID) |
| |
| static VOID | Test_Epilog (VOID) |
| |
| static VOID | Test_SpareCode (VOID) |
| |
| | START_TEST (RtlVirtualUnwind) |
| |
◆ INIT_RAX
| #define INIT_RAX 0xDEADBEEFDEADBEEFULL |
◆ PARENT_OFFSET
◆ UWOP_ALLOC_LARGE
◆ UWOP_ALLOC_SMALL
◆ UWOP_EPILOG
◆ UWOP_PUSH_MACHFRAME
| #define UWOP_PUSH_MACHFRAME 10 |
◆ UWOP_PUSH_NONVOL
◆ UWOP_SAVE_NONVOL
◆ UWOP_SAVE_NONVOL_FAR
| #define UWOP_SAVE_NONVOL_FAR 5 |
◆ UWOP_SAVE_XMM128
◆ UWOP_SAVE_XMM128_FAR
| #define UWOP_SAVE_XMM128_FAR 9 |
◆ UWOP_SET_FPREG
◆ UWOP_SPARE_CODE
◆ IMAGE_STRUCT
◆ TEST_UNWIND_CODE
◆ TEST_UNWIND_INFO
◆ anonymous enum
| Enumerator |
|---|
| REG_RAX | |
| REG_RCX | |
| REG_RDX | |
| REG_RBX | |
| REG_RSP | |
| REG_RBP | |
| REG_RSI | |
| REG_RDI | |
| REG_R8 | |
| REG_R9 | |
| REG_R10 | |
| REG_R11 | |
| REG_R12 | |
| REG_R13 | |
| REG_R14 | |
| REG_R15 | |
Definition at line 24 of file RtlVirtualUnwind.c.
◆ DECLSPEC_ALIGN()
| static DECLSPEC_ALIGN |
( |
16 |
| ) |
|
|
static |
Definition at line 71 of file RtlVirtualUnwind.c.
81{
85 Info->SizeOfProlog = SizeOfProlog;
86 Info->CountOfCodes = CountOfCodes;
88}
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
◆ DoUnwind()
Definition at line 108 of file RtlVirtualUnwind.c.
110{
111 RUNTIME_FUNCTION
Func =
112 {
116 };
119
125 &HandlerData,
127 Pointers);
129}
#define UNW_FLAG_NHANDLER
_IRQL_requires_same_ _In_ PVOID EstablisherFrame
NTSYSAPI PEXCEPTION_ROUTINE WINAPI RtlVirtualUnwind(ULONG, ULONG_PTR, ULONG_PTR, RUNTIME_FUNCTION *, CONTEXT *, void **, ULONG_PTR *, KNONVOLATILE_CONTEXT_POINTERS *)
#define FIELD_OFFSET(t, f)
_In_ UCHAR _In_ UCHAR _In_ ULONG Code
Referenced by RunUnwind(), and Test_SetFpReg().
◆ InitContext()
◆ RunUnwind()
Definition at line 132 of file RtlVirtualUnwind.c.
134{
137}
static ULONG_PTR DoUnwind(PCONTEXT Context, ULONG CodeOffset, PKNONVOLATILE_CONTEXT_POINTERS Pointers)
static VOID InitContext(PCONTEXT Context, ULONG_PTR Rsp)
Referenced by Test_AllocLargeScaled(), Test_AllocLargeUnscaled(), Test_AllocSmall(), Test_ChainedInfo(), Test_ContextPointers(), Test_Epilog(), Test_PartialProlog(), Test_PushMachframe(), Test_PushNonvol(), Test_SaveNonvol(), Test_SaveNonvolFar(), Test_SaveXmm128(), Test_SaveXmm128Far(), Test_SpareCode(), and Test_TypicalProlog().
◆ SetCode()
Definition at line 91 of file RtlVirtualUnwind.c.
93{
94 Info->UnwindCode[
Index].CodeOffset = CodeOffset;
95 Info->UnwindCode[
Index].UnwindOp = UnwindOp;
97}
_In_ WDFCOLLECTION _In_ ULONG Index
Referenced by Test_AllocLargeScaled(), Test_AllocLargeUnscaled(), Test_AllocSmall(), Test_ChainedInfo(), Test_ContextPointers(), Test_Epilog(), Test_PartialProlog(), Test_PushMachframe(), Test_PushNonvol(), Test_SaveNonvol(), Test_SaveNonvolFar(), Test_SaveXmm128(), Test_SaveXmm128Far(), Test_SetFpReg(), Test_SpareCode(), and Test_TypicalProlog().
◆ START_TEST()
Definition at line 534 of file RtlVirtualUnwind.c.
535{
552}
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)
static VOID Test_Epilog(VOID)
static VOID Test_AllocLargeScaled(VOID)
static VOID Test_AllocSmall(VOID)
static VOID Test_SaveXmm128Far(VOID)
static VOID Test_SpareCode(VOID)
static VOID Test_SaveNonvolFar(VOID)
static VOID Test_ChainedInfo(VOID)
static VOID Test_SetFpReg(VOID)
static VOID Test_AllocLargeUnscaled(VOID)
static VOID Test_SaveNonvol(VOID)
◆ Test_AllocLargeScaled()
| static VOID Test_AllocLargeScaled |
( |
VOID |
| ) |
|
|
static |
Definition at line 176 of file RtlVirtualUnwind.c.
177{
181
183 g_StackBuffer[0x100 / 8] = 0x12345678ABCDEF00ULL;
184
185
186 Info = ResetUnwindInfo(1, 7, 2);
188 Info->UnwindCode[1].FrameOffset = 0x100 / 8;
189
193}
static VOID SetCode(TEST_UNWIND_INFO *Info, ULONG Index, UCHAR CodeOffset, UCHAR UnwindOp, UCHAR OpInfo)
static ULONG_PTR RunUnwind(PCONTEXT Context, ULONG_PTR Rsp, ULONG CodeOffset, PKNONVOLATILE_CONTEXT_POINTERS Pointers)
#define ok_eq_hex64(value, expected)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Referenced by START_TEST().
◆ Test_AllocLargeUnscaled()
| static VOID Test_AllocLargeUnscaled |
( |
VOID |
| ) |
|
|
static |
Definition at line 195 of file RtlVirtualUnwind.c.
196{
201
203 g_StackBuffer[
Size / 8] = 0xAA55AA55AA55AA55ULL;
204
205
206 Info = ResetUnwindInfo(1, 7, 3);
209
213}
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Referenced by START_TEST().
◆ Test_AllocSmall()
Definition at line 158 of file RtlVirtualUnwind.c.
159{
163
165 g_StackBuffer[8] = 0xFEEDFACEFEEDFACEULL;
166
167
168 Info = ResetUnwindInfo(1, 4, 1);
170
174}
Referenced by START_TEST().
◆ Test_ChainedInfo()
Definition at line 383 of file RtlVirtualUnwind.c.
384{
389
390
391
393 g_StackBuffer[0] = 0xAA00AA00AA00AA00ULL;
394 g_StackBuffer[1] = 0xBB00BB00BB00BB00ULL;
395 g_StackBuffer[2] = 0xCC00CC00CC00CC00ULL;
396
397 Child = ResetUnwindInfo(1, 1, 1);
398 Child->Flags = UNW_FLAG_CHAININFO;
400
401
402
407
414
420}
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
static PRUNTIME_FUNCTION(WINAPI *pRtlLookupFunctionEntry)(ULONG_PTR
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Referenced by START_TEST().
◆ Test_ContextPointers()
| static VOID Test_ContextPointers |
( |
VOID |
| ) |
|
|
static |
Definition at line 364 of file RtlVirtualUnwind.c.
365{
367 KNONVOLATILE_CONTEXT_POINTERS Ptrs;
370
373 g_StackBuffer[0] = 0xAABBCCDDAABBCCDDULL;
374
375 Info = ResetUnwindInfo(1, 1, 1);
377
381}
#define ok_eq_pointer(value, expected)
Referenced by START_TEST().
◆ Test_Epilog()
Definition at line 478 of file RtlVirtualUnwind.c.
479{
483
484
485
486
488 g_StackBuffer[0] = 0xAAAAAAAAAAAAAAAAULL;
489 g_StackBuffer[1] = 0xBBBBBBBBBBBBBBBBULL;
490
491 Info = ResetUnwindInfo(2, 0, 3);
493 Info->UnwindCode[1].FrameOffset = 0;
495
499}
Referenced by START_TEST().
◆ Test_PartialProlog()
Definition at line 337 of file RtlVirtualUnwind.c.
338{
342
343
344
346 g_StackBuffer[0] = 0x2222222222222222ULL;
347 g_StackBuffer[1] = 0x3333333333333333ULL;
348 g_StackBuffer[2] = 0x4444444444444444ULL;
349
350 Info = ResetUnwindInfo(1, 7, 4);
355
362}
Referenced by START_TEST().
◆ Test_PushMachframe()
Definition at line 284 of file RtlVirtualUnwind.c.
285{
289
290
291
293 g_StackBuffer[1] = 0xCAFEBABE00000000ULL;
294 g_StackBuffer[4] =
Stack + 0x100;
295
296 Info = ResetUnwindInfo(1, 1, 1);
298
302}
#define UWOP_PUSH_MACHFRAME
Referenced by START_TEST().
◆ Test_PushNonvol()
Definition at line 139 of file RtlVirtualUnwind.c.
140{
144
146 g_StackBuffer[0] = 0x1111111122222222ULL;
147 g_StackBuffer[1] = 0xDEADC0DEDEADC0DEULL;
148
149 Info = ResetUnwindInfo(1, 1, 1);
151
156}
Referenced by START_TEST().
◆ Test_SaveNonvol()
Definition at line 241 of file RtlVirtualUnwind.c.
242{
246
248 g_StackBuffer[0x80 / 8] = 0x4242424242424242ULL;
249 g_StackBuffer[0] = 0xDEADC0DEDEADC0DEULL;
250
251
252 Info = ResetUnwindInfo(1, 8, 2);
254 Info->UnwindCode[1].FrameOffset = 0x10;
255
260}
Referenced by START_TEST().
◆ Test_SaveNonvolFar()
Definition at line 422 of file RtlVirtualUnwind.c.
423{
427
428
429
431 g_StackBuffer[1] = 0xAAAAAAAABBBBBBBBULL;
432 g_StackBuffer[8] = 0xCCCCCCCCDDDDDDDDULL;
433
434 Info = ResetUnwindInfo(2, 0, 3);
437
440 ok(Ctx.Rbx != 0xCCCCCCCCDDDDDDDDULL,
441 "Rbx looks scaled-by-8: %I64x\n", Ctx.Rbx);
442
443
446}
#define UWOP_SAVE_NONVOL_FAR
Referenced by START_TEST().
◆ Test_SaveXmm128()
Definition at line 262 of file RtlVirtualUnwind.c.
263{
268
269 Expected.Low = 0x0011223344556677ULL;
270 Expected.High = 0x8899AABBCCDDEEFFULL;
271
274
275
276 Info = ResetUnwindInfo(1, 9, 2);
278 Info->UnwindCode[1].FrameOffset = 4;
279
282}
#define ok_eq_xmm(value, expected)
Referenced by START_TEST().
◆ Test_SaveXmm128Far()
Definition at line 448 of file RtlVirtualUnwind.c.
449{
454
455 Expected.Low = 0x1111111122222222ULL;
456 Expected.High = 0x3333333344444444ULL;
457 Decoy.Low = 0x5555555566666666ULL;
458 Decoy.High = 0x7777777788888888ULL;
459
460
461
464 *(
M128A *)&g_StackBuffer[256 / 8] = Decoy;
465
466 Info = ResetUnwindInfo(2, 0, 3);
469
472 ok(Ctx.Xmm6.Low != Decoy.Low,
473 "Xmm6 looks scaled-by-16: %I64x\n", Ctx.Xmm6.Low);
476}
#define UWOP_SAVE_XMM128_FAR
Referenced by START_TEST().
◆ Test_SetFpReg()
Definition at line 215 of file RtlVirtualUnwind.c.
216{
222
223
225 g_StackBuffer[0x100 / 8] = 0x9999AAAA9999AAAAULL;
226
227 Info = ResetUnwindInfo(1, 4, 1);
229 Info->FrameOffset = 2;
231
233 Ctx.Rbp = FrameTop + 0x20;
235
239}
Referenced by START_TEST().
◆ Test_SpareCode()
Definition at line 501 of file RtlVirtualUnwind.c.
502{
506
507
508
509
511 g_StackBuffer[0] = 0xAAAAAAAAAAAAAAAAULL;
512 g_StackBuffer[1] = 0xBBBBBBBBBBBBBBBBULL;
513
514 Info = ResetUnwindInfo(2, 0, 4);
516 Info->UnwindCode[1].FrameOffset = 0;
517 Info->UnwindCode[2].FrameOffset = 0;
519
521 {
525 }
527 {
528 skip(
"UWOP_SPARE_CODE triggered exception 0x%08lx (debug build ASSERT)\n",
530 }
532}
#define EXCEPTION_EXECUTE_HANDLER
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
Referenced by START_TEST().
◆ Test_TypicalProlog()
Definition at line 304 of file RtlVirtualUnwind.c.
305{
309
310
311
312
313
314
315
317 g_StackBuffer[0x40 / 8] = 0x1111111111111111ULL;
318 g_StackBuffer[0x48 / 8] = 0x2222222222222222ULL;
319 g_StackBuffer[0x50 / 8] = 0x3333333333333333ULL;
320 g_StackBuffer[0x58 / 8] = 0x4444444444444444ULL;
321
322 Info = ResetUnwindInfo(1, 7, 4);
327
335}
Referenced by START_TEST().