[363] | 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 |
|
---|