#include #include #include #include #include #include "crashdrv.h" #define CRASHDRV_DEVICE "\\\\.\\CrashDrv" #define KMODE_EXCEPTION_NOT_HANDLED ((ULONG)0x0000001EL) #define IRQL_NOT_LESS_OR_EQUAL ((ULONG)0x0000000AL) typedef struct _TESTINFO { DWORD CtlCode; DWORD TestNum; LPSTR Description; } TESTINFO, *LPTESTINFO; TESTINFO TestInformation[] = { 0, 0, NULL, (DWORD)IOCTL_CRASHDRV_BUGCHECK, TEST_BUGCHECK, "Bugcheck", (DWORD)IOCTL_CRASHDRV_STACK_OVERFLOW, TEST_STACK_OVERFLOW, "Stack overflow", (DWORD)IOCTL_CRASHDRV_SIMPLE, TEST_SIMPLE, "Simple", (DWORD)IOCTL_CRASHDRV_EXCEPTION, TEST_EXCEPTION, "Exception", (DWORD)IOCTL_CRASHDRV_HARDERR, TEST_HARDERR, "Hard error", (DWORD)IOCTL_CRASHDRV_SPECIAL, TEST_SPECIAL, "Special" }; #define MaxTests (sizeof(TestInformation)/sizeof(TESTINFO)) DWORD IoctlBuf[16]; DWORD TestNumber; VOID GetCommandLineArgs(VOID); VOID Usage(VOID); DWORD CrashDrvCheckRequest(HANDLE); BOOL StartCrashDrvService(VOID); void _cdecl main( void ) { HANDLE hCrashDrv; DWORD rq; DWORD ReturnedByteCount; ZeroMemory( IoctlBuf, sizeof(IoctlBuf) ); GetCommandLineArgs(); if (!StartCrashDrvService()) { return; } hCrashDrv = CreateFile( CRASHDRV_DEVICE, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if ( hCrashDrv == INVALID_HANDLE_VALUE ) { printf("Could not open the CrashDrv device (%d)\n",GetLastError()); ExitProcess(1); } printf("Successfuly opened the CrashDrv device\n"); if (TestNumber) { if (TestNumber > MaxTests) { printf( "invalid test number\n" ); Usage(); } if (!DeviceIoControl( hCrashDrv, TestInformation[TestNumber].CtlCode, NULL, 0, IoctlBuf, sizeof(IoctlBuf), &ReturnedByteCount, NULL )) { printf( "call to driver failed \n", GetLastError() ); } return; } while( TRUE ) { rq = CrashDrvCheckRequest( hCrashDrv ); if (rq) { if (!DeviceIoControl( hCrashDrv, CTL_CODE(FILE_DEVICE_CRASHDRV, rq, METHOD_BUFFERED,FILE_ANY_ACCESS), NULL, 0, IoctlBuf, sizeof(IoctlBuf), &ReturnedByteCount, NULL )) { printf( "call to driver failed \n", GetLastError() ); } } Sleep(500); } CloseHandle( hCrashDrv ); return; } DWORD CrashDrvCheckRequest( HANDLE hCrashDrv ) { DWORD ReturnedByteCount; BOOL rc; ZeroMemory( IoctlBuf, sizeof(IoctlBuf) ); rc = DeviceIoControl( hCrashDrv, (DWORD)IOCTL_CRASHDRV_CHECK_REQUEST, NULL, 0, IoctlBuf, sizeof(IoctlBuf), &ReturnedByteCount, NULL ); return IoctlBuf[0]; } VOID Usage( VOID ) { DWORD i; printf( "usage: TEST [options]\n" ); printf( " [-?] Display this message\n" ); printf( " [-t test-number] Execute a test\n" ); for (i=1; i= ssStatus.dwCheckPoint) { break; } } if (ssStatus.dwCurrentState == SERVICE_RUNNING) printf("CrashDrv service started\n"); else { printf("CrashDrv service not started: \n"); } CloseServiceHandle(schService); }