非同期ドライバー通知登録
非同期ドライバー通知を使用するため、デバイス ドライバーは、ハードウェア パーティションにプロセッサまたはメモリ モジュールを動的に追加するときにオペレーティング システムが呼び出すコールバック関数を実装します。 次のコード例は、このようなコールバック関数のプロトタイプです。
// Prototypes for the asynchronous
// notification callback functions
NTSTATUS
AsyncProcessorCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
NTSTATUS
AsyncMemoryCallback(
IN PVOID NotificationStructure,
IN PVOID Context
);
デバイス ドライバーは、IoRegisterPlugPlayNotification 関数を呼び出して非同期通知に登録します。この関数は、デバイス ドライバーのコールバック関数ごとに 1 回、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
);