#include "stdafx.h" #include #include #define BREAK_EIP(checkEip) (obp+0x00401000>=checkEip) void NativeCode::Put( const NativeCode &nativeCode ) { long baseOffset = size; // コードバッファを追加 Put( nativeCode.codeBuffer, nativeCode.size ); // スケジュールを追加 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.GetSourceCodePos(), sourceLine.GetCodeType() ) ); } } void NativeCode::PutUserProcSchedule( const UserProc *pUserProc, bool isCall ) { pUserProc->Using(); Schedule schedule( pUserProc, size ); if( isCall == false ) { schedule.SpecifyAddressOf(); } schedules.push_back( schedule ); *((long *)(codeBuffer+size))=0; size += sizeof(long); } void NativeCode::PutDllProcSchedule( const DllProc *pDllProc ) { pDllProc->Using(); schedules.push_back( Schedule( pDllProc, size ) ); *((long *)(codeBuffer+size))=0; size += sizeof(long); } void NativeCode::NextSourceLine() { if( sourceLines.size() ) { if( sourceLines.back().GetNativeCodePos() == size ) { sourceLines.back().SetSourceCodePos( cp ); 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(), size, cp, sourceLineType ) ); } void NativeCode::ResetDataSectionBaseOffset( long dataSectionBaseOffset ) { BOOST_FOREACH( const Schedule &schedule, schedules ) { if( schedule.GetType() == Schedule::DataTable ) { Overwrite( schedule.GetOffset(), GetLong( schedule.GetOffset() ) + dataSectionBaseOffset ); } } }