1 #ifndef _C_LOADRUN_CTR_ 2 #define _C_LOADRUN_CTR_ 3 4 namespace kmc { 5 namespace dcnt { 6 namespace CTR { 7 8 typedef struct { 9 DWORD id; 10 HANDLE hCmd; 11 HANDLE hLog; 12 HANDLE hEvt; 13 DWORD pid; 14 } DbgCtrl; 15 16 #define DEBUGGER_CTRS (0) 17 #define DEBUGGER_CTRSEN (1) 18 #define DEBUGGER_CTRJ (2) 19 #define DEBUGGER_KINDMAX (3) 20 21 typedef int (*PLRCTR_id2serialno)(DWORD, char*); 22 typedef int (*PLRCTR_serialno2id)(const char*, DWORD*); 23 typedef const char* (*PLRCTR_getDefaultBinDir)(int); 24 typedef const char* (*PLRCTR_getDefaultCfgDir)(int); 25 typedef int (*PLRCTR_setDir)(const char*, const char*, int); 26 typedef int (*PLRCTR_setAllocator)(void* (*)(size_t)); 27 typedef int (*PLRCTR_getList)(DWORD**); 28 typedef int (*PLRCTR_ConnectDebuggerEx)(DWORD, DbgCtrl*, int, char*); 29 typedef int (*PLRCTR_ConnectExistDebugger)(DWORD, DbgCtrl*, int); 30 typedef int (*PLRCTR_DisconnectDebugger)(DbgCtrl*); 31 typedef int (*PLRCTR_SendCommand)(DbgCtrl*, const char*, char**, DWORD*); 32 typedef int (*PLRCTR_PollEvent)(DbgCtrl*, int *, char**, DWORD*); 33 typedef int (*PLRCTR_PollLog)(DbgCtrl*, char**, DWORD*); 34 35 typedef struct { 36 DWORD id; /* �f�o�b�K�\�t�g�E�F�A���ڑ����Ă���PARTNER��ID */ 37 DWORD pid; /* �f�o�b�K�\�t�g�E�F�A�̃v���Z�XID */ 38 } DbgList; 39 typedef int (*PLRCTR_getDebuggerList)(DbgList**); 40 typedef struct { 41 DWORD id; /* �f�o�b�K�\�t�g�E�F�A���ڑ����Ă���PARTNER��ID */ 42 DWORD pid; /* �f�o�b�K�\�t�g�E�F�A�̃v���Z�XID */ 43 DWORD kind; /* �f�o�b�K�\�t�g�E�F�A�̎�� : DEBUGGER_CTRS �܂��� DEBUGGER_CTRJ */ 44 DWORD corenum; /* �ڑ����Ă���R�A�ԍ�(JTAG�̂�) */ 45 } DbgList2; 46 typedef int (*PLRCTR_getDebuggerList2)(DbgList2**); 47 typedef int (*PLRCTR_terminateDebugger)(DWORD); 48 49 50 #if defined(_MFC_VER) && defined(_AFXDLL) 51 #define LOADLIBRARY AfxLoadLibrary 52 #define FREELIBRARY AfxFreeLibrary 53 #else 54 #define LOADLIBRARY LoadLibrary 55 #define FREELIBRARY FreeLibrary 56 #endif 57 58 class CLoadRun { 59 protected: 60 HINSTANCE m_hDLL; 61 62 PLRCTR_id2serialno m_pId2serialno; 63 PLRCTR_serialno2id m_pSerialno2id; 64 PLRCTR_getDefaultBinDir m_pGetDefaultBinDir; 65 PLRCTR_getDefaultCfgDir m_pGetDefaultCfgDir; 66 PLRCTR_setDir m_pSetDir; 67 PLRCTR_setAllocator m_pSetAllocator; 68 PLRCTR_getList m_pGetList; 69 PLRCTR_ConnectDebuggerEx m_pConnectDebuggerEx; 70 PLRCTR_ConnectExistDebugger m_pConnectExistDebugger; 71 PLRCTR_DisconnectDebugger m_pDisconnectDebugger; 72 PLRCTR_SendCommand m_pSendCommand; 73 PLRCTR_PollEvent m_pPollEvent; 74 PLRCTR_PollLog m_pPollLog; 75 PLRCTR_getDebuggerList m_pGetDebuggerList; 76 PLRCTR_getDebuggerList2 m_pGetDebuggerList2; 77 PLRCTR_terminateDebugger m_pTerminateDebugger; 78 79 public: CLoadRun()80 CLoadRun() 81 { 82 m_hDLL = NULL; 83 m_pId2serialno = NULL; 84 m_pSerialno2id = NULL; 85 m_pGetDefaultBinDir = NULL; 86 m_pGetDefaultCfgDir = NULL; 87 m_pSetDir = NULL; 88 m_pSetAllocator = NULL; 89 m_pGetList = NULL; 90 m_pConnectDebuggerEx = NULL; 91 m_pConnectExistDebugger = NULL; 92 m_pDisconnectDebugger = NULL; 93 m_pSendCommand = NULL; 94 m_pPollEvent = NULL; 95 m_pPollLog = NULL; 96 m_pGetDebuggerList = NULL; 97 m_pGetDebuggerList2 = NULL; 98 m_pTerminateDebugger = NULL; 99 } 100 ~CLoadRun()101 virtual ~CLoadRun() 102 { 103 Finalize(); 104 } 105 106 /* ���������� */ 107 /* �߂�l: TRUE:���� / FALSE:���s */ Initialize()108 BOOL Initialize() 109 { 110 if (m_hDLL != NULL) return TRUE; 111 112 TCHAR dirname[MAX_PATH]; 113 if ((GetEnvironmentVariable(TEXT("KMC_PARTNER_CTRS"), dirname, MAX_PATH) > 0)|| 114 (GetEnvironmentVariable(TEXT("KMC_PARTNER_CTRJ"), dirname, MAX_PATH) > 0)) { 115 TCHAR temp[MAX_PATH]; 116 wsprintf(temp, TEXT("%s\\BIN\\%s"), dirname, TEXT("loadrun_ctr.dll")); 117 m_hDLL = LOADLIBRARY(temp); 118 } else { 119 m_hDLL = LOADLIBRARY(TEXT("loadrun_ctr.dll")); 120 } 121 if (m_hDLL != NULL) { 122 m_pId2serialno = (PLRCTR_id2serialno)GetProcAddress(m_hDLL, "LRCTR_id2serialno"); 123 m_pSerialno2id = (PLRCTR_serialno2id)GetProcAddress(m_hDLL, "LRCTR_serialno2id"); 124 m_pGetDefaultBinDir = (PLRCTR_getDefaultBinDir)GetProcAddress(m_hDLL, "LRCTR_getDefaultBinDir"); 125 m_pGetDefaultCfgDir = (PLRCTR_getDefaultCfgDir)GetProcAddress(m_hDLL, "LRCTR_getDefaultCfgDir"); 126 m_pSetDir = (PLRCTR_setDir)GetProcAddress(m_hDLL, "LRCTR_setDir"); 127 m_pSetAllocator = (PLRCTR_setAllocator)GetProcAddress(m_hDLL, "LRCTR_setAllocator"); 128 m_pGetList = (PLRCTR_getList)GetProcAddress(m_hDLL, "LRCTR_getList"); 129 m_pConnectDebuggerEx = (PLRCTR_ConnectDebuggerEx)GetProcAddress(m_hDLL, "LRCTR_ConnectDebuggerEx"); 130 m_pConnectExistDebugger = (PLRCTR_ConnectExistDebugger)GetProcAddress(m_hDLL, "LRCTR_ConnectExistDebugger"); 131 m_pDisconnectDebugger = (PLRCTR_DisconnectDebugger)GetProcAddress(m_hDLL, "LRCTR_DisconnectDebugger"); 132 m_pSendCommand = (PLRCTR_SendCommand)GetProcAddress(m_hDLL, "LRCTR_SendCommand"); 133 m_pPollEvent = (PLRCTR_PollEvent)GetProcAddress(m_hDLL, "LRCTR_PollEvent"); 134 m_pPollLog = (PLRCTR_PollLog)GetProcAddress(m_hDLL, "LRCTR_PollLog"); 135 m_pGetDebuggerList = (PLRCTR_getDebuggerList)GetProcAddress(m_hDLL, "LRCTR_getDebuggerList"); 136 m_pGetDebuggerList2 = (PLRCTR_getDebuggerList2)GetProcAddress(m_hDLL, "LRCTR_getDebuggerList2"); 137 m_pTerminateDebugger = (PLRCTR_terminateDebugger)GetProcAddress(m_hDLL, "LRCTR_terminateDebugger"); 138 } 139 return (m_hDLL != NULL); 140 } 141 142 /* �I������ */ 143 /* �߂�l: TRUE:���� / FALSE:���s */ Finalize()144 BOOL Finalize() 145 { 146 if (m_hDLL != NULL) { 147 FREELIBRARY(m_hDLL); 148 } 149 return TRUE; 150 } 151 152 /* ID���V���A��������ɕϊ����� */ 153 /* ����: id:�ϊ�����ID / pSerial:�ϊ���̃V���A��(9�o�C�g�ȏ�̃o�b�t�@�ł��邱��) */ 154 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ Id2SerialNo(DWORD id,char * pSerial)155 int Id2SerialNo(DWORD id, char* pSerial) 156 { 157 return (m_pId2serialno) ? (*m_pId2serialno)(id, pSerial) : -1; 158 } 159 160 /* �V���A���������ID�ɕϊ����� */ 161 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ SerialNo2Id(const char * pSerial,DWORD * pId)162 int SerialNo2Id(const char* pSerial, DWORD *pId) 163 { 164 return (m_pSerialno2id) ? (*m_pSerialno2id)(pSerial, pId) : -1; 165 } 166 167 /* PARTNER�̃C���X�g�[�����ꂽBIN�f�B���N�g�����擾���� */ 168 /* ����: kind:�f�o�b�K�̎��(DEBUGGER_XXX) */ 169 /* �߂�l: NULL�ȊO:�f�B���N�g��������(NUL�I�[) / NULL:���s */ GetDefaultBinDir(int kind)170 const char* GetDefaultBinDir(int kind) 171 { 172 return (m_pGetDefaultBinDir) ? (*m_pGetDefaultBinDir)(kind) : NULL; 173 } 174 175 /* PARTNER�̃f�t�H���g�̃v���W�F�N�g�f�B���N�g�����擾���� */ 176 /* ����: kind:�f�o�b�K�̎��(DEBUGGER_XXX) */ 177 /* �߂�l: NULL�ȊO:�f�B���N�g��������(NUL�I�[) / NULL:���s */ GetDefaultCfgDir(int kind)178 const char* GetDefaultCfgDir(int kind) 179 { 180 return (m_pGetDefaultCfgDir) ? (*m_pGetDefaultCfgDir)(kind) : NULL; 181 } 182 183 /* �ڑ�����PARTNER�̎��/�f�B���N�g����ݒ肷�� */ 184 /* ����: pBinDir:PARTNER��BIN�f�B���N�g�� / pCfgDir:�N������v���W�F�N�g�̃f�B���N�g�� / kind:�f�o�b�K�̎��(DEBUGGER_XXX) */ 185 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ SetPartnerDir(const char * pBinDir,const char * pCfgDir,int kind)186 int SetPartnerDir(const char* pBinDir, const char* pCfgDir, int kind) 187 { 188 return (m_pSetDir) ? (*m_pSetDir)(pBinDir, pCfgDir, kind) : -1; 189 } 190 191 /* �ڑ�����PARTNER�̎�ʂ��f�t�H���g�Őݒ肷�� */ 192 /* ����: kind:�f�o�b�K�̎��(DEBUGGER_XXX) */ 193 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ SetDefaultDir(int kind)194 int SetDefaultDir(int kind) 195 { 196 return SetPartnerDir(GetDefaultBinDir(kind), GetDefaultCfgDir(kind), kind); 197 } 198 199 /* �������m�ۗp��API��ݒ肷�� */ 200 /* GetDebuggerList, SendCommand, PollEvent, PollLog�Ŏg�p���郁�����̊m�ۗp�̊���ݒ肵�܂� */ 201 /* ����: pAllocator:alloc�� */ 202 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ 203 /* ���̊����Ăяo���Ă��Ȃ��ꍇ�A�܂�pAllocator��NULL�̏ꍇ�́A */ 204 /* DLL�̓����Ł@HeapAlloc(GetProcessHeap(),0, size)�@���Ă�܂��B*/ SetAllocator(void * (* pAllocator)(size_t))205 int SetAllocator(void* (*pAllocator)(size_t)) 206 { 207 return (m_pSetAllocator) ? (*m_pSetAllocator)(pAllocator) : -1; 208 } 209 210 /* �ڑ��\�ȃf�o�b�K�̃��X�g���擾���� */ 211 /* ����: �擾�������X�g�ւ̃|�C���^ */ 212 /* �߂�l: �����ł����f�o�b�K�̐� / ���̒l:���s */ GetDebuggerList(DWORD ** pIds)213 int GetDebuggerList(DWORD **pIds) 214 { 215 return (m_pGetList) ? (*m_pGetList)(pIds) : -1; 216 } 217 218 #define CLRCTR_ATTR_HIDE (0x00000001) 219 #define CLRCTR_ATTR_SYSTRAY (0x00000002) 220 #define CLRCTR_ATTR_NOCMD (0x00000004) 221 #define CLRCTR_ATTR_NOLOG (0x00000008) 222 #define CLRCTR_ATTR_NOEVT (0x00000010) 223 /* �f�o�b�K��V�K�ɋN�����Đڑ����� */ 224 /* ����: id: �ڑ�����f�o�b�K(0�Ŏw��Ȃ�) */ 225 /* pCtrl:�ڑ��Ǘ��\���� / attr:�N���I�v�V���� / extra:�lj��̋N���I�v�V���� */ 226 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ 227 int ConnectDebugger(DWORD id, DbgCtrl* pCtrl, int attr, char* extra=NULL) 228 { 229 return (m_pConnectDebuggerEx) ? (*m_pConnectDebuggerEx)(id, pCtrl, attr, extra) : -1; 230 } 231 232 /* ���ɋN�����Ă���f�o�b�K�ɐڑ����� */ 233 /* ����: pid:�ڑ�����f�o�b�K�̃v���Z�XID */ 234 /* pCtrl:�ڑ��Ǘ��\���� / attr:�N���I�v�V����CLRCTR_ATTR_NOxxx�̂�) */ 235 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ ConnectExistDebugger(DWORD pid,DbgCtrl * pCtrl,int attr)236 int ConnectExistDebugger(DWORD pid, DbgCtrl* pCtrl, int attr) 237 { 238 return (m_pConnectExistDebugger) ? (*m_pConnectExistDebugger)(pid, pCtrl, attr) : -1; 239 } 240 241 /* �f�o�b�K��ؒf���� */ 242 /* ����: pCtrl:�ڑ��Ǘ��\���� */ 243 /* �߂�l: 0�ȏ�:���� / ���̒l:���s */ DisconnectDebugger(DbgCtrl * pCtrl)244 int DisconnectDebugger(DbgCtrl *pCtrl) 245 { 246 return (m_pDisconnectDebugger) ? (*m_pDisconnectDebugger)(pCtrl) : -1; 247 } 248 249 /* �f�o�b�K�փR�}���h�M���� */ 250 /* ����: pCtrl:�ڑ��Ǘ��\���� / pCmd:���M����R�}���h������ */ 251 /* pResTxt:���X�|���X�o�� / pLength:���X�|���X�o�͂̕�����*/ 252 /* �߂�l: ���̒l:���s / 0:���� / ���̒l:�R�}���h�G���[ */ SendCommand(DbgCtrl * pCtrl,const char * pCmd,char ** pResTxt,DWORD * pLength)253 int SendCommand(DbgCtrl* pCtrl, const char *pCmd, char **pResTxt, DWORD *pLength) 254 { 255 return (m_pSendCommand) ? (*m_pSendCommand)(pCtrl, pCmd, pResTxt, pLength) : -1; 256 } 257 258 #define CLRCTR_EVENT_EXIT (0) 259 #define CLRCTR_EVENT_BP_SET (1) 260 #define CLRCTR_EVENT_BP_DISABLE (2) 261 #define CLRCTR_EVENT_BP_ENABLE (3) 262 #define CLRCTR_EVENT_BP_CLEAR (4) 263 /* �f�o�b�K����̃C�x���g�ʒm���m�F���� */ 264 /* ����: pCtrl:�ڑ��Ǘ��\���� / pEvent:��M�����C�x���g��� */ 265 /* pResTxt:���X�|���X�o�� / pLength:���X�|���X�o�͂̕�����*/ 266 /* �߂�l: ���̒l:���s / 0:�f�[�^���� / ���̒l:�f�[�^���� */ PollEvent(DbgCtrl * pCtrl,int * pEvent,char ** pEvtTxt,DWORD * pLength)267 int PollEvent(DbgCtrl* pCtrl, int *pEvent, char** pEvtTxt, DWORD *pLength) 268 { 269 return (m_pPollEvent) ? (*m_pPollEvent)(pCtrl, pEvent, pEvtTxt, pLength) : -1; 270 } 271 272 /* �A�v������̃��O�o�͂��m�F����*/ 273 /* ����: pCtrl:�ڑ��Ǘ��\���� */ 274 /* pLogTxt:���O�o�� / pLength:���O�o�͂̕�����*/ PollLog(DbgCtrl * pCtrl,char ** pLogTxt,DWORD * pLength)275 int PollLog(DbgCtrl* pCtrl, char** pLogTxt, DWORD *pLength) 276 /* �߂�l: ���̒l:���s / 0:�f�[�^���� / ���̒l:���O�f�[�^������ */ 277 { 278 return (m_pPollLog) ? (*m_pPollLog)(pCtrl, pLogTxt, pLength) : -1; 279 } 280 281 /* ���݉ғ����̃f�o�b�K�\�t�g�̃��X�g���擾���� */ 282 /* ����: pList:�擾�������X�g */ 283 /* �߂�l: ���̒l:���s / 0�ȏ�:�ғ����̃f�o�b�K�\�t�g�̐� */ GetDebuggerSoftwareList(DbgList ** pList)284 int GetDebuggerSoftwareList(DbgList** pList) 285 { 286 return (m_pGetDebuggerList) ? (*m_pGetDebuggerList)(pList) : -1; 287 } 288 289 /* ���݉ғ����̃f�o�b�K�\�t�g�̃��X�g���擾����(�g��) */ 290 /* ����: pList:�擾�������X�g */ 291 /* �߂�l: ���̒l:���s / 0�ȏ�:�ғ����̃f�o�b�K�\�t�g�̐� */ GetDebuggerSoftwareList(DbgList2 ** pList)292 int GetDebuggerSoftwareList(DbgList2** pList) 293 { 294 return (m_pGetDebuggerList2) ? (*m_pGetDebuggerList2)(pList) : -1; 295 } 296 297 /* �ғ����̃f�o�b�K�\�t�g���I�������� */ 298 /* ����: pid:�I��������f�o�b�K�\�t�g�E�F�A�̃v���Z�XID */ 299 /* �߂�l: ���̒l:���s / 0�ȏ�:���� */ TerminateDebuggerSoftware(DWORD pid)300 int TerminateDebuggerSoftware(DWORD pid) 301 { 302 return (m_pTerminateDebugger) ? (*m_pTerminateDebugger)(pid) : -1; 303 } 304 }; 305 306 } 307 } 308 } 309 310 #endif /* _C_LOADRUN_CTR_ */