ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1594回复:7

关于fastio的问题,各位帮忙看看!!

楼主#
更多 发布于:2004-04-15 15:20
遇到这样一个问题,请各位帮忙解决

当第一次打开一个文本文件(如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???

请高手指点一下!!谢啦!!

最新喜欢:

cyliucyliu
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-15 17:50
说说你到底想做什么?
ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-16 09:48
我想在文件被打开前,预读一下内容,如果包含特定的内容,就返回错误,不允许被打开。如果第一次打开文件,可以通过上面代码获得文件buffer然后处理,但是一旦打开过一次后,我该怎么办呢???
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-16 11:39
我想在文件被打开前,预读一下内容,如果包含特定的内容,就返回错误,不允许被打开。如果第一次打开文件,可以通过上面代码获得文件buffer然后处理,但是一旦打开过一次后,我该怎么办呢???


预读时,使用标志FILE_NO_INTERMEDIATE_BUFFERING打开文件,这样系统就始终从磁盘上读了。
ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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 );
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-16 18:08
我是照着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 );
 


你不说读文件的内容吗?怎么变成读目录了???对于目录来说,是不存在什么IRP_NOCACHE之类的标志的。
ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-19 10:07
我的意思是,是不是在挂接硬盘的时候设置那个标志??我不是用zwcreatefile直接打开文件的,而是根据不同的读文件的方式(如IRP_NOCACHE)或的文件的buffer(如MmGetSystemAddressForMdlSafe),
ildee
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2005-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-19 10:09
如果文件被打开一次,就不会有irp_nocache,此时我怎么获得文件的buffer,还是必须用zwcreatefile直接打开文件然后读取内容呢??好像不用这样吧..
游客

返回顶部