Example #1
0
HRESULT MemoryBytes::WriteAt(
    IDebugMemoryContext2* pStartContext,
    DWORD                 dwCount,
    BYTE*                 rgbMemory )
{
    if ( pStartContext == NULL )
        return E_INVALIDARG;
    if ( rgbMemory == NULL )
        return E_INVALIDARG;

    HRESULT hr = S_OK;
    Address addr = 0;
    SIZE_T  lenWritten = 0;
    CComQIPtr<IMagoMemoryContext>   memCxt = pStartContext;

    if ( memCxt == NULL )
        return E_INVALIDARG;

    memCxt->GetAddress( addr );

    hr = mDebugger->WriteMemory(
             mProc,
             addr,
             dwCount,
             lenWritten,
             rgbMemory );
    if ( FAILED( hr ) )
        return hr;

    return S_OK;
}
Example #2
0
HRESULT MemoryBytes::ReadAt(
    IDebugMemoryContext2* pStartContext,
    DWORD                 dwCount,
    BYTE*                 rgbMemory,
    DWORD*                pdwRead,
    DWORD*                pdwUnreadable )
{
    if ( pStartContext == NULL )
        return E_INVALIDARG;
    if ( (rgbMemory == NULL) || (pdwRead == NULL) )
        return E_INVALIDARG;

    HRESULT hr = S_OK;
    Address addr = 0;
    SIZE_T  lenRead = 0;
    SIZE_T  lenUnreadable = 0;
    CComQIPtr<IMagoMemoryContext>   memCxt = pStartContext;

    if ( memCxt == NULL )
        return E_INVALIDARG;

    memCxt->GetAddress( addr );

    hr = mDebugger->ReadMemory(
             mProc,
             addr,
             dwCount,
             lenRead,
             lenUnreadable,
             rgbMemory );
    if ( FAILED( hr ) )
        return hr;

    *pdwRead = lenRead;

    if ( pdwUnreadable != NULL )
        *pdwUnreadable = lenUnreadable;

    return S_OK;
}
Example #3
0
	List<CallStackFrame^>^ Debuggee::GetCallStack(uint32_t threadId)
	{
		CComModule _Module;
		List<CallStackFrame^>^ frames = gcnew List<CallStackFrame^>();

		RefPtr<Mago::Thread> thread;
		HRESULT hr = mProg->FindThread(threadId, thread);
		if (FAILED(hr))
			return frames;

		FRAMEINFO_FLAGS flags =
			FIF_DEBUGINFO
			| FIF_FUNCNAME
			| FIF_RETURNTYPE
			| FIF_ARGS
			| FIF_LANGUAGE
			| FIF_MODULE
			| FIF_FUNCNAME_MODULE
			| FIF_FUNCNAME_ARGS_ALL
			| FIF_FUNCNAME_LINES
			| FIF_FUNCNAME_OFFSET
			| FIF_FUNCNAME_ARGS_TYPES
			| FIF_FUNCNAME_ARGS_NAMES
			| FIF_FUNCNAME_ARGS_VALUES
			| FIF_FRAME;


		DWORD tid = NULL;
		hr = thread->GetThreadId(&tid);
		if (FAILED(hr))
			return frames;

		CComPtr<IEnumDebugFrameInfo2> edfi = NULL;
		hr = thread->EnumFrameInfo(flags, 10, &edfi);
		if (FAILED(hr))
			return frames;

		ULONG cnt = 0;
		hr = edfi->GetCount(&cnt);
		if (FAILED(hr))
			return frames;
		
		ULONG fetched = 0;
		Mago::FrameInfoArray  array(cnt);
		while (fetched < cnt)
		{
			ULONG ft = 0;
			hr = edfi->Next(cnt - fetched, &array[fetched], &ft);
			if (FAILED(hr))
				return frames;
			fetched += ft;
		}

		for (ULONG i = 0; i < fetched; i++)
		{
			FRAMEINFO* fi = &array[i];
			CComPtr<IDebugCodeContext2> dcCtx = NULL;
			
			hr = fi->m_pFrame->GetCodeContext(&dcCtx);
			if (FAILED(hr))
				continue;

			CComQIPtr<Mago::IMagoMemoryContext> mmCtx = dcCtx; //how else to get address?
			Mago::Address64 addr = 0;
			hr = mmCtx->GetAddress(addr);

			CallStackFrame^ frame = gcnew CallStackFrame();
			frame->AddressMin = fi->m_addrMin;
			frame->AddressMax = fi->m_addrMax;
			frame->FunctionName = gcnew String(fi->m_bstrFuncName);
			frame->Args = gcnew String(fi->m_bstrArgs);
			frame->ReturnType = gcnew String(fi->m_bstrReturnType);
			frame->Language = gcnew String(fi->m_bstrLanguage);
			frame->InstructionPointer = addr;
			frames->Add(frame);
		}

		return frames;
	}