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_ */