内核模式驱动程序写入文件

时间:2009-05-11 23:35:46

标签: windows kernel driver

我正在使用Windows键盘过滤器驱动程序,我需要写入文件。我尝试使用zwcreate,zwwrite和zwclose,但驱动程序没有在PASSIVE_LEVEL运行,我得到了BSOD。我之前从未写过Windows驱动程序。谢谢你的帮助!

编辑:谢谢J.传递!

3 个答案:

答案 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);