gpt4 book ai didi

c# - 在源 'X' 中找不到事件 ID 'Microsoft-Windows-Kernel-Power' 的描述

转载 作者:行者123 更新时间:2023-12-03 14:42:22 24 4
gpt4 key购买 nike

我正在尝试使用以下方法读取 C# .NET 3.5 中的系统事件日志 EventLog.GetEventLogs .这似乎适用于我想查看的各种事件日志。只有一个异常(exception):Microsoft-Windows-Kernel-Power可以读取但会产生以下消息的事件日志:

Microsoft-Windows-Kernel-Power The description for Event ID 'X' in Source 'Microsoft-Windows-Kernel-Power' cannot be found. The local computer may not have the necessary registry information or message DLL files to display the message, or you may not have permission to access them. The following information is part of the event:'Y', 'Z'



而不是 Windows 事件查看器中显示的正确消息。

代码看起来像这样
var myEventLogs = new List<myModels.EventLogEntry>();

foreach (var eventLog in EventLog.GetEventLogs())
{
foreach (var entry in eventLog.Entries)
{
if (entry.Source.IndexOf("kernel-power", StringComparison.OrdinalIgnoreCase) == -1 &&
entry.Message.IndexOf("kernel-power", StringComparison.OrdinalIgnoreCase) == -1)
continue;

myEventLogs.Add(new myModels.EventLogEntry(entry.Source, entry.Message))
}
}

即使我以管理员身份运行应用程序,也会发生这种情况。我在这里不知所措。我在互联网上进行了广泛的搜索,发现了一些似乎有类似问题的帖子,但大多数都是为了编写事件日志而不是在阅读它们时遇到问题。有没有人熟悉这种问题或者可以指出我正确的方向?我所有的注册表项等似乎都设置正确(并且在不同的 PC 上也显示相同的结果)。

编辑:Windows 版本 10.0.18363 Build 18363 但它发生在多台 PC 上(我不确定其他人使用的是什么 Windows 版本)。事实上,我还没有找到一个正在工作的(到目前为止测试了 5 个)。

最佳答案

我也找不到任何规范,但我得到了一个 hack,它在这里显示了合理的消息。这个问题看起来像是 EventLogEntry 中的错误。来自 CLR 或 kernel-power 的非统一消息处理事件。
我重现了这个问题,以及在我的机器上发生了什么:

  • 例如。有一个109 ( 0x6D ) 事件日志中的事件:
    Windows Event Log Viewer
  • EventLogEntryHKLM\SYSTEM\CurrentControlSet\Services\EventLog\Application\Microsoft-Windows-Kernel-Power\EventMessageFile 获取带有字符串资源的 dll 的路径(在 CLREventLogEntry 来源中为 herehere )
  • 我机器上的dll路径是:%systemroot%\system32\microsoft-windows-kernel-power-events.dll ,成功找到并加载,但是没有0x6D里面的字符串id。但是,有一个字符串具有相同的文本但带有 0x02 00 00 00 id 中的前缀(使用 this 文章枚举来自 native dll 的字符串资源)

  • ID 0x0200006d (33554541) Language: 0409

    The kernel power manager has initiated a shutdown transition.


    所以如果设置 0x02 00 00 00在事件 id 中手动位,它可能会产生有意义的消息。下面的代码可以做到这一点,但这又是一个丑陋的 hack,它不应该用于现实生活中的软件,因为它完全基于假设而不是在所有情况下都经过测试,并且它操纵 EventLogEntry 的私有(private)状态:
        var myEventLogs = new List<myModels.EventLogEntry>();

    foreach (var eventLog in EventLog.GetEventLogs())
    {
    foreach (EventLogEntry entry in eventLog.Entries)
    {
    if (entry.Source.IndexOf("kernel-power", StringComparison.OrdinalIgnoreCase) == -1 &&
    entry.Message.IndexOf("kernel-power", StringComparison.OrdinalIgnoreCase) == -1)
    continue;

    var dataBuf = entry.GetPrivateField<byte[]>("dataBuf");
    var bufOffset = entry.GetPrivateField<int>("bufOffset");

    byte previousMagicByte = dataBuf[bufOffset + EVENTID + 3];
    try
    {
    dataBuf[bufOffset + EVENTID + 3] |= 0x02; //as strings in microsoft-windows-kernel-power-events.dll have 0x02****** ids

    myEventLogs.Add(new myModels.EventLogEntry(entry.Source, entry.Message))
    }
    finally
    {
    dataBuf[bufOffset + EVENTID + 3] = previousMagicByte;
    }
    }
    }
    ...


    internal const int EVENTID = 20;

    public static T GetPrivateField<T>(this object obj, string fieldName)
    {
    if (fieldName == null)
    throw new ArgumentNullException(nameof(fieldName));

    var fieldInfo = obj.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);

    if (fieldInfo == null)
    throw new ArgumentException($"Type {obj.GetType().FullName} doesn't have {fieldName} private instance field");

    object result = fieldInfo.GetValue(obj);
    return (T)result;
    }

    关于c# - 在源 'X' 中找不到事件 ID 'Microsoft-Windows-Kernel-Power' 的描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62210954/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com