阅读:5453回复:7
设备名+FltCreateFile+ZwReadFile读不到数据
在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; |
|
沙发#
发布于: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来读取数据 |
|
板凳#
发布于:2010-06-30 20:39
返回值检查过,成功,也可以得到文件句柄,得到的文件句柄,用ZwRead去读,返回值,成功,但是读到的数据长度显示为1,而且buffer里面的内容为空。
“或者是如果成功的话我是用ObReferenceObjectByHandle来获取文件对象,然后用FltReadFile来读取数据”这个方法我没有试过,我先试试看,谢谢ander5115 |
|
地板#
发布于:2010-07-01 12:54
我也是在微过滤开发指南上面看到FltCreateFile的句柄可以用ZwReadFile来读,没试过。我用的就是ObReferenceObjectByHandle来获取文件对象,然后用FltReadFile来读取数据是成功的,没有出现过问题。
|
|
地下室#
发布于:2010-07-01 14:53
FltXXXX多好用多爽啊,为什么非要ZwXXXX呢?
|
|
|
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来获取文件对象不正确,你可以帮我看一下吗?或者,你说类似的代码,发给我一份,谢谢! |
|
6楼#
发布于:2010-07-03 09:24
回 4楼(looksail) 的帖子
我当时是参考《微过滤开发指南》上面来做的,它上面说:“用FltCreateFile的句柄可以用ZwReadFile来读,而不必使用FltReadFile和FileWriteFile“,所以就没有使用FltXXXX了 |
|
7楼#
发布于:2010-07-05 09:09
问题已经解决,是由于参数设置不当所引起的(我用到的方法还是FltCreateFile+ZwReadFile)
|
|