阅读:1780回复:5
tooflat的那段经典代码----文件透明加解密中一处的疑或:
NTSTATUS
SfDirectoryControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension; PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); PFILE_OBJECT FileObject = IrpSp->FileObject; NTSTATUS Status = STATUS_SUCCESS; PFILE_BOTH_DIR_INFORMATION DirInfo = NULL; PFILE_BOTH_DIR_INFORMATION PreDirInfo = NULL; ULONG Length = 0; ULONG NewLength = 0; ULONG Offset = 0; ULONG CurPos = 0; // // We only care about volume filter device object // if (!DevExt->StorageStackDeviceObject) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->AttachedToDeviceObject, Irp); } //中间略。。。。。。。。。。。。 while (TRUE) { if (!NT_SUCCESS(Status)) break; Length = IrpSp->Parameters.QueryDirectory.Length; NewLength = Length; CurPos = 0; DirInfo = (PFILE_BOTH_DIR_INFORMATION) Irp->UserBuffer; PreDirInfo = DirInfo; // // There is no entry, so just complete the request // if (Length == 0) break; // // Sanity check // if ((!DirInfo) || (DirInfo->NextEntryOffset > Length)) break; do { Offset = DirInfo->NextEntryOffset; if ((DirInfo->FileNameLength > SF_ENCRYPT_POSTFIX_LENGTH * sizeof(WCHAR)) && (_wcsnicmp(&DirInfo->FileName[DirInfo->FileNameLength / sizeof(WCHAR) - SF_ENCRYPT_POSTFIX_LENGTH], SF_ENCRYPT_POSTFIX, SF_ENCRYPT_POSTFIX_LENGTH) == 0)) { if (0 == Offset) // the last one { PreDirInfo->NextEntryOffset = 0; NewLength = CurPos; } else { if (PreDirInfo != DirInfo) { PreDirInfo->NextEntryOffset += DirInfo->NextEntryOffset; DirInfo = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) DirInfo + Offset); //此处是不是应该加一句: CurPos += Offset; //原因:当不等时,是通过修改前一项的偏移来过滤当前项, // buffer没有减少, 当前位置应该加一个偏移。 //请请大家给点意见, 及tooflat本人赐教 } else { RtlMoveMemory((PUCHAR) DirInfo,(PUCHAR) DirInfo + Offset, Length - CurPos - Offset); NewLength -= Offset; } } } else { CurPos += Offset; PreDirInfo = DirInfo; DirInfo = (PFILE_BOTH_DIR_INFORMATION) ((PUCHAR) DirInfo + Offset); } } while (0 != Offset); if (0 == NewLength) // All entry is filtered { Status = SfForwardIrpSyncronously(DevExt->AttachedToDeviceObject, Irp); // // If no entry returned, just complete the request, // else we must continue to filter // if (0 == Irp->IoStatus.Information) break; } else { Irp->IoStatus.Information = NewLength; break; } // continue to filter } IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } |
|
最新喜欢:linshi... |
沙发#
发布于:2007-12-22 14:47
代码下的很多,看过的没有,看来只好自己研究了。tooflat能给解释下就好了。
|
|
板凳#
发布于:2007-12-24 14:04
貌似是应该加上
|
|
地板#
发布于:2009-10-02 22:14
看了很长时间tooflat的代码,佩服至极。
下面想说下我的理解和疑问(请多多批评指正): tooflat关于文件透明加解密的过滤驱动主要是通过一个xefs.dat规则文件设置对某些文件进行过滤。 且设置了一些布尔值(如IsEncryptFlagExist等)来表明文件是否已经存在加密标志、是否应该加密、是否应读时解密、是否应写时加密 等等。 在SfCreate、SfRead、SfWrite等函数中设置并检查相关标志位,以及进行相关操作。 不知以上我的大致理解对不对,请tooflat等各位大牛多多指教! 另外,为什么我运行了驱动(net start sfilter)之后,新建我指定的要过滤的文件时,却出现“访问被拒绝”这样的提示?? 还有,想问您一个非常非常菜鸟的问题:这个过滤驱动是否适应于各个文件系统(NTFS、FAT32)?? 热切的期盼大牛们的回复,尤其是tooflat,如果有一份可运行的代码,能否发给我,让我系统的研究一下您的代码?非常感谢 我的邮箱:amazingzyx@163.com |
|
地下室#
发布于:2009-10-09 13:51
ooflat的代码在哪儿下载呢????
|
|
5楼#
发布于:2009-10-09 13:53
tooflat的代码在哪儿下载呢????
|
|