#include "../BasicCompiler_Common/common.h" #include "opcode.h" ULONG_PTR rva_to_real(DWORD p){ extern DWORD ImageBase; extern int MemPos_CodeSection; return p+ImageBase+MemPos_CodeSection; } void ShowVarList(DEBUG_EVENT *pde,BOOL bExit){ extern DWORD ImageBase; extern DWORD _DebugSys_dwThreadID[256]; extern HANDLE hDebugProcess; extern int MemPos_RWSection; SIZE_T stAccBytes; ReadProcessMemory(hDebugProcess, (void *)(LONG_PTR)(ImageBase+MemPos_RWSection), _DebugSys_dwThreadID,sizeof(DWORD)*256,&stAccBytes); //デバッグダイアログを表示 extern HINSTANCE hInst; extern HWND hMainDlg; extern HWND hDebugWnd; extern DWORD dwStepRun; dwStepRun=0; if(!hDebugWnd) SendMessage(hMainDlg,WM_SHOWVARLIST,0,pde->dwThreadId); else InitVarList(pde->dwThreadId); if(bExit){ //"中断" SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE); extern HWND hDebuggerToolbar; SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_START,TBSTATE_INDETERMINATE); SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPOVER,TBSTATE_INDETERMINATE); SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPIN,TBSTATE_INDETERMINATE); } else{ //"継続" SetDlgItemText(hDebugWnd,IDCANCEL,STRING_CONTINUE); } while(hDebugWnd&&dwStepRun==0) Sleep(1); } void DebugMessage(char *buffer){ extern HWND hMainDlg; int pos; if(!IsWindowEnabled(GetDlgItem(hMainDlg,IDC_DEBUGLIST))){ SetDlgItemText(hMainDlg,IDC_DEBUGLIST,""); EnableWindow(GetDlgItem(hMainDlg,IDC_DEBUGLIST),1); } pos=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_DEBUGLIST)); SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_SETSEL,pos,pos); SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer); } SUBINFO *GetSubFromObp(ULONG_PTR pos){ extern SUBINFO **ppSubHash; SUBINFO *psi; int i2; for(i2=0;i2CompileAddress) <= pos && pos < rva_to_real(psi->EndOpAddr)) return psi; psi=psi->pNextData; } } return 0; } void ReleaseSingleStep(HANDLE hThread,CONTEXT *pContext){ //以前にシングルステップ実行をした場合 extern HANDLE hDebugProcess; extern DWORD *lpdwDebugThreadID; extern HANDLE *lphDebugThread; extern int DebugThreadNum; extern DWORD ImageBase; extern int MemPos_CodeSection; extern int FileSize_CodeSection; extern char *OpBuffer; int i2; SIZE_T stAccBytes; //シングルステップOFF WriteProcessMemory(hDebugProcess, (void *)(LONG_PTR)(ImageBase+MemPos_CodeSection), OpBuffer,FileSize_CodeSection,&stAccBytes); if(ImageBase+MemPos_CodeSection <= pContext->Rip && pContext->Rip < ImageBase+MemPos_CodeSection+FileSize_CodeSection){ //オリジナルコード内のみ、シングルステップ用の"int 3"を考慮 pContext->Rip--; SetThreadContext(hThread,pContext); } //他のスレッドのサスペンドを解除 for(i2=0;i2CompileAddress)-(long)Context.Rip){ //プロシージャの終端位置の場合はステップインを行う goto StepIn; } //スレッドのプロシージャ実行状況を取得 bRet=ReadProcessMemory(hDebugProcess, (void *)(LONG_PTR)(ImageBase+MemPos_RWSection), dwData,sizeof(DWORD)*256,&stAccBytes); if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK); for(i2=0;;i2++){ if(dwData[i2]==de.dwThreadId) break; } GetDebugThreadInfo(i2); extern int GlobalOpBufferSize; extern DEBUG_PROCINFO dpi; if(ImageBase+MemPos_CodeSection<=dpi.lpqwObp[dpi.num]&& dpi.lpqwObp[dpi.num]CompileAddress), SingleStepCodeBuffer+psi->CompileAddress, psi->EndOpAddr-psi->CompileAddress, &stAccBytes); } DeleteDebugThreadInfo(); //次の命令語のブレーク命令は解除しておく(シングルステップ実行後のみ) //(オリジナルコード内のみ) if(i3&&ImageBase+MemPos_CodeSection<=Context.Rip&&Context.RipbCompile) HeapDefaultFree(psi->pVar); psi=psi->pNextData; } } //列挙型に関するメモリを解放 DeleteEnumInfo(); //クラスに関するメモリを解放 delete pobj_DBClass; pobj_DBClass=0; //サブルーチン情報のメモリ解放 DeleteSubInfo(); //定数に関する情報を解放 DeleteConstInfo(); //ソースコードを解放 extern char *pBaseBuffer; HeapDefaultFree(pBaseBuffer); //コードと行番号の関係を解放 extern LINEINFO *pLineInfo; HeapDefaultFree(pLineInfo); //コードバッファを解放 extern char *OpBuffer; if(OpBuffer){ HeapDefaultFree(OpBuffer); OpBuffer=0; } }