mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3389回复:12

调试过sfilter的路过请看

楼主#
更多 发布于:2011-03-09 08:42
请教大家一个问题,调试sfilter的时候是不是出现的错误一个接着一个?为什么我解决了一个错误,又紧接着会出现另一错误呢?不知道是环境没搭对还是sfilter本身的错误?大家调试的时候是什么情况呢?
qdm7681256
驱动牛犊
驱动牛犊
  • 注册日期2010-06-03
  • 最后登录2012-09-27
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-03-09 22:47
把错误贴上来看看,估计是环境配置不对。
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
板凳#
发布于:2011-03-10 14:39
用户被禁言,该主题自动屏蔽!
mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2011-03-10 16:06
好,把windbg里面错误的截图发上来,如下所示:

其中SfCreate函数的代码如下:
NTSTATUS
SfCreate(
    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;
    PFILE_OBJECT RelatedFileObject = FileObject->RelatedFileObject;
    PWSTR FileName = NULL;
    PFILE_CONTEXT FileCtxPtr = NULL;
    BOOLEAN DeleteOnClose = (BOOLEAN) (IrpSp->Parameters.Create.Options & FILE_DELETE_ON_CLOSE);
    BOOLEAN IsEncryptFlagExist = FALSE;
    BOOLEAN IsNeedEncrypt = FALSE;
    NTSTATUS Status = STATUS_SUCCESS;
    NTSTATUS LocalStatus = STATUS_SUCCESS;

    PAGED_CODE();

    //
    // If this is for our control device object, don't allow it to be opened.
    //
    if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
    {
        //
        // Sfilter doesn't allow for any communication through its control
        // device object, therefore it fails all requests to open a handle
        // to its control device object.
        //
        // See the FileSpy sample for an example of how to allow creates to
        // the filter's control device object and manage communication via
        // that handle.
        //
        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        return STATUS_INVALID_DEVICE_REQUEST;
    }

    ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

    //
    // We only care about volume filter device object
    //
    if (!DevExt->StorageStackDeviceObject)
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

    if (DevExt->DriveLetter == L'\0')
    {

        UNICODE_STRING DosName;

        Status = SfVolumeDeviceNameToDosName(&DevExt->DeviceName, &DosName);
        if (NT_SUCCESS(Status))
        {
          
            DevExt->DriveLetter = DosName.Buffer[0];
            ExFreePool(DosName.Buffer);
    
            if ((DevExt->DriveLetter >= L'a') && (DevExt->DriveLetter <= L'z'))
                DevExt->DriveLetter += L'A' - L'a';
            
        }
        else
            KdPrint(("sfilter!SfCreate: SfVolumeDeviceNameToDosName(%x) failed(%x)\n",
                DevExt->StorageStackDeviceObject, Status));
        
    }

    //
    // Open Volume Device directly
    //
    if ((FileObject->FileName.Length == 0) && !RelatedFileObject)
    {
      
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

#if DBG
    if (DevExt->DriveLetter != DEBUG_VOLUME)
    {
        
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }
#endif

    do
    {
        //
        // If the file is opened by id, then we can't get file name directly,
        // But if this case happened, the FsContext must be in GenericTable already.
        // So we just update the RefCount, that's enough
        //
        if (!(IrpSp->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID))
        {
      
            FileName = ExAllocateFromPagedLookasideList(&gFileNameLookAsideList);
            if (!FileName)
            {
                KdPrint(("sfilter!SfCreate: ExAllocatePoolWithTag failed\n"));

                Status = STATUS_INSUFFICIENT_RESOURCES;
                break;
            }

            if (!SfDissectFileName(DeviceObject, Irp, FileName))
            {
                KdPrint(("sfilter!SfCreate: SfDissectFileName failed\n"));
                
                Status = STATUS_INVALID_PARAMETER;
                break;
            }

            if (wcslen(FileName) >= SF_ENCRYPT_POSTFIX_LENGTH)
            {
                if (_wcsnicmp(&FileName[wcslen(FileName) - SF_ENCRYPT_POSTFIX_LENGTH],
                    SF_ENCRYPT_POSTFIX, SF_ENCRYPT_POSTFIX_LENGTH) == 0)
                {
                    //
                    // We deny all create request to our encrypt falg file except kernel mode
                    //
                    if (KernelMode == Irp->RequestorMode)
                    {
                        ExFreeToPagedLookasideList(&gFileNameLookAsideList, FileName);

                        IoSkipCurrentIrpStackLocation(Irp);
                        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
                    }
                    else
                    {
                        Status = STATUS_SUCCESS;
                        break;
                    }
                }
            }
        }
  
        FileCtxPtr = ExAllocatePoolWithTag(PagedPool, sizeof(FILE_CONTEXT), SFLT_POOL_TAG);
        if (FileCtxPtr == NULL)
        {
            Status = STATUS_INSUFFICIENT_RESOURCES;
            break;
        }

        Status = SfForwardIrpSyncronously(DevExt->AttachedToDeviceObject, Irp);
        if (NT_SUCCESS(Status) && (STATUS_REPARSE != Status) && SfIsObjectFile(FileObject))
        {
            PFILE_CONTEXT FileCtxPtr2 = NULL;
            BOOLEAN NewElement = FALSE;

            FileCtxPtr->FsContext = FileObject->FsContext;

            ExAcquireFastMutex(&DevExt->FsCtxTableMutex);

            FileCtxPtr2 = RtlLookupElementGenericTable(&DevExt->FsCtxTable, FileCtxPtr);
            if (FileCtxPtr2)
                ++FileCtxPtr2->RefCount;
            else
            {
                FileCtxPtr2 = RtlInsertElementGenericTable(
                    &DevExt->FsCtxTable,
                    FileCtxPtr,
                    sizeof(FILE_CONTEXT),
                    &NewElement
                    );

                FileCtxPtr2->RefCount = 1;

                ASSERT(FileName);
                wcscpy(FileCtxPtr2->Name, FileName);

                KeInitializeEvent(&FileCtxPtr2->Event, SynchronizationEvent, TRUE);
            }

            FileCtxPtr2->DeleteOnClose = DeleteOnClose;

            ExReleaseFastMutex(&DevExt->FsCtxTableMutex);

            IsEncryptFlagExist = FALSE;
            IsNeedEncrypt = FALSE;
            LocalStatus = STATUS_SUCCESS;

            KdPrint(("sfilter!SfCreate: FileName = %ws\n", FileCtxPtr2->Name));

            //
            // we need handle file synchronously
            //
            KeWaitForSingleObject(&FileCtxPtr2->Event, Executive, KernelMode, FALSE, NULL);
            
            LocalStatus = SfIsEncryptFlagExist(DeviceObject, FileCtxPtr2->Name, &IsEncryptFlagExist,
                FileCtxPtr2->EncryptExtData, sizeof(FileCtxPtr2->EncryptExtData));
            if (!NT_SUCCESS(LocalStatus))
                KdPrint(("sfilter!SfPostCreateWorker: SfIsEncryptFlagExist failed, return %x\n", LocalStatus));
            
            LocalStatus = SfIsFileNeedEncrypt(DeviceObject, FileCtxPtr2->Name, &IsNeedEncrypt);
            if (!NT_SUCCESS(LocalStatus))
                KdPrint(("sfilter!SfPostCreateWorker: SfIsFileNeedEncrypt failed, return %x\n", LocalStatus));
        
            FileCtxPtr2->EncryptFlagExist = IsEncryptFlagExist;
            FileCtxPtr2->NeedEncrypt = IsNeedEncrypt;

            KdPrint(("sfilter!SfCreate: IsEncryptFlagExist = %d, IsNeedEncrypt = %d, NewElement = %d\n",
                IsEncryptFlagExist, IsNeedEncrypt, NewElement));

            if (NewElement && ((!IsNeedEncrypt && IsEncryptFlagExist) || (IsNeedEncrypt && !IsEncryptFlagExist)))
            {
                if (!IsNeedEncrypt && IsEncryptFlagExist)
                {
                    if (NewElement)
                        FileCtxPtr2->DecryptOnRead = TRUE;

                    FileCtxPtr2->EncryptOnWrite = FALSE;
                    
                    KdPrint(("sfilter!SfPostCreateWorker: Decrypt %ws\n", FileCtxPtr2->Name));
                    LocalStatus = SfUpdateFileByFileObject(DeviceObject, FileObject);
                    if (NT_SUCCESS(LocalStatus))
                    {
                        FileCtxPtr2->DecryptOnRead = FALSE;
                        FileCtxPtr2->EncryptOnWrite = FALSE;
            
                        LocalStatus = SfSetFileEncrypted(DeviceObject, FileCtxPtr2->Name, FALSE, NULL, 0);
                        if (NT_SUCCESS(LocalStatus))
                            FileCtxPtr2->EncryptFlagExist = FALSE;
                        else
                            KdPrint(("sfilter!SfPostCreateWorker: SfSetFileEncrypted(%ws, FALSE) failed, return %x\n", FileCtxPtr2->Name, LocalStatus));
                    }
                    else
                    {
                        KdPrint(("sfilter!SfPostCreateWorker: SfUpdateFileByFileObject failed, return %x\n", LocalStatus));
            
                        FileCtxPtr2->DecryptOnRead = TRUE;
                        FileCtxPtr2->EncryptOnWrite = TRUE;
                    }
                }
                else
                {
                    if (NewElement)
                        FileCtxPtr2->DecryptOnRead = FALSE;

                    FileCtxPtr2->EncryptOnWrite = TRUE;

                    KdPrint(("sfilter!SfPostCreateWorker: Encrypt %ws\n", FileCtxPtr2->Name));
                    LocalStatus = SfUpdateFileByFileObject(DeviceObject, FileObject);
                    if (NT_SUCCESS(LocalStatus))
                    {
                        FileCtxPtr2->DecryptOnRead = TRUE;
                        FileCtxPtr2->EncryptOnWrite = TRUE;
            
                        LocalStatus = SfSetFileEncrypted(DeviceObject, FileCtxPtr2->Name, TRUE,
                            FileCtxPtr2->EncryptExtData, sizeof(FileCtxPtr2->EncryptExtData));
                        if (NT_SUCCESS(LocalStatus))
                            FileCtxPtr2->EncryptFlagExist = TRUE;
                        else
                            KdPrint(("sfilter!SfPostCreateWorker: SfSetFileEncrypted(%ws, TRUE) failed, return %x\n", FileCtxPtr2->Name, LocalStatus));
                    }
                    else
                    {
                        KdPrint(("sfilter!SfPostCreateWorker: SfUpdateFileByFileObject failed, return %x\n", LocalStatus));
            
                        FileCtxPtr2->DecryptOnRead = FALSE;
                        FileCtxPtr2->EncryptOnWrite = FALSE;
                    }                                            
                }
            }
            else
            {
                if (FileCtxPtr2->NeedEncrypt)
                {
                    FileCtxPtr2->DecryptOnRead = TRUE;
                    FileCtxPtr2->EncryptOnWrite = TRUE;

                    if (!FileCtxPtr2->EncryptFlagExist)
                    {
                        LocalStatus = SfSetFileEncrypted(DeviceObject, FileCtxPtr2->Name, TRUE,
                            FileCtxPtr2->EncryptExtData, sizeof(FileCtxPtr2->EncryptExtData));
                        if (NT_SUCCESS(LocalStatus))
                            FileCtxPtr2->EncryptFlagExist = TRUE;
                        else
                            KdPrint(("sfilter!SfPostCreateWorker: SfSetFileEncrypted(%ws, TRUE) failed, return %x\n", FileCtxPtr2->Name, LocalStatus));
                    }                    
                }
                else
                {
                    FileCtxPtr2->DecryptOnRead = FALSE;
                    FileCtxPtr2->EncryptOnWrite = FALSE;

                    if (FileCtxPtr2->EncryptFlagExist)
                    {
                        LocalStatus = SfSetFileEncrypted(DeviceObject, FileCtxPtr2->Name, FALSE,
                            NULL, 0);
                        if (NT_SUCCESS(LocalStatus))
                            FileCtxPtr2->EncryptFlagExist = FALSE;
                        else
                            KdPrint(("sfilter!SfPostCreateWorker: SfSetFileEncrypted(%ws, TRUE) failed, return %x\n", FileCtxPtr2->Name, LocalStatus));
                    }                    
                }
            }
            
            KeSetEvent(&FileCtxPtr2->Event, IO_NO_INCREMENT, FALSE);
        }
    } while (FALSE);

    if (FileName)
        ExFreeToPagedLookasideList(&gFileNameLookAsideList, FileName);

    if (FileCtxPtr)
        ExFreePool(FileCtxPtr);

    Irp->IoStatus.Status = Status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    return Status;
}

mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2011-03-10 16:08
SfCreate函数的代码有点长,本人菜鸟一个,看不懂什么意思。。。
catface
驱动小牛
驱动小牛
  • 注册日期2009-01-11
  • 最后登录2014-03-09
  • 粉丝1
  • 关注1
  • 积分155分
  • 威望1341点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分2分
5楼#
发布于:2011-03-10 21:58
网络有楚狂人的文件驱动PDF版本 也可以看看寒江独钓  对SFILTER调试原理讲的很清楚了
mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2011-03-11 10:52
回 5楼(catface) 的帖子
原理是清楚,代码没看懂。。。调试总是有问题
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
7楼#
发布于:2011-03-11 16:57
用户被禁言,该主题自动屏蔽!
mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2011-03-13 20:57
回 7楼(wanghui219) 的帖子
是的,不知道调试怎么会有这个错误?
molige
驱动牛犊
驱动牛犊
  • 注册日期2010-12-02
  • 最后登录2011-08-15
  • 粉丝0
  • 关注1
  • 积分66分
  • 威望171点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2011-03-16 14:25
还是从ifs例子调试开始吧,不然寸步难行。我也是刚刚学
mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2011-03-16 14:55
回 9楼(molige) 的帖子
对,现在就是有种寸步难行的感觉
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
11楼#
发布于:2011-03-19 11:16
So what is the device name when this error occurred?

Probably you encountered a device without DOS name or more precisely a device without symbolic link.
mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2011-03-20 08:37
回 11楼(michaelgz) 的帖子
嚯!O(∩_∩)O谢谢,句子差点没读懂。。嘿嘿
游客

返回顶部