130 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			130 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | //  Detours Test Program (dumpe.cpp of dumpe.exe)
 | ||
|  | //
 | ||
|  | //  Microsoft Research Detours Package
 | ||
|  | //
 | ||
|  | //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | ||
|  | //
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <stdlib.h>
 | ||
|  | #include <windows.h>
 | ||
|  | #include <ole2.h>
 | ||
|  | #include <shellapi.h>
 | ||
|  | #include "detours.h"
 | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | #ifndef NODEBUG
 | ||
|  | #undef ASSERT
 | ||
|  | VOID DetourAssertMessage(CONST PCHAR szMsg, CONST PCHAR szFile, DWORD nLine); | ||
|  | 
 | ||
|  | #define ASSERT(x)   \
 | ||
|  | do { if (!(x)) { DetourAssertMessage(#x, __FILE__, __LINE__); DebugBreak(); }} while (0) | ||
|  |     ; | ||
|  | #undef ASSERTX
 | ||
|  | #define ASSERTX(x)   \
 | ||
|  | do { if (!(x)) { DetourAssertMessage(#x, __FILE__, __LINE__); PCHAR p=(PCHAR)(x); *p = 1; }} while (0) | ||
|  |     ; | ||
|  | #else   // NODEBUG
 | ||
|  | #undef ASSERT
 | ||
|  | #define ASSERT(x)
 | ||
|  | #undef ASSERTX
 | ||
|  | #define ASSERTX(x)
 | ||
|  | #endif  // NODEBUG
 | ||
|  | //
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | 
 | ||
|  | ////////////////////////////////////////////////////////////// Error Messages.
 | ||
|  | //
 | ||
|  | VOID DetourAssertMessage(CONST PCHAR szMsg, CONST PCHAR szFile, DWORD nLine) | ||
|  | { | ||
|  |     printf("ASSERT(%s) failed in %s, line %ld.", szMsg, szFile, nLine); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | static BOOL CALLBACK ExportCallback(PVOID pContext, | ||
|  |                                     ULONG nOrdinal, | ||
|  |                                     LPCSTR pszSymbol, | ||
|  |                                     PVOID pbTarget) | ||
|  | { | ||
|  |     (void)pContext; | ||
|  | 
 | ||
|  |     printf("    %7ld      %p %-30s\n", | ||
|  |            (ULONG)nOrdinal, | ||
|  |            pbTarget, | ||
|  |            pszSymbol ? pszSymbol : "[NONAME]"); | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | BOOL DumpFile(PCHAR pszPath) | ||
|  | { | ||
|  |     HINSTANCE hInst = LoadLibraryA(pszPath); | ||
|  |     if (hInst == NULL) { | ||
|  |         printf("Unable to load %s: Error %ld\n", pszPath, GetLastError()); | ||
|  |         return FALSE; | ||
|  |     } | ||
|  | 
 | ||
|  |     printf("%s @ %p\n", pszPath, hInst); | ||
|  | 
 | ||
|  |     PVOID pbEntry = DetourGetEntryPoint(hInst); | ||
|  |     printf("  EntryPoint: %p\n", pbEntry); | ||
|  | 
 | ||
|  |     printf("    Ordinal      RVA     Name\n"); | ||
|  |     DetourEnumerateExports(hInst, NULL, ExportCallback); | ||
|  | 
 | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | void PrintUsage(void) | ||
|  | { | ||
|  |     printf("Usage:\n" | ||
|  |            "    dumpe [.dll files]\n" | ||
|  |            "Misc. Options:\n" | ||
|  |            "    /?       : Help screen.\n"); | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////// main.
 | ||
|  | //
 | ||
|  | int CDECL main(int argc, char **argv) | ||
|  | { | ||
|  |     BOOL fNeedHelp = FALSE; | ||
|  | 
 | ||
|  |     int arg = 1; | ||
|  |     for (; arg < argc; arg++) { | ||
|  |         if (argv[arg][0] == '-' || argv[arg][0] == '/') { | ||
|  |             CHAR *argn = argv[arg] + 1; | ||
|  |             CHAR *argp = argn; | ||
|  |             while (*argp && *argp != ':') | ||
|  |                 argp++; | ||
|  |             if (*argp == ':') | ||
|  |                 *argp++ = '\0'; | ||
|  | 
 | ||
|  |             switch (argn[0]) { | ||
|  | 
 | ||
|  |             case '?':                                   // Help.
 | ||
|  |                 fNeedHelp = TRUE; | ||
|  |                 break; | ||
|  | 
 | ||
|  |             default: | ||
|  |                 fNeedHelp = TRUE; | ||
|  |                 printf("Bad argument: %s:%s\n", argn, argp); | ||
|  |                 break; | ||
|  |             } | ||
|  |         } | ||
|  |         else { | ||
|  |             DumpFile(argv[arg]); | ||
|  |         } | ||
|  |     } | ||
|  |     if (fNeedHelp || argc == 1) { | ||
|  |         PrintUsage(); | ||
|  |         return 1; | ||
|  |     } | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | // End of File
 |