LPFN_RIOREGISTERBUFFER
コールバックシグネチャ
RIO_BUFFERID LPFN_RIOREGISTERBUFFER(
LPSTR DataBuffer,
DWORD DataLength
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| DataBuffer | LPSTR | 登録するメモリバッファーの先頭へのポインター。 |
| DataLength | DWORD | 登録するバッファーの長さ (バイト単位)。 |
公式ドキュメント
RIORegisterBuffer 関数は、Winsock 登録 I/O 拡張機能で使用するために、登録されたバッファー記述子である RIO_BUFFERID を、指定したバッファーに対して登録します。
戻り値
エラーが発生しない場合、RIORegisterBuffer 関数は登録されたバッファー記述子を返します。それ以外の場合は RIO_INVALID_BUFFERID の値が返され、WSAGetLastError 関数を呼び出すことで固有のエラーコードを取得できます。
| 戻り値 | 説明 |
|---|---|
| 呼び出しでポインター引数を使用しようとした際に、システムが無効なポインターアドレスを検出しました。このエラーは、DataBuffer パラメーターに無効なバッファーポインターが渡された場合に返されます。 |
|
| 無効なパラメーターが関数に渡されました。 このエラーは、DataLength パラメーターが 0 の場合に返されます。 |
解説(Remarks)
RIORegisterBuffer 関数は、指定したバッファーに対する登録されたバッファー識別子を作成します。バッファーが登録されると、そのバッファーを含む仮想メモリページは物理メモリ内にロックされます。
小さく連続していないバッファーを複数登録した場合、バッファーの物理メモリ使用量は、実質的に登録ごとにメモリページ 1 ページ分に達することがあります。このような場合は、複数の要求バッファーをまとめて割り当てると効果的なことがあります。
また、バッファーの登録自体にも物理メモリ上のわずかなオーバーヘッドがあります。そのため、多数の割り当てを 1 つの大きな割り当てに集約している場合は、バッファーの登録も集約することで物理メモリ使用量をさらに削減できます。この場合、アプリケーションは、バッファーが最終的に登録解除されること、ただし送信または受信の要求が未完了の間は登録解除しないことを確実にするため、特に注意が必要になることがあります。
登録されたバッファーの一部は、データを送受信するために RIOSend、RIOSendEx、RIOReceive、RIOReceiveEx の各関数の pData パラメーターに渡されます。
バッファー識別子が不要になったら、RIODeregisterBuffer 関数を呼び出してバッファー識別子を登録解除します。
RIORegisterBuffer 関数への関数ポインターは、SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER オペコードを指定して WSAIoctl 関数を呼び出すことにより、実行時に取得する必要があります。WSAIoctl 関数に渡す入力バッファーには、Winsock 登録 I/O 拡張関数を識別する値を持つグローバル一意識別子 (GUID) である WSAID_MULTIPLE_RIO を格納する必要があります。成功した場合、WSAIoctl 関数が返す出力には、Winsock 登録 I/O 拡張関数へのポインターを含む RIO_EXTENSION_FUNCTION_TABLE 構造体へのポインターが格納されます。SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL は Ws2def.h ヘッダーファイルで定義されています。WSAID_MULTIPLE_RIO GUID は Mswsock.h ヘッダーファイルで定義されています。
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストアアプリでサポートされます。
Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストアアプリでサポートされます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)