wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2007-07-16 15:53
先谢过,我去试试
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2007-07-16 16:55
shakesky 兄,IoBuildSynchronousFsdRequest在上面代码的判断之后调用???
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2007-07-16 16:57
结果死机啊,黑屏啊
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2007-07-16 16:59
shakesky 兄,能不能将你的这段代码贴全拉??
小弟再次谢了
shakesky
驱动牛犊
驱动牛犊
  • 注册日期2006-03-16
  • 最后登录2011-06-25
  • 粉丝0
  • 关注0
  • 积分581分
  • 威望69点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2007-07-23 11:29
不好意思,好久没来了
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;
    NTSTATUS Status = STATUS_SUCCESS;
    POST_CREATE_WORKER_CONTEXT WorkerCtx;

    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);
    }

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


    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;
            }

            else
            {
                if (IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)
                {
                    //
                    // We don't care about directories
                    //
                    ExFreeToPagedLookasideList(&gFileNameLookAsideList, FileName);

                    IoSkipCurrentIrpStackLocation(Irp);
                    return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
                }
            }
        }
        else
        {
            if (IrpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE)
            {
                //
                // We don't care about directories
                //
                IoSkipCurrentIrpStackLocation(Irp);
                return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
            }
        }
        if(wcscmp(FileName,L"C:\\test\\cccc.txt")==0)
        {
            KdPrint(("open:%x,%ws\n",IrpSp->Parameters.Create.SecurityContext->DesiredAccess,
                FileName));
        }
        if(wcscmp(FileName,L"C:\\test\\test.txt")==0)
        {
            KdPrint(("open:%x,%ws\n",IrpSp->Parameters.Create.SecurityContext->DesiredAccess,
                FileName));
        }
        
        Status = SfForwardIrpSyncronously(DevExt->AttachedToDeviceObject, Irp);
        if (NT_SUCCESS(Status) && (STATUS_REPARSE != Status))
        {
            FILE_CONTEXT FileCtx;
            PFILE_CONTEXT FileCtxPtr = NULL;
            BOOLEAN NewElement = FALSE;
            
            if(!SfIsObjectFile(FileObject))
                break;
            
            FileCtx.FsContext = FileObject->FsContext;
            if ((IrpSp->Parameters.Create.SecurityContext->DesiredAccess
            == FILE_READ_ATTRIBUTES) ) //FILE_READ_DATA
                break;
            ExAcquireFastMutex(&DevExt->FsCtxTableMutex);

            FileCtxPtr = RtlLookupElementGenericTable(&DevExt->FsCtxTable, &FileCtx);
            if (FileCtxPtr)
            {
                ++FileCtxPtr->RefCount;
                ExReleaseFastMutex(&DevExt->FsCtxTableMutex);
                break;
            }
            else
            {
                FileCtxPtr = RtlInsertElementGenericTable(
                    &DevExt->FsCtxTable,
                    &FileCtx,
                    sizeof(FILE_CONTEXT),
                    &NewElement
                    );

                FileCtxPtr->RefCount = 1;

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

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

            ExReleaseFastMutex(&DevExt->FsCtxTableMutex);
            //KdPrint(("open:%x,%ws\n",IrpSp->Parameters.Create.SecurityContext->DesiredAccess,
            //    FileName));
    
            ExInitializeWorkItem(&WorkerCtx.WorkItem, SfIsEncryptFlagExist, &WorkerCtx);
            WorkerCtx.DeviceObject = ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject;
            WorkerCtx.FileObject = FileObject;
            KeInitializeEvent(&WorkerCtx.Event, NotificationEvent, FALSE);
            WorkerCtx.FileContext = FileCtxPtr;
            //WorkerCtx.NewElement = NewElement;
                
            if (KeGetCurrentIrql() == PASSIVE_LEVEL)
                SfIsEncryptFlagExist(&WorkerCtx);
            else
            {
                ExQueueWorkItem(&WorkerCtx.WorkItem, DelayedWorkQueue);
                KeWaitForSingleObject(&WorkerCtx.Event, Executive, KernelMode, FALSE, NULL);
            }
        }
    } while (FALSE);

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

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

    return Status;
}
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2007-07-23 12:34
能读出标识了,但问题又来了
打开文件时,出现标识不显示了(正确),可是总是在文件的末尾加了几个“空格”(长度=标识的长度)
为什么,shakesky 兄,你遇到过了吗?
shakesky
驱动牛犊
驱动牛犊
  • 注册日期2006-03-16
  • 最后登录2011-06-25
  • 粉丝0
  • 关注0
  • 积分581分
  • 威望69点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2007-07-24 10:38
没留意看看
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2007-07-24 11:19
一起努力
yandong_8212
驱动小牛
驱动小牛
  • 注册日期2006-07-28
  • 最后登录2011-02-11
  • 粉丝0
  • 关注0
  • 积分1046分
  • 威望464点
  • 贡献值1点
  • 好评度173点
  • 原创分0分
  • 专家分1分
28楼#
发布于:2007-07-24 21:48
OSR有篇关于用WINDBG从FILE_OBJECT得到文件类容的文章,具体地址忘了.
商务MSN:YanDong_8212@163.com
上一页 下一页
游客

返回顶部