mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
[KMTESTS/RTL]
- Add a small RtlException test, mainly to check that a stack overflow really throws STATUS_STACK_OVERFLOW, not STATUS_ACCESS_VIOLATION. svn path=/trunk/; revision=56434
This commit is contained in:
parent
348bef46b7
commit
0515cd1d2e
4 changed files with 66 additions and 0 deletions
|
@ -10,6 +10,7 @@ add_subdirectory(ntos_io)
|
||||||
list(APPEND COMMON_SOURCE
|
list(APPEND COMMON_SOURCE
|
||||||
example/GuardedMemory.c
|
example/GuardedMemory.c
|
||||||
rtl/RtlAvlTree.c
|
rtl/RtlAvlTree.c
|
||||||
|
rtl/RtlException.c
|
||||||
rtl/RtlMemory.c
|
rtl/RtlMemory.c
|
||||||
rtl/RtlSplayTree.c
|
rtl/RtlSplayTree.c
|
||||||
rtl/RtlUnicodeString.c)
|
rtl/RtlUnicodeString.c)
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
KMT_TESTFUNC Test_Example;
|
KMT_TESTFUNC Test_Example;
|
||||||
KMT_TESTFUNC Test_IoDeviceObject;
|
KMT_TESTFUNC Test_IoDeviceObject;
|
||||||
KMT_TESTFUNC Test_RtlAvlTree;
|
KMT_TESTFUNC Test_RtlAvlTree;
|
||||||
|
KMT_TESTFUNC Test_RtlException;
|
||||||
KMT_TESTFUNC Test_RtlMemory;
|
KMT_TESTFUNC Test_RtlMemory;
|
||||||
KMT_TESTFUNC Test_RtlSplayTree;
|
KMT_TESTFUNC Test_RtlSplayTree;
|
||||||
KMT_TESTFUNC Test_RtlUnicodeString;
|
KMT_TESTFUNC Test_RtlUnicodeString;
|
||||||
|
@ -20,6 +21,7 @@ const KMT_TEST TestList[] =
|
||||||
{ "Example", Test_Example },
|
{ "Example", Test_Example },
|
||||||
{ "IoDeviceObject", Test_IoDeviceObject },
|
{ "IoDeviceObject", Test_IoDeviceObject },
|
||||||
{ "RtlAvlTree", Test_RtlAvlTree },
|
{ "RtlAvlTree", Test_RtlAvlTree },
|
||||||
|
{ "RtlException", Test_RtlException },
|
||||||
{ "RtlMemory", Test_RtlMemory },
|
{ "RtlMemory", Test_RtlMemory },
|
||||||
{ "RtlSplayTree", Test_RtlSplayTree },
|
{ "RtlSplayTree", Test_RtlSplayTree },
|
||||||
{ "RtlUnicodeString", Test_RtlUnicodeString },
|
{ "RtlUnicodeString", Test_RtlUnicodeString },
|
||||||
|
|
|
@ -38,6 +38,7 @@ KMT_TESTFUNC Test_ObTypeClean;
|
||||||
KMT_TESTFUNC Test_ObTypeNoClean;
|
KMT_TESTFUNC Test_ObTypeNoClean;
|
||||||
KMT_TESTFUNC Test_ObTypes;
|
KMT_TESTFUNC Test_ObTypes;
|
||||||
KMT_TESTFUNC Test_RtlAvlTree;
|
KMT_TESTFUNC Test_RtlAvlTree;
|
||||||
|
KMT_TESTFUNC Test_RtlException;
|
||||||
KMT_TESTFUNC Test_RtlMemory;
|
KMT_TESTFUNC Test_RtlMemory;
|
||||||
KMT_TESTFUNC Test_RtlSplayTree;
|
KMT_TESTFUNC Test_RtlSplayTree;
|
||||||
|
|
||||||
|
@ -74,6 +75,7 @@ const KMT_TEST TestList[] =
|
||||||
{ "-ObTypeNoClean", Test_ObTypeNoClean },
|
{ "-ObTypeNoClean", Test_ObTypeNoClean },
|
||||||
{ "ObTypes", Test_ObTypes },
|
{ "ObTypes", Test_ObTypes },
|
||||||
{ "RtlAvlTreeKM", Test_RtlAvlTree },
|
{ "RtlAvlTreeKM", Test_RtlAvlTree },
|
||||||
|
{ "RtlExceptionKM", Test_RtlException },
|
||||||
{ "RtlMemoryKM", Test_RtlMemory },
|
{ "RtlMemoryKM", Test_RtlMemory },
|
||||||
{ "RtlSplayTreeKM", Test_RtlSplayTree },
|
{ "RtlSplayTreeKM", Test_RtlSplayTree },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|
61
rostests/kmtests/rtl/RtlException.c
Normal file
61
rostests/kmtests/rtl/RtlException.c
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS kernel-mode tests
|
||||||
|
* LICENSE: GPLv2+ - See COPYING in the top level directory
|
||||||
|
* PURPOSE: Kernel-Mode Test Suite Exception test
|
||||||
|
* PROGRAMMER: Thomas Faber <thfabba@gmx.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <kmt_test.h>
|
||||||
|
|
||||||
|
#define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
|
||||||
|
#define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok_eq_hex(ExceptionStatus, ExpectedStatus)
|
||||||
|
|
||||||
|
START_TEST(RtlException)
|
||||||
|
{
|
||||||
|
NTSTATUS ExceptionStatus;
|
||||||
|
PCHAR Buffer[128];
|
||||||
|
CHAR Value;
|
||||||
|
|
||||||
|
/* Access a valid pointer - must not trigger SEH */
|
||||||
|
StartSeh()
|
||||||
|
RtlFillMemory(Buffer, sizeof(Buffer), 0x12);
|
||||||
|
EndSeh(STATUS_SUCCESS);
|
||||||
|
|
||||||
|
/* Read from a NULL pointer - must cause an access violation */
|
||||||
|
StartSeh()
|
||||||
|
Value = *(volatile CHAR *)NULL;
|
||||||
|
EndSeh(STATUS_ACCESS_VIOLATION);
|
||||||
|
|
||||||
|
/* Write to a NULL pointer - must cause an access violation */
|
||||||
|
StartSeh()
|
||||||
|
*(volatile CHAR *)NULL = 5;
|
||||||
|
EndSeh(STATUS_ACCESS_VIOLATION);
|
||||||
|
|
||||||
|
/* TODO: Find where MmBadPointer is defined - gives an unresolved external */
|
||||||
|
#if 0 //def KMT_KERNEL_MODE
|
||||||
|
/* Read from MmBadPointer - must cause an access violation */
|
||||||
|
StartSeh()
|
||||||
|
Value = *(volatile CHAR *)MmBadPointer;
|
||||||
|
EndSeh(STATUS_ACCESS_VIOLATION);
|
||||||
|
|
||||||
|
/* Write to MmBadPointer - must cause an access violation */
|
||||||
|
StartSeh()
|
||||||
|
*(volatile CHAR *)MmBadPointer = 5;
|
||||||
|
EndSeh(STATUS_ACCESS_VIOLATION);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We cannot test this in kernel mode easily - the stack is just "somewhere"
|
||||||
|
* in system space, and there's no guard page below it */
|
||||||
|
#ifdef KMT_USER_MODE
|
||||||
|
/* Overflow the stack - must cause a special exception */
|
||||||
|
StartSeh()
|
||||||
|
PCHAR Pointer;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
Pointer = _alloca(1024);
|
||||||
|
*Pointer = 5;
|
||||||
|
}
|
||||||
|
EndSeh(STATUS_STACK_OVERFLOW);
|
||||||
|
#endif
|
||||||
|
}
|
Loading…
Reference in a new issue