サブデバイスの作成
サブデバイスという用語は、次の表にリストされている 4 つのコンポーネントのバインドを説明するために使用されます。
コンポーネント | 説明 |
---|---|
ミニポート オブジェクト |
ミニポート ドライバーの IMiniportXxx インターフェイスを公開するオブジェクト |
Port オブジェクト |
ポート ドライバーの IportXxx インターフェイスを公開するオブジェクト |
リソース リスト オブジェクト |
サブデバイスに割り当てられているアダプター ドライバー リソースのリストを含むオブジェクト |
参照文字列 |
フィルタ作成時にサブデバイスを指定するためにデバイスのパス名に追加される名前 |
サブデバイスの IMiniportXxx インターフェイスと IPortXxx インターフェイスは、それぞれ基本インターフェイス IMiniport と IPort を継承します。
PortCls システム ドライバーは、ポート ドライバーとミニポート ドライバーを区別しません。 システム生成のリクエストを処理できるインターフェイスを備えたポート オブジェクトなどのオブジェクトが必要なだけです。
同様に、PortCls はリソースの管理には直接関与しません。 必要なのは、リクエスト ハンドラー (ポート ドライバー) をリソース リストにバインドすることだけです。 アダプター ドライバーは、ポート、ミニポート、およびリソース リスト オブジェクトを一緒にバインドする役割を果たします。
次のコード例は、アダプター ドライバーがこれらのアクションを実行する方法を示しています:
//
// Instantiate the port by calling a function supplied by PortCls.
//
PPORT port;
NTSTATUS ntStatus = PcNewPort(&port, PortClassId);
if (NT_SUCCESS(ntStatus))
{
PUNKNOWN miniport;
//
// Create the miniport object.
//
if (MiniportCreate) // a function to create a proprietary miniport
{
ntStatus = MiniportCreate(&miniport,
MiniportClassId, NULL, NonPagedPool);
}
else // Ask PortCls for one of its built-in miniports.
{
ntStatus = PcNewMiniport((PMINIPORT*)&miniport,
MiniportClassId);
}
if (NT_SUCCESS(ntStatus))
{
//
// Bind the port, miniport, and resources.
//
ntStatus = port->Init(DeviceObject,
Irp, miniport, UnknownAdapter, ResourceList);
if (NT_SUCCESS(ntStatus))
{
//
// Hand the port driver and the reference
// string to PortCls.
//
ntStatus = PcRegisterSubdevice(DeviceObject,
Name, port);
}
//
// We no longer need to reference the miniport driver.
// Either the port driver now references it,
// or binding failed and it should be deleted.
//
miniport->Release();
}
//
// Release the reference that existed when PcNewPort() gave us
// the pointer in the first place. This reference must be released
// regardless of whether the binding of the port and miniport
// drivers succeeded.
//
port->Release();
}
PcRegisterSubdevice.前述のコード例の PortCls 関数呼び出しの詳細情報は、PcNewPort、PcNewMiniport、および PcRegisterSubdeviceを参照してください。