Windows セキュリティ更新プログラム(Windows Update)を実行した。
なんの更新をしたかを確認するのに、イベントログを見ればわかる。
Windows Update以外のログもあるので、面倒なのでイベントログを読み出すプログラムを
作ってみよう。
以前、イベントログに書き込むプログラムを作ったことがあるので
今度は、読み込む練習だ・・・・。
必要そうなAPIは
OpenEventLog
CloseEventLog
ReadEventLog
ぐらいかなぁ・・・
最初はオープン・クローズから
#include<windows.h>
int main(int argc, char **argv) {
HANDLE hf;
hf = OpenEventLog(NULL, "System");
if(hf == NULL) {
printf("Event Log Open Error.\n");
return -1;
}
CloseEventLog(hf);
return 0;
} |
特に問題はないであろう。OpenEventLogの2つめの引数は、Application、Security、Systemの
いずれか。(レジストリを参照したほうがよいかも)
1つめの引数は、NULLをしていしているのでローカルコンピュータとなる。
GetNumberOfEventLogRecordsを使ってイベントログのレコード数を取得してみよう。
#include<windows.h>
int main(int argc, char **argv) {
HANDLE hf;
DWORD dwLogCount;
hf = OpenEventLog(NULL, "System");
if(hf == NULL) {
printf("Event Log Open Error.\n");
return -1;
}
if(GetNumberOfEventLogRecords(hf, &dwLogCount))
printf("Event Log Count %d\n", dwLogCount);
else
printf("Could not get Event Log Count\n");
CloseEventLog(hf);
return 0;
} |
これも問題ないであろう。
ReadEventLogは少々、わかりづらい。
ReadEventLog
BOOL ReadEventLog(
HANDLE hEventLog,
DWORD dwReadFlags,
DWORD dwRecordOffset,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
DWORD *pnBytesRead,
DWORD *pnMinNumberOfBtesNeeded
); |
lpBufferはEVENTLOGRECORD構造体を含むバッファへのポインタとなる。
#include<windows.h>
void DisplayError(DWORD dwError);
int main(int argc, char **argv) {
HANDLE hf;
DWORD dwLogCount;
DWORD dwLogSize, dwReadByte, dwNextSize, dwError;
EVENTLOGRECORD *pEventLogRecord;
BOOL bResult;
hf = OpenEventLog(NULL, "System");
if(hf == NULL) {
printf("Event Log Open Error.\n");
return -1;
}
if(GetNumberOfEventLogRecords(hf, &dwLogCount))
printf("Event Log Count %d\n", dwLogCount);
else
printf("Could not get Event Log Count\n");
dwLogSize = 1024;
pEventLogRecord = GlobalAlloc(GPTR, dwLogSize);
bResult = ReadEventLog(hf, EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ, 0, nEventLogRecord, dwLogSize, &dwReadByte, &dwNextSize);
if(bResult) {
printf("ReadByte : %d\n", dwReadByte);
}
else {
dwError = GetLastError();
DisplayError(dwError);
}
CloseEventLog(hf);
return 0;
}
void DisplayError(DWORD dwError) {
LPTSTR lpBuffer;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dwError, LANG_USER_DEFAULT,
(LPTSTR)&lpBuffer, 0, NULL);
printf("%s\n", lpBuffer);
LocalFree(lpBuffer);
} |
ポイントとなるのは、EVENTLOGRECORD構造体へのポインタに1024バイトのバッファをGlobalAllocして
いる。この1024バイトは適当だ。領域が足りない場合は、
D:>ReadEventLog
システム コールに渡されるデータ領域が小さすぎます。
D:> |
と表示される。うまく、読み込めれば、
D:>ReadEventLog
Event Log Count 2566
ReadByte : 944
D:> |
と読み込んだバイト数が表示されるはずだ。
(本来は領域不足のエラーの場合、領域を増やし再度読み込むようにプログラムを作る。)
この後、書き込んだが、文字数制限に引っかかったので
つづく・・