2010-06-02 18 views
2

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 code

pour 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; 
} 

Répondre

0

Voici une liste EURISTIC je suis arrivé après beaucoup d'essais et d'erreurs:

écriture comme:

IRP_MJ_SET_EA 
IRP_MJ_SET_INFORMATION 
IRP_MJ_SET_QUOTA 
IRP_MJ_SET_SECURITY 
IRP_MJ_SET_VOLUME_INFORMATION 
IRP_MJ_WRITE 

lecture comme :

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 
+0

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

+0

Merci pour vos commentaires, je vais creuser un peu plus, je crois que vous avez raison. – clyfe