test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
阅读:1733回复:12

为什么使用zwreadfile不能读出数据???

楼主#
更多 发布于:2007-05-17 17:59
    我想在驱动里打开一个文件,并读出文件中的内容,我是在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执行后,并没有返回正确的结果,不知道是什么原因?最开始我以为是我的参数有误,于是在坛子上找了很多提前发的帖子,可是发现参数设置没有问题,希望各位大牛帮忙解决一下难题,这个问题已经困惑我几天了,谢谢!!!
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-18 08:51
帖子快沉了,自己把它顶起来!
各位大牛帮帮忙吧!!!
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2007-05-18 11:48
你加那么多"\"干什么?
商务MSN:YanDong_8212@163.com
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-18 12:33
引用第2楼yandong_8212于2007-05-18 11:48发表的  :
你加那么多""干什么?


我也不想加呀,可是不加四个,驱动就会蓝屏,后来找了相关的帖子,才改成这样的,不知道你使用什么方法实现的,能说的详细点吗?
谢谢!!!
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
地下室#
发布于:2007-05-18 15:17
蓝屏要找根本原因,不应该去猜.路径应该是L"\\??\\c:\\1.log",在哪一行出错,错误信息是什么帖出来.是谁说的要用"\\\\"哦,把那篇贴子地址发一下呢.,我从来都是用的"\\".
商务MSN:YanDong_8212@163.com
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-18 16:05
引用第4楼yandong_8212于2007-05-18 15:17发表的  :
蓝屏要找根本原因,不应该去猜.路径应该是L"\??\c:\1.log",在哪一行出错,错误信息是什么帖出来.是谁说的要用"\\"哦,把那篇贴子地址发一下呢.,我从来都是用的"\".


我是看到toolflat大牛的帖子改的:http://bbs.driverdevelop.com/htm_data/39/0411/82192.html。如果说是其他参数的问题,我找了以前的帖子,也试了不同的参数,可是返回的结果都是zwcreatefile函数的返回结果有误,不知道你是怎么实现的?能否具体说一下,多谢!!!
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
6楼#
发布于:2007-05-18 16:39
你用softice或者windbg跟一下,看是哪儿行出了错.你如果什么信息都不提供,很难知道原因.
商务MSN:YanDong_8212@163.com
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-18 16:56
是在ZwCreateFile出错的,我用softice跟踪后,发现ntstatus 的返回值不是status_success!
但是不知道是什么原因造成的?
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-05-20 18:30
不知道何时能得到高手的解答呀?
llj2655506
驱动牛犊
驱动牛犊
  • 注册日期2007-03-27
  • 最后登录2009-06-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望27点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-05-22 10:21
是不是重入了?
驱网无线,快乐无限
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-05-22 15:21
引用第9楼llj2655506于2007-05-22 10:21发表的  :
是不是重入了?


你是指哪里重入了?
多谢!
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-07-26 16:17
filePath = L"\\\\??\\\\c:\\\\1.log";
改成 filePath= L"\\DosDevice\\c:\\1.log"
即可.
向前,向前,向前....
haifong2
驱动牛犊
驱动牛犊
  • 注册日期2006-05-15
  • 最后登录2014-10-16
  • 粉丝0
  • 关注0
  • 积分890分
  • 威望114点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-07-27 14:14
听说句柄是线程相关的,同一个驱动创建的文件未必能自己读出来,你应该自己创建IRP读
游客

返回顶部