总线驱动程序如何捕获到相关设备插入拔出事件

总线驱动程序如果想捕获到相关设备插入拔出事件,可以在其IRP_MN_START_DEVICE结束处用IoRegisterPlugPlayNotification注册一回调函数。

IoRegisterPlugPlayNotification原型如下:

NTSTATUS 
  IoRegisterPlugPlayNotification(
    IN IO_NOTIFICATION_EVENT_CATEGORY  EventCategory,
    IN ULONG  EventCategoryFlags,
    IN PVOID  EventCategoryData  OPTIONAL,
    IN PDRIVER_OBJECT  DriverObject,
    IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE  CallbackRoutine,
    IN PVOID  Context,
    OUT PVOID  *NotificationEntry
    );

各个参数的细节可以参考MSDN。

 

比如我想在驱动中得知硬盘插入拔出的事件,那么我可以如下使用:

IoRegisterPlugPlayNotification(
   EventCategoryDeviceInterfaceChange,
   PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
   (PVOID)(&GUID_DEVINTERFACE_DISK),
   DeviceData->pDriverObject,
   (PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)DriverDevInterxNotifyCallBack,
   (PVOID)DeviceData,
   &NotificationEntry);

 

上面的DriverDevInterxNotifyCallBack在收硬盘在插入和拔出时会被调用。

此回调函数的原型如下:

typedef NTSTATUS (*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE) (
    IN PVOID NotificationStructure,
    IN PVOID Context
    );

 

 

这里需要注意一点,就是IoRegisterPlugPlayNotification的最后一个参数,它需要的是一个地址,此地址指向的内存不用自己分配,但需要自己释放。

 

例子中NotificationEntry的定义如下:

PVOID  NotificationEntry = NULL;

然后就直接调用。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

danxuezx

如果对你有用是我的快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值