/// Get the combined time a thread has spent in user and kernel space in ms static DWORD GetThreadTick( const FILETIME& user, const FILETIME& kernel ) { __int64 tick = MAKEDWORDLONG( user.dwLowDateTime, user.dwHighDateTime ); tick += MAKEDWORDLONG( kernel.dwLowDateTime, kernel.dwHighDateTime ); tick /= 10000; return static_cast< DWORD >( tick ); }
LPVOID GetRelativeBranchDestination(LPVOID lpInst,hdes *hs) { #ifdef _AMD64_ return (LPVOID)MAKEDWORDLONG((LODWORD(lpInst)+hs->len+hs->imm.imm32),HIDWORD(lpInst)); #else return (LPVOID)((DWORD)lpInst+hs->len+hs->imm.imm32); #endif }
CAMLprim value win_stat(value path, value wpath) { int res, mode; HANDLE h; BY_HANDLE_FILE_INFORMATION info; CAMLparam2(path,wpath); CAMLlocal1 (v); h = CreateFileW ((LPCWSTR) String_val (wpath), 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_READONLY, NULL); if (h == INVALID_HANDLE_VALUE) { win32_maperr (GetLastError ()); uerror("stat", path); } res = GetFileInformationByHandle (h, &info); if (res == 0) { win32_maperr (GetLastError ()); (void) CloseHandle (h); uerror("stat", path); } res = CloseHandle (h); if (res == 0) { win32_maperr (GetLastError ()); uerror("stat", path); } v = caml_alloc (12, 0); Store_field (v, 0, Val_int (info.dwVolumeSerialNumber)); // Apparently, we cannot trust the inode number to be stable when // nFileIndexHigh is 0. if (info.nFileIndexHigh == 0) info.nFileIndexLow = 0; /* The ocaml code truncates inode numbers to 31 bits. We hash the low and high parts in order to lose as little information as possible. */ Store_field (v, 1, Val_int (MAKEDWORDLONG(info.nFileIndexLow,info.nFileIndexHigh)+155825701*((DWORDLONG)info.nFileIndexHigh))); Store_field (v, 2, Val_int (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? 1: 0)); mode = 0000444; if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) mode |= 0000111; if (!(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) mode |= 0000222; Store_field (v, 3, Val_int(mode)); Store_field (v, 4, Val_int (info.nNumberOfLinks)); Store_field (v, 5, Val_int (0)); Store_field (v, 6, Val_int (0)); Store_field (v, 7, Val_int (0)); Store_field (v, 8, copy_int64(MAKEDWORDLONG(info.nFileSizeLow,info.nFileSizeHigh))); Store_field (v, 9, copy_double((double) FILETIME_TO_TIME(info.ftLastAccessTime))); Store_field (v, 10, copy_double((double) FILETIME_TO_TIME(info.ftLastWriteTime))); Store_field (v, 11, copy_double((double) FILETIME_TO_TIME(info.ftCreationTime))); CAMLreturn (v); }
/// Convert a FILETIME to ticks (ms) static DWORD GetThreadTick( const FILETIME& time ) { __int64 tick = MAKEDWORDLONG( time.dwLowDateTime, time.dwHighDateTime ); return static_cast< DWORD >( tick /= 10000 ); }