タイプ(読み取り/書き込み)に基づいた操作前のコールバックでI / O要求パケット(IRP)を失敗させる必要があるWindowsファイルシステムミニフィルタードライバーを作成しています。操作が読み取りに似ている(データを読み取るだけ)か、書き込みに似ている(ディスク上のデータを変更する-書き込み、削除、フォーマットなど)かどう
かをコールバックパラメーター(または他の場所)からどのように知ることができますか?
主要なIRPコードのリストは次のとおりです。
私は次のようなことを考えています:
Data->Iopb->TargetFileObject->ReadAccess
Data->Iopb->TargetFileObject->WriteAccess
しかし、よくわかりません。これらは、操作後のコールバックでのみ使用できると思います。ドキュメントは本当に面倒です。
さらに明確にするためのコードサンプル:
FLT_PREOP_CALLBACK_STATUS
Fail (
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
)
{
FLT_PREOP_CALLBACK_STATUS status = FLT_PREOP_SUCCESS_NO_CALLBACK;
//********************************************************************
if ( IS_WRITE_LIKE(Data, FltObjects) ) { // ??? HOW DO I FIND OUT ???
//********************************************************************
if( FLT_IS_FASTIO_OPERATION(Data) ){
status = FLT_PREOP_DISALLOW_FASTIO;
} else {
status = FLT_PREOP_COMPLETE;
}
Data->IoStatus.Status = STATUS_ACCESS_DENIED;
Data->IoStatus.Information = 0;
return status;
}
return status;
}