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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |