设备的打开与关闭

如果打开不能成功,则通信无法实现。要打开成功,只需要简单的返回成功就可以了。在一些有同步限制的驱动中(比如每次只允许一个进程打开设备)编程要更加复杂一点。但是现在忽略这些问题。暂时认为我们生成的设备任何进程都可以随时打开,不需要担心和其他进程冲突的问题。

简单的返回一个IRP成功(或者直接失败)是三部曲,如下:

  1. 设置irp->IoStatus.Information为0。关于Information的描述,请联系前面关于IO_STATUS_BLOCK结构的解释。
  2. 设置irp->IoStatus.Status的状态。如果成功则设置STATUS_SUCCESS,否则设置错误码。
  3. 调用IoCompleteRequest (irp,IO_NO_INCREMENT)。这个函数完成IRP。

以上三步完成后,直接返回irp->IoStatus.Status即可。示例代码如下。这个函数能完成打开和关闭请求。

    NTSTATUS
    MyCreateClose(
        IN PDEVICE_OBJECT device,
        IN PIRP           irp)
    {
        irp->IoStatus.Information = 0;
        irp->IoStatus.Status = STATUS_SUCCESS;
           IoCompleteRequest (irp,IO_NO_INCREMENT);
        return irp->IoStatus.Status;
    }

当然,在前面设置分发函数的时候,应该加上:

    DriverObject->MajorFunctions[IRP_MJ_CREATE] = MyCreateClose;    
    DriverObject->MajorFunctions[IRP_MJ_CLOSE] = MyCreateClose;

在应用层,打开和关闭这个设备的代码如下:

    HANDLE device=CreateFile("\\\\.\\MyCDOSL",
        GENERIC_READ|GENERIC_WRITE,0,0,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_SYSTEM,0);
if (device == INVALID_HANDLE_VALUE)
{
    // …. 打开失败,说明驱动没加载,报错即可
}

// 关闭
CloseHandle(device);
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!