126 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | //  First Chance Exception Handling Test Program (excep.cpp of excep.exe)
 | ||
|  | //
 | ||
|  | //  Microsoft Research Detours Package
 | ||
|  | //
 | ||
|  | //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | ||
|  | //
 | ||
|  | //  For more information on exception handling, see "A Crash Course on the
 | ||
|  | //  Depths of Win32 Structured Exception Handling," by Matt Pietrek in the
 | ||
|  | //  January 1997 issue of Microsoft Systems Journal.
 | ||
|  | //
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <windows.h>
 | ||
|  | #include <detours.h>
 | ||
|  | #include "firstexc.h"
 | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | static LPVOID   s_pvData = NULL; | ||
|  | static DWORD    s_dwDataPerm = 0; | ||
|  | 
 | ||
|  | static LONG ExceptCatch(LONG nTry, DWORD dwException, LPEXCEPTION_POINTERS pinfo) | ||
|  | { | ||
|  |     printf("      ExceptCatch(%ld, %08lx, %08lx)\n", nTry, dwException, (ULONG)pinfo); | ||
|  | #ifdef INCLUDE_THIS
 | ||
|  |     if (nTry == 0) { | ||
|  |         return EXCEPTION_CONTINUE_EXECUTION; | ||
|  |     } | ||
|  | #endif
 | ||
|  |     return EXCEPTION_EXECUTE_HANDLER; | ||
|  | } | ||
|  | 
 | ||
|  | static int BadCode(int nTry) | ||
|  | { | ||
|  |     printf("    BadCode(Try:%d)\n", nTry); | ||
|  |     printf("      BadCode -> %ld\n", *(PULONG)s_pvData); | ||
|  |     ((PULONG)s_pvData)[0] = 0; | ||
|  |     printf("      BadCode -> %ld\n", *(PULONG)s_pvData); | ||
|  |     ((PULONG)s_pvData)[-1] = 0; | ||
|  |     printf("      BadCode -> %ld\n", *(PULONG)s_pvData); | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | void safe(int nTry) | ||
|  | { | ||
|  |     __try { | ||
|  |         printf("  try(%d)\n", nTry); | ||
|  |         BadCode(nTry); | ||
|  |         printf("  good(%d)\n", nTry); | ||
|  |     } __except(ExceptCatch(nTry, | ||
|  |                            GetExceptionCode(), | ||
|  |                            GetExceptionInformation())) { | ||
|  |         DWORD dwExcept = GetExceptionCode(); | ||
|  | 
 | ||
|  |         printf("  handler(%d) : %08lx\n", nTry, dwExcept); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void raw(int nTry) | ||
|  | { | ||
|  |     BadCode(nTry); | ||
|  | } | ||
|  | 
 | ||
|  | LONG WINAPI MyVirtualFaultFilter(PEXCEPTION_POINTERS pException) | ||
|  | { | ||
|  |     PEXCEPTION_RECORD pExceptRec = pException->ExceptionRecord; | ||
|  | 
 | ||
|  |     if (pExceptRec->ExceptionCode == 0xc0000005) { | ||
|  |         printf("--        Memory access exception.\n"); | ||
|  |         if (pExceptRec->NumberParameters >= 2 && | ||
|  |             pExceptRec->ExceptionInformation[1] >= (ULONG)s_pvData && | ||
|  |             pExceptRec->ExceptionInformation[1] <= (ULONG)s_pvData + sizeof(ULONG)) { | ||
|  | 
 | ||
|  |             VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READWRITE, &s_dwDataPerm); | ||
|  |             printf("--        Changed permissions.\n"); | ||
|  |             return EXCEPTION_CONTINUE_EXECUTION; | ||
|  |         } | ||
|  |     } | ||
|  |     return EXCEPTION_CONTINUE_SEARCH; | ||
|  | } | ||
|  | 
 | ||
|  | int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR lpszCmdLine, int nCmdShow) | ||
|  | { | ||
|  |     (void)hinst; | ||
|  |     (void)hprev; | ||
|  |     (void)lpszCmdLine; | ||
|  |     (void)nCmdShow; | ||
|  | 
 | ||
|  |     s_pvData = VirtualAlloc(NULL, sizeof(ULONG), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); | ||
|  |     if (s_pvData == NULL) { | ||
|  |         printf("VirtualAlloc failed: %ld\n", GetLastError()); | ||
|  |         return 0; | ||
|  |     } | ||
|  |     *(PULONG)s_pvData = 1; | ||
|  | 
 | ||
|  |     VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READONLY, &s_dwDataPerm); | ||
|  | 
 | ||
|  |     DetourFirstChanceExceptionFilter(MyVirtualFaultFilter); | ||
|  | 
 | ||
|  |     printf("main\n"); | ||
|  |     printf("--------------------------------------------------\n"); | ||
|  |     int nTry = 0; | ||
|  |     for (; nTry < 1; nTry++) { | ||
|  |         // safe(nTry);
 | ||
|  |     } | ||
|  |     printf("-- safe ------------------------------------------\n"); | ||
|  |     safe(nTry); | ||
|  |     VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READWRITE, &s_dwDataPerm); | ||
|  |     *(PULONG)s_pvData = 1; | ||
|  |     VirtualProtect(s_pvData, sizeof(ULONG), PAGE_READONLY, &s_dwDataPerm); | ||
|  | 
 | ||
|  |     printf("-- raw -------------------------------------------\n"); | ||
|  |     printf("*\n"); | ||
|  |     printf("* NB: The second attempt to write will fail because it isn't handled.\n"); | ||
|  |     printf("*\n"); | ||
|  |     raw(nTry); | ||
|  |     printf("--------------------------------------------------\n"); | ||
|  |     printf("exit\n"); | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } | ||
|  | //
 | ||
|  | ///////////////////////////////////////////////////////////////// End of File.
 |