307 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			307 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | //  Detours Test Program (dtarge.dll)
 | ||
|  | //
 | ||
|  | //  Microsoft Research Detours Package
 | ||
|  | //
 | ||
|  | //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | ||
|  | //
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <windows.h>
 | ||
|  | #include "dtarge.h"
 | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target0() | ||
|  | { | ||
|  |     printf("    Target0 ()\n"); | ||
|  |     return 1000; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target1(DWORD_PTR v1) | ||
|  | { | ||
|  |     printf("    Target1 (%ld)\n", | ||
|  |            (DWORD)v1); | ||
|  |     return 1001; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target2(DWORD_PTR v1, DWORD_PTR v2) | ||
|  | { | ||
|  |     printf("    Target2 (%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2); | ||
|  |     return 1002; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target3(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3) | ||
|  | { | ||
|  |     printf("    Target3 (%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3); | ||
|  |     return 1003; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target4(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4) | ||
|  | { | ||
|  |     printf("    Target4 (%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4); | ||
|  |     return 1004; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target5(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                          DWORD_PTR v5) | ||
|  | { | ||
|  |     printf("    Target5 (%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5); | ||
|  |     return 1005; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target6(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                          DWORD_PTR v5, DWORD_PTR v6) | ||
|  | { | ||
|  |     printf("    Target6 (%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6); | ||
|  |     return 1006; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target7(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7) | ||
|  | { | ||
|  |     printf("    Target7 (%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7); | ||
|  |     return 1007; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target8(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8) | ||
|  | { | ||
|  |     printf("    Target8 (%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8); | ||
|  |     return 1008; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target9(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                          DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                          DWORD_PTR v9) | ||
|  | { | ||
|  |     printf("    Target9 (%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9); | ||
|  |     return 1009; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target10(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10) | ||
|  | { | ||
|  |     printf("    Target10(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10); | ||
|  |     return 1010; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target11(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11) | ||
|  | { | ||
|  |     printf("    Target11(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10, (DWORD)v11); | ||
|  |     return 1011; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target12(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12) | ||
|  | { | ||
|  |     printf("    Target12(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12); | ||
|  |     return 1012; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target13(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12, | ||
|  |                           DWORD_PTR v13) | ||
|  | { | ||
|  |     printf("    Target13(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12, | ||
|  |            (DWORD)v13); | ||
|  |     return 1013; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target14(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12, | ||
|  |                           DWORD_PTR v13, DWORD_PTR v14) | ||
|  | { | ||
|  |     printf("    Target14(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12, | ||
|  |            (DWORD)v13, (DWORD)v14); | ||
|  |     return 1014; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target15(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12, | ||
|  |                           DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15) | ||
|  | { | ||
|  |     printf("    Target15(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12, | ||
|  |            (DWORD)v13, (DWORD)v14, (DWORD)v15); | ||
|  |     return 1015; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI Target16(DWORD_PTR v1, DWORD_PTR v2, DWORD_PTR v3, DWORD_PTR v4, | ||
|  |                           DWORD_PTR v5, DWORD_PTR v6, DWORD_PTR v7, DWORD_PTR v8, | ||
|  |                           DWORD_PTR v9, DWORD_PTR v10, DWORD_PTR v11, DWORD_PTR v12, | ||
|  |                           DWORD_PTR v13, DWORD_PTR v14, DWORD_PTR v15, DWORD_PTR v16) | ||
|  | { | ||
|  |     printf("    Target16(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)\n", | ||
|  |            (DWORD)v1, (DWORD)v2, (DWORD)v3, (DWORD)v4, | ||
|  |            (DWORD)v5, (DWORD)v6, (DWORD)v7, (DWORD)v8, | ||
|  |            (DWORD)v9, (DWORD)v10, (DWORD)v11, (DWORD)v12, | ||
|  |            (DWORD)v13, (DWORD)v14, (DWORD)v15, (DWORD)v16); | ||
|  |     return 1016; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI TargetV(DWORD_PTR v1, ...) | ||
|  | { | ||
|  |     DWORD_PTR args[32]; | ||
|  | 
 | ||
|  |     va_list va; | ||
|  |     va_start(va, v1); | ||
|  | 
 | ||
|  |     int argc = 0; | ||
|  |     for (args[argc++] = v1; args[argc-1] != 0;) { | ||
|  |         args[argc++] = va_arg(va, DWORD_PTR); | ||
|  |     } | ||
|  |     va_end(va); | ||
|  | 
 | ||
|  |     printf("    TargetV ("); | ||
|  |     int i = argc - 1; | ||
|  |     for (; i > 0; i--) { | ||
|  |         printf("%ld,", (DWORD)args[i]); | ||
|  |     } | ||
|  |     printf("%ld)\n", (DWORD)args[0]); | ||
|  | 
 | ||
|  |     return 1000 + argc; | ||
|  | } | ||
|  | 
 | ||
|  | DWORD_PTR WINAPI TargetR(DWORD_PTR v1, ...) | ||
|  | { | ||
|  |     DWORD_PTR args[32]; | ||
|  | 
 | ||
|  |     va_list va; | ||
|  |     va_start(va, v1); | ||
|  | 
 | ||
|  |     int argc = 0; | ||
|  |     for (args[argc++] = v1; args[argc-1] != 0;) { | ||
|  |         args[argc++] = va_arg(va, DWORD_PTR); | ||
|  |     } | ||
|  |     va_end(va); | ||
|  | 
 | ||
|  |     if (v1 > 1) { | ||
|  |         printf(":"); | ||
|  |         switch (argc) { | ||
|  |           default: | ||
|  |             return TargetR(0) + 1; | ||
|  |           case 1: | ||
|  |             return TargetR(args[0] - 1) + 1; | ||
|  |           case 2: | ||
|  |             return TargetR(args[0] - 1, args[1]) + 1; | ||
|  |           case 3: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2]) + 1; | ||
|  |           case 4: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3]) + 1; | ||
|  |           case 5: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4]) + 1; | ||
|  |           case 6: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5]) + 1; | ||
|  |           case 7: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6]) + 1; | ||
|  |           case 8: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7]) + 1; | ||
|  |           case 9: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8]) + 1; | ||
|  |           case 10: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9]) + 1; | ||
|  |           case 11: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10]) + 1; | ||
|  |           case 12: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10], args[11]) + 1; | ||
|  |           case 13: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10], args[11], | ||
|  |                            args[12]) + 1; | ||
|  |           case 14: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10], args[11], | ||
|  |                            args[12], args[13]) + 1; | ||
|  |           case 15: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10], args[11], | ||
|  |                            args[12], args[13], args[14]) + 1; | ||
|  |           case 16: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10], args[11], | ||
|  |                            args[12], args[13], args[14], args[15]) + 1; | ||
|  |           case 17: | ||
|  |             return TargetR(args[0] - 1, args[1], args[2], args[3], | ||
|  |                            args[4], args[5], args[6], args[7], | ||
|  |                            args[8], args[9], args[10], args[11], | ||
|  |                            args[12], args[13], args[14], args[15], | ||
|  |                            args[16]) + 1; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     printf("    TargetR ("); | ||
|  |     int i = argc - 1; | ||
|  |     for (; i > 0; i--) { | ||
|  |         printf("%ld,", (DWORD)args[i]); | ||
|  |     } | ||
|  |     printf("%ld)\n", (DWORD)args[0]); | ||
|  | 
 | ||
|  |     return 2000 + argc; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved) | ||
|  | { | ||
|  |     (void)hinst; | ||
|  |     (void)dwReason; | ||
|  |     (void)reserved; | ||
|  | 
 | ||
|  |     return TRUE; | ||
|  | } | ||
|  | 
 | ||
|  | //
 | ||
|  | ///////////////////////////////////////////////////////////////// End of File.
 |