首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Windows 10内核模式驱动程序登录到txt文件

从Windows 10内核模式驱动程序登录到txt文件
EN

Stack Overflow用户
提问于 2018-03-04 02:44:57
回答 1查看 3.8K关注 0票数 2

我希望从Windows 10内核模式驱动程序(C)中进行一些日志记录。我在驱动程序中有很多日志记录,但是在这个实例中,我不能附加内核调试器,所以我想将调试字符串转储到txt文件(甚至是事件日志)。

这里有一个例子

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
VOID Log(char * text) {
    FILE *f = fopen("c:\\temp\\logger.txt", "a+");
    if (f == NULL) return;

    fprintf(f, "%s\n", text);

    fclose(f);
}

不管我得到了什么

driver.obj : error LNK2019:函数日志driver.obj中引用的未解析外部符号fclose : LNK2019:函数日志中引用的未解析外部符号fopen :错误LNK2019:函数日志中引用的未解析外部符号fprintf

我包括了stdio.h,我还需要做些什么才能把这个联系起来吗?

还是因为这是一个内核驱动程序,我不能使用这些库,必须执行不同的低级过程才能写入日志文件?

编辑:看来我不能使用内核驱动程序的fopen .

我尝试过这样做,但是没有任何东西被写入文件。我根据这个例子编写了代码:

https://support.microsoft.com/en-us/help/891805/how-to-open-a-file-from-a-kernel-mode-device-driver-and-how-to-read-fr

我所更改的只是将标志设置为FILE_OPEN_IF,以便在文件已经存在的情况下追加该文件。我知道每次打开和关闭句柄是非常低效的,但是我现在只是在测试。

代码语言:javascript
复制
VOID Log(char* text) {

    UNICODE_STRING     uniName;
    OBJECT_ATTRIBUTES  objAttr;

    RtlInitUnicodeString(&uniName, L"\\SystemRoot\\example.txt");  // or L"\\SystemRoot\\example.txt"
    InitializeObjectAttributes(&objAttr, &uniName,
        OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
        NULL, NULL);

    HANDLE   handle;
    NTSTATUS ntstatus;
    IO_STATUS_BLOCK    ioStatusBlock;

    // Do not try to perform any file operations at higher IRQL levels.
    // Instead, you may use a work item or a system worker thread to perform file operations.

    if (KeGetCurrentIrql() != PASSIVE_LEVEL) return;
        //return STATUS_INVALID_DEVICE_STATE;

    ntstatus = ZwCreateFile(&handle,
        GENERIC_WRITE,
        &objAttr, &ioStatusBlock, NULL,
        FILE_ATTRIBUTE_NORMAL,
        0,
        FILE_OPEN_IF,
        FILE_SYNCHRONOUS_IO_NONALERT,
        NULL, 0);

    CHAR     buffer[BUFFER_SIZE];
    size_t  cb;

    if (NT_SUCCESS(ntstatus)) {
        ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), text, 0x0);
        if (NT_SUCCESS(ntstatus)) {
            ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);
            if (NT_SUCCESS(ntstatus)) {
                ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,
                    buffer, (ULONG)cb, NULL, NULL);
            }
        }
        ZwClose(handle);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-12 19:59:18

如果确实需要从内核模式驱动程序进行日志记录,我建议您查看WMI/WPP跟踪。这将能够足够快地进行日志记录,从而能够跟上大多数内核事件,而这些事件显示在文件或调试器上并不是很好。它还允许您在生产/发布驱动程序中进行跟踪,而不会影响性能,从而使客户能够收集日志并对其进行分析。

https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/wpp-software-tracing

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49091442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档