focusbh99
驱动牛犊
驱动牛犊
  • 注册日期2007-07-04
  • 最后登录2010-01-25
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望68点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
阅读:1780回复:5

tooflat的那段经典代码----文件透明加解密中一处的疑或:

楼主#
更多 发布于:2007-12-20 10:47
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;
}

最新喜欢:

linshierlinshi...
focusbh99
驱动牛犊
驱动牛犊
  • 注册日期2007-07-04
  • 最后登录2010-01-25
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望68点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-12-22 14:47
代码下的很多,看过的没有,看来只好自己研究了。tooflat能给解释下就好了。
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-12-24 14:04
貌似是应该加上
amazingzyx
驱动牛犊
驱动牛犊
  • 注册日期2009-03-06
  • 最后登录2010-01-19
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望181点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-10-02 22:14
看了很长时间tooflat的代码,佩服至极。
下面想说下我的理解和疑问(请多多批评指正):
tooflat关于文件透明加解密的过滤驱动主要是通过一个xefs.dat规则文件设置对某些文件进行过滤。
且设置了一些布尔值(如IsEncryptFlagExist等)来表明文件是否已经存在加密标志、是否应该加密、是否应读时解密、是否应写时加密 等等。
在SfCreate、SfRead、SfWrite等函数中设置并检查相关标志位,以及进行相关操作。

不知以上我的大致理解对不对,请tooflat等各位大牛多多指教!
另外,为什么我运行了驱动(net start sfilter)之后,新建我指定的要过滤的文件时,却出现“访问被拒绝”这样的提示??

还有,想问您一个非常非常菜鸟的问题:这个过滤驱动是否适应于各个文件系统(NTFS、FAT32)??

热切的期盼大牛们的回复,尤其是tooflat,如果有一份可运行的代码,能否发给我,让我系统的研究一下您的代码?非常感谢
我的邮箱:amazingzyx@163.com
skymelai
驱动牛犊
驱动牛犊
  • 注册日期2007-08-10
  • 最后登录2010-01-29
  • 粉丝1
  • 关注0
  • 积分81分
  • 威望711点
  • 贡献值3点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-10-09 13:51
ooflat的代码在哪儿下载呢????
skymelai
驱动牛犊
驱动牛犊
  • 注册日期2007-08-10
  • 最后登录2010-01-29
  • 粉丝1
  • 关注0
  • 积分81分
  • 威望711点
  • 贡献值3点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-10-09 13:53
tooflat的代码在哪儿下载呢????
游客

返回顶部