簡體   English   中英

從Windows 10內核模式驅動程序登錄到txt文件

[英]Log to a txt file from a Windows 10 Kernel Mode driver

我正在尋找從Windows 10內核模式驅動程序(C)進行一些日志記錄的方法。 我在驅動程序內部進行了大量日志記錄,但是在這種情況下,我無法附加內核調試器,因此我想將調試字符串轉儲到txt文件(甚至事件日志)中。

例如,這是一個例子

#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: unresolved external symbol fclose referenced in function Log driver.obj : error LNK2019: unresolved external symbol fopen referenced in function Log tdriver.obj : error LNK2019: unresolved external symbol fprintf referenced in function Log 

我已經包含了stdio.h,還需要做些其他的事情才能使它鏈接嗎?

還是因為這是內核驅動程序,所以我無法使用這些庫,並且必須執行其他低級過程才能寫入日志文件?

編輯:看來我不能從內核驅動程序使用fopen。

我試過了,但是什么也沒寫到文件中。 我基於此示例編寫代碼:

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

我所做的只是將標志設置為FILE_OPEN_IF以附加文件(如果文件已經存在)。 我知道每次打開和關閉手柄效率都很低,但是我現在只是在測試。

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);
    }
}

如果確實需要從內核模式驅動程序進行日志記錄,建議您研究WMI / WPP跟蹤。 這將能夠以足夠快的速度記錄日志,以使其能夠跟上大多數內核事件,而這些事件記錄到文件或調試器中並不適合。 它還將使您能夠在不影響性能的情況下跟蹤生產/發布驅動程序,以便使客戶能夠收集日志並進行分析。

https://docs.microsoft.com/zh-cn/windows-hardware/drivers/devtest/wpp-software-tracing

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM