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.
 |