首页
社区
课程
招聘
[旧帖] 关于minifilter中Pre函数中无法使用FltReadFile读取Log文件 0.00雪花
发表于: 2013-5-7 16:54 10840

[旧帖] 关于minifilter中Pre函数中无法使用FltReadFile读取Log文件 0.00雪花

2013-5-7 16:54
10840
在一个Minifilter驱动中,我想在PreCreate函数中打开C盘下的目录文件,现在可以使用FltCreateFle获取文件句柄,但是使用FltReadFile时候会导致蓝屏:DUMP分析之后是PAGE_FAULT_IN_NONPAGED_AREA错误。
我也尝试了直接发送IRP给底层设备 ,但是不知道底层设备的DEVICE_OBJECT怎么获取,陷入了文件的重入。
代码如下:

        NTSTATUS status;
        NTSTATUS ntStatus;
        HANDLE hFile;
        PIO_STATUS_BLOCK iostatus;
        OBJECT_ATTRIBUTES objectAttributes;
        IO_STATUS_BLOCK ioStatus;
        UNICODE_STRING fileName;
        ULONG length;
        char FileName[260] = "X:";
        char str_temp[260] = {'\0'};
        FILE_STANDARD_INFORMATION fsi;
        PFLT_FILE_NAME_INFORMATION nameInfo;
       
        PFILE_OBJECT FileObject;

        PVOID pBuffer;
        ULONG bytesRead;
        LARGE_INTEGER offset;

        UNREFERENCED_PARAMETER( CompletionContext );
        PAGED_CODE();

        __try {                                                                                                    
                status = FltGetFileNameInformation( Data,
                        FLT_FILE_NAME_NORMALIZED |
                        FLT_FILE_NAME_QUERY_DEFAULT,
                        &nameInfo );
                if (NT_SUCCESS( status )) {
                        //开始文件截获
                        if (gCommand == ENUM_BLOCK) {

                                FltParseFileNameInformation( nameInfo );
                                if (NPUnicodeStringToChar(&nameInfo->Name, FileName)) {
                                        //下面开始打开文件并且读入需要过滤的文件信息
                                        _asm int 3;
                                        RtlInitUnicodeString( &fileName,LoadFilePath);

                                        InitializeObjectAttributes( &objectAttributes,
                                                &fileName,
                                                OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
                                                NULL,
                                                NULL );
                                        //下面使用FltCreateFile开始非重入打开文件
                                        status = FltCreateFile( gFilterHandle,
                                                FltObjects->Instance,
                                                &hFile,
                                                FILE_READ_DATA,
                                                &objectAttributes,
                                                &ioStatus,
                                                (PLARGE_INTEGER) NULL,
                                                FILE_ATTRIBUTE_NORMAL,
                                                FILE_SHARE_READ,
                                                FILE_OPEN_IF,
                                                FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_ALERT,
                                                NULL,
                                                0,
                                                IO_IGNORE_SHARE_ACCESS_CHECK
                                                );

                                       

                                        if(!NT_SUCCESS(status))
                                        {
                                                __leave;
                                                FltClose(hFile);
                                        }

                                        //读取文件长度
                                        ntStatus = ZwQueryInformationFile(hFile,
                                                &iostatus,
                                                &fsi,
                                                sizeof(FILE_STANDARD_INFORMATION),
                                                FileStandardInformation);

                                        KdPrint(("The program want to read %d bytes\n",fsi.EndOfFile.QuadPart));

                                        //为读取的文件分配缓冲区
                                        length = (ULONG)fsi.EndOfFile.QuadPart;
                                        pBuffer = FltAllocatePoolAlignedWithTag( FltObjects->Instance,
                                                PagedPool,
                                                length,
                                                'nacS' );

                                        FileObject = (PFILE_OBJECT)ExAllocatePool(PagedPool,sizeof(FILE_OBJECT));
                                        //读取文件

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

                                       
                                        /*status = ZwReadFile(hFile,NULL,
                                                NULL,NULL,
                                                iostatus,
                                                pBuffer,
                                                (LONG)fsi.EndOfFile.QuadPart,
                                                NULL,NULL);*/
                                        if(!NT_SUCCESS(status))
                                        {
                                                __leave;
                                                FltClose(hFile);
                                        }
                                        //下面使用直接封装IRP发送到设备栈的底层的方式
                                        offset.QuadPart = 0;
                                        //status  = FltFileReadWrite(FltObjects->FileObject->DeviceObject->AttachedDevice,FileObject,&offset,&length,pBuffer,TRUE);
                                        //status  = FltFileReadWrite(Data->Iopb->TargetFileObject->DeviceObject,FileObject,&offset,&length,pBuffer,TRUE);
                                       
                                         bytesRead = 0;

                                        _asm int 3;

                                        if (KeGetCurrentIrql() > PASSIVE_LEVEL)
                                        {
                                                DbgPrint("Over Level");
                                                __leave;
                                       
                                        }
                                        PAGED_CODE();
                                        status = FltReadFile(
                                                FltObjects->Instance,
                                                FileObject,
                                                &offset,
                                                1,
                                                pBuffer,
                                                FLTFL_IO_OPERATION_NON_CACHED|FLTFL_IO_OPERATION_PAGING,
                                                &bytesRead,
                                                NULL,
                                                NULL
                                                );
                                        if(!NT_SUCCESS(status))
                                        {
                                                __leave;
                                                FltClose(hFile);
                                        }

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 859
活跃值: (304)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
//读取文件长度
          ntStatus = ZwQueryInformationFile(hFile,
            &iostatus,
            &fsi,
            sizeof(FILE_STANDARD_INFORMATION),
            FileStandardInformation);

有更好的函数吧
FltQueryInformationFile
2013-5-7 18:39
0
雪    币: 96
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
这一步是没有问题的 可以准确获取文件信息
2013-5-7 22:59
0
雪    币: 859
活跃值: (304)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
4
。。。。。。。
2013-5-7 23:01
0
雪    币: 165
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有fltxxx就用嘛,不然重入了多纠结
2013-5-7 23:10
0
雪    币: 96
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
额--下面就是用了FltReadFile 然后就出现了内存错误--搞了几天了 智商很拙计ing
2013-5-8 00:11
0
雪    币: 9934
活跃值: (2554)
能力值: ( LV6,RANK:87 )
在线值:
发帖
回帖
粉丝
7
用FltCreateFileEx直接获得文件对象,不要用FltCreateFile+ObReferenceObjectByHandle的组合
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ddi/fltkernel/nf-fltkernel-fltcreatefileex?f1url=%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(FLTKERNEL%252FFltCreateFileEx);k(FltCreateFileEx);k(DevLang-C%252B%252B);k(TargetOS-Windows)%26rd%3Dtrue
2021-7-22 10:51
0
游客
登录 | 注册 方可回帖
返回
//