阅读:2662回复:5
为什么minifilter过滤读写时文件长度和偏移和FileMon抓出来的不同?
我用minifilter做了个监视文件读写的驱动,在 IRP_MJ_READ 的回调中,
FLT_PREOP_CALLBACK_STATUS TMDSYSPreRead ( __inout PFLT_CALLBACK_DATA Data, __in PCFLT_RELATED_OBJECTS FltObjects, __deref_out_opt PVOID *CompletionContext) { ULONG nLength = Data->Iopb->Parameters.Read.Length; LONGLONG nOffset = Data->Iopb->Parameters.Read.ByteOffset.QuadPart; if (FLT_IS_FASTIO_OPERATION(Data) ) { return FLT_PREOP_DISALLOW_FASTIO; } DbgPrint("Offset: %I64d Length: %d\n", nOffset , nLength); return FLT_PREOP_SUCCESS_NO_CALLBACK; } 在这里获取的读取文件的偏移量和长度, 打印出来的结果,和FileMon中抓出来的不同。 为什么会这样呢? 各位知道原因的,请教教我啊,谢谢! |
|
|
沙发#
发布于:2012-09-08 23:44
filemapping 之类的 page io会导致读取的长度是按页对齐的。不知道是不是这个?
|
|
|
板凳#
发布于:2012-09-09 10:08
感谢老大回复!
Data->Iopb->Parameters.Read.Length; 获取到的长度,的确大部分是按页对齐的,但是也有部分是没有按页对齐。 而且在定义FLT_OPERATION_REGISTRATION回调的时候加上如下标志 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO 获取到的长度还是不对,和FileMon都不同。 |
|
|
地板#
发布于:2012-09-10 12:08
继续等待,各位大侠救救小弟吧
|
|
|
地下室#
发布于:2012-09-11 00:30
去掉FLT_IS_FASTIO_OPERATION的判断再看看
|
|
|
5楼#
发布于:2012-09-14 19:57
感谢楼上的。
我最开始就没加 FLT_IS_FASTIO_OPERATION 判断, 但是所获取到的偏移和长度还是和FileMon相差很大啊。 |
|
|