题
我工作上的键盘过滤器驱动器了,我需要写入一个文件。我试图使用zwcreate,zwwrite,并zwclose但驾驶员不是运行在PASSIVE_LEVEL和我的蓝屏。我从来没有写过一窗户驱动程序之前。谢谢你的帮助!
编辑:J.谢谢传球!
解决方案
附表的工作项(IoAllocateWorkItem / IoQueueWorkItem)和处理所有文件I / O从工作项回调例程内。
我不知道这是否是一个好主意,让内核驱动程序写在首位的文件。要做到这一点IMHO最好的办法是,提供一种用户空间程序,与驾驶员进行通信时,获取数据,然后将其写入到磁盘上。
这是用于Unix真实的,但不适用于Windows。
其他提示
一个很好的例子使用Zw工具来编写的文件从一个装置驱动程序是Clandestiny的Klog现在 rootkit.com.它目前是帮我很多。
和我有点同意与约翰内斯,这是不可取的做经典的用户态的工作(文件/net/...-接入)直接从一个驱动程序。它不仅是errorprone,它也可能会破坏、无法预见的未来。用户接口的通常是更加稳定性和弹性。
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);
不隶属于 StackOverflow