fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
阅读:1127回复:3

无法获得driver的Handle,请大家指教

楼主#
更多 发布于:2007-01-14 23:17
  我用的是tooflat的sfilter,我现在需要控制它,用的是IRP_MJ_DIRECTORY_CONTROL。
只是现在我用的这个调用驱动的程序,无法获得driver的句柄,请问我有没有什么写错的方法呀?
 TCHAR completeDeviceName[]=_T("\\\\.\\Sfilter");
 hDevice = CreateFile( completeDeviceName,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL
                          );

每次hDevice 的值都是-1请问为什么呀,特别着急
驱网无线,快乐无限
fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-01-15 09:38
我在driver程序中,是象下面这样创建控制设配的,IoCreateSymbolicLink 也创建成功了,为什么我在调用时,用CreateFile像上一贴那样一获取控制设备的句柄,hDevice值是-1

    RtlInitUnicodeString(&NameString, L"\\FileSystem\\Filters\\SFilter");

    Status = IoCreateDevice(
        DriverObject,
        0,        
        &NameString,
        FILE_DEVICE_DISK_FILE_SYSTEM,
        FILE_DEVICE_SECURE_OPEN,
        FALSE,
        &gSFilterControlDeviceObject
        );
    if (Status == STATUS_OBJECT_PATH_NOT_FOUND)
    {
        
        RtlInitUnicodeString(&NameString, L"\\FileSystem\\SFilterCDO");

        Status = IoCreateDevice(
            DriverObject,
            0,                      
            &NameString,
            FILE_DEVICE_DISK_FILE_SYSTEM,
            FILE_DEVICE_SECURE_OPEN,
            FALSE,
            &gSFilterControlDeviceObject
            );
        if (!NT_SUCCESS(Status))
        {
            KdPrint(("SFilter!DriverEntry: Error creating control device object \"%wZ\", Status=%08x\n", &NameString, Status));
            ZwClose(&gRuleFileHandle);
            ExDeleteResourceLite(&gRulesResource);
            return Status;
        }
        
    }
    else if (!NT_SUCCESS(Status))
    {
        KdPrint(("SFilter!DriverEntry: Error creating control device object \"%wZ\", Status=%08x\n", &NameString, Status));
        ZwClose(&gRuleFileHandle);
        ExDeleteResourceLite(&gRulesResource);
        return Status;
    }

    RtlInitUnicodeString(&DosNameString, L"\\DosDevices\\Sfilter");
    Status = IoCreateSymbolicLink (&DosNameString, &NameString );
  if(!NT_SUCCESS(Status)) {

    KdPrint(("SFilter!DriverEntry: Error creating control dosdevice object \"%wZ\", Status=%08x\n", &DosNameString, Status));
        ZwClose(&gRuleFileHandle);
        ExDeleteResourceLite(&gRulesResource);
        return Status;      
  }
  KdPrint(("SFilter!DriverEntry: Createing SymbolicLink Success \"%wZ\", Status=%08x\n", &DosNameString, Status));
驱网无线,快乐无限
fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-01-15 11:35
各位大侠救命呀
驱网无线,快乐无限
fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-01-15 23:56
解决了,呵呵,问题不在上面粘的代码,而是将SfCreate的中的代码加以修改。原因是在CreateFile来取得句柄时,进入了SfCreate事件,它符合IS_MY_CONTROL_DEVICE_OBJECT条件,但是tooflat没打算自己控制什么,所以就让Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;了,所以每次返回的都是-1了,改成下面这样就成了。
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;
//        //完成了io的所有请求,并返回irp给io
//        IoCompleteRequest(Irp, IO_NO_INCREMENT);
//
//        return STATUS_INVALID_DEVICE_REQUEST;
            Status = Irp->IoStatus.Status;
            IoCompleteRequest(Irp, IO_NO_INCREMENT);
            return Status;
    }
驱网无线,快乐无限
游客

返回顶部