阅读:2136回复:7
还是 win2k file filter driver 问题, notepad 打开的文件内容怎样读取???
扑获 IRP_MJ_READ, 读取 UserBuffer 或 MDL 老是 raise exception?? 还有 Cache 进不去,PrivateCacheMap 为 NULL.
请高手指点。 |
|
最新喜欢:![]() |
沙发#
发布于:2002-03-18 14:10
扑获 IRP_MJ_READ, 读取 UserBuffer 或 MDL 老是 raise exception?? 1,确保dispatch给底层的IRP_MJ_READ返回之后,且不是PENDDING,再访问MDL/UserBuffer 2,对Mdl/UserBuffer的访问最好放在NonCachedIO时来做,因为对于Cached IO,可能导致Page Fault,数据的填充过程是在Page Fault中完成的。 还有 Cache 进不去,PrivateCacheMap 为 NULL. \"Cache 进不去\"是什么意思? |
|
|
板凳#
发布于:2002-03-18 15:52
thanx, matt.
本是想通过 FileObject->PrivateCacheMap 是否为空来判断数据是否 Cache, 但发现 2k 下 notepad 再次打开文件时,进入到 IRP_MJ_FILE_SYSTEM_CONTROL 而是 IRP_MJ_READ, 从 Cache 中读取数据, 而PrivateCacheMap 始终为 NULL, 不太明白,直接用 CcCopyRead/CcMdlRead 去读数据可行吗? |
|
地板#
发布于:2002-03-18 16:51
本是想通过 FileObject->PrivateCacheMap 是否为空来判断数据是否 Cache 你这种判断对一些文件系统可能不适用,比如这个FSD可能利用IoCreateStreamFileObject来产生一个替代。 但就你的情况,我想你是在filter VFAT吧。 但发现 2k 下 notepad 再次打开文件时,进入到 IRP_MJ_FILE_SYSTEM_CONTROL 而是 IRP_MJ_READ, 从 Cache 中读取数据, 而PrivateCacheMap 始终为 NULL,不太明白 你这句话,我没看明白。文件读要么在IRP_MJ_READ中完成,要么就是FastIO中。 你说的IRP_MJ_FILE_SYS_CONTROL,具体的Minor Function是什么,我猜可能是FSCTL_IS_VOLUME_MOUNTED。 直接用CcCopyRead/CcMdlRead 去读数据可行吗? Ccxxx之前一定要对输入的FileObject的PrivateCacheMap初始化(CcInitializeCacheMap)... |
|
|
地下室#
发布于:2002-03-18 17:58
当进入到 IRP_MJ_FILE_SYSTEM_CONTROL 时,DeviceIoControl.IoControlCode 为 第一次为 0x900c0, 后面的都是 0x90028, MinorFuction 好象无用, 都为 0.
经跟, FastIORead 里根本没有进去的。第一次打开时, irp_MJ_READ 进入的,后都进入到 IRP_MJ_FILE_SYSTEM_CONTROL 的. 查看 Flag ,好象也根本不是 FILE_OPEN_BY_FILE_ID 的,怪。。 (注: 别的应用几乎都是在 IRP_MJ_READ/FastIO 扑获得,就 notepad 不行) |
|
5楼#
发布于:2002-03-19 10:09
当进入到 IRP_MJ_FILE_SYSTEM_CONTROL 时,DeviceIoControl.IoControlCode 为 第一次为 0x900c0, 后面的都是 0x90028, MinorFuction 好象无用, 都为 0. 你这里跟IRP_MJ_FILE_SYSTEM_CONTROL应该没关系的。 MinorFunction = 0; IRP_MN_USER_FS_REQUEST 90028: FSCTL_IS_VOLUME_MOUNTED 900c0: FSCTL_CREATE_OR_GET_OBJECT_ID,此返回STATUS_INVALID_DEVICE_REQUEST (0xc0000010)吗? 经跟, FastIORead 里根本没有进去的。第一次打开时, irp_MJ_READ 进入的,后都进入到 IRP_MJ_FILE_SYSTEM_CONTROL 的. 查看 Flag ,好象也根本不是 FILE_OPEN_BY_FILE_ID 的,怪。 我在我的文件系统试了一下,会有两次IRP_MJ_READ。对你的情况,可能是系统对你Filter的FSD直接进行FastIO,而跳过了你的Filter. 对FastIO的机制,我还没常深入研究过,不敢枉谈。你不妨到NTFSD Mailing list中问问。(www.osr.com) |
|
|
6楼#
发布于:2002-03-19 10:12
当进入到 IRP_MJ_FILE_SYSTEM_CONTROL 时,DeviceIoControl.IoControlCode 为 第一次为 0x900c0, 后面的都是 0x90028, MinorFuction 好象无用, 都为 0. 你这里跟IRP_MJ_FILE_SYSTEM_CONTROL应该没关系的。 MinorFunction = 0; IRP_MN_USER_FS_REQUEST 90028: FSCTL_IS_VOLUME_MOUNTED 900c0: FSCTL_CREATE_OR_GET_OBJECT_ID,此返回STATUS_INVALID_DEVICE_REQUEST (0xc0000010)吗? 经跟, FastIORead 里根本没有进去的。第一次打开时, irp_MJ_READ 进入的,后都进入到 IRP_MJ_FILE_SYSTEM_CONTROL 的. 查看 Flag ,好象也根本不是 FILE_OPEN_BY_FILE_ID 的,怪。 我在我的文件系统试了一下,会有两次IRP_MJ_READ。对你的情况,可能是系统对你Filter的FSD直接进行FastIO,而跳过了你的Filter. 对FastIO的机制,我还没常深入研究过,不敢枉谈。你不妨到NTFSD Mailing list中问问。(www.osr.com) |
|
|
7楼#
发布于:2002-03-19 11:00
环境: win2k pro, hook fsd: FAT 软盘
操作: 利用 notepad 打开 文本文件。 |
|