gestionnaire de fenêtres E / S - classification de IRP en lecture comme en écriture et comme
-
23-10-2019 - |
Question
Je suis en train d'écrire une fenêtre système de fichiers minifiltres pilote qui doit échouer E / S (IRP Demande Packets de) dans un rappel pré-opératoire en fonction de leur type (lecture / écriture).
Comment puis-je savoir à partir des paramètres de rappel (ou ailleurs?) Si l'opération est lecture comme (lit uniquement les données) ou il est écriture comme (modifie des données sur la disque - écriture, suppression, le format, etc.)
est une liste de les principaux codes du PRI.
Je pense à des choses comme:
Data->Iopb->TargetFileObject->ReadAccess
Data->Iopb->TargetFileObject->WriteAccess
Mais je ne sais pas, je pense que ceux-ci ne sont disponibles que dans le rappel de post-op. La documentation est vraiment lourd.
Exemple de code pour obtenir des précisions:
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;
}
La solution
Here is an euristic list I got after a lot of trial and error:
write-like:
IRP_MJ_SET_EA
IRP_MJ_SET_INFORMATION
IRP_MJ_SET_QUOTA
IRP_MJ_SET_SECURITY
IRP_MJ_SET_VOLUME_INFORMATION
IRP_MJ_WRITE
read-like:
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