我正在开发 Windows 键盘过滤器驱动程序,我需要写入文件。我尝试使用 zwcreate、zwwrite 和 zwclose,但驱动程序没有在 PASSIVE_LEVEL 运行,我得到了 BSOD。我以前从未编写过 Windows 驱动程序。谢谢您的帮助!
编辑:谢谢 J. 通过!
调度工作项 (IoAllocateWorkItem/IoQueueWorkItem) 并从工作项回调例程中处理所有文件 I/O。
我不确定让内核驱动程序首先写入文件是否是个好主意。恕我直言,最好的方法是提供一个与驱动程序通信、获取数据然后将其写入磁盘的用户空间程序。
这适用于 Unix,但不适用于 Windows。
PCUCHAR buffer[] = {0x00, 0x01, 0x02, 0x03}; // for example
ULONG bufferSize = sizeof(buffer);
UNICODE_STRING filePath; // Must be with DOS prefix: \??\C:\MyFolder\logs.txt
HANDLE hFile;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
InitializeObjectAttributes(&ObjectAttributes, &filePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
NTSTATUS Status = ZwCreateFile(&hFile, FILE_GENERIC_READ | FILE_GENERIC_WRITE, &ObjectAttributes,
&IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE,
FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
if (!NT_SUCCESS(Status))
{
DbgPrint("[DRV_NAME]: Creating file error");
return Status;
}
Status = ZwWriteFile(hFile, NULL, NULL, NULL, &IoStatusBlock, (PVOID)buffer, bufferSize, NULL, NULL);
if (!NT_SUCCESS(Status))
{
InjDbgPrint("[DRV_NAME]: Writing file error");
return Status;
}
ZwClose(hFile);
使用 Zw-Tools 从设备驱动程序写入文件的一个很好的例子是在 rootkit.com 上找到的 Clandestiny 的Klog。它目前对我帮助很大。
好吧,我有点同意 Johannes 的观点,即不建议直接从驱动程序执行经典的用户态工作(文件/网络/...-访问)。它不仅容易出错,而且将来可能会出现不可预见的中断。用户界面通常更加稳定和有弹性。