阅读:1733回复:12
为什么使用zwreadfile不能读出数据???
我想在驱动里打开一个文件,并读出文件中的内容,我是在IRP_MJ_CREATE的处理函数SfCreate中做的,具体代码如下:
NTSTATUS SfCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { wchar_t* filePath = L"\\\\??\\\\c:\\\\1.log"; UNICODE_STRING uniName; OBJECT_ATTRIBUTES objAttr; HANDLE handle; NTSTATUS ntstatus; IO_STATUS_BLOCK ioStatusBlock; LARGE_INTEGER byteOffset; #define BUFFER_SIZE 64 CHAR buffer[BUFFER_SIZE]; ...... RtlInitUnicodeString(&uniName, filePath); InitializeObjectAttributes(&objAttr, &uniName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); if(KeGetCurrentIrql() != PASSIVE_LEVEL) return STATUS_INVALID_DEVICE_STATE; ntstatus = ZwCreateFile(&handle, GENERIC_WRITE | GENERIC_READ | SYNCHRONIZE, &objAttr, &ioStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); if(ntstatus != STATUS_SUCCESS) { DbgPrint("error %L\n",ntstatus); } if(NT_SUCCESS(ntstatus)) { byteOffset.LowPart = byteOffset.HighPart = 0; ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer, BUFFER_SIZE, &byteOffset, NULL); if(NT_SUCCESS(ntstatus)) { buffer[BUFFER_SIZE-1] = '\0'; DbgPrint("%s\n", buffer); } ZwClose(handle); } } 我用DebugView查看驱动的打印信息。 可是驱动加载后,无法从文件中读出数据,我跟踪后发现ZwCreateFile执行后,并没有返回正确的结果,不知道是什么原因?最开始我以为是我的参数有误,于是在坛子上找了很多提前发的帖子,可是发现参数设置没有问题,希望各位大牛帮忙解决一下难题,这个问题已经困惑我几天了,谢谢!!! |
|
沙发#
发布于:2007-05-18 08:51
帖子快沉了,自己把它顶起来!
各位大牛帮帮忙吧!!! |
|
驱动小牛
![]() |
板凳#
发布于:2007-05-18 11:48
你加那么多"\"干什么?
|
|
地板#
发布于:2007-05-18 12:33
引用第2楼yandong_8212于2007-05-18 11:48发表的 : 我也不想加呀,可是不加四个,驱动就会蓝屏,后来找了相关的帖子,才改成这样的,不知道你使用什么方法实现的,能说的详细点吗? 谢谢!!! |
|
驱动小牛
![]() |
地下室#
发布于:2007-05-18 15:17
蓝屏要找根本原因,不应该去猜.路径应该是L"\\??\\c:\\1.log",在哪一行出错,错误信息是什么帖出来.是谁说的要用"\\\\"哦,把那篇贴子地址发一下呢.,我从来都是用的"\\".
|
|
5楼#
发布于:2007-05-18 16:05
引用第4楼yandong_8212于2007-05-18 15:17发表的 : 我是看到toolflat大牛的帖子改的:http://bbs.driverdevelop.com/htm_data/39/0411/82192.html。如果说是其他参数的问题,我找了以前的帖子,也试了不同的参数,可是返回的结果都是zwcreatefile函数的返回结果有误,不知道你是怎么实现的?能否具体说一下,多谢!!! |
|
驱动小牛
![]() |
6楼#
发布于:2007-05-18 16:39
你用softice或者windbg跟一下,看是哪儿行出了错.你如果什么信息都不提供,很难知道原因.
|
|
7楼#
发布于:2007-05-18 16:56
是在ZwCreateFile出错的,我用softice跟踪后,发现ntstatus 的返回值不是status_success!
但是不知道是什么原因造成的? |
|
8楼#
发布于:2007-05-20 18:30
不知道何时能得到高手的解答呀?
|
|
9楼#
发布于:2007-05-22 10:21
是不是重入了?
|
|
|
10楼#
发布于:2007-05-22 15:21
引用第9楼llj2655506于2007-05-22 10:21发表的 : 你是指哪里重入了? 多谢! |
|
11楼#
发布于:2007-07-26 16:17
filePath = L"\\\\??\\\\c:\\\\1.log";
改成 filePath= L"\\DosDevice\\c:\\1.log" 即可. |
|
|
12楼#
发布于:2007-07-27 14:14
听说句柄是线程相关的,同一个驱动创建的文件未必能自己读出来,你应该自己创建IRP读
|
|