NdisMRegisterDevice 関数 (ndis.h)

メモ NDIS 5。 x は非推奨となり、NDIS 6 に置き換えられます。 x があります。 新しい NDIS ドライバーの開発については、「 Windows Vista 以降のネットワーク ドライバー」を参照してください。 NDIS 5 の移植に関する情報。 x ドライバーから NDIS 6 へ。 x については、「 NDIS 5.x ドライバーを NDIS 6.0 に移植する」を参照してください。

NdisMRegisterDevice 関数は、名前付きデバイス オブジェクトと、そのデバイスのデバイス オブジェクトとユーザーに表示される名前の間のシンボリック リンクを作成します。

構文

NDIS_STATUS NdisMRegisterDevice(
  [in]  NDIS_HANDLE      NdisWrapperHandle,
  [in]  PNDIS_STRING     DeviceName,
  [in]  PNDIS_STRING     SymbolicName,
  [in]  PDRIVER_DISPATCH *MajorFunctions,
  [in]  PDEVICE_OBJECT   *pDeviceObject,
  [out] NDIS_HANDLE      *NdisDeviceHandle
);

パラメーター

[in] NdisWrapperHandle

NdisMInitializeWrapper によって返されるハンドルを指定します。

[in] DeviceName

デバイス オブジェクトに名前を付ける null で終わる Unicode 文字列を含むNDIS_STRING型へのポインター。 文字列は、完全パス名である必要があります。たとえば、 \Device\DeviceName です。 Windows 2000 以降の場合、NDIS はNDIS_STRING型を UNICODE_STRING 型として定義します。

[in] SymbolicName

登録されているデバイスの Win32 表示名である Unicode 文字列を含むNDIS_STRING型へのポインター。 通常、 シンボリック名 の形式は \DosDevices\SymbolicName です

[in] MajorFunctions

デバイス ドライバーのディスパッチ ルーチンの 1 つ以上のエントリ ポイントの配列へのポインター。 ドライバーは、ドライバーがデバイス オブジェクトに対して処理するIRP_MJ_XXX コードと同じ数の個別のディスパッチ エントリ ポイントを設定する必要があります。 各ディスパッチ ルーチンは、次のように宣言されます。

NTSTATUS
(*PDRIVER_DISPATCH) (
    IN PDEVICE_OBJECT Device Object,
    IN PIRP Irp
)   ;

ドライバーは、作成されたデバイス オブジェクトが物理デバイス用ではなく、プラグ アンド プレイまたは Power Management IRP を受信しないため、プラグ アンド プレイまたは Power Management ハンドラーのエントリ ポイントを指定することはできません。

[in] pDeviceObject

呼び出しが成功した場合は、新しく作成されたデバイス オブジェクトへのポインター。

[out] NdisDeviceHandle

呼び出し元が指定した変数へのポインター。この関数が成功した場合、デバイス オブジェクトへのハンドルが返されます。 このハンドルは、ドライバーが後で呼び出す NdisMDeregisterDevice 関数に必要なパラメーターです。

戻り値

NdisMRegisterDevice は、成功した場合はSTATUS_SUCCESSを返し、呼び出し元が NDIS ミニポート ドライバーでない場合はNDIS_STATUS_NOT_SUPPORTED、失敗した場合はエラー コードを返します。

注釈

中間ドライバーまたはミニポート ドライバーには、個別のスタンドアロン デバイス オブジェクトが必要な場合があります。 たとえば、中間ミニポート ドライバーでは、NIC のミニポート ドライバーが稼働していないときに、基になる NIC の状態を監視するスタンドアロン デバイス オブジェクトが必要な場合があります。 このような場合に NIC の状態を取得するには、ユーザー モード アプリケーションまたは環境サブシステムは、デバイス オブジェクトに IRP を送信します。 IRP は中間ドライバーによって処理されます。 スタンドアロン デバイス オブジェクトがない場合、NIC の状態は、NIC のミニポート ドライバーが稼働している場合にのみ使用できます。

中間ドライバーまたはミニポート ドライバーは、DriverEntry が NdisMInitializeWrapper を呼び出した後、その DriverEntry 関数から NdisMRegisterDevice を呼び出すことによって、デバイス オブジェクトを作成します。 NdisMRegisterDevice は、名前付きデバイス オブジェクトと、そのデバイスのデバイス オブジェクト名とユーザーに表示される名前の間のシンボリック リンクも作成します。 NdisMRegisterDevice の呼び出しが成功した場合、I/O マネージャーは、デバイス オブジェクト自体と、ドライバーのデバイス拡張機能を含む、デバイス オブジェクトに関連付けられている他のすべてのデータ構造の非ページ プールに記憶域を割り当てます。 NdisMRegisterDevice で作成されたオブジェクトのデバイス拡張機能は、NDIS で使用するために予約されており、ドライバーで使用することはできません。

NdisMRegisterDevice 関数を使用して作成されたデバイス オブジェクトは、それぞれ IoCreateDeviceIoCreateSymbolicLink を使用して作成されたデバイス オブジェクトおよびシンボリック リンクと同じ方法で機能します。 ミニポート ドライバーは、デバイス オブジェクトに対して受信するすべての IRP を処理します。 (NDIS は、デバイス オブジェクトに送信されたすべてのプラグ アンド プレイと電源管理 IRP を処理します。ドライバーは、NdisMRegisterDevice への MajorFunctions ポインターを指定したときに登録されたディスパッチ ルーチンを使用して、デバイス オブジェクトに送信された IRP を処理します。 デバイス オブジェクト、IRP、ディスパッチ ルーチンの詳細については、「 デバイス オブジェクトとデバイス スタック」、「 IRP の処理」、「 ディスパッチ ルーチンの作成」を参照してください。

NDIS ミニポート ドライバーと中間ドライバーは、 IoCreateDevice または IoCreateSymbolicLink を呼び出さないでください。 代わりに、NDIS ドライバーでデバイス オブジェクトを作成する必要がある場合は、 NdisMRegisterDevice を呼び出す必要があります。 ミニポート ドライバーと中間ドライバーは、 IoAttachDevice を呼び出すことによって、物理デバイス オブジェクト経由でデバイス オブジェクトをスタックしようとしないでください。

NdisMRegisterDevice で作成されたデバイス オブジェクトは物理デバイス オブジェクトでないため、プラグ アンド プレイまたは Power Management IRP を受け取りません。 したがって、NdisMRegisterDevice の呼び出し元は、MajorFunctions が指す配列内のプラグ アンド プレイハンドラーまたは Power Management ハンドラーのエントリ ポイントを省略する必要があります。

NdisMRegisterDevice で作成されたデバイス オブジェクトへのハンドルが開いている場合、デバイス オブジェクトを作成したドライバーをアンロードできないことに注意してください。 したがって、ユーザー モード アプリケーションでは、次のいずれかの操作を行う必要があります。

  1. アプリケーションが RegisterDeviceNotification 関数を呼び出して基になるデバイス上のデバイス イベント通知に登録する場合は、DBT_DEVTYP_HANDLEの種類の通知フィルターを指定します。 (RegisterDeviceNotification 関数の詳細については、Microsoft Windows SDKドキュメントを参照してください)。その後、アプリケーションがデバイスのDBT_DEVICEQUERYREMOVE イベントを受け取った場合、アプリケーションは開いているハンドルを閉じる必要があります。

  2. アプリケーションが RegisterDeviceNotification 関数を呼び出して基になるデバイス上のデバイス イベント通知に登録する場合は、DBT_DEVTYP_DEVICEINTERFACE型通知フィルターを指定し、インターフェイス クラス GUID としてGUID_NDIS_LAN_CLASSします。 その後、アプリケーションがハンドルが対応するデバイス インターフェイスのDBT_DEVICEREMOVECOMPLETE イベントを受け取った場合、アプリケーションは開いているハンドルを閉じる必要があります。

NdisMRegisterDevice へのドライバーの呼び出しが失敗した場合、ドライバーは、ドライバーの操作に対するスタンドアロン デバイス オブジェクトの重要度に応じて、読み込みを続行できます。

  • ターゲット プラットフォーム: ユニバーサル
  • バージョン: Windows Vista の NDIS 6.0 ドライバーではサポートされていません。 代わりに NdisRegisterDeviceExを使用してください。 Windows Vista および Windows XP の NDIS 5.1 ドライバーでサポートされています。

要件

要件
Header ndis.h (Ndis.h を含む)
Library Ndis.lib
IRQL PASSIVE_LEVEL

こちらもご覧ください