Я пишу драйвер минифильтра файловой системы Windows , который должен потерпеть неудачу Пакеты запросов ввода / вывода (IRP) в обратном вызове до операции в зависимости от их типа /write).
Как я могу узнать из параметров обратного вызова (или где-нибудь еще?), Является ли операция похожей на чтение (только для чтения данных) или похожей на запись (изменяет данные на диске - писать, удалять, форматировать и т. д.)?
Здесь - список основных кодов 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;
}