0

私が制御できないこのコードは、重複した I/O を使用してファイルを読み取ります。

// Read file asynchronously
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...);
BYTE buffer[10];
OVERLAPPED oRead = { 0 };
ReadFile(hFile, buffer, 10, NULL, &oRead);

// Do work while file is being read
...

// Wait for read to finish
WaitForSingleObject(hFile, INFINITE);

// ReadFile has finished 
// buffer now contains data which can be used
...

別のスレッド (実際には ReadFile の API フック) で、hFileブロックを解除するために にシグナルを送る必要がありWaitForSingleObjectます。通常、Windows (または を処理するデバイス ドライバーReadFile) がこれを行いますが、シミュレートする必要があります。

、 、およびhFileを含むReleaseMutex、通常これを行う API は見つかりませんでした。それらはすべてエラー 6 を返します (ハンドルが無効です)。ファイル、名前付きパイプ、または通信デバイスで動作する API はありますか?ReleaseSemaphoreSetEvent

推奨されていないことはわかっていWaitForSingleObject(hFile)ますが、上記のコードは与えられたものであり、それを使用する必要があります。ありがとう!

4

1 に答える 1

0

私の知る限り、ファイル ハンドルの通知は Windows に対して内部的に行われ、カーネル モードで実行している場合でも API はありません。(ファイル システム ドライバーは、Windows に操作が完了したことを伝え、ユーザー モード プロセスを通知する方法を Windows に認識させるだけだと思います。私は間違っているかもしれません。)

解決策の 1 つは、ハンドルに対して本物の ReadFile (0 バイトの読み取りで十分な場合があります) を発行して、それを通知することです。

しかし、WaitForSingleObject をフックし、それが問題のファイル ハンドルで呼び出されているかどうかを確認し、そうである場合は動作を適切に変更する方が賢明でしょう。

于 2015-12-19T22:36:08.343 に答える