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

急!!!大侠救命,用CreateFile获得设备句柄的问题

楼主#
更多 发布于:2007-01-15 16:24
  我用的是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请问为什么呀

driver的代码如下
    RtlInitUnicodeString(&NameString, L"\\Device\\SFilter");
    Status = IoCreateDevice(
        DriverObject,
        0,                      // has no device extension
        &NameString,
        FILE_DEVICE_DISK_FILE_SYSTEM,
        0,
        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;
    }
    
    RtlInitUnicodeString(&DosNameString, L"\\DosDevices\\SFilter");
    
    Status = IoCreateSymbolicLink (&DosNameString, &NameString );
  if(!NT_SUCCESS(Status)) {

    KdPrint(("SFilter!DriverEntry: Error creating control dosdevice object"));
        ZwClose(&gRuleFileHandle);
        ExDeleteResourceLite(&gRulesResource);
        return Status;      
  }
  KdPrint(("SFilter!DriverEntry: Createing SymbolicLink Success333333333"));
驱网无线,快乐无限
fatmouse527
驱动牛犊
驱动牛犊
  • 注册日期2006-12-27
  • 最后登录2009-04-10
  • 粉丝1
  • 关注0
  • 积分347分
  • 威望85点
  • 贡献值0点
  • 好评度81点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-01-15 23:55
解决了,呵呵,问题不在上面粘的代码,而是将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;
    }
驱网无线,快乐无限
游客

返回顶部