예제 #1
0
파일: module.c 프로젝트: mingpen/OpenNT
BOOL
ProcessModuleLoad ( PDEBUGPACKET dp, LPDEBUG_EVENT de )

/*++

Routine Description:

    Process all module load debug events, create process & dll load.
    The purpose is to allocate a MODULEINFO structure, fill in the
    necessary values, and load the symbol table.

Arguments:

    dp      - pointer to a debug packet
    de      - pointer to a debug event structure

Return Value:

    TRUE    - everything worked
    FALSE   - we're hosed

--*/

{
    HANDLE      hFile;
    DWORD       dwBaseOfImage;
    LPSTR       SymbolPath;

    if (de->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) {
        hFile = de->u.CreateProcessInfo.hFile;
        dwBaseOfImage = (DWORD)de->u.CreateProcessInfo.lpBaseOfImage;
        dp->hProcess = de->u.CreateProcessInfo.hProcess;
        dp->dwProcessId = de->dwProcessId;
        SymInitialize( dp->hProcess, NULL, FALSE );
        SymbolPath = GetSymbolSearchPath();
        SymSetSearchPath( dp->hProcess, SymbolPath );
        free( SymbolPath );
    } else if (de->dwDebugEventCode == LOAD_DLL_DEBUG_EVENT) {
        hFile = de->u.LoadDll.hFile;
        dwBaseOfImage = (DWORD)de->u.LoadDll.lpBaseOfDll;
    }

    if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE)) {
        return FALSE;
    }

    if (!SymLoadModule( dp->hProcess, hFile, NULL, NULL, dwBaseOfImage, 0 )) {
        return FALSE;
    } else {
        if (de->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) {
            IMAGEHLP_MODULE   mi;
            if (SymGetModuleInfo( dp->hProcess, dwBaseOfImage, &mi )) {
                strcpy( szApp, mi.ImageName );
            }
        }
    }

    return TRUE;
}
예제 #2
0
void EnumCallStack(HANDLE hThread, CONTEXT* context, PRINTSTACKFRAMECALLBACK pfn, LPVOID lpData)
{	
	if(!IsStackTraceEnabled())
		return;

	DebugHelper dbghelp;

	DWORD dwSymOptions = dbghelp.SymGetOptions();
	dwSymOptions |= SYMOPT_DEFERRED_LOADS;
	dwSymOptions |= SYMOPT_FAIL_CRITICAL_ERRORS;
	dwSymOptions |= SYMOPT_LOAD_LINES;
	dwSymOptions |= SYMOPT_UNDNAME;
	
	if(!dbghelp.SymSetOptions(dwSymOptions))
		return;
		
	if(!dbghelp.SymInitialize(0))	
		return;

	DWORD dwBufferSize = 1024*2;
	LPTSTR lpszSearchPath = (LPTSTR)::LocalAlloc(LPTR, dwBufferSize);
	if((lpszSearchPath != 0) && dbghelp.SymGetSearchPath(lpszSearchPath, dwBufferSize))
	{	
		GetSymbolSearchPath(lpszSearchPath, dwBufferSize);		
		dbghelp.SymSetSearchPath(lpszSearchPath);				
	}
	if(lpszSearchPath)
		::LocalFree(lpszSearchPath);	
	
	STACKFRAME64 stackFrame;
	ZeroMemory(&stackFrame, sizeof(stackFrame));
	stackFrame.AddrPC.Offset = context->Eip;
	stackFrame.AddrPC.Mode = AddrModeFlat;
	stackFrame.AddrFrame.Offset = context->Ebp;
	stackFrame.AddrFrame.Mode = AddrModeFlat;

	for (int frameNum = 0; dbghelp.StackWalk64(hThread, &stackFrame, context) || frameNum < 50; frameNum++)
	{		
		PrintStackFrame(dbghelp, stackFrame, frameNum, pfn, lpData);         
	}
	dbghelp.SymCleanup();
}