我工作上的键盘过滤器驱动器了,我需要写入一个文件。我试图使用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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top