まぁ、タイトルのブラックボックスなプロダクトって、Windowsの事なんですが、先日、「ReadFileを行うとGetLastError()=121が発生する。」みたいな話があって、私としては(、ブラックボックスなプロダクトの内部仕様に関する話なので)、早々に提供元ベンダ(要するにM$さん)のサポートに行くだろうなぁ。と思って見てました。
...と言うのも、コレ系、サポート行かないと正確なこと言え無いですから。とは言え、「
Advanced Windows 改訂第4版」を、当時、一万円で自費購入し、まぁ、読破した事がある位の知識量はあるので、今回は、もうチョット細部に言及して、なんで、早々にベンダのサポートに行った方が良いのか?納得できるような形にしてみようと思います。
そもそも、121 (0x79)って、
ERROR_SEM_TIMEOUT (The semaphore timeout period has expired.)らしいんですよね。semaphoreとは、スレッド同期ツールキットのカーネル・オブジェクトですね。ググると、このエラーが、ReadFileを使う、様々な箇所で発生するらしいです。
ちなみに、semaphoreの使い方は以下で、
WaitForSingleObjectで待機します。
そこで、
WaitForSingleObjectの説明を見ると、基本的なエラーコードにWAIT_TIMEOUTというのがあるので、ERROR_SEM_TIMEOUTは、WaitForSingleObject側で出しているエラーでは無さそうだ。と言う事が解ります。
なので、ReadFile側でWaitForSingleObjectを使用していて、ここで、WAIT_TIMEOUTが返った時に、ERROR_SEM_TIMEOUTのエラーコードを設定しているんだろう。...と言う事が想像できますね(ソースコードを読んだ訳では無いので正確なことは解りませんが)。しかし、解るのは、所詮、ココ迄で、「もう少し、知りたい。」と言われても、「
Process Monitor等を使用して、デバッグしてみたら、何か解るかも知れません。」...位です。
余談ですが、前述の「Advanced Windows 改訂第4版」も、中の人が書いた書籍ではないので、様々な、カーネル・オブジェクトの仕様の掘り下げのタメに、沢山のサンプル・コードを持って、様々な検証を行っているんですね。...とは言え、やってる範囲は、正常系なので、異常系になってくると、外部仕様から推測すると言うアプローチではチョット難しくなってくると思います(内部仕様やデバッガが必要になって来る)。
...と言うことで、このようなケースでは、
「コードレベルで解るし、内部のKB検索や、適切なデバッグツール(、例えば semaphore を release しないスレッドを調査するとか)、への誘導等をしてくれるだろう、ベンダ・サポートに、早々に問い合わせるのが良いのではないか?」
等と思う次第であります。