註冊非同步驅動程式通知
若要使用非同步驅動程式通知,設備磁碟機會實作作業系統在動態將處理器或記憶體模組新增至硬體磁碟分割時所呼叫的回呼函式。 下列程式碼範例顯示這類回呼函式的原型:
// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
設備磁碟機會藉由呼叫 IoRegisterPlugPlayNotification 函式來註冊非同步通知,針對每個設備磁碟機的回呼函式一次,針對 EventCategoryData 參數指定下列其中一個 GUID 的指標:
GUID_DEVICE_PROCESSOR
當處理器動態新增至硬體磁碟分割時,註冊以通知。
GUID_DEVICE_MEMORY
註冊,以在記憶體動態新增至硬體磁碟分割時收到通知。
這些 GUID 定義于標頭檔 Poclass.h 中。
下列程式碼範例示範如何註冊這兩個通知:
PVOID ProcessorNotificationEntry;
PVOID MemoryNotificationEntry;
NTSTATUS Status;
Status =
IoRegisterPlugPlayNotification(
EventCategoryDeviceInterfaceChange,
0,
&GUID_DEVICE_PROCESSOR,
DriverObject,
AsyncProcessorCallback,
NULL,
&ProcessorNotificationEntry
);
Status =
IoRegisterPlugPlayNotification(
EventCategoryDeviceInterfaceChange,
0,
&GUID_DEVICE_MEMORY,
DriverObject,
AsyncMemoryCallback,
NULL,
&MemoryNotificationEntry
);
注意 如果設備磁碟機只需要收到處理器的相關通知,就不需要實作記憶體的回呼函式或註冊記憶體的相關通知。 同樣地,如果設備磁碟機只需要通知記憶體,就不需要實作處理器的回呼函式或註冊處理器的相關通知。
當設備磁碟機必須停止接收非同步驅動程式通知時,例如卸載時,它必須呼叫 IoUnregisterPlugPlayNotification 函式來取消註冊每個回呼函式。 下列程式碼範例示範如何取消註冊回呼函式:
// Unregister for asynchronous notifications
Status =
IoUnregisterPlugPlayNotification(
ProcessorNotificationEntry
);
Status =
IoUnregisterPlugPlayNotification(
MemoryNotificationEntry
);