2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Runtime library stack trace test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
8 #define KMT_EMULATE_KERNEL
11 static PVOID ReturnAddresses
[4];
27 const ULONG FunctionSizeGuess
= 0x1000;
29 ReturnAddresses
[3] = _ReturnAddress();
31 Ret
= RtlWalkFrameChain(NULL
, 5, 0);
34 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
35 Ret
= RtlWalkFrameChain(Frames
, 0, 0);
37 ok_eq_pointer(Frames
[0], (PVOID
)(ULONG_PTR
)0x5555555555555555);
39 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
40 Ret
= RtlWalkFrameChain(Frames
, 5, 0);
42 ok((ULONG_PTR
)Frames
[0] > (ULONG_PTR
)TestStackWalk4
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
43 ok((ULONG_PTR
)Frames
[0] < (ULONG_PTR
)TestStackWalk4
+ FunctionSizeGuess
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
44 ok_eq_pointer(Frames
[1], ReturnAddresses
[3]);
45 ok_eq_pointer(Frames
[2], ReturnAddresses
[2]);
46 ok_eq_pointer(Frames
[3], ReturnAddresses
[1]);
47 ok_eq_pointer(Frames
[4], ReturnAddresses
[0]);
49 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
50 Ret
= RtlWalkFrameChain(Frames
, 4, 0);
52 ok((ULONG_PTR
)Frames
[0] > (ULONG_PTR
)TestStackWalk4
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
53 ok((ULONG_PTR
)Frames
[0] < (ULONG_PTR
)TestStackWalk4
+ FunctionSizeGuess
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
54 ok_eq_pointer(Frames
[1], ReturnAddresses
[3]);
55 ok_eq_pointer(Frames
[2], ReturnAddresses
[2]);
56 ok_eq_pointer(Frames
[3], ReturnAddresses
[1]);
57 ok_eq_pointer(Frames
[4], (PVOID
)(ULONG_PTR
)0x5555555555555555);
60 RtlCaptureStackBackTrace(0, 5, NULL
, NULL
);
61 KmtEndSeh(STATUS_ACCESS_VIOLATION
);
63 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
65 Ret
= RtlCaptureStackBackTrace(0, 0, Frames
, &Hash
);
67 ok_eq_hex(Hash
, 0x55555555);
68 ok_eq_pointer(Frames
[0], (PVOID
)(ULONG_PTR
)0x5555555555555555);
70 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
72 Ret
= RtlCaptureStackBackTrace(0, 1, Frames
, NULL
);
74 ok((ULONG_PTR
)Frames
[0] > (ULONG_PTR
)TestStackWalk4
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
75 ok((ULONG_PTR
)Frames
[0] < (ULONG_PTR
)TestStackWalk4
+ FunctionSizeGuess
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
76 ok_eq_pointer(Frames
[1], (PVOID
)(ULONG_PTR
)0x5555555555555555);
78 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
79 Ret
= RtlCaptureStackBackTrace(0, 5, Frames
, &Hash
);
82 for (i
= 0; i
< 5; i
++)
83 ExpectedHash
+= (ULONG
)(ULONG_PTR
)Frames
[i
];
84 ok_eq_hex(Hash
, ExpectedHash
);
85 ok((ULONG_PTR
)Frames
[0] > (ULONG_PTR
)TestStackWalk4
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
86 ok((ULONG_PTR
)Frames
[0] < (ULONG_PTR
)TestStackWalk4
+ FunctionSizeGuess
, "Frame is %p, function is %p\n", Frames
[0], TestStackWalk4
);
87 ok_eq_pointer(Frames
[1], ReturnAddresses
[3]);
88 ok_eq_pointer(Frames
[2], ReturnAddresses
[2]);
89 ok_eq_pointer(Frames
[3], ReturnAddresses
[1]);
90 ok_eq_pointer(Frames
[4], ReturnAddresses
[0]);
92 RtlFillMemory(Frames
, sizeof(Frames
), 0x55);
93 Ret
= RtlCaptureStackBackTrace(1, 4, Frames
, &Hash
);
96 for (i
= 0; i
< 4; i
++)
97 ExpectedHash
+= (ULONG
)(ULONG_PTR
)Frames
[i
];
98 ok_eq_hex(Hash
, ExpectedHash
);
99 ok_eq_pointer(Frames
[0], ReturnAddresses
[3]);
100 ok_eq_pointer(Frames
[1], ReturnAddresses
[2]);
101 ok_eq_pointer(Frames
[2], ReturnAddresses
[1]);
102 ok_eq_pointer(Frames
[3], ReturnAddresses
[0]);
103 ok_eq_pointer(Frames
[4], (PVOID
)(ULONG_PTR
)0x5555555555555555);
111 ReturnAddresses
[2] = _ReturnAddress();
120 ReturnAddresses
[1] = _ReturnAddress();
129 ReturnAddresses
[0] = _ReturnAddress();