我希望从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:函数日志driver.obj中引用的未解析外部符号fclose : LNK2019:函数日志中引用的未解析外部符号fopen :错误LNK2019:函数日志中引用的未解析外部符号fprintf
我包括了stdio.h,我还需要做些什么才能把这个联系起来吗?
还是因为这是一个内核驱动程序,我不能使用这些库,必须执行不同的低级过程才能写入日志文件?
编辑:看来我不能使用内核驱动程序的fopen .
我尝试过这样做,但是没有任何东西被写入文件。我根据这个例子编写了代码:
我所更改的只是将标志设置为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);
}
}发布于 2018-03-12 19:59:18
如果确实需要从内核模式驱动程序进行日志记录,我建议您查看WMI/WPP跟踪。这将能够足够快地进行日志记录,从而能够跟上大多数内核事件,而这些事件显示在文件或调试器上并不是很好。它还允许您在生产/发布驱动程序中进行跟踪,而不会影响性能,从而使客户能够收集日志并对其进行分析。
https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/wpp-software-tracing
https://stackoverflow.com/questions/49091442
复制相似问题