#include "stdafx.h" #define BREAK_EIP(checkEip) (obp+0x00401000>=checkEip) const ::DllProc &Schedule::GetDllProc() const { _ASSERT( type == Schedule::DllProc ); return *pDllProc; } const ::UserProc &Schedule::GetUserProc() const { _ASSERT( type == Schedule::UserProc || type == Schedule::AddressOf || type == Schedule::CatchAddress ); return *pUserProc; } const ::CClass &Schedule::GetClass() const { _ASSERT( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo ); return *pClass; } void NativeCode::PutEx( const NativeCode &nativeCode ) { long baseOffset = GetSize(); // コードバッファを追加 Put( nativeCode.GetBuffer(), nativeCode.GetSize() ); // スケジュールを追加 BOOST_FOREACH( const Schedule &schedule, nativeCode.schedules ) { this->schedules.push_back( Schedule( schedule.GetType(), baseOffset + schedule.GetOffset(), schedule.GetLongPtrValue() ) ); } // ソースコード行番号とネイティブコード位置の対応情報を追加 BOOST_FOREACH( const SourceLine &sourceLine, nativeCode.sourceLines ) { this->sourceLines.push_back( SourceLine( sourceLine.GetLineNum(), baseOffset + sourceLine.GetNativeCodePos(), sourceLine.GetRelationalObjectModuleIndex(), // TODO: 複数libの取り込みを想定できていない(ソースコード行番号とネイティブコード位置の対応情報の追加は静的リンクが完了した後に行うべき) sourceLine.GetSourceCodePos(), sourceLine.GetCodeType() ) ); } } void NativeCode::PutEx( long l, Schedule::Type scheduleType ) { if( scheduleType != Schedule::None ) { schedules.push_back( Schedule( scheduleType, GetSize() ) ); } Put( l ); } void NativeCode::PutUserProcSchedule( const UserProc *pUserProc, bool isCall ) { pUserProc->Using(); Schedule::Type type = isCall ? Schedule::UserProc : Schedule::AddressOf; schedules.push_back( Schedule( type, pUserProc, GetSize() ) ); Put( (long)0 ); } void NativeCode::PutCatchAddressSchedule( const UserProc *pUserProc, long codePos ) { pUserProc->Using(); schedules.push_back( Schedule( Schedule::CatchAddress, pUserProc, GetSize() ) ); Put( codePos ); } void NativeCode::PutDllProcSchedule( const DllProc *pDllProc ) { pDllProc->Using(); schedules.push_back( Schedule( pDllProc, GetSize() ) ); Put( (long)0 ); } void NativeCode::PutComVtblSchedule( const CClass *pClass ) { schedules.push_back( Schedule( Schedule::ComVtbl, pClass, GetSize() ) ); Put( (long)0 ); } void NativeCode::PutVtblSchedule( const CClass *pClass ) { schedules.push_back( Schedule( Schedule::Vtbl, pClass, GetSize() ) ); Put( (long)0 ); } void NativeCode::NextSourceLine( int currentSourceIndex, int nowLine ) { if( sourceLines.size() ) { if( sourceLines.back().GetNativeCodePos() == GetSize() ) { sourceLines.back().SetSourceCodePos( nowLine ); return; } } extern BOOL bDebugSupportProc; extern BOOL bSystemProc; DWORD sourceLineType = 0; if( bDebugSupportProc ) { sourceLineType |= CODETYPE_DEBUGPROC; } if( bSystemProc ) { sourceLineType |= CODETYPE_SYSTEMPROC; } sourceLines.push_back( SourceLine( (long)sourceLines.size(), GetSize(), currentSourceIndex, nowLine, sourceLineType ) ); } void NativeCode::ResetDataSectionBaseOffset( long dataSectionBaseOffset ) { BOOST_FOREACH( const Schedule &schedule, schedules ) { if( schedule.GetType() == Schedule::DataTable ) { Overwrite( schedule.GetOffset(), GetLong( schedule.GetOffset() ) + dataSectionBaseOffset ); } } } void NativeCode::ResetSourceIndexes( const std::vector &relationTable ) { BOOST_FOREACH( SourceLine &sourceLine, sourceLines ) { sourceLine.SetRelationalObjectModuleIndex( relationTable[sourceLine.GetRelationalObjectModuleIndex()] ); } }