BOOL My_GetWriteWatch() { DWORD dwFlags=NULL; PVOID lpBaseAddress=NULL; SIZE_T dwRegionSize=NULL; PVOID * lpAddresses=NULL; PULONG_PTR lpdwCount=NULL; PULONG lpdwGranularity=NULL; UINT returnVal_Real = NULL; UINT returnVal_Intercepted = NULL; DWORD error_Real = 0; DWORD error_Intercepted = 0; disableInterception(); returnVal_Real = GetWriteWatch (dwFlags,lpBaseAddress,dwRegionSize,lpAddresses,lpdwCount,lpdwGranularity); error_Real = GetLastError(); enableInterception(); returnVal_Intercepted = GetWriteWatch (dwFlags,lpBaseAddress,dwRegionSize,lpAddresses,lpdwCount,lpdwGranularity); error_Intercepted = GetLastError(); return ((returnVal_Real == returnVal_Intercepted) && (error_Real == error_Intercepted)); }
int vm_get_write_watch(void * addr, size_t size, void ** pages, unsigned int * n_pages, int options) { #ifdef HAVE_VM_WRITE_WATCH #ifdef HAVE_WIN32_VM DWORD flags = 0; if (options & VM_WRITE_WATCH_RESET) flags |= WRITE_WATCH_FLAG_RESET; ULONG page_size; ULONG_PTR count = *n_pages; int ret_code = GetWriteWatch(flags, addr, size, pages, &count, &page_size); if (ret_code != 0) return -1; *n_pages = count; return 0; #endif #endif // Unsupported return -1; }