1 | /*
|
---|
2 | * TOPPERS/JSP Kernel
|
---|
3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
4 | * Just Standard Profile Kernel
|
---|
5 | *
|
---|
6 | * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
|
---|
7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
8 | *
|
---|
9 | * ä¸è¨è使¨©è
|
---|
10 | ã¯ï¼ä»¥ä¸ã® (1)ã(4) ã®æ¡ä»¶ãï¼Free Software Foundation
|
---|
11 | * ã«ãã£ã¦å
|
---|
12 | ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨
|
---|
13 | * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢
|
---|
14 | * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé
|
---|
15 | å¸ï¼ä»¥ä¸ï¼
|
---|
16 | * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
|
---|
17 | * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
|
---|
18 | * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
|
---|
19 | * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼
|
---|
20 | * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
21 | * ç¨ã§ããå½¢ã§åé
|
---|
22 | å¸ããå ´åã«ã¯ï¼åé
|
---|
23 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨
|
---|
24 | * è
|
---|
25 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è使¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨
|
---|
26 | * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
27 | * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
28 | * ç¨ã§ããªãå½¢ã§åé
|
---|
29 | å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã
|
---|
30 | * ã¨ï¼
|
---|
31 | * (a) åé
|
---|
32 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
33 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è
|
---|
34 | * 使¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
35 | * (b) åé
|
---|
36 | å¸ã®å½¢æ
|
---|
37 | ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã«
|
---|
38 | * å ±åãããã¨ï¼
|
---|
39 | * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
|
---|
40 | * 害ãããï¼ä¸è¨è使¨©è
|
---|
41 | ããã³TOPPERSããã¸ã§ã¯ããå
|
---|
42 | 責ãããã¨ï¼
|
---|
43 | *
|
---|
44 | * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨è使¨©è
|
---|
45 | ã
|
---|
46 | * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã
|
---|
47 | * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´
|
---|
48 | * æ¥çã¾ãã¯éæ¥çã«çãããããªãæå®³ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼
|
---|
49 | *
|
---|
50 | * @(#) $Id: cmdwatch.cpp,v 1.3 2003/06/30 15:51:47 takayuki Exp $
|
---|
51 | */
|
---|
52 |
|
---|
53 | // cmdwatch.cpp : ã³ã³ã½ã¼ã« ã¢ããªã±ã¼ã·ã§ã³ã®ã¨ã³ã㪠ãã¤ã³ããå®ç¾©ãã¾ãã
|
---|
54 | //
|
---|
55 |
|
---|
56 | #include <stdio.h>
|
---|
57 | #include <stdarg.h>
|
---|
58 |
|
---|
59 | #include <windows.h>
|
---|
60 | #include <objbase.h>
|
---|
61 | #include <unknwn.h>
|
---|
62 | #include <ocidl.h>
|
---|
63 |
|
---|
64 | #include <conio.h>
|
---|
65 |
|
---|
66 | #pragma warning(disable:4200) //鿍æºã®æ¡å¼µæ©è½ : é·ã0ã®é
|
---|
67 | åãæã¤æ§é ä½
|
---|
68 |
|
---|
69 | #define TMAX_LOGINFO 8
|
---|
70 |
|
---|
71 | typedef unsigned int BITMASK;
|
---|
72 | typedef struct {
|
---|
73 | unsigned int logtype;
|
---|
74 | unsigned int logtim;
|
---|
75 | unsigned int valid;
|
---|
76 | unsigned int bufsz;
|
---|
77 | unsigned char buf[];
|
---|
78 | } DBIFLOG;
|
---|
79 |
|
---|
80 | #define DBIFLOG_BUFMARGIN ((unsigned int)(&((DBIFLOG *)0)->buf))
|
---|
81 |
|
---|
82 | /*
|
---|
83 | * ãã°æ
|
---|
84 | å ±ã®éè¦åº¦ã®å®ç¾©
|
---|
85 | */
|
---|
86 | #define LOG_EMERG 0 /* ã·ã£ãããã¦ã³ã«å¤ããã¨ã©ã¼ */
|
---|
87 | #define LOG_ALERT 1
|
---|
88 | #define LOG_CRIT 2
|
---|
89 | #define LOG_ERR 3 /* ã·ã¹ãã ã¨ã©ã¼ */
|
---|
90 | #define LOG_WARNING 4 /* è¦åã¡ãã»ã¼ã¸ */
|
---|
91 | #define LOG_NOTICE 5
|
---|
92 | #define LOG_INFO 6
|
---|
93 | #define LOG_DEBUG 7 /* ãããã°ç¨ã¡ãã»ã¼ã¸ */
|
---|
94 |
|
---|
95 | /*
|
---|
96 | * ãã°æ
|
---|
97 | å ±ã®éè¦åº¦ã®ãããããããä½ãããã®ãã¯ã
|
---|
98 | */
|
---|
99 | #define LOG_MASK(prio) (1 << (prio))
|
---|
100 | #define LOG_UPTO(prio) ((1 << ((prio) + 1)) - 1)
|
---|
101 |
|
---|
102 | /*
|
---|
103 | * ãã°æ
|
---|
104 | å ±ã®ç¨®å¥ã®å®ç¾©
|
---|
105 | */
|
---|
106 | #define LOG_TYP_INTERRUPT 0x01 /* å²è¾¼ã¿ãã³ãã© */
|
---|
107 | #define LOG_TYP_ISR 0x02 /* å²è¾¼ã¿ãµã¼ãã¹ãã³ãã© */
|
---|
108 | #define LOG_TYP_TIMERHDR 0x03 /* ã¿ã¤ã ã¤ãã³ããã³ãã© */
|
---|
109 | #define LOG_TYP_CPUEXC 0x04 /* CPUä¾å¤ãã³ãã© */
|
---|
110 | #define LOG_TYP_TSKEXC 0x05 /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³ */
|
---|
111 | #define LOG_TYP_TSKSTAT 0x06 /* ã¿ã¹ã¯ç¶æ
|
---|
112 | å¤å */
|
---|
113 | #define LOG_TYP_DISPATCH 0x07 /* ãã£ã¹ããã㣠*/
|
---|
114 | #define LOG_TYP_SVC 0x08 /* ãµã¼ãã¹ã³ã¼ã« */
|
---|
115 | #define LOG_TYP_COMMENT 0x09 /* ã³ã¡ã³ãï¼æååã®ã¿ã®ãã°ï¼ */
|
---|
116 | #define LOG_ENTER 0x00 /* å
|
---|
117 | ¥å£ï¼éå§ */
|
---|
118 | #define LOG_LEAVE 0x80 /* åºå£ï¼çµäº */
|
---|
119 |
|
---|
120 |
|
---|
121 |
|
---|
122 | static FILE * destination = NULL;
|
---|
123 |
|
---|
124 | static const char * apiname[] =
|
---|
125 | { "cre_tsk","del_tsk","act_tsk","can_act","sta_tsk","ext_tsk","exd_tsk","ter_tsk","chg_pri","get_pri","ref_tsk","ref_tst","slp_tsk","tslp_tsk","wup_tsk","can_wup","rel_wai","sus_tsk","rsm_tsk","frsm_tsk","dly_tsk","","def_tex","ras_tex","dis_tex","ena_tex","sns_tex","ref_tex","cre_sem","del_sem","sig_sem","","wai_sem","pol_sem","twai_sem","ref_sem","cre_flg","del_flg","set_flg","clr_flg","wai_flg","pol_flg","twai_flg","ref_flg","cre_dtq","del_dtq","","","snd_dtq","psnd_dtq","tsnd_dtq","fsnd_dtq","rcv_dtq","prcv_dtq","trcv_dtq","ref_dtq","cre_mbx","del_mbx","snd_mbx","","rcv_mbx","prcv_mbx","trcv_mbx","ref_mbx","cre_mpf","del_mpf","rel_mpf","","get_mpf","pget_mpf","tget_mpf","ref_mpf","set_tim","get_tim","cre_cyc","del_cyc","sta_cyc","stp_cyc","ref_cyc","","rot_rdq","get_tid","","","loc_cpu","unl_cpu","dis_dsp","ena_dsp","sns_ctx","sns_loc","sns_dsp","sns_dpn","ref_sys","","","","def_inh","cre_isr","del_isr","ref_isr","dis_int","ena_int","chg_ixx","get_ixx","def_svc","def_exc","ref_cfg","ref_ver","iact_tsk","iwup_tsk","irel_wai","iras_tex","isig_sem","iset_flg","ipsnd_dtq","ifsnd_dtq","irot_rdq","iget_tid","iloc_cpu","iunl_cpu","isig_tim","","","","cre_mtx","del_mtx","unl_mtx","","loc_mtx","ploc_mtx","tloc_mtx","ref_mtx","cre_mbf","del_mbf","","","snd_mbf","psnd_mbf","tsnd_mbf" };
|
---|
126 |
|
---|
127 |
|
---|
128 |
|
---|
129 | void Printf(const char * format, ... )
|
---|
130 | {
|
---|
131 | va_list vl;
|
---|
132 | char buffer[1024];
|
---|
133 | int i;
|
---|
134 |
|
---|
135 | va_start(vl,format);
|
---|
136 | i = ::vsprintf(buffer, format, vl);
|
---|
137 | if(destination != NULL)
|
---|
138 | fwrite(buffer, i, 1, destination);
|
---|
139 | fwrite(buffer, i, 1, stdout);
|
---|
140 | }
|
---|
141 |
|
---|
142 | const char * get_apiname(int fncd)
|
---|
143 | { return apiname[-5 - fncd]; };
|
---|
144 |
|
---|
145 | void print_log(DBIFLOG * log)
|
---|
146 | {
|
---|
147 | int i;
|
---|
148 |
|
---|
149 | Printf("%10d ms : ",log->logtim);
|
---|
150 | switch(log->logtype)
|
---|
151 | {
|
---|
152 | case LOG_TYP_SVC:
|
---|
153 | Printf("[SVC|ENT] %s (",get_apiname(*(int*)log->buf));
|
---|
154 |
|
---|
155 | for(i=0;i < *((int*)log->buf+1);i++)
|
---|
156 | {
|
---|
157 | if(i!=0)
|
---|
158 | Printf(", ");
|
---|
159 | Printf("0x%08x",*((int*)log->buf+2+i));
|
---|
160 | }
|
---|
161 | Printf(")\n");
|
---|
162 | break;
|
---|
163 |
|
---|
164 | case LOG_TYP_SVC|LOG_LEAVE:
|
---|
165 | Printf("[SVC|LEA] %s",get_apiname(*(int*)log->buf));
|
---|
166 | if(*((int*)log->buf+1) > 0)
|
---|
167 | Printf(" (ercd = 0x%08x)",*((int*)log->buf+2));
|
---|
168 | Printf("\n");
|
---|
169 | break;
|
---|
170 |
|
---|
171 | case LOG_TYP_TSKSTAT:
|
---|
172 | Printf("[TSKSTAT] Tsk:%d ",*(int*)log->buf);
|
---|
173 | switch(*((int*)log->buf+1))
|
---|
174 | {
|
---|
175 | case 0x01:
|
---|
176 | case 0x02:
|
---|
177 | Printf("<Ready>\n",*(int*)log->buf);
|
---|
178 | break;
|
---|
179 | case 0x04:
|
---|
180 | case 0x0c:
|
---|
181 | if(*((int*)log->buf+1) == 0x04)
|
---|
182 | Printf("<Waiting : ");
|
---|
183 | else
|
---|
184 | Printf("<Wait-Suspend : ");
|
---|
185 |
|
---|
186 | switch(*((int*)log->buf+2))
|
---|
187 | {
|
---|
188 | case 0x1:
|
---|
189 | Printf("Sleep>\n");
|
---|
190 | break;
|
---|
191 | case 0x2:
|
---|
192 | Printf("Delay>\n");
|
---|
193 | break;
|
---|
194 | case 0x4:
|
---|
195 | Printf("Semaphore (id=%d)>\n",*((int*)log->buf+3));
|
---|
196 | break;
|
---|
197 | case 0x8:
|
---|
198 | Printf("Eventflag (id=%d)>\n",*((int*)log->buf+3));
|
---|
199 | break;
|
---|
200 | case 0x10:
|
---|
201 | Printf("Dataqueue[send] (id=%d)>\n",*((int*)log->buf+3));
|
---|
202 | break;
|
---|
203 | case 0x20:
|
---|
204 | Printf("Dataqueue[receive] (id=%d)>\n",*((int*)log->buf+3));
|
---|
205 | break;
|
---|
206 | case 0x40:
|
---|
207 | Printf("Mailbox (id=%d)>\n",*((int*)log->buf+3));
|
---|
208 | break;
|
---|
209 | case 0x80:
|
---|
210 | Printf("Mutex (id=%d)>\n",*((int*)log->buf+3));
|
---|
211 | break;
|
---|
212 | case 0x100:
|
---|
213 | Printf("MessageBuffer[send] (id=%d)>\n",*((int*)log->buf+3));
|
---|
214 | break;
|
---|
215 | case 0x200:
|
---|
216 | Printf("MessageBuffer[receive] (id=%d)>\n",*((int*)log->buf+3));
|
---|
217 | break;
|
---|
218 | case 0x400:
|
---|
219 | Printf("Rendezvous[call] (id=%d)>\n",*((int*)log->buf+3));
|
---|
220 | break;
|
---|
221 | case 0x800:
|
---|
222 | Printf("Rendezvous[accept] (id=%d)>\n",*((int*)log->buf+3));
|
---|
223 | break;
|
---|
224 | case 0x1000:
|
---|
225 | Printf("Rendezvous[completion] (id=%d)>\n",*((int*)log->buf+3));
|
---|
226 | break;
|
---|
227 | case 0x2000:
|
---|
228 | Printf("Fixed Memorypool (id=%d)>\n",*((int*)log->buf+3));
|
---|
229 | break;
|
---|
230 | case 0x4000:
|
---|
231 | Printf("Variable Memorypool (id=%d)>\n",*((int*)log->buf+3));
|
---|
232 | break;
|
---|
233 | default:
|
---|
234 | Printf(" complex [%04x]>\n", *((int*)log->buf+2));
|
---|
235 | break;
|
---|
236 | }
|
---|
237 | break;
|
---|
238 |
|
---|
239 | case 0x08:
|
---|
240 | Printf("<Suspended>\n");
|
---|
241 | break;
|
---|
242 | case 0x10:
|
---|
243 | Printf("<Dormant>\n");
|
---|
244 | break;
|
---|
245 | default:
|
---|
246 | Printf("<Unknown : %d>",*(int*)log->buf);
|
---|
247 | break;
|
---|
248 | }
|
---|
249 | break;
|
---|
250 |
|
---|
251 | case LOG_TYP_TSKEXC:
|
---|
252 | Printf("[TEX|ENT] Tsk:%d\n",*(int*)log->buf);
|
---|
253 | break;
|
---|
254 |
|
---|
255 | case LOG_TYP_TSKEXC | LOG_LEAVE:
|
---|
256 | Printf("[TEX|LEA] Tsk:%d\n",*(int*)log->buf);
|
---|
257 | break;
|
---|
258 |
|
---|
259 | case LOG_TYP_DISPATCH:
|
---|
260 | if(*((int*)log->buf+1) == 0)
|
---|
261 | Printf("[DSP|ENT] Tsk:%d Task-context\n",*(int*)log->buf);
|
---|
262 | else
|
---|
263 | Printf("[DSP|ENT] Tsk:%d Nontask-context\n",*(int*)log->buf);
|
---|
264 | break;
|
---|
265 |
|
---|
266 | case LOG_TYP_DISPATCH | LOG_LEAVE:
|
---|
267 | Printf("[DSP|LEA] Tsk:%d\n",*(int*)log->buf);
|
---|
268 | break;
|
---|
269 |
|
---|
270 | case LOG_TYP_COMMENT:
|
---|
271 | *((char *)log->buf + log->bufsz -1) = '\x0';
|
---|
272 | Printf("[COMMENT](%d) : <%s>\n",*(int *)log->buf,log->buf+sizeof(int));
|
---|
273 | break;
|
---|
274 |
|
---|
275 | case LOG_TYP_INTERRUPT:
|
---|
276 | Printf("[INT|ENT] %d\n",*(int*)log->buf);
|
---|
277 | break;
|
---|
278 |
|
---|
279 | case LOG_TYP_INTERRUPT | LOG_LEAVE:
|
---|
280 | Printf("[INT|LEA] %d\n",*(int*)log->buf);
|
---|
281 | break;
|
---|
282 |
|
---|
283 | case LOG_TYP_CPUEXC:
|
---|
284 | Printf("[CEX|ENT] Tsk:%d\n",*(int*)log->buf);
|
---|
285 | break;
|
---|
286 |
|
---|
287 | case LOG_TYP_CPUEXC | LOG_LEAVE:
|
---|
288 | Printf("[CEX|LEA] Tsk:%d\n",*(int*)log->buf);
|
---|
289 | break;
|
---|
290 |
|
---|
291 | case LOG_TYP_TIMERHDR:
|
---|
292 | case LOG_TYP_TIMERHDR | LOG_LEAVE:
|
---|
293 | if((log->logtype & LOG_LEAVE) != 0)
|
---|
294 | Printf("[INT|LEA]");
|
---|
295 | else
|
---|
296 | Printf("[INT|ENT]");
|
---|
297 |
|
---|
298 | if( *(int*)log->buf == 0x8d )
|
---|
299 | Printf(" cyclic ");
|
---|
300 | else
|
---|
301 | Printf(" OBJ(%02x) ", *(int*)log->buf);
|
---|
302 |
|
---|
303 | Printf(" ID:%d EXINF:0x%08x\n",*((int*)log->buf+1), *((int*)log->buf+2));
|
---|
304 | break;
|
---|
305 |
|
---|
306 | default:
|
---|
307 | Printf("[UNKNOWN] : 0x%x\n",log->logtype);
|
---|
308 | };
|
---|
309 | }
|
---|
310 |
|
---|
311 |
|
---|
312 |
|
---|
313 |
|
---|
314 | const CLSID CLSID_KernelLog = {0x4BD327FC,0x9E4A,0x4A5D,{0x95,0x03,0x27,0xC9,0x79,0xA8,0xE8,0x02}};
|
---|
315 |
|
---|
316 | MIDL_INTERFACE("395F900A-AC7E-4A78-9BC1-EE5EF76254FF")
|
---|
317 | IKernelLog : public IUnknown
|
---|
318 | {
|
---|
319 | public:
|
---|
320 | };
|
---|
321 |
|
---|
322 |
|
---|
323 | struct __declspec(uuid("35E35399-55ED-45FC-8F0B-4A1BC6CEA3F0")) _IKernelLogEvents;
|
---|
324 |
|
---|
325 | class IKernelLogEvents : public IUnknown
|
---|
326 | {
|
---|
327 | public:
|
---|
328 | STDMETHOD(QueryInterface)(REFIID, void **);
|
---|
329 | STDMETHOD_(ULONG,AddRef)();
|
---|
330 | STDMETHOD_(ULONG,Release)();
|
---|
331 | virtual HRESULT STDMETHODCALLTYPE OnKernelStart(void);
|
---|
332 | virtual HRESULT STDMETHODCALLTYPE OnKernelExit(void);
|
---|
333 | virtual HRESULT STDMETHODCALLTYPE OnLogEvent(long sz, byte __RPC_FAR data[]);
|
---|
334 |
|
---|
335 | IKernelLogEvents(void) { RefCount = 0; };
|
---|
336 | // virtual ~IKernelLogEvents(void) { if(destination != NULL) fclose(destination); };
|
---|
337 |
|
---|
338 | LONG RefCount;
|
---|
339 | };
|
---|
340 |
|
---|
341 | HRESULT IKernelLogEvents::QueryInterface(REFIID riid, void ** ppvObject)
|
---|
342 | {
|
---|
343 | if( riid == __uuidof(_IKernelLogEvents) || riid == __uuidof(IUnknown) )
|
---|
344 | {
|
---|
345 | *ppvObject = this;
|
---|
346 | ::InterlockedIncrement(&RefCount);
|
---|
347 | return S_OK;
|
---|
348 | }
|
---|
349 |
|
---|
350 | return E_NOINTERFACE;
|
---|
351 | }
|
---|
352 |
|
---|
353 | ULONG IKernelLogEvents::AddRef(void)
|
---|
354 | { return ::InterlockedIncrement(&RefCount); }
|
---|
355 |
|
---|
356 | ULONG IKernelLogEvents::Release(void)
|
---|
357 | {
|
---|
358 | if( ::InterlockedDecrement(&RefCount) == 0 )
|
---|
359 | {
|
---|
360 | delete this;
|
---|
361 | return 0;
|
---|
362 | }
|
---|
363 | return RefCount;
|
---|
364 | }
|
---|
365 |
|
---|
366 | HRESULT IKernelLogEvents::OnKernelExit(void)
|
---|
367 | {
|
---|
368 | Printf("OnKernelExit at \n");
|
---|
369 |
|
---|
370 | if(destination != NULL)
|
---|
371 | {
|
---|
372 | fclose(destination);
|
---|
373 | destination = 0;
|
---|
374 | }
|
---|
375 | return S_OK;
|
---|
376 | }
|
---|
377 |
|
---|
378 | HRESULT IKernelLogEvents::OnKernelStart(void)
|
---|
379 | {
|
---|
380 | char buffer[256];
|
---|
381 | SYSTEMTIME systim;
|
---|
382 |
|
---|
383 | if(destination != NULL)
|
---|
384 | fclose(destination);
|
---|
385 |
|
---|
386 | ::GetLocalTime(&systim);
|
---|
387 | ::wsprintf(buffer, "kernel-log-%04d%02d%02d-%02d%02d%02d.txt", systim.wYear, systim.wMonth, systim.wDay, systim.wHour, systim.wMinute, systim.wSecond);
|
---|
388 | destination = fopen(buffer, "wt");
|
---|
389 |
|
---|
390 | Printf("OnKernelStart\n");
|
---|
391 | return S_OK;
|
---|
392 | }
|
---|
393 |
|
---|
394 | HRESULT IKernelLogEvents::OnLogEvent(long sz, byte data [])
|
---|
395 | {
|
---|
396 | print_log((DBIFLOG *)data);
|
---|
397 | return S_OK;
|
---|
398 | }
|
---|
399 |
|
---|
400 |
|
---|
401 | //ã³ãã¯ã·ã§ã³ãã¤ã³ãã¸ã®æ¥ç¶
|
---|
402 | bool Advise(IUnknown * container, REFIID iid, IUnknown * sink, DWORD * cookie, IConnectionPoint ** pcp = NULL)
|
---|
403 | {
|
---|
404 | IConnectionPointContainer * cpc;
|
---|
405 | IConnectionPoint * cp;
|
---|
406 |
|
---|
407 | HRESULT result;
|
---|
408 |
|
---|
409 | if(pcp == NULL)
|
---|
410 | pcp = &cp;
|
---|
411 |
|
---|
412 | container->QueryInterface(IID_IConnectionPointContainer, (void **)&cpc);
|
---|
413 | if(cpc == 0)
|
---|
414 | return false;
|
---|
415 |
|
---|
416 | cpc->FindConnectionPoint(iid, pcp);
|
---|
417 | cpc->Release();
|
---|
418 | if(*pcp == 0)
|
---|
419 | return false;
|
---|
420 |
|
---|
421 | if(FAILED(result = (*pcp)->Advise(sink, cookie)))
|
---|
422 | return false;
|
---|
423 |
|
---|
424 | if(pcp == &cp)
|
---|
425 | cp->Release();
|
---|
426 | return true;
|
---|
427 | }
|
---|
428 |
|
---|
429 | DWORD tmain_threadid;
|
---|
430 |
|
---|
431 | BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
|
---|
432 | {
|
---|
433 | switch(dwCtrlType)
|
---|
434 | {
|
---|
435 | case CTRL_C_EVENT:
|
---|
436 | ::PostThreadMessage(tmain_threadid,WM_QUIT,0,0);
|
---|
437 | break;
|
---|
438 | default:
|
---|
439 | return FALSE;
|
---|
440 | }
|
---|
441 |
|
---|
442 | return TRUE;
|
---|
443 | }
|
---|
444 |
|
---|
445 | int main(int argc, char * argv[])
|
---|
446 | {
|
---|
447 | IKernelLog * pKernelLog;
|
---|
448 | IKernelLogEvents * psKernelLogEvents;
|
---|
449 | IConnectionPoint * cp;
|
---|
450 | DWORD cookie;
|
---|
451 | MSG msg;
|
---|
452 |
|
---|
453 | IKernelLogEvents a;
|
---|
454 |
|
---|
455 | ::CoInitialize(NULL);
|
---|
456 |
|
---|
457 | destination = 0;
|
---|
458 | tmain_threadid = ::GetCurrentThreadId();
|
---|
459 |
|
---|
460 | if(!FAILED(::CoCreateInstance(CLSID_KernelLog, NULL, CLSCTX_ALL, __uuidof(IKernelLog), (void **)&pKernelLog)))
|
---|
461 | {
|
---|
462 | cp = NULL;
|
---|
463 | psKernelLogEvents = new IKernelLogEvents;
|
---|
464 |
|
---|
465 | if(Advise(pKernelLog, __uuidof(_IKernelLogEvents), psKernelLogEvents, &cookie, &cp))
|
---|
466 | {
|
---|
467 | ::SetConsoleCtrlHandler(HandlerRoutine, TRUE);
|
---|
468 | while(::GetMessage(&msg, NULL, 0, 0) != 0)
|
---|
469 | { ::DispatchMessage(&msg); }
|
---|
470 | ::SetConsoleCtrlHandler(HandlerRoutine, FALSE);
|
---|
471 |
|
---|
472 | cp->Unadvise(cookie);
|
---|
473 | }
|
---|
474 |
|
---|
475 | delete psKernelLogEvents;
|
---|
476 |
|
---|
477 | if(pKernelLog != NULL)
|
---|
478 | pKernelLog->Release();
|
---|
479 | }
|
---|
480 |
|
---|
481 | if(destination != NULL)
|
---|
482 | {
|
---|
483 | Printf("\n\nSuspended by Ctrl-C event occursion.\n");
|
---|
484 | fclose(destination);
|
---|
485 | }
|
---|
486 |
|
---|
487 | ::CoUninitialize();
|
---|
488 | return 0;
|
---|
489 | }
|
---|
490 |
|
---|