liuchangdong007
驱动牛犊
驱动牛犊
  • 注册日期2010-04-15
  • 最后登录2011-07-12
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望511点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5002回复:7

设备名+FltCreateFile+ZwReadFile读不到数据

楼主#
更多 发布于:2010-06-29 19:16
在minifilter的驱动里面,根据设备名(比如说\\Device\\HarddiskVolume1\\a.txt),可以通过ZwCreateFile和ZwReadFile读得数据。
或者说直接用链接名(比如说\\??\\C:\\a.txt)+FltCreateFile+ZwReadFile,读得数据的结果。可是,用设备名(比如说\\Device\\HarddiskVolume1\\a.txt)+FltCreateFile+ZwReadFile读不到数据,读到数据为空,不知道是什么原因。
下面是我的代码:
NTSTATUS status;
    HANDLE filehandle  = NULL;
    OBJECT_ATTRIBUTES object_attributes;
    PCHAR buffer = NULL;
    LARGE_INTEGER offset = { 0 };
    IO_STATUS_BLOCK io_status = { 0 };
    ULONG64 length = 4*1024;
    UNICODE_STRING testlcd;

    RtlInitEmptyUnicodeString(&DocName,DocNumBuffer,1000*sizeof(WCHAR));

    
    RtlInitUnicodeString(&testlcd,L"\\Device\\HarddiskVolume1\\a.txt");
    DbgPrint("test lcd :%wZ",&testlcd);

    InitializeObjectAttributes(&object_attributes,
        &testlcd,
        OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
        NULL,
        NULL
        );

    status = FltCreateFile( FltObjects->Filter,
        FltObjects->Instance,
        &filehandle,
        GENERIC_READ|GENERIC_WRITE,
        &object_attributes,
        &io_status,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        FILE_OPEN,
        FILE_NON_DIRECTORY_FILE,
        NULL,
        0,
        IO_IGNORE_SHARE_ACCESS_CHECK
        );

    while (TRUE)
    {
        status = ZwReadFile (
            filehandle,
            NULL,
            NULL,
            NULL,
            &io_status,
            buffer,
            length,
            &offset,
            NULL
            );
        if (status == STATUS_END_OF_FILE)
        {
            break;
        }else{
            length = io_status.Information;
            offset.QuadPart += length;
            DbgPrint("the buffer is:%s",buffer);
        }
    }

    ExFreePool(buffer);
    return status;
ander5115
驱动牛犊
驱动牛犊
  • 注册日期2009-12-23
  • 最后登录2012-08-17
  • 粉丝6
  • 关注3
  • 积分76分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-06-30 12:34
回 楼主(liuchangdong007) 的帖子
status = FltCreateFile( FltObjects->Filter,
        FltObjects->Instance,
        &filehandle,
        GENERIC_READ|GENERIC_WRITE,
        &object_attributes,
        &io_status,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        FILE_OPEN,
        FILE_NON_DIRECTORY_FILE,
        NULL,
        0,
        IO_IGNORE_SHARE_ACCESS_CHECK
        );
的返回值有检查过吗,FltCreateFile是否成功

或者是如果成功的话我是用ObReferenceObjectByHandle来获取文件对象,然后用FltReadFile来读取数据
liuchangdong007
驱动牛犊
驱动牛犊
  • 注册日期2010-04-15
  • 最后登录2011-07-12
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望511点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-06-30 20:39
返回值检查过,成功,也可以得到文件句柄,得到的文件句柄,用ZwRead去读,返回值,成功,但是读到的数据长度显示为1,而且buffer里面的内容为空。


“或者是如果成功的话我是用ObReferenceObjectByHandle来获取文件对象,然后用FltReadFile来读取数据”这个方法我没有试过,我先试试看,谢谢ander5115
ander5115
驱动牛犊
驱动牛犊
  • 注册日期2009-12-23
  • 最后登录2012-08-17
  • 粉丝6
  • 关注3
  • 积分76分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-07-01 12:54
我也是在微过滤开发指南上面看到FltCreateFile的句柄可以用ZwReadFile来读,没试过。我用的就是ObReferenceObjectByHandle来获取文件对象,然后用FltReadFile来读取数据是成功的,没有出现过问题。
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-07-01 14:53
FltXXXX多好用多爽啊,为什么非要ZwXXXX呢?
提问归提问,还是只能靠自己
liuchangdong007
驱动牛犊
驱动牛犊
  • 注册日期2010-04-15
  • 最后登录2011-07-12
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望511点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-07-03 09:23
回 3楼(ander5115) 的帖子
我用你说的方法,写的代码如下,
    NTSTATUS status;
    HANDLE filehandle  = NULL;
    OBJECT_ATTRIBUTES object_attributes;
    PCHAR buffer = NULL;
    LARGE_INTEGER offset = { 0 };
    IO_STATUS_BLOCK io_status = { 0 };
    ULONG length = 4*1024;
    ULONG testlength;
    MD5_CTX context;
    UNICODE_STRING test = RTL_CONSTANT_STRING(L"\\??\\C:\\a.txt");
    UNICODE_STRING testlcd;
    PFILE_OBJECT  FileObject = (PFILE_OBJECT)ExAllocatePool(PagedPool,sizeof(FILE_OBJECT));

    buffer = (PCHAR) ExAllocatePool(NonPagedPool,4096*sizeof(PCHAR));
    RtlInitUnicodeString(&testlcd,L"\\Device\\HarddiskVolume1\\a.txt");

    InitializeObjectAttributes(&object_attributes,
        &testlcd,
        OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
        NULL,
        NULL
        );

    status = FltCreateFile( FltObjects->Filter,
        FltObjects->Instance,
        &filehandle,
        FILE_READ_DATA,
        &object_attributes,
        &io_status,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ,
        FILE_OPEN,
        FILE_NON_DIRECTORY_FILE,
        NULL,
        0,
        IO_IGNORE_SHARE_ACCESS_CHECK
        );
    if(status == STATUS_SUCCESS)
        DbgPrint("fltcreate result success");

    status = ObReferenceObjectByHandle(filehandle,FILE_READ_DATA,*IoFileObjectType,
        KernelMode,(PVOID*)FileObject,NULL);

    testlength = FileObject->Size;
    DbgPrint("the file size is :%d",testlength);
    while (TRUE)
    {
        if (testlength==0)
        {
            break;
        }else if (testlength<4096)
        {
            length = testlength;
            testlength = 0;
        }else if (testlength>=4096)
        {
            testlength -= 4096;
        }

        status = FltReadFile(
            FltObjects->Instance,
            FileObject,
            &offset,
            length,
            buffer,
            FLTFL_IO_OPERATION_PAGING,
            &length,
            NULL,
            NULL
            );
        offset.QuadPart += length;
    }
    FltClose(filehandle);
    ExFreePool(buffer);
    ExFreePool(FileObject);
    return status;
用这个方法还是得不到数据,可能是我里面的参数,还是分配内存的地方有问题,我在调试的时候,发现ObReferenceObjectByHandle来获取文件对象不正确,你可以帮我看一下吗?或者,你说类似的代码,发给我一份,谢谢!
liuchangdong007
驱动牛犊
驱动牛犊
  • 注册日期2010-04-15
  • 最后登录2011-07-12
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望511点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-07-03 09:24
回 4楼(looksail) 的帖子
我当时是参考《微过滤开发指南》上面来做的,它上面说:“用FltCreateFile的句柄可以用ZwReadFile来读,而不必使用FltReadFile和FileWriteFile“,所以就没有使用FltXXXX了
liuchangdong007
驱动牛犊
驱动牛犊
  • 注册日期2010-04-15
  • 最后登录2011-07-12
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望511点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2010-07-05 09:09
问题已经解决,是由于参数设置不当所引起的(我用到的方法还是FltCreateFile+ZwReadFile)
游客

返回顶部