Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}