windows-nt/Source/XPSP1/NT/sdktools/crash/driver/tests.c
2020-09-26 16:20:57 +08:00

285 lines
4.7 KiB
C

#include <ntosp.h>
extern KEVENT CrashEvent;
extern ULONG CrashRequest;
unsigned int fExcept1 = 0;
unsigned int cTry1 = 0;
unsigned int cRaise1pre = 0;
unsigned int cRaise1post = 0;
unsigned int cExcept1 = 0;
unsigned int cFilter1 = 0;
unsigned int fExcept2 = 0;
unsigned int cTry2 = 0;
unsigned int cRaise2pre = 0;
unsigned int cRaise2post = 0;
unsigned int cFinally2 = 0;
unsigned int fExcept3 = 0;
unsigned int cTry3 = 0;
unsigned int cRaise3pre = 0;
unsigned int cRaise3post = 0;
unsigned int cExcept3 = 0;
unsigned int cFilter3 = 0;
unsigned int fExcept4 = 0;
unsigned int cTry4 = 0;
unsigned int cRaise4pre = 0;
unsigned int cRaise4post = 0;
unsigned int cFinally4 = 0;
unsigned int fExcept5 = 0;
unsigned int cTry5 = 0;
unsigned int cRaise5pre = 0;
unsigned int cRaise5post = 0;
unsigned int cExcept5 = 0;
unsigned int cFilter5 = 0;
unsigned long GlobalVar = 0;
int ExceptFilterFn5 (int ExceptCode)
{
DbgPrint( "CrashDrv exception filter\n" );
cFilter5 ++;
return ExceptCode == 0x00003344 ? EXCEPTION_EXECUTE_HANDLER :
EXCEPTION_CONTINUE_EXECUTION ;
}
void function5 ()
{
_try
{
cTry5 ++;
if (fExcept5)
{
cRaise5pre ++;
ExRaiseStatus( fExcept4 );
cRaise5post ++;
}
}
_except (ExceptFilterFn5 (GetExceptionCode ()))
{
cExcept5 ++;
}
}
void function4 ()
{
_try
{
cTry4 ++;
function5 ();
if (fExcept4)
{
cRaise4pre ++;
ExRaiseStatus( fExcept4 );
cRaise4post ++;
}
}
_finally
{
cFinally4 ++;
}
}
int ExceptFilterFn3 (int ExceptCode)
{
cFilter3 ++;
return ExceptCode == 0x00005678 ? EXCEPTION_EXECUTE_HANDLER :
EXCEPTION_CONTINUE_SEARCH ;
}
void function3 ()
{
_try
{
cTry3 ++;
function4 ();
if (fExcept3)
{
cRaise3pre ++;
ExRaiseStatus( fExcept3 );
cRaise3post ++;
}
}
_except (ExceptFilterFn3 (GetExceptionCode ()))
{
cExcept3 ++;
}
}
void function2 ()
{
_try
{
cTry2 ++;
function3 ();
if (fExcept2)
{
cRaise2pre ++;
ExRaiseStatus( fExcept2 );
cRaise2post ++;
}
}
_finally
{
cFinally2 ++;
}
}
int ExceptFilterMain (int ExceptCode)
{
cFilter1 ++;
return ExceptCode == 0x00001010 ? EXCEPTION_EXECUTE_HANDLER :
ExceptCode == 0x00005678 ? EXCEPTION_CONTINUE_EXECUTION :
EXCEPTION_CONTINUE_SEARCH ;
}
VOID
CrashDrvExceptionTest(
PULONG ub
)
{
int i = 0;
while ( i++ < 10 ) {
_try {
cTry1 ++;
function2 ();
if (fExcept1) {
cRaise1pre ++;
ExRaiseStatus( fExcept1 );
cRaise1post ++;
}
}
_except (ExceptFilterMain (GetExceptionCode ())) {
cExcept1 ++;
}
fExcept1 = 0;
fExcept2 = 0;
fExcept3 = 0;
fExcept4 = 0;
fExcept5 = 0;
}
}
VOID
CrashDrvSimpleTest(
PULONG ub
)
{
int i = 0;
int j = 0;
int k = 0;
GlobalVar = 69;
i = 1;
j = 2;
k = 3;
}
#pragma warning(disable:4717) // disable recursion check
VOID
CrashDrvStackOverFlow(
PULONG ub
)
{
struct {
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int i;
} Foo;
RtlFillMemory (&Foo, 'a', sizeof (Foo));
CrashDrvStackOverFlow ((PVOID) &Foo);
return;
}
VOID
CrashDrvBugCheck(
PULONG ub
)
{
KeBugCheck( 0x69696969 );
}
VOID
CrashDrvHardError(
PULONG ub
)
{
NTSTATUS Status;
NTSTATUS ErrorCode;
ULONG Response;
ErrorCode = STATUS_SYSTEM_PROCESS_TERMINATED;
Status = ExRaiseHardError(
ErrorCode,
0,
0,
NULL,
OptionShutdownSystem,
&Response
);
return;
}
ULONG CurrentWatchPoint=0;
VOID
AsyncSetBreakPoint(
ULONG LinearAddress
)
{
#ifdef i386
CurrentWatchPoint = LinearAddress;
_asm {
mov eax, LinearAddress
mov dr0, eax
mov eax, 10303h
mov dr7, eax
}
#endif
}
VOID
AsyncRemoveBreakPoint(
ULONG LinearAddress
)
{
#ifdef i386
CurrentWatchPoint = 0;
_asm {
mov eax, 0
mov dr7, eax
}
#endif
}
#pragma optimize ( "", on )
VOID
CrashSpecial(
PULONG ub
)
{
CrashRequest = ub[0];
KeSetEvent( &CrashEvent, 0, FALSE );
}