지금껏 이벤트로그에 쓰는건 해봤어도, 이벤트 로그를 읽을일이 없어 그냥 무심히 지나쳐왔었는데요..
일이란걸 하다보니, 이벤트 로그를 읽어들이면 간단하게 끝날 수 있는데,
직접 코딩하려니 무자게 빡센 업무가 되는것들도 있더라구요.. 흠...

지금 하려는 작업은 시스템 이벤트중 보안(Security) 이벤트에 먼가가 써지면 그 이벤트를 바로 받아서
어떤게 써졌는지 읽어오는 작업이 되겠습니다.

// 이벤트 로그의 핸들과, 그것의 이벤트를 처리할 EVENT 핸들
HANDLE m_hEventLog;
HANDLE m_hEvent;

// 이벤트 로그를 오픈하고, 새로운 이벤트를 하나 만든다.
m_hEventLog = OpenEventLog(NULL, "Security);
m_hEvent = CreateEvent(NULL, FALSE, FALSE, "crowback_m_hEvent");

// 열린 이벤트로그에, 새로 만든 EVENT를 등록하여
// 이벤트 로그의 이벤트를 받아보자.
if(NotifyChangeEventLog(m_hEventLog, m_hEvent) == FALSE)
{
   if(m_hEvent)
        CloseHandle(m_hEvent);
   CloseEventLog(m_hEventLog);
}

비동기로 계속 이벤트를 모니터링 해야하므로 별도의 스레드가 하나 있어야겠죠?
프로그램 자체의 메인 루프에다가 처리해도 상관없을꺼구요..

// 스레드나 메인루프에서 이벤트를 대기하다가, 시그널이 날라오면
// 해당 이벤트 로그를 열어서 필요한 정보를 추출한다.
while(종료조건)
{
    if(WaitForSingleObject(pThis->EventLogGetEventHandle(), 100) == WAIT_OBJECT_0)
        EventLogCallback();
}

// 이벤트 로그를 열어서 최근 데이터를 읽어들인다.
void EventLogCallback()
{
    HANDLE evt = OpenEventLog(NULL, "Security");
    if (evt == NULL)
        return;

    BYTE bBuffer[4096] = {0};
    DWORD dwRead, dwNeeded;
    EVENTLOGRECORD *pevlr = (EVENTLOGRECORD *) &bBuffer;
    LPCTSTR lpSourceName;
    
    if(ReadEventLog(evt,   // Event log handle
        EVENTLOG_BACKWARDS_READ | // 최근 것을 읽어들인다.
        EVENTLOG_SEQUENTIAL_READ, // Sequential read
        0,       // Ignored for sequential read
        pevlr,      // Pointer to buffer
        4096,      // Size of buffer
        &dwRead,     // Number of bytes read
        &dwNeeded) == FALSE)   
    {
        CloseEventLog(evt);
        return;
    }
    CloseEventLog(evt);

    lpSourceName = (LPCTSTR) ((LPBYTE) pevlr + sizeof(EVENTLOGRECORD));

    // EVENTLOGRECORD 구조체에 필요한 정보가 모두 들어있다.
}

+ Recent posts