Administrador de E/S de Windows-Clasificación de IRP en lectura y escritura
-
23-10-2019 - |
Pregunta
Estoy escribiendo un controlador de minifilter del sistema de archivos de Windows que debe fallar Paquetes de solicitud de E/S (IRP) en un devolución de llamada de preoperación Basado en su tipo (leer/escribir).
¿Cómo puedo averiguar en los parámetros de devolución de llamada (o en otro lugar?) Si la operación es como una lectura (solo lee datos) o es como escritura (Modifica datos en el disco: escribir, eliminar, formato, etc.)?
Aquí es una lista de los principales códigos IRP.
Estoy pensando en cosas como:
Data->Iopb->TargetFileObject->ReadAccess
Data->Iopb->TargetFileObject->WriteAccess
Pero no estoy seguro, creo que estos están disponibles solo en la devolución de llamada posterior a la operación. La documentación es realmente engorrosa.
Muestra de código para una aclaración adicional:
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;
}
Solución
Aquí hay una lista EURISTA que obtuve después de mucha prueba y error:
Escritura:
IRP_MJ_SET_EA
IRP_MJ_SET_INFORMATION
IRP_MJ_SET_QUOTA
IRP_MJ_SET_SECURITY
IRP_MJ_SET_VOLUME_INFORMATION
IRP_MJ_WRITE
Lectura:
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