阅读:1594回复:7
关于fastio的问题,各位帮忙看看!!
遇到这样一个问题,请各位帮忙解决
当第一次打开一个文本文件(如abc.txt),首先进入IRP_MJ_READ,然后可以在完成例程里获得文件的buffer和bufferlength,此时的irp->flag是IRP_NOCACHE 。 if(IrpSp->MajorFunction & IRP_MJ_READ) { if(Irp->Flags & ( IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO )) { if(Irp->MdlAddress) { buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority); bufferlength = MmGetMdlByteCount(Irp->MdlAddress); } } } 但是当再次打开这个文件时,并不会进入IRP_MJ_READ,但是却能够进入完成例程,此时的irp->flag有时是IRP_PAGING_IO,有时是IRP_SYNCHRONOUS_PAGING_IO,或者干脆是两者(IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO),我想知道这是怎么回事??还有就是,当这个完成例程到来并且标志不是IRP_NOCACHE,我该怎样获得文件的buffer 和 bufferlength??? 请高手指点一下!!谢啦!! |
|
最新喜欢:cyliu |
沙发#
发布于:2004-04-15 17:50
说说你到底想做什么?
|
|
板凳#
发布于:2004-04-16 09:48
我想在文件被打开前,预读一下内容,如果包含特定的内容,就返回错误,不允许被打开。如果第一次打开文件,可以通过上面代码获得文件buffer然后处理,但是一旦打开过一次后,我该怎么办呢???
|
|
地板#
发布于:2004-04-16 11:39
我想在文件被打开前,预读一下内容,如果包含特定的内容,就返回错误,不允许被打开。如果第一次打开文件,可以通过上面代码获得文件buffer然后处理,但是一旦打开过一次后,我该怎么办呢??? 预读时,使用标志FILE_NO_INTERMEDIATE_BUFFERING打开文件,这样系统就始终从磁盘上读了。 |
|
地下室#
发布于:2004-04-16 13:39
我是照着filemon改的,第一次打开文件时,在完成里程例判断IRP_NOCACHE,然后可以找到文件的buffer,第二次打开,文件的buffer在什么地方??根本就不会进到IRP_NOCACHE,会有这些标志
IRP_BUFFERED_IO ,IRP_DEALLOCATE_BUFFER,IRP_DEFER_IO_COMPLETION,IRP_READ_OPERATION。 你说的那个标志是用zwCreateFile挂接硬盘时候设置吗??可是我试了一下好像不行。。能不能贴段代码出来?? 我是这样做的 WCHAR filename[] = L\"\\\\DosDevices\\\\A:\\\\\"; // // We have to figure out what device to hook - first open the volume\'s // root directory // RtlInitUnicodeString( &fileNameUnicodeString, filename ); InitializeObjectAttributes( &objectAttributes, &fileNameUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL ); ntStatus = ZwCreateFile( &ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE|FILE_NO_INTERMEDIATE_BUFFERING, NULL, 0 ); |
|
5楼#
发布于:2004-04-16 18:08
我是照着filemon改的,第一次打开文件时,在完成里程例判断IRP_NOCACHE,然后可以找到文件的buffer,第二次打开,文件的buffer在什么地方??根本就不会进到IRP_NOCACHE,会有这些标志 你不说读文件的内容吗?怎么变成读目录了???对于目录来说,是不存在什么IRP_NOCACHE之类的标志的。 |
|
6楼#
发布于:2004-04-19 10:07
我的意思是,是不是在挂接硬盘的时候设置那个标志??我不是用zwcreatefile直接打开文件的,而是根据不同的读文件的方式(如IRP_NOCACHE)或的文件的buffer(如MmGetSystemAddressForMdlSafe),
|
|
7楼#
发布于:2004-04-19 10:09
如果文件被打开一次,就不会有irp_nocache,此时我怎么获得文件的buffer,还是必须用zwcreatefile直接打开文件然后读取内容呢??好像不用这样吧..
|
|