読み出し処理をドライブ

非同期タイムアウト処理を読み書きするドライブについては、ネットワーク上のデータは、ちょうど最近、仕事でこの問題が発生し、比較的まれであるので、私は少し勉強し、またはいくつかの出入り口を見つけます。タイムアウトが発生した読み取りおよび書き込みを処理するために、アプリケーション層に完全に従った処理ロジックは、駆動層ブルースクリーン上の問題、等もし

限り、読み取りと書き込みのタイムアウトとして、我々は確かに第一印象を考えますが、コール関連のイベントとイベントの動作や機能を待ち、その後、いくつかのファイル操作機能はのはドライバーを見てみましょう宣言します。

最初はオープン操作です

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;
}

〜コンプリート〜

おすすめ

転載: www.cnblogs.com/magicdmer/p/10994140.html