读取_EVT_SYSTEM_PROPERTY_ID的Event-ID数据错误,如何正确打印?
如何正确用WIN32 API获取并打印Event ID
使用WIN32 API打印Event ID时,获取的数据与事件查看器显示不符,以下是相关代码及正确解决方案:
事件渲染部分代码
hContext = EvtCreateRenderContext(0, NULL, EvtRenderContextUser); if (NULL == hContext) { ERRMSG("ParseEventDataBySource: Failed with error code : %lu\n", errorCode = GetLastError()); goto cleanup; } if (!EvtRender(hContext, hEvent, EvtRenderEventValues, dwBufferSize, pRenderedValues, &dwBufferUsed, &dwPropertyCount)) { if (ERROR_INSUFFICIENT_BUFFER == (errorCode = GetLastError())) { dwBufferSize = dwBufferUsed; pRenderedValues = (PEVT_VARIANT)malloc(dwBufferSize); if (pRenderedValues) { EvtRender(hContext, hEvent, EvtRenderEventValues, dwBufferSize, pRenderedValues, &dwBufferUsed, &dwPropertyCount);
本人获取Event ID的代码
UINT16 EventID; EventID = pRenderedValues[EvtSystemEventID].UInt16Val; eventIDString.Format(" [EventID : %hu] ", EventID); dataBuffer += eventIDString;
官方参考代码
DWORD EventID = pRenderedValues[EvtSystemEventID].UInt16Val; if (EvtVarTypeNull != pRenderedValues[EvtSystemQualifiers].Type) { EventID = MAKELONG(pRenderedValues[EvtSystemEventID].UInt16Val, pRenderedValues[EvtSystemQualifiers].UInt16Val); } wprintf(L"EventID: %lu\n", EventID);
解决方案
问题根源是仅读取了EvtSystemEventID的16位值,但部分事件的Event ID是32位结构:低16位为EvtSystemEventID,高16位为EvtSystemQualifiers。事件查看器显示的是完整32位ID,因此需要按官方逻辑组合两个值:
修改后的获取代码示例:
DWORD EventID = pRenderedValues[EvtSystemEventID].UInt16Val; // 检查Qualifiers字段是否存在有效值,存在则组合成完整32位ID if (EvtVarTypeNull != pRenderedValues[EvtSystemQualifiers].Type) { EventID = MAKELONG(pRenderedValues[EvtSystemEventID].UInt16Val, pRenderedValues[EvtSystemQualifiers].UInt16Val); } eventIDString.Format(" [EventID : %lu] ", EventID); dataBuffer += eventIDString;
调整后获取的Event ID将与事件查看器显示内容一致。
内容的提问来源于stack exchange,提问作者NImIPKZvUc
相关产品推荐
相关产品推荐

