diff options
Diffstat (limited to 'samples/excep/excep.cpp')
-rw-r--r-- | samples/excep/excep.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/samples/excep/excep.cpp b/samples/excep/excep.cpp new file mode 100644 index 0000000..488a489 --- /dev/null +++ b/samples/excep/excep.cpp @@ -0,0 +1,125 @@ +////////////////////////////////////////////////////////////////////////////// +// +// 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. |