#ifndef _C_LOADRUN_CTR_ #define _C_LOADRUN_CTR_ namespace kmc { namespace dcnt { namespace CTR { typedef struct { DWORD id; HANDLE hCmd; HANDLE hLog; HANDLE hEvt; DWORD pid; } DbgCtrl; #define DEBUGGER_CTRS (0) #define DEBUGGER_CTRSEN (1) #define DEBUGGER_CTRJ (2) #define DEBUGGER_KINDMAX (3) typedef int (*PLRCTR_id2serialno)(DWORD, char*); typedef int (*PLRCTR_serialno2id)(const char*, DWORD*); typedef const char* (*PLRCTR_getDefaultBinDir)(int); typedef const char* (*PLRCTR_getDefaultCfgDir)(int); typedef int (*PLRCTR_setDir)(const char*, const char*, int); typedef int (*PLRCTR_setAllocator)(void* (*)(size_t)); typedef int (*PLRCTR_getList)(DWORD**); typedef int (*PLRCTR_ConnectDebuggerEx)(DWORD, DbgCtrl*, int, char*); typedef int (*PLRCTR_ConnectExistDebugger)(DWORD, DbgCtrl*, int); typedef int (*PLRCTR_DisconnectDebugger)(DbgCtrl*); typedef int (*PLRCTR_SendCommand)(DbgCtrl*, const char*, char**, DWORD*); typedef int (*PLRCTR_PollEvent)(DbgCtrl*, int *, char**, DWORD*); typedef int (*PLRCTR_PollLog)(DbgCtrl*, char**, DWORD*); typedef struct { DWORD id; /* デバッガソフトウェアが接続しているPARTNERのID */ DWORD pid; /* デバッガソフトウェアのプロセスID */ } DbgList; typedef int (*PLRCTR_getDebuggerList)(DbgList**); typedef struct { DWORD id; /* デバッガソフトウェアが接続しているPARTNERのID */ DWORD pid; /* デバッガソフトウェアのプロセスID */ DWORD kind; /* デバッガソフトウェアの種類 : DEBUGGER_CTRS または DEBUGGER_CTRJ */ DWORD corenum; /* 接続しているコア番号(JTAGのみ) */ } DbgList2; typedef int (*PLRCTR_getDebuggerList2)(DbgList2**); typedef int (*PLRCTR_terminateDebugger)(DWORD); #if defined(_MFC_VER) && defined(_AFXDLL) #define LOADLIBRARY AfxLoadLibrary #define FREELIBRARY AfxFreeLibrary #else #define LOADLIBRARY LoadLibrary #define FREELIBRARY FreeLibrary #endif class CLoadRun { protected: HINSTANCE m_hDLL; PLRCTR_id2serialno m_pId2serialno; PLRCTR_serialno2id m_pSerialno2id; PLRCTR_getDefaultBinDir m_pGetDefaultBinDir; PLRCTR_getDefaultCfgDir m_pGetDefaultCfgDir; PLRCTR_setDir m_pSetDir; PLRCTR_setAllocator m_pSetAllocator; PLRCTR_getList m_pGetList; PLRCTR_ConnectDebuggerEx m_pConnectDebuggerEx; PLRCTR_ConnectExistDebugger m_pConnectExistDebugger; PLRCTR_DisconnectDebugger m_pDisconnectDebugger; PLRCTR_SendCommand m_pSendCommand; PLRCTR_PollEvent m_pPollEvent; PLRCTR_PollLog m_pPollLog; PLRCTR_getDebuggerList m_pGetDebuggerList; PLRCTR_getDebuggerList2 m_pGetDebuggerList2; PLRCTR_terminateDebugger m_pTerminateDebugger; public: CLoadRun() { m_hDLL = NULL; m_pId2serialno = NULL; m_pSerialno2id = NULL; m_pGetDefaultBinDir = NULL; m_pGetDefaultCfgDir = NULL; m_pSetDir = NULL; m_pSetAllocator = NULL; m_pGetList = NULL; m_pConnectDebuggerEx = NULL; m_pConnectExistDebugger = NULL; m_pDisconnectDebugger = NULL; m_pSendCommand = NULL; m_pPollEvent = NULL; m_pPollLog = NULL; m_pGetDebuggerList = NULL; m_pGetDebuggerList2 = NULL; m_pTerminateDebugger = NULL; } virtual ~CLoadRun() { Finalize(); } /* 初期化処理 */ /* 戻り値: TRUE:成功 / FALSE:失敗 */ BOOL Initialize() { if (m_hDLL != NULL) return TRUE; TCHAR dirname[MAX_PATH]; if ((GetEnvironmentVariable(TEXT("KMC_PARTNER_CTRS"), dirname, MAX_PATH) > 0)|| (GetEnvironmentVariable(TEXT("KMC_PARTNER_CTRJ"), dirname, MAX_PATH) > 0)) { TCHAR temp[MAX_PATH]; wsprintf(temp, TEXT("%s\\BIN\\%s"), dirname, TEXT("loadrun_ctr.dll")); m_hDLL = LOADLIBRARY(temp); } else { m_hDLL = LOADLIBRARY(TEXT("loadrun_ctr.dll")); } if (m_hDLL != NULL) { m_pId2serialno = (PLRCTR_id2serialno)GetProcAddress(m_hDLL, "LRCTR_id2serialno"); m_pSerialno2id = (PLRCTR_serialno2id)GetProcAddress(m_hDLL, "LRCTR_serialno2id"); m_pGetDefaultBinDir = (PLRCTR_getDefaultBinDir)GetProcAddress(m_hDLL, "LRCTR_getDefaultBinDir"); m_pGetDefaultCfgDir = (PLRCTR_getDefaultCfgDir)GetProcAddress(m_hDLL, "LRCTR_getDefaultCfgDir"); m_pSetDir = (PLRCTR_setDir)GetProcAddress(m_hDLL, "LRCTR_setDir"); m_pSetAllocator = (PLRCTR_setAllocator)GetProcAddress(m_hDLL, "LRCTR_setAllocator"); m_pGetList = (PLRCTR_getList)GetProcAddress(m_hDLL, "LRCTR_getList"); m_pConnectDebuggerEx = (PLRCTR_ConnectDebuggerEx)GetProcAddress(m_hDLL, "LRCTR_ConnectDebuggerEx"); m_pConnectExistDebugger = (PLRCTR_ConnectExistDebugger)GetProcAddress(m_hDLL, "LRCTR_ConnectExistDebugger"); m_pDisconnectDebugger = (PLRCTR_DisconnectDebugger)GetProcAddress(m_hDLL, "LRCTR_DisconnectDebugger"); m_pSendCommand = (PLRCTR_SendCommand)GetProcAddress(m_hDLL, "LRCTR_SendCommand"); m_pPollEvent = (PLRCTR_PollEvent)GetProcAddress(m_hDLL, "LRCTR_PollEvent"); m_pPollLog = (PLRCTR_PollLog)GetProcAddress(m_hDLL, "LRCTR_PollLog"); m_pGetDebuggerList = (PLRCTR_getDebuggerList)GetProcAddress(m_hDLL, "LRCTR_getDebuggerList"); m_pGetDebuggerList2 = (PLRCTR_getDebuggerList2)GetProcAddress(m_hDLL, "LRCTR_getDebuggerList2"); m_pTerminateDebugger = (PLRCTR_terminateDebugger)GetProcAddress(m_hDLL, "LRCTR_terminateDebugger"); } return (m_hDLL != NULL); } /* 終了処理 */ /* 戻り値: TRUE:成功 / FALSE:失敗 */ BOOL Finalize() { if (m_hDLL != NULL) { FREELIBRARY(m_hDLL); } return TRUE; } /* IDをシリアル文字列に変換する */ /* 引数: id:変換するID / pSerial:変換後のシリアル(9バイト以上のバッファであること) */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int Id2SerialNo(DWORD id, char* pSerial) { return (m_pId2serialno) ? (*m_pId2serialno)(id, pSerial) : -1; } /* シリアル文字列をIDに変換する */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int SerialNo2Id(const char* pSerial, DWORD *pId) { return (m_pSerialno2id) ? (*m_pSerialno2id)(pSerial, pId) : -1; } /* PARTNERのインストールされたBINディレクトリを取得する */ /* 引数: kind:デバッガの種類(DEBUGGER_XXX) */ /* 戻り値: NULL以外:ディレクトリ文字列(NUL終端) / NULL:失敗 */ const char* GetDefaultBinDir(int kind) { return (m_pGetDefaultBinDir) ? (*m_pGetDefaultBinDir)(kind) : NULL; } /* PARTNERのデフォルトのプロジェクトディレクトリを取得する */ /* 引数: kind:デバッガの種類(DEBUGGER_XXX) */ /* 戻り値: NULL以外:ディレクトリ文字列(NUL終端) / NULL:失敗 */ const char* GetDefaultCfgDir(int kind) { return (m_pGetDefaultCfgDir) ? (*m_pGetDefaultCfgDir)(kind) : NULL; } /* 接続するPARTNERの種別/ディレクトリを設定する */ /* 引数: pBinDir:PARTNERのBINディレクトリ / pCfgDir:起動するプロジェクトのディレクトリ / kind:デバッガの種類(DEBUGGER_XXX) */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int SetPartnerDir(const char* pBinDir, const char* pCfgDir, int kind) { return (m_pSetDir) ? (*m_pSetDir)(pBinDir, pCfgDir, kind) : -1; } /* 接続するPARTNERの種別をデフォルトで設定する */ /* 引数: kind:デバッガの種類(DEBUGGER_XXX) */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int SetDefaultDir(int kind) { return SetPartnerDir(GetDefaultBinDir(kind), GetDefaultCfgDir(kind), kind); } /* メモリ確保用のAPIを設定する */ /* GetDebuggerList, SendCommand, PollEvent, PollLogで使用するメモリの確保用の関数を設定します */ /* 引数: pAllocator:alloc関数 */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ /* この関数を呼び出していない場合、またpAllocatorがNULLの場合は、 */ /* DLLの内部で HeapAlloc(GetProcessHeap(),0, size) が呼ばれます。*/ int SetAllocator(void* (*pAllocator)(size_t)) { return (m_pSetAllocator) ? (*m_pSetAllocator)(pAllocator) : -1; } /* 接続可能なデバッガのリストを取得する */ /* 引数: 取得したリストへのポインタ */ /* 戻り値: 検索できたデバッガの数 / 負の値:失敗 */ int GetDebuggerList(DWORD **pIds) { return (m_pGetList) ? (*m_pGetList)(pIds) : -1; } #define CLRCTR_ATTR_HIDE (0x00000001) #define CLRCTR_ATTR_SYSTRAY (0x00000002) #define CLRCTR_ATTR_NOCMD (0x00000004) #define CLRCTR_ATTR_NOLOG (0x00000008) #define CLRCTR_ATTR_NOEVT (0x00000010) /* デバッガを新規に起動して接続する */ /* 引数: id: 接続するデバッガ(0で指定なし) */ /* pCtrl:接続管理構造体 / attr:起動オプション / extra:追加の起動オプション */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int ConnectDebugger(DWORD id, DbgCtrl* pCtrl, int attr, char* extra=NULL) { return (m_pConnectDebuggerEx) ? (*m_pConnectDebuggerEx)(id, pCtrl, attr, extra) : -1; } /* 既に起動しているデバッガに接続する */ /* 引数: pid:接続するデバッガのプロセスID */ /* pCtrl:接続管理構造体 / attr:起動オプションCLRCTR_ATTR_NOxxxのみ) */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int ConnectExistDebugger(DWORD pid, DbgCtrl* pCtrl, int attr) { return (m_pConnectExistDebugger) ? (*m_pConnectExistDebugger)(pid, pCtrl, attr) : -1; } /* デバッガを切断する */ /* 引数: pCtrl:接続管理構造体 */ /* 戻り値: 0以上:成功 / 負の値:失敗 */ int DisconnectDebugger(DbgCtrl *pCtrl) { return (m_pDisconnectDebugger) ? (*m_pDisconnectDebugger)(pCtrl) : -1; } /* デバッガへコマンドを送信する */ /* 引数: pCtrl:接続管理構造体 / pCmd:送信するコマンド文字列 */ /* pResTxt:レスポンス出力 / pLength:レスポンス出力の文字列長*/ /* 戻り値: 負の値:失敗 / 0:成功 / 正の値:コマンドエラー */ int SendCommand(DbgCtrl* pCtrl, const char *pCmd, char **pResTxt, DWORD *pLength) { return (m_pSendCommand) ? (*m_pSendCommand)(pCtrl, pCmd, pResTxt, pLength) : -1; } #define CLRCTR_EVENT_EXIT (0) #define CLRCTR_EVENT_BP_SET (1) #define CLRCTR_EVENT_BP_DISABLE (2) #define CLRCTR_EVENT_BP_ENABLE (3) #define CLRCTR_EVENT_BP_CLEAR (4) /* デバッガからのイベント通知を確認する */ /* 引数: pCtrl:接続管理構造体 / pEvent:受信したイベント種別 */ /* pResTxt:レスポンス出力 / pLength:レスポンス出力の文字列長*/ /* 戻り値: 負の値:失敗 / 0:データ無し / 正の値:データあり */ int PollEvent(DbgCtrl* pCtrl, int *pEvent, char** pEvtTxt, DWORD *pLength) { return (m_pPollEvent) ? (*m_pPollEvent)(pCtrl, pEvent, pEvtTxt, pLength) : -1; } /* アプリからのログ出力を確認する*/ /* 引数: pCtrl:接続管理構造体 */ /* pLogTxt:ログ出力 / pLength:ログ出力の文字列長*/ int PollLog(DbgCtrl* pCtrl, char** pLogTxt, DWORD *pLength) /* 戻り値: 負の値:失敗 / 0:データ無し / 正の値:ログデータ文字列長 */ { return (m_pPollLog) ? (*m_pPollLog)(pCtrl, pLogTxt, pLength) : -1; } /* 現在稼働中のデバッガソフトのリストを取得する */ /* 引数: pList:取得したリスト */ /* 戻り値: 負の値:失敗 / 0以上:稼働中のデバッガソフトの数 */ int GetDebuggerSoftwareList(DbgList** pList) { return (m_pGetDebuggerList) ? (*m_pGetDebuggerList)(pList) : -1; } /* 現在稼働中のデバッガソフトのリストを取得する(拡張) */ /* 引数: pList:取得したリスト */ /* 戻り値: 負の値:失敗 / 0以上:稼働中のデバッガソフトの数 */ int GetDebuggerSoftwareList(DbgList2** pList) { return (m_pGetDebuggerList2) ? (*m_pGetDebuggerList2)(pList) : -1; } /* 稼働中のデバッガソフトを終了させる */ /* 引数: pid:終了させるデバッガソフトウェアのプロセスID */ /* 戻り値: 負の値:失敗 / 0以上:成功 */ int TerminateDebuggerSoftware(DWORD pid) { return (m_pTerminateDebugger) ? (*m_pTerminateDebugger)(pid) : -1; } }; } } } #endif /* _C_LOADRUN_CTR_ */