(wdm.h) IoRegisterPlugPlayNotification 函式
IoRegisterPlugPlayNotification 例程會在發生指定類別的 PnP 事件時,註冊要呼叫的 隨插即用 (PnP) 通知回呼例程。
語法
NTSTATUS IoRegisterPlugPlayNotification(
[in] IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
[in] ULONG EventCategoryFlags,
[in, optional] PVOID EventCategoryData,
[in] PDRIVER_OBJECT DriverObject,
[in] PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
[in, optional] __drv_aliasesMem PVOID Context,
[out] PVOID *NotificationEntry
);
參數
[in] EventCategory
指定 來自 IO_NOTIFICATION_EVENT_CATEGORY 的列舉值,指出正在登錄回呼例程的 PnP 事件類別。
[in] EventCategoryFlags
標幟修改註冊作業的位。 可能的值包括:
PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES
只有 EventCategoryDeviceInterfaceChange 的 EventCategory 才有效。 如果設定,PnP 管理員會針對目前已註冊且作用中的每個裝置介面實例呼叫驅動程式回呼例程,並註冊回呼例程,以供未來抵達或移除裝置介面實例。
[in, optional] EventCategoryData
有關要註冊 CallbackRoutine 之事件之進一步資訊的指標。 不同 EventCategory 值的資訊會有所不同:
當 EventCategory 為 EventCategoryDeviceInterfaceChange 時, EventCategoryData 必須指向指定裝置介面類別的 GUID。 當啟用或移除該類別的介面時,將會呼叫 CallbackRoutine。
當 EventCategory 為 EventCategoryHardwareProfileChange 時, EventCategoryData 必須是 NULL。
當 EventCategory 是 EventCategoryTargetDeviceChange 時, EventCategoryData 必須指向要求 PnP 通知的檔案物件。
[in] DriverObject
呼叫端驅動程式物件的指標。
為了確保驅動程式在註冊 PnP 通知時仍保持載入狀態,此呼叫會遞增 DriverObject 上的參考計數。 拿掉此註冊時,PnP 管理員會遞減參考計數。
對於 EventCategoryTargetDeviceChange,DriverObject 不得為目標裝置的驅動程序物件; 相反地,它應該是實作 CallbackRoutine 之驅動程式的驅動程序物件。
[in] CallbackRoutine
當指定的 PnP 事件發生時,要呼叫之 PnP 通知回呼例程的指標。
此回呼例程的函式原型定義如下:
typedef NTSTATUS
DRIVER_NOTIFICATION_CALLBACK_ROUTINE(
_In_ PVOID NotificationStructure,
_Inout_opt_ PVOID Context
);
回呼例程的 NotificationStructure 專屬於 EventCategory 值,如下表所示。
事件類別目錄 | 通知結構 |
---|---|
EventCategoryDeviceInterfaceChange | DEVICE_INTERFACE_CHANGE_NOTIFICATION |
EventCategoryHardwareProfileChange | HWPROFILE_CHANGE_NOTIFICATION |
EventCategoryTargetDeviceChange | TARGET_DEVICE_REMOVAL_NOTIFICATION 如需詳細資訊,請參閱 使用 PnP 通知 和 TARGET_DEVICE_CUSTOM_NOTIFICATION。 |
回呼例程的 Context 參數包含註冊期間驅動程式提供的內容數據。
如需包含符合 靜態驅動程序驗證程式 (SDV) 需求的回呼例程函式宣告的相關信息,請參閱範例。
PnP 管理員會在 IRQL = PASSIVE_LEVEL呼叫驅動程式回呼例程。
[in, optional] Context
呼叫端配置的緩衝區指標,其中包含 PnP 管理員傳遞給回呼例程的內容。
[out] NotificationEntry
這個呼叫所傳回之不透明值的指標,可識別註冊。 將此值傳遞至 IoUnregisterPlugPlayNotificationEx 例程以移除註冊。
傳回值
IoRegisterPlugPlayNotification 會傳回STATUS_SUCCESS或適當的錯誤狀態。
備註
驅動程式會註冊事件類別目錄。 每個類別都包含一或多個 PnP 事件類型。
驅動程式可以針對不同的事件類別註冊不同的回呼例程,也可以註冊單一回呼例程。 單一回呼例程可以將 NotificationStructure 轉換成 PLUGPLAY_NOTIFICATION_HEADER ,並使用 [事件 ] 字段來判斷通知結構的確切類型。
如果呼叫端指定PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,操作系統可能會針對現有介面的單一 EventCategoryDeviceInterfaceChange 事件呼叫 PnP 通知回呼例程兩次。 您可以放心地忽略回呼的第二次呼叫。 操作系統不會針對單一事件呼叫回呼兩次以上。
PnP 通知回呼例程應該儘快完成其工作,並將控制權傳回給 PnP 管理員,以避免延遲通知已註冊事件的其他驅動程式和應用程式。
當驅動程式註冊 EventCategoryTargetDeviceChange 事件的通知時,PnP 管理員不會取出檔案對象的參考。 如果驅動程式的 PnP 通知回呼例程需要存取檔案對象,驅動程式應該先在檔案物件上取出額外的參考,再呼叫 IoRegisterPlugPlayNotification。
一般而言,Kernel-Mode Driver Framework (KMDF) 驅動程式應該從其 EvtDeviceSelfManagedIoInit 回呼函式呼叫 IoRegisterPlugPlayNotification,而且應該從其 EvtDeviceSelfManagedIoCleanup 回呼函式呼叫 IoUnregisterPlugPlayNotification。 這些驅動程式不應該從其 EvtDriverDeviceAdd 回呼函式呼叫 IoRegisterPlugPlayNotification;否則,PnP 通知回呼例程可能會在 PnP 啟動驅動程式堆疊之前呼叫,在此情況下,驅動程式將不會準備好處理通知。
如需詳細資訊,請參閱 使用 PnP 通知。
範例
若要定義 PnP 通知回呼例程,您必須先提供函式宣告來識別您要定義的回呼例程類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析、 靜態驅動程式驗證器 (SDV) ,以及其他驗證工具尋找錯誤,而且這是撰寫 Windows 操作系統驅動程式的需求。
例如,若要定義名為 MyCallbackRoutine
的 PnP 通知回呼例程,請使用DRIVER_NOTIFICATION_CALLBACK_ROUTINE類型,如下列程式代碼範例所示:
DRIVER_NOTIFICATION_CALLBACK_ROUTINE MyCallbackRoutine;
然後,實作回呼例程,如下所示:
_Use_decl_annotations_
NTSTATUS
MyCallbackRoutine(
PVOID NotificationStructure,
PVOID Context
)
{
// Function body
}
DRIVER_NOTIFICATION_CALLBACK_ROUTINE函式類型定義於 Wdm.h 頭檔中。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 Use_decl_annotations 批註新增至函式定義。 Use_decl_annotations批註可確保使用頭檔中套用至DRIVER_NOTIFICATION_CALLBACK_ROUTINE函式類型的註釋。 如需函數宣告需求的詳細資訊,請參閱 使用WDM驅動程式的函式角色類型來宣告函式。 如需 的相關信息 _Use_decl_annotations_
,請參閱 標註函式行為。
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIS (storport) 、 MarkPower (wdm) 、MarkPowerDown (wdm) 、 MarkQueryRelations (wdm ) 、 MarkStartDevice (wdm) 、 PowerIrpDDis (wdm) |
另請參閱
DEVICE_INTERFACE_CHANGE_NOTIFICATION
IoUnregisterPlugPlayNotification
IoUnregisterPlugPlayNotificationEx