1329078 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

さすらいのプログラマ

さすらいのプログラマ

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Keyword Search

▼キーワード検索

Profile

xyzzy_user

xyzzy_user

Calendar

Comments

AllenRaf@ fig Dib <a href="https://privatespb.com…
Rolandodeamp@ surry alubs <a href="https://blyadsk.ru/&qu…
Victornuple@ wic Exhax <a href="https://sosamba196.ru/…
avenue17@ Sains Sig круть...инетересно было прочесть
Davidabeds@ dog Slild Надеюсь, Вы найдёте верное решение.

Freepage List

2006/08/11
XML
カテゴリ:C言語(Win32)
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:>

と読み込んだバイト数が表示されるはずだ。
(本来は領域不足のエラーの場合、領域を増やし再度読み込むようにプログラムを作る。)

この後、書き込んだが、文字数制限に引っかかったので
つづく・・





お気に入りの記事を「いいね!」で応援しよう

Last updated  2006/08/11 02:47:34 PM
コメント(0) | コメントを書く
[C言語(Win32)] カテゴリの最新記事



© Rakuten Group, Inc.