DWORD Client::GetProcess(DWORD dwProcessID) { HANDLE hHandle = fnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); DWORD dwError = (DWORD) Error::IX_ERROR; if (hHandle != INVALID_HANDLE_VALUE) { PROCESSENTRY32 pEntry; pEntry.dwSize = sizeof(PROCESSENTRY32); if (fnProcess32First(hHandle, &pEntry)) { do { if (ClientAPI::GetHash(pEntry.szExeFile, FALSE) == dwProcessID) dwError = pEntry.th32ProcessID; } while (fnProcess32Next(hHandle, &pEntry) && dwError == Error::IX_ERROR); } fnCloseHandle(hHandle); } return dwError; }
DWORD Client::GetThread(DWORD dwProcessID) { HANDLE hHandle = fnCreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); DWORD dwError = (DWORD) Error::IX_ERROR; if (hHandle != INVALID_HANDLE_VALUE) { THREADENTRY32 pEntry; pEntry.dwSize = sizeof(THREADENTRY32); if (fnThread32First(hHandle, &pEntry)) { do { if (pEntry.th32OwnerProcessID == dwProcessID) dwError = pEntry.th32ThreadID; } while (fnThread32Next(hHandle, &pEntry) && dwError == Error::IX_ERROR); } fnCloseHandle(hHandle); } return dwError; }
bool dbgsymengine::guard::init() { if (!m_ref) { m_ref = -1; HANDLE hProc = SymGetProcessHandle(); DWORD dwPid = GetCurrentProcessId(); // initializes SymSetOptions (SymGetOptions()|SYMOPT_DEFERRED_LOADS|SYMOPT_LOAD_LINES); // SymSetOptions (SYMOPT_UNDNAME|SYMOPT_LOAD_LINES); if (::SymInitialize(hProc, 0, TRUE)) { // enumerate modules if (IsNT()) { typedef BOOL (WINAPI *ENUMPROCESSMODULES)(HANDLE, HMODULE*, DWORD, LPDWORD); HINSTANCE hInst = LoadLibrary( "psapi.dll" ); if (hInst) { ENUMPROCESSMODULES fnEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hInst, "EnumProcessModules"); DWORD cbNeeded = 0; if (fnEnumProcessModules && fnEnumProcessModules(GetCurrentProcess(), 0, 0, &cbNeeded) && cbNeeded) { HMODULE * pmod = (HMODULE *)alloca(cbNeeded); DWORD cb = cbNeeded; if (fnEnumProcessModules(GetCurrentProcess(), pmod, cb, &cbNeeded)) { m_ref = 0; for (unsigned i = 0; i < cb / sizeof (HMODULE); ++i) { if (!load_module(hProc, pmod[i])) { // m_ref = -1; // break; _ASSERTE(0); } } } } else { _ASSERTE(0); } VERIFY(FreeLibrary(hInst)); } else { _ASSERTE(0); } } else { typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD, DWORD); typedef BOOL (WINAPI *MODULEWALK)(HANDLE, LPMODULEENTRY32); HMODULE hMod = GetModuleHandle("kernel32"); CREATESNAPSHOT fnCreateToolhelp32Snapshot = (CREATESNAPSHOT)GetProcAddress(hMod, "CreateToolhelp32Snapshot"); MODULEWALK fnModule32First = (MODULEWALK)GetProcAddress(hMod, "Module32First"); MODULEWALK fnModule32Next = (MODULEWALK)GetProcAddress(hMod, "Module32Next"); if (fnCreateToolhelp32Snapshot && fnModule32First && fnModule32Next) { HANDLE hModSnap = fnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid); if (hModSnap) { MODULEENTRY32 me32 = {0}; me32.dwSize = sizeof(MODULEENTRY32); if (fnModule32First(hModSnap, &me32)) { m_ref = 0; do { if (!load_module(hProc, me32.hModule)) { // m_ref = -1; // break; } } while(fnModule32Next(hModSnap, &me32)); } VERIFY(CloseHandle(hModSnap)); } } } if (m_ref == -1) { VERIFY(SymCleanup(SymGetProcessHandle())); } } else { _ASSERTE(0); } } if (m_ref == -1) return false; if (0 == m_ref) ++m_ref; // lock it once // ++m_ref; return true; }