3

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

编辑:谢谢 J. 通过!

4

3 回答 3

3

调度工作项 (IoAllocateWorkItem/IoQueueWorkItem) 并从工作项回调例程中处理所有文件 I/O。

我不确定让内核驱动程序首先写入文件是否是个好主意。恕我直言,最好的方法是提供一个与驱动程序通信、获取数据然后将其写入磁盘的用户空间程序。

这适用于 Unix,但不适用于 Windows。

于 2009-05-12T06:06:06.470 回答
3
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);
于 2019-07-09T18:00:00.900 回答
0

使用 Zw-Tools 从设备驱动程序写入文件的一个很好的例子是在 rootkit.com 上找到的 Clandestiny 的Klog。它目前对我帮助很大。

好吧,我有点同意 Johannes 的观点,即不建议直接从驱动程序执行经典的用户态工作(文件/网络/...-访问)。它不仅容易出错,而且将来可能会出现不可预见的中断。用户界面通常更加稳定和有弹性。

于 2009-07-16T13:13:13.917 回答