105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | //  Test the different system region bounds (region.cpp of region.exe)
 | ||
|  | //
 | ||
|  | //  Microsoft Research Detours Package
 | ||
|  | //
 | ||
|  | //  Copyright (c) Microsoft Corporation.  All rights reserved.
 | ||
|  | //
 | ||
|  | #include <stdio.h>
 | ||
|  | 
 | ||
|  | #include <windows.h>
 | ||
|  | #include <detours.h>
 | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | static DWORD (WINAPI * TrueSleepEx)(DWORD dwMilliseconds, BOOL bAlertable) = SleepEx; | ||
|  | 
 | ||
|  | DWORD WINAPI LoudSleepEx(DWORD dwMilliseconds, BOOL bAlertable) | ||
|  | { | ||
|  |     DWORD dwBeg = GetTickCount(); | ||
|  |     DWORD ret = TrueSleepEx(dwMilliseconds, bAlertable); | ||
|  |     DWORD dwEnd = GetTickCount(); | ||
|  | 
 | ||
|  |     printf("Slept %lu ticks.\n", dwEnd - dwBeg); | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////////////////////////////////////////
 | ||
|  | //
 | ||
|  | PVOID AttachAndDetach(DWORD dwMilliseconds) | ||
|  | { | ||
|  |     LONG error; | ||
|  |     PVOID trampoline; | ||
|  | 
 | ||
|  |     DetourTransactionBegin(); | ||
|  |     DetourUpdateThread(GetCurrentThread()); | ||
|  |     DetourAttach(&(PVOID&)TrueSleepEx, LoudSleepEx); | ||
|  |     error = DetourTransactionCommit(); | ||
|  | 
 | ||
|  |     printf("Attach: %ld, Trampoline: %p\n", error, TrueSleepEx); | ||
|  | 
 | ||
|  |     trampoline = TrueSleepEx; | ||
|  | 
 | ||
|  |     printf("\n"); | ||
|  |     printf("Sleep(%lu)\n", dwMilliseconds); | ||
|  |     Sleep(dwMilliseconds); | ||
|  |     printf("\n"); | ||
|  | 
 | ||
|  |     DetourTransactionBegin(); | ||
|  |     DetourUpdateThread(GetCurrentThread()); | ||
|  |     DetourDetach(&(PVOID&)TrueSleepEx, LoudSleepEx); | ||
|  |     error = DetourTransactionCommit(); | ||
|  | 
 | ||
|  |     return trampoline; | ||
|  | } | ||
|  | 
 | ||
|  | int main(int argc, char **argv) | ||
|  | { | ||
|  |     (void)argc; | ||
|  |     (void)argv; | ||
|  | 
 | ||
|  |     // First, save the default system region.
 | ||
|  | 
 | ||
|  |     PVOID pDefaultLower = DetourSetSystemRegionLowerBound(NULL); | ||
|  |     PVOID pDefaultUpper = DetourSetSystemRegionUpperBound(NULL); | ||
|  | 
 | ||
|  |     // Now attach the detour with the default system region.
 | ||
|  | 
 | ||
|  |     DetourSetSystemRegionLowerBound(pDefaultLower); | ||
|  |     DetourSetSystemRegionUpperBound(pDefaultUpper); | ||
|  | 
 | ||
|  |     printf("%p..%p: ", pDefaultLower, pDefaultUpper); | ||
|  |     PVOID pTramp1 = AttachAndDetach(10); | ||
|  | 
 | ||
|  |     printf("%p..%p: ", pDefaultLower, pDefaultUpper); | ||
|  |     PVOID pTramp2 = AttachAndDetach(10); | ||
|  | 
 | ||
|  |     // Now attach the detour with a smaller system region.
 | ||
|  | 
 | ||
|  |     PVOID pSmallerLower = (PVOID)( ((ULONG_PTR)pTramp1) & ~(ULONG_PTR)0x3fffffff ); | ||
|  |     PVOID pSmallerUpper = (PVOID)( ((ULONG_PTR)pTramp1 + 0x3fffffff) & ~(ULONG_PTR)0x3fffffff ); | ||
|  | 
 | ||
|  |     DetourSetSystemRegionLowerBound(pSmallerLower); | ||
|  |     DetourSetSystemRegionUpperBound(pSmallerUpper); | ||
|  | 
 | ||
|  |     printf("%p..%p: ", pSmallerLower, pSmallerUpper); | ||
|  |     PVOID pTramp3 = AttachAndDetach(20); | ||
|  | 
 | ||
|  |     printf("Sleep(30)\n"); | ||
|  |     Sleep(30); | ||
|  |     printf("\n"); | ||
|  | 
 | ||
|  |     if (pTramp1 != pTramp2) { | ||
|  |         printf("!!!!!! Trampoling allocation is not deterministic.  %p != %p\n", pTramp1, pTramp2); | ||
|  |         return 1; | ||
|  |     } | ||
|  |     else if (pTramp2 == pTramp3) { | ||
|  |         printf("!!!!!! Trampoling allocation doesn't skip region.  %p == %p\n", pTramp2, pTramp3); | ||
|  |         return 2; | ||
|  |     } | ||
|  | 
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 |