Диспетчер ввода / вывода Windows - классификация IRP в режиме чтения и записи - PullRequest
2 голосов
/ 02 июня 2010

Я пишу драйвер минифильтра файловой системы 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;
}

1 Ответ

0 голосов
/ 29 июня 2010

Вот эвристический список, который я получил после многих проб и ошибок:

как в записи:

IRP_MJ_SET_EA
IRP_MJ_SET_INFORMATION
IRP_MJ_SET_QUOTA
IRP_MJ_SET_SECURITY
IRP_MJ_SET_VOLUME_INFORMATION
IRP_MJ_WRITE 

для чтения, как:

IRP_MJ_CREATE
IRP_MJ_DEVICE_CONTROL
IRP_MJ_FILE_SYSTEM_CONTROL
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_INTERNAL_DEVICE_CONTROL
IRP_MJ_QUERY_EA
IRP_MJ_QUERY_INFORMATION
IRP_MJ_QUERY_QUOTA
IRP_MJ_QUERY_SECURITY
IRP_MJ_QUERY_VOLUME_INFORMATION
IRP_MJ_READ
IRP_MJ_OPERATION_END
...