我正在使用Windows键盘过滤器驱动程序,我需要写入文件。我尝试使用zwcreate,zwwrite和zwclose,但驱动程序没有在PASSIVE_LEVEL运行,我得到了BSOD。我之前从未写过Windows驱动程序。谢谢你的帮助!
编辑:谢谢J.传递!
答案 0 :(得分:3)
安排工作项(IoAllocateWorkItem / IoQueueWorkItem)并处理workitem回调例程中的所有文件I / O.
我不确定让内核驱动程序首先写入文件是否是个好主意。执行此操作的最佳方法是提供与驱动程序通信的用户空间程序,获取数据然后将其写入磁盘。
这适用于Unix,但不适用于Windows。
答案 1 :(得分:0)
使用Zw-Tools从设备驱动程序写入文件的一个很好的例子是在rootkit.com找到的Clandestiny的Klog。它目前正在帮助我很多。
好吧,我有点同意约翰内斯的意见,不建议直接从驱动程序进行经典的用户工作(文件/网络/网络访问)。它不仅是错误的,它也可能在将来无法实现。用户界面通常更稳定,更有弹性。
答案 2 :(得分:0)
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);