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



我希望从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, "%sn", 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/en-us/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://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/wpp-software-tracing

相关内容

  • 没有找到相关文章

最新更新