非同期タイムアウト処理を読み書きするドライブについては、ネットワーク上のデータは、ちょうど最近、仕事でこの問題が発生し、比較的まれであるので、私は少し勉強し、またはいくつかの出入り口を見つけます。タイムアウトが発生した読み取りおよび書き込みを処理するために、アプリケーション層に完全に従った処理ロジックは、駆動層ブルースクリーン上の問題、等もし
限り、読み取りと書き込みのタイムアウトとして、我々は確かに第一印象を考えますが、コール関連のイベントとイベントの動作や機能を待ち、その後、いくつかのファイル操作機能はのはドライバーを見てみましょう宣言します。
最初はオープン操作です
NTSTATUS ZwCreateFile(
_Out_ PHANDLE FileHandle,
_In_ ACCESS_MASK DesiredAccess,
_In_ POBJECT_ATTRIBUTES ObjectAttributes,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_In_opt_ PLARGE_INTEGER AllocationSize,
_In_ ULONG FileAttributes,
_In_ ULONG ShareAccess,
_In_ ULONG CreateDisposition,
_In_ ULONG CreateOptions,
_In_opt_ PVOID EaBuffer,
_In_ ULONG EaLength
);
あなたは読み書きにタイムアウトを実装したい場合は、アプリケーション層の経験は、私たちは、非同期的にファイルを開く必要があり、それはあなたが開いて同期する必要がある場合、あなたは次の値を設定する必要があり、デフォルトのドライブ非同期のオープン操作である(2が設定する必要があります)
DesiredAccessを:SYNCHRONIZE
CreateOptions:FILE_SYNCHRONOUS_IO_NONALERT
そして、読み取りおよび書き込み機能、類似した2
NTSTATUS ZwReadFile(
_In_ HANDLE FileHandle,
_In_opt_ HANDLE Event,
_In_opt_ PIO_APC_ROUTINE ApcRoutine,
_In_opt_ PVOID ApcContext,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_Out_ PVOID Buffer,
_In_ ULONG Length,
_In_opt_ PLARGE_INTEGER ByteOffset,
_In_opt_ PULONG Key
);
NTSTATUS ZwWriteFile(
_In_ HANDLE FileHandle,
_In_opt_ HANDLE Event,
_In_opt_ PIO_APC_ROUTINE ApcRoutine,
_In_opt_ PVOID ApcContext,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_In_ PVOID Buffer,
_In_ ULONG Length,
_In_opt_ PLARGE_INTEGER ByteOffset,
_In_opt_ PULONG Key
);
ここでは、アプリケーション層の経験は、私たちは、後のパラメータは、非同期タイムアウト待ちのために使用することができるかを決定するためにドキュメントを参照して、文書宣言、イベントに関連するだけで二番目のパラメータに応じて、イベント(イベント)のパラメータがあります。私たちはイベントドリブン機能を作成する上でイベントを作成する必要があります今回は、最初に考えるKeInitializeEventを、しかし、ここで必要であるHANDLEのタイプなので、私たちは、作成するには、次のメソッドを使用する必要があります。
ZwCreateEvent(&g_hEvent, GENERIC_ALL, NULL, SynchronizationEvent, FALSE);
その後、我々は自然に関連するZwを待ち機能の検索を開始それを考えます
status = ZwWaitForSingleObject(g_hEvent, FALSE, &time);
ステータス返す場合、この時間STATUS_TIMEOUTの場合、タイムアウトに代わってファイルを読み書き、今回はイベントハンドラを閉じてから、ファイルハンドルを返します。あなたが本当にやり場合は、そのようなリターンなどのリアルタイムデータは、ブルースクリーンの問題があるでしょう。
分析は、我々が使用しているため、ことがわかっZwCloseハンドルが閉じられた後に機能を、それが非同期であるため、背景がまだ今回我々は資源を破壊する場合、データを待って返されるので、ウィンドウは、文書の操作を停止しませんでしたが、残業中のデータ帰国後、そのようなメモリアクセスエラー0xc0000005でブルースクリーンが発生します。だから私たちは自然にファイルIO操作を無効にする機能があるかどうかについて考え、答えはイエスですが、それが文書化されていない機能である、次のように、関数の宣言は、次のとおりです。
typedef
NTSTATUS
(NTAPI *MyZwCancelIoFile)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock);
我々はタイムアウトを読み書きする場合、この関数は、ファイルIOをキャンセルするために使用することができ、我々は、ファイルIO操作の背景をキャンセルして、関連するハンドルを閉じる必要があります。私たちは、関数のアドレスを取得することができます。
UNICODE_STRING funcname = RTL_CONSTANT_STRING(L"ZwCancelIoFile");
ZwCancelIoFile = (MyZwCancelIoFile)MmGetSystemRoutineAddress(&funcname);
if (ZwCancelIoFile == NULL)
{
return FALSE;
}
〜コンプリート〜