wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
阅读:1009回复:2

tooflat文件系统驱动学习..问题来拉

楼主#
更多 发布于:2007-05-31 17:23
由于工作的需要,刚刚学习文件系统驱动,买了<文件系统内幕>(此站的),觉得楚狂人教程不错,就开始学习他的,同时借鉴了tooflat的代码,可是刚刚开始就出现无数次的蓝屏啊,
就下面的代码问题:
1.    我争取在sfread涵数中添加我对文件数据操作的代码,不在sfreadcomplete中,所以用拉楚老大的waitforobject的代码段(书上写的),取不到文件的信息??
NTSTATUS
SfRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
    PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS Status = STATUS_SUCCESS;
    
    PAGED_CODE();

    ASSERT(IrpSp);

    ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject));
    ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));

    if (!DevExt->StorageStackDeviceObject)
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

    
    if ((Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

    {
        //test
        KEVENT waitEvent;
        UNICODE_STRING    filename;
        UNICODE_STRING    tempstr;
        //RtlCopyUnicodeString(&filename, &IrpSp->FileObject->FileName);
        filename = IrpSp->FileObject->FileName;
        RtlInitUnicodeString( &tempstr, L"\\test11.txt" );
        KdPrint(("sfilter!SfRead: tempstr: 0[%ws]", tempstr.Buffer));
        //KdPrint(("sfilter!SfRead: filename: 1[%ws]", filename.Buffer));
        
        if(!RtlCompareUnicodeString(&filename, &tempstr, 0))
        {
    
            KeInitializeEvent(
                &waitEvent,
                NotificationEvent,
                FALSE);
            IoCopyCurrentIrpStackLocationToNext(Irp);
            IoSetCompletionRoutine(
                Irp,
                SfReadCompletion,
                &waitEvent,
                TRUE,
                TRUE,
                TRUE);
            Status = IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
            if(STATUS_PENDING == Status)
            {
                Status = KeWaitForSingleObject(
                    &waitEvent,
                    Executive,
                    KernelMode,
                    FALSE,
                    NULL);
                ASSERT(STATUS_PENDING == Status);
                if(Irp->MdlAddress == NULL)
                {
                    KdPrint(("sfilter!SfRead: filename: !!!![%ws], rd offset: [%u], rd.length: [%u],wt.offset: [%u], wt.length: [%u]\n"
                        , IrpSp->FileObject->FileName.Buffer
                        , IrpSp->Parameters.Read.ByteOffset.QuadPart
                        , IrpSp->Parameters.Read.Length
                        , IrpSp->Parameters.Write.ByteOffset.QuadPart
                        , IrpSp->Parameters.Write.Length));
                }
            }
        }
    }
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
    
}
NTSTATUS
SfReadCompletion(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
{
    //PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = (PREAD_WRITE_COMPLETION_CONTEXT) Context;

    UNREFERENCED_PARAMETER(DeviceObject);
    UNREFERENCED_PARAMETER(Irp);
    ASSERT(Context != NULL);
    KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
    //return STATUS_MORE_PROCESSING_REQUIRED ;
    return STATUS_SUCCESS;
}
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-31 17:26
还有:
if (DevExt->DriveLetter != DEBUG_VOLUME)
我将DEBUG_VOLUME设置成 L"D",然后在D盘上操作,为什么没等过.
wengzuhong
驱动小牛
驱动小牛
  • 注册日期2004-07-16
  • 最后登录2014-10-22
  • 粉丝3
  • 关注1
  • 积分9分
  • 威望262点
  • 贡献值0点
  • 好评度219点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-01 10:59
没人啊?tooflat/devia/znsoft人呢? 支持一下啊
游客

返回顶部