32 ビット プロセスから RegConnectRegistry() を実行した後、リモート レジストリ サービスの停止を行うと、ハンドル リークが発生する

現象

32 ビット プロセスから RegConnectRegistry() を呼び出して任意のレジストリ ハンドルに接続した後、リモート レジストリ サービスの停止を行うと、RegConnectRegistry() を呼び出した 32 ビット プロセスの内部に解放されないハンドルが 1 つ残ります。
このハンドルは、RegCloseKey() を呼び出しても解放されないため、32 ビット プロセス内でハンドル リークが発生します。

なお本現象は、32 ビット版ならびに 64 ビット版の Windows 上で動作する 32 ビット プロセスでのみ発生し、64 ビット版の Windows 上で動作する 64 ビット プロセスでは発生しません。

原因

RegConnectRegistry() 呼び出しが成功すると、呼び出し側の 32 ビット プロセス内でいくつかのハンドルが作成されます。
このハンドルは、RegCloseKey() が呼び出された際に、Windows 内部の Remote Procedure Call (RPC) 側で解放される設計になっています。
ところが RegConnectRegistry() 呼び出しが成功した後に、リモート レジストリ サービスが停止された場合は、RPC 側でこのハンドルを参照してクローズすることができなくなります。
そのため、RegConnectRegistry() を呼び出した 32 ビット プロセス内で、ハンドル リークが発生します。

64 ビット プロセスは、Windows 内部の動作が 32 ビット プロセスとは異なるために、リモート レジストリ サービスが停止された場合でも、ハンドル リークが発生しません。

回避策

リモート レジストリ サービスは、頻繁な停止・再開を行わずにご利用ください。

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
プロパティ

文書番号:2591693 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック