阅读:1350回复:7
还是关于filemon的问题?用户被禁言,该主题自动屏蔽! |
|
最新喜欢:simonl... |
沙发#
发布于:2002-04-03 14:05
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-04-03 15:13
主要的例程:
FilemonFastIoRead FilemonFastIoWrite FilemonFastIoDeviceIoControl IRP_MJ_READ IRP_MJ_WRITE IRP_FILE_SYSTEM_CONTROL IRP_MJ_DIRECTORY_CONTROL |
|
|
地板#
发布于:2002-04-03 17:33
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-04 09:15
这个问题很好解决。
要判断是不是你的目标,也就是你感兴趣的行为发生了,或者说你设置的目录、文件正在被操作。你首先可能需要在应用程序端设置这些参数。比如说加密目录名、文件名,将这些参数传递到驱动程序中作为全局变量保存起来(以后在驱动程序中访问它们一定需要同步)。然后在驱动程序的分发例程中,每次响应一个请求(IRP或者FastI/O),都先根据传入的参数FileObject得到文件完整路径名。(FileObject在IoGetCurrentIrpStackLocation->FileObject,在Fast I/O 例程中则直接在传入的参数中)。得到完整路径名后,再和用户端设置的路径相比,如果相同,则执行加解密操作,否则,直接调用低层驱动程序。 相关流程: 在Dispatch例程里(Normal I/O && Fast I/O) if(Normal I/O) PFILE_OBJECT pFileObject=IoGetCurrentIrpStackLocation(pIrp); GetFullPathOfThisFilbObject(pFileObject);//这个功能怎么实现,请参阅Filemonitor中的相关源码。 if(FULLPATH(pFileObject)==*pRequiredProcess)//pRequiredProcess为全局指针,保存着用户设置的加密目录名。 { if(pIrp->MajorFunction==IRP_MJ_READ or related read) IoSetCompletionRoutine(pIrp,ReadCompleted,1,1,1); set the next layer stack location; IoCallDriver(pLowerDevice,pIrp); return STATUS_MORE_PROCESSING_REQUIRED; } ReadCompleted(...) { 此时文件已经读出,根据你对缓冲区使用方法的设置,文件内容存在于不同的位置,并且根据文件大小的不同,可能需要串行I/O的访问; PCHAR pContext=pIrp->AssociatedIrp->SystemBuffer; PCHAR pDecode= 解蜜(pContext); //这里需要你自己的算法 //需要注意的是,I/O 完成例程的IRQL一般为DISPATCH_LEVEL,不允许有分页内存,你可以选择使用一个DPC例程,这是更好的办法。我只是作一个示例,另外,还有几个相关的IRP,处理方法类似。 return; } Best regards ! |
|
|
5楼#
发布于:2002-04-04 09:51
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2002-04-04 16:37
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2002-04-04 20:19
You should can see the content of the specified file in the completion routine,but any completion routine run in the lower device\'s context,DISPATCH_LEVEL normally,so you should be careful enough to use memory.
|
|
|