ミューテックスを所有するスレッドが終了したときに、ミューテックスの所有権が解放されるのを防ぐ方法はありません。
状況に応じて、問題を解決できる可能性のある他の方法がいくつかあります。
1)クライアントのコードを変更できますか?たとえば、クライアント実行可能ファイルが接続を確立および維持するために提供したDLLを使用している場合、ミューテックスではなく、より適切なオブジェクト(名前付きパイプなど)を使用するようにDLLを変更できます。 DLLに、ミューテックスを所有するための独自のスレッドを開始させる。
2)複数のクライアントがありますか?おそらく、ミューテックスを使用しているため、一度に1つのクライアントのみが接続することを期待しています。一度に1つのクライアントのみが接続されると安全に想定できる場合、サーバーがミューテックスが放棄されたことを検出すると、ミューテックスへの自身のハンドルを閉じることができます。クライアントプロセスが終了すると、ミューテックスは自動的に削除されるため、サーバーはミューテックスがまだ存在するかどうかを定期的にチェックできます。
3)クライアントはサーバーとどのように通信していますか?サーバーはおそらくクライアントにとって有用なことをしているので、ミューテックスだけでなく別の通信チャネルが必要です。たとえば、クライアントがサーバーへの名前付きパイプを開いている場合、ミューテックスの代わりにその接続を使用して、クライアントプロセスがいつ終了するかを検出できます。または、通信チャネルでクライアントのプロセスIDを判別できる場合は、プロセスへのハンドルを開き、それを使用してクライアントプロセスがいつ終了するかを検出できます。
4)他の解決策が機能せず、サーバーだけでなくクライアントも書き直す必要がある場合は、名前付きパイプなど、より適切な形式のIPCの使用を検討してください。
追加
5)プロセスハンドルを使用して、プロセスの終了を待機(またはテスト)するのが一般的な方法です。ほとんどの場合、これらのハンドルは、プロセスの作成時に親用に生成されたものですが、OpenProcessによって生成されたハンドルを使用しない理由はありません。先例に関しては、少なくとも、ミューテックスを使用する場合と同じくらい、OpenProcessによって生成されたハンドルを使用してクライアントプロセスを監視するための先例があることを保証します。プロセスが終了したことを検出するためにWindowsミューテックスを使用しようとした最初の人である可能性は十分にあります。:-)
6)おそらく、SQLDisconnect()関数は、サーバーから切断するためにReleaseMutexを呼び出しています。ミューテックスを所有していないスレッドからこれを行っているため、エラーコードを返す以外は何もしません。したがって、サーバーがその発生を検出するための合理的な方法はありません。関数はミューテックスでCloseHandleも呼び出しますか?その場合は、(2)のアプローチを使用して、これがいつ発生するかを検出できます。これは、SQLDisconnect()の呼び出しと、プロセスの終了時の両方で機能します。異なるミューテックスを使用しているため、複数のクライアントが存在することは問題ではありません。
6a) ReleaseMutexの動作を変更する ためにフックを使用できると考えられるため、「合理的な方法はありません」と言います。これは良い選択肢ではありません。
7)ReleaseMutexやCloseHandleを呼び出す以外に、SQLDisconnect()関数が何をするかを注意深く調べる必要があります。ミューテックス以外の方法で切断を検出できる可能性は十分にあります。