void CMemSpyEngineActiveObject::ConstructL( CMemSpyEngine& /*aEngine*/ ) { TBuf<256> item; _LIT(KBasicFormat, "\t0x%08x\t\t"); item.Format( KBasicFormat, VTable() ); // Add modifiers _LIT( KModifiers, "%d" ); _LIT( KBoxedCharFormat, " [%c]" ); item.AppendFormat( KModifiers, RequestStatusValue() ); if ( IsActive() ) { item.AppendFormat( KBoxedCharFormat, 'A' ); } if ( RequestIsPending() ) { item.AppendFormat( KBoxedCharFormat, 'P' ); } iCaption = item.AllocL(); // Listbox items TPtrC value; // Address _LIT(KCaption1, "\tAddress\t\t0x%08x"); item.Format( KCaption1, iAddress ); AppendL( item ); // vTable _LIT(KCaption2, "\tVTable\t\t0x%08x"); item.Format( KCaption2, iVTable ); AppendL( item ); // _LIT(KCaption3, "\tStatus Value\t\t%d"); item.Format( KCaption3, iRequestStatusValue ); AppendL( item ); // _LIT(KCaption5, "\tIs Active\t\t%S"); value.Set( YesNoValue( IsActive() ) ); item.Format( KCaption5, &value ); AppendL( item ); // _LIT(KCaption6, "\tRequest Pending\t\t%S"); value.Set( YesNoValue( RequestIsPending() ) ); item.Format( KCaption6, &value ); AppendL( item ); // _LIT(KCaption4, "\tPriority\t\t%d"); item.Format( KCaption4, iPriority ); AppendL( item ); }
EXPORT_C void CMemSpyEngineActiveObject::OutputDataL( CMemSpyEngine& aEngine ) const { _LIT(KMemSpyEngineAOOutputHex, "0x%08x"); _LIT(KMemSpyEngineAOOutputDecimal, "%d"); _LIT(KMemSpyEngineAOOutputDecimalFixed10, "%10d"); _LIT(KMemSpyEngineAOOutputString, "%S"); _LIT(KMemSpyEngineAOOutputVTable, "vTable: 0x%08x"); // TPtrC yesNoValue( KNullDesC ); HBufC* columns = HBufC::NewLC( 1024 ); TPtr pColumns( columns->Des() ); // pColumns.AppendFormat( KMemSpyEngineAOOutputHex, Address() ); pColumns.Append( KMemSpyEngineAOOutputComma ); // pColumns.AppendFormat( KMemSpyEngineAOOutputDecimal, Priority() ); pColumns.Append( KMemSpyEngineAOOutputComma ); // yesNoValue.Set( YesNoValue( IsActive() ) ); pColumns.AppendFormat( KMemSpyEngineAOOutputString, &yesNoValue ); pColumns.Append( KMemSpyEngineAOOutputComma ); // yesNoValue.Set( YesNoValue( RequestIsPending() ) ); pColumns.AppendFormat( KMemSpyEngineAOOutputString, &yesNoValue ); pColumns.Append( KMemSpyEngineAOOutputComma ); // pColumns.AppendFormat( KMemSpyEngineAOOutputDecimalFixed10, RequestStatusValue() ); pColumns.Append( KMemSpyEngineAOOutputComma ); // pColumns.AppendFormat( KMemSpyEngineAOOutputDecimal, RequestStatusFlags() ); pColumns.Append( KMemSpyEngineAOOutputComma ); // pColumns.AppendFormat( KMemSpyEngineAOOutputHex, VTable() ); pColumns.Append( KMemSpyEngineAOOutputComma ); // pColumns.AppendFormat( KMemSpyEngineAOOutputVTable, VTable() ); // aEngine.Sink().OutputLineL( pColumns ); CleanupStack::PopAndDestroy( columns ); }
FARPROC KFuncTable::GetProcAddr(int funcid) { int mod = m_func[funcid].f_module; switch ( m_func[funcid].f_kind ) { case FUNC_COMMETHOD: { const unsigned * pFunc = (const unsigned *) VTable(mod); assert(pFunc); return (FARPROC) pFunc[m_func[funcid].f_methodid]; } break; case FUNC_WIN32API: { HINSTANCE hModule = ModHandle(m_func[funcid].f_module); assert(hModule); FARPROC fp = GetProcAddress(hModule, GetFuncName(funcid)); // assert(fp); if ( fp==NULL ) { char temp[128]; wsprintf(temp, "Not found module %d at %x, func %s at %x", m_func[funcid].f_module, hModule, GetFuncName(funcid), fp); Send(M_TEXT, 0, 0, temp); } return fp; } case FUNC_SYSCALL: return m_func[funcid].f_oldaddress; default: assert(false); } return NULL; }
int KFuncTable::InterceptCom(void) { int no = 0; for (int i=0; i<m_funcno; i++) if ( (m_func[i].f_kind==FUNC_COMMETHOD) && !m_func[i].f_hooked ) { if ( HackMethod(VTable(m_func[i].f_module), m_func[i].f_methodid, m_func[i].f_newaddress()) ) { m_func[i].f_hooked = TRUE; no ++; } } return no; }