eate和Open文件的Create和Open可以通过发送IRP_MJ_CREATE给FSD
或者调用IoCreateFile函数来完成
Create和Open的区别实际上在于IoCreateFileIRP_MJ_CREATE的一个参数Disposition的取值
通过发送IRP_MJ_CREATE给FSD的方法与此类似
可以参考IFSDDKdocument的IRP_MJ_CREATE说明
不同于上面方法的是需要自己创建一个FILE_OBJECT
好于上面方法的是这种方法不需要一个HANDLE
HANDLE是线程依赖的,FileObject则是线程无关
文件的Read和Write我们通过给FSD发送IRP_MJ_READ来读取文件
给FSD发送IRP_MJ_WRITE来改写文件
如果我们是通过一个HANDLE来执行如使用IoCreateFile打开的文件)
就要先用ObReferenceObjectByHandle函数来获得这个Handle对应的FileObject
我们只能给FileObject发送IRP
之后我们使用IoAllocateIrp分配一个IRP
根据FileObject>
DeviceObject>
Flags的值
我们判断目标文件系统使用什么样的IO方式
对每种不同的IO方式使用不同的地址传递方式
随后我们填充IRP内win7 64纯净版下载的各个参数域
就可以发送IRP了
接着要考虑如果IRP不能及时完成
会异步的返回的情况
我们安装一个CompletionRoutine
在CompletionRoutine里面设置一个事件为已激活
通知我们的主线程读取或者写入操作已经完成
现在可以发送IRP了
如果不采取特殊的措施的话
IRP发送目标是FileObject对应的DeviceObject
发送后
等待IRP的完成并且释放资源
返回
文件的DeleteDelete实际上是通过向FSD发送IRP_MJ_SET_INFORMATION的IRP
并把IrpSp>
ParametersSetFileFileInformationClass设置为FileDispositionInformation
用一个FILE_DISPOSITION_INFORMATION结构填充buffer来执行的
文件的Rename类似于Delete
Rename是向FSD发送IRP_MJ_SET_INFORMATION的IRP
把IrpSp>
ParametersSetFileFileInformationClass设置为FileRenameInformation
填充buffer为FILE_RENAME_INFORMATION结构
综上
于是我们可以在驱动里面通过发送IRP来直接访问文件系统了