J'écris un windows filesystem minifilter driver qui doit échouer I/O Request Packets (IRP's) dans un preoperation callback en fonction de leur type (lecture/écriture).
Comment puis-je savoir à partir des paramètres de rappel (ou ailleurs?) Si l'opération est comme en lecture seule (lit uniquement les données) ou comme en écriture (modifie les données sur le disque - écriture, suppression, format, etc.)?windows I/O manager - classification de l'IRP en lecture et en écriture
Here est une liste des principaux codes IRP.
Je pense à des choses comme:
Data->Iopb->TargetFileObject->ReadAccess
Data->Iopb->TargetFileObject->WriteAccess
Mais je ne suis pas sûr, je pense que ceux-ci ne sont disponibles que dans le rappel de post-op. La documentation est vraiment lourde.
Exemple de codepour plus de 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;
}
Je n'ai pas s vers le bas pour le vérifier mais j'aurais pensé que IRP_MJ_CREATE était "en écriture", en fonction des drapeaux. Pas de critique, juste une question. – Jan
Merci pour vos commentaires, je vais creuser un peu plus, je crois que vous avez raison. – clyfe