Windows 展開サービス サーバー API の使用
標準の Windows 展開サービス (WDS) ソリューションを使用できない環境では、WDS サーバーは、開発者がプリブート実行環境 (PXE) 要求を処理するために、プロバイダーと呼ばれるプラグインを記述できるようにする API を公開します。 開発者は、WDS 用の PXE プロバイダーを作成するときに、次のガイドラインに従う必要があります。
WDS ロールをサーバーにインストールする
- Windows 展開サービス (WDS) は、リモート インストール サービス (RIS) の改訂版です。WDS PXE サーバーとプロバイダーを実装するには、WDS サーバーの役割が必要です。
- WDS は、RIS を Windows Server 2008 および Windows Server 2003 以降の標準コンポーネントとして Service Pack 2 (SP2) に置き換えます。
- RIS サーバーを Windows Server 2003 Service Pack 1 (SP1) で WDS に更新する必要があります。 WDS サーバーの役割は、 Windows 自動インストール キット (WAIK) を使用してインストールできます。
プロバイダーの登録
インストール時にプロバイダーダイナミック リンク ライブラリ (DLL) を登録し、登録されたプロバイダーの順序付きリストにプロバイダーを挿入します。
注意
新しいプロバイダーまたは変更されたプロバイダーをインストールする場合、変更を有効にするには WDS PXE サービスを再起動する必要があります。
PxeProviderRegister 関数を使用してプロバイダーを登録し、一覧に追加します。 PxeProviderUnRegister 関数を使用して、登録済みプロバイダーの登録を解除し、一覧から削除します。
順序付きリストでプロバイダーのシーケンスを指定します。 リスト内のプロバイダーのインデックスは、後で別のプロバイダーが登録される可能性があるため、保証できません。 別の登録済みプロバイダーの前または後にプロバイダーを一覧に挿入するには、まず PxeProviderQueryIndex 関数を使用して登録済みプロバイダーのインデックスを取得し、新しいプロバイダーを登録して、より大きいまたは小さいインデックス値を指定します。
インストールでは、プロバイダーの登録時に返されるレジストリ キーの下にプロバイダー構成情報を格納できます。 レジストリ キーのアドレスは、PxeProviderRegister の phProviderKey によって受信されます。 プロバイダーは、pxeProviderInitialize コールバックに hProviderKey パラメーターと同じキーへのハンドルを受け取ります。 プロバイダーは、このキーのアドレスを格納する必要があります。
プロバイダー ダイナミック リンク ライブラリ (DLL) をサーバーの Program Files フォルダーに常にインストールします。
Initialize
- プロバイダーに PxeProviderInitialize コールバック関数をエクスポートする DLL を含めます。 すべてのプロバイダーには、 PxeProviderInitialize コールバックが必要です。 WDS はプロバイダーを読み込むとき、プロバイダーの PxeProviderInitialize 関数を呼び出し、プロバイダーの登録時に構成情報を格納するために使用されるのと同じキーにハンドルを渡します。
- PxeProviderInitialize コールバックが を返し、成功すると、プロバイダーは完全に初期化され、要求を処理する準備が整う必要があります。
- PxeProviderInitialize 関数の処理中に、プロバイダー内のすべてのコールバックを登録します。 コールバックは PxeRegisterCallback 関数に登録する必要があります。
- PxeProviderInitialize 関数の処理中に、プロバイダーのすべての内部リソースを初期化します。
Shutdown
- PxeProviderShutdown コールバックを実装します。 すべてのプロバイダーに PxeProviderShutdownコールバックが必要です。
- PxeProviderShutdown コールバック関数は、プロバイダーを完全にシャットダウンし、そのすべてのリソースを解放する必要があります。
- PxeProviderShutdown コールバックが返された後、PxeProviderInitialize 関数に渡される hProvider ハンドルは無効になり、WDS の呼び出しには使用しないでください。
- PxeProviderInitialize コールバックの処理中に、PxeRegisterCallback 関数をPXE_CALLBACK_SHUTDOWNで呼び出して、PxeProviderShutdown コールバックを登録します。 PxeProviderInitialize 関数が失敗した場合は、PxeProviderShutdown コールバックを呼び出さないでください。
要求パケットの処理
プロバイダーの PxeProviderRecvRequest コールバックを実装します。 すべてのプロバイダーに PxeProviderRecvRequest コールバックが必要です。 WDS は、要求を受信すると、登録済みプロバイダーの一覧の最初のプロバイダーに対して PxeProviderRecvRequest コールバックを呼び出します。
プロバイダーがこの要求を同期的に処理する場合、 PxeProviderRecvRequest 関数は ERROR_SUCCESS の値を返す必要があります。 プロバイダーがこの要求を非同期的に処理する場合にのみ、 PxeProviderRecvRequest コールバックは ERROR_IO_PENDING を返し、要求が処理されたときに PxeAsyncRecvDone 関数を呼び出す必要があります。
PxeProviderRecvRequest コールバックと PxeAsyncRecvDone 関数は、要求を処理するためにプロバイダーによって実行されるアクションを記述するPXE_BOOT_ACTION列挙型のアドレスを返します。
プロバイダーが要求を処理するには、次の 4 つの方法があります。
- プロバイダーは、ネットワーク ブート プログラムへのパスを含む標準の DHCP 応答パケットを使用してクライアントに応答します。 列挙型の PXE_BA_NBP 値を返すことは、プロバイダーが要求パケットを正常に処理し、 PxePacketAllocate 関数と PxeSendReply 関数を呼び出して応答パケットを送信して要求を完了したことを意味します。
- プロバイダーは、DHCP に準拠していないカスタム応答パケットを使用してクライアントに応答します。 列挙型の PXE_BA_CUSTOM 値を返すことは、プロバイダーが要求パケットを正常に処理し、 PxePacketAllocate 関数と PxeSendReply 関数を呼び出してカスタム応答パケットを送信して要求を完了したことを意味します。
- プロバイダーは、要求を無視する必要があると判断します。 列挙型の PXE_BA_IGNORE 値を返すと、プロバイダーは要求に関連付けられているすべてのリソースを解放し、登録されたプロバイダーの一覧の次のプロバイダーに要求が渡されないことを意味します。 プロバイダーは、要求パケットが無効であることを検出した場合に、このオプションを使用できます。
- プロバイダーは要求のサービスを拒否します。 列挙型の PXE_BA_REJECT 値を返すと、システムは登録済みプロバイダーの一覧で次のプロバイダーに要求を渡すように指示します。 これがリスト内の最後のプロバイダーである場合、要求に関連付けられているすべてのリソースが解放され、要求は無視されます。
- PxeProviderInitialize コールバックの処理中に、PxeRegisterCallback 関数をPXE_CALLBACK_RECV_REQUESTで呼び出して、PxeProviderRecvRequest コールバックを登録します。
応答パケットの生成
- API を使用して、DHCP 要求を処理し、応答パケットを生成するプロバイダーを作成します。
- PxeProviderSetAttribute 関数は、プロバイダーがパケットをフィルター処理するために使用する属性を指定します。 プロバイダーの属性を指定して、プロバイダーがすべてのパケットを表示するか、プロバイダーに DHCP パケットのみが表示されるか、DHCP ベンダー クラス識別子オプション (60) を "PXEClient" として指定した DHCP パケットのみがプロバイダーに表示されるように指定できます。
- PxeDhcpIsValid 関数は、パケットが有効な DHCP パケットであることを確認します。 プロバイダーは PxeDhcpIsValid 関数を使用して、PxeProviderSetAttribute 関数で設定されたフィルターがすべてのパケットを受信するように設定され、指定されたパケットが有効な DHCP パケットであるかどうかを判断するときに、クライアントからのパケットが DHCP パケットであるかどうかをチェックできます。
- PxeDhcpInitialize 関数は、クライアントから受信したパケットの情報に基づいて、DHCP 応答パケットとして応答パケットを初期化します。 PxeProviderInitialize 関数は、PxeProviderRecvRequest コールバックでクライアントから受信した有効な DHCP パケットのアドレスを受け取ります。 PxeDhcpInitialize 関数は、PxePacketAllocate 関数で割り当てられた応答パケットへのポインターを受け取ります。
- PxeDhcpGetOptionValue 関数は、DHCP パケットからオプション値を取得します。 PxeDhcpGetVendorOptionValue 関数は、DHCP パケットのベンダー固有情報フィールド (43) からオプション値を取得します。
- プロバイダーは、応答パケットに情報を入力し、 PxeSendReply 関数を使用して応答パケットをクライアントに送信できます。 PxeDhcpAppendOption 関数は、応答パケットに DHCP オプションを追加します。
- パケットを送信してクライアント要求に応答するプロバイダーは、 PxePacketAllocate 関数を使用して応答パケットを割り当てる必要があります。 プロバイダーは、応答パケットに情報を入力し、 PxeSendReply 関数を使用して応答パケットをクライアントに送信できます。
- 割り当てられたメモリが不要になったら、プロバイダーは PxePacketFree 関数を使用して解放する必要があります。
登録済みプロバイダーを列挙する
- API を使用して、リスト内の他の登録済みプロバイダーを列挙してチェックプロバイダーを記述します。
- PxeGetServerInfo 関数は、PXE サーバーに関する情報を返します。 PxeGetServerInfo 関数は、サーバーに対してトレースが有効になっているかどうかを示す BOOL を返します。 TRUE は 、トレースが有効になっていることを示します。
- PxeProviderEnumFirst 関数は、登録済みプロバイダーの一覧で列挙プロバイダーを開始します。 PxeProviderEnumFirst 関数は列挙を開始し、PxeProviderEnumNext 関数を呼び出すときに使用するハンドルのアドレスを返します。 PxeProviderEnumNext 関数は、プロバイダーに関する情報を含むPXE_PROVIDER構造体を返します。 PxeProviderFreeInfo 関数は、PxeProviderEnumNext 関数によってPXE_PROVIDER構造体に割り当てられたメモリを解放します。 PxeProviderEnumClose 関数は、登録済みプロバイダーリスト内のプロバイダーの列挙を閉じます。
サービス コントロール コードの処理
- サービス コントロール メッセージを受信すると、WDS は PxeProviderServiceControl コールバックを呼び出します。
- プロバイダーは、サービス 制御メッセージを処理する PxeProviderServiceControl コールバック関数を定義できます。
- PxeProviderInitialize コールバックの処理中に、PxeRegisterCallback 関数をPXE_CALLBACK_SERVICE_CONTROLで呼び出して、PxeProviderServiceControl コールバックを登録します。
PXE ログへのトレース エントリの追加
- PxeTrace 関数は、PXE ログにトレース エントリを追加します。 WDSPXE は、管理者がトラブルシューティングを行うのに役立つトレースを提供します。 プロバイダーは、異なる重大度レベルのトレース エントリをログに記録できます。 管理者は、特定の重大度レベルのエントリのみをログに記録するように WDSPXE を構成できます。
関連トピック