Requêtes IRPs

Signaler
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008
-
Messages postés
4
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
19 septembre 2008
-
Bonjour, j'aimerais savoir comment il est possible d'envoyer des IRPs à un driver avec IOCallDriver. Je sais qu'il faut spécifier le PDEVICE_OBJECT contenant le driver object du driver en question, mais comment "sélectionner" la fonction driver que l'on souhaite appeler ? avec la structure IRP ?

Par exemple, avec le driver de système de fichier NTFS, IOCallDriver appelle ce driver avec un certain IRP, contenant entre autre le FILE_OBJECT dont on souhaite récupérer un handle, mais comment appeler spécifiquement la fonction NtfsFsdCreate ? (afin de récupérer le handle) ?

Et aussi, comment définir ces fonctions dans le driver, faut-il encore les spécifier dans DriverObject->MajorFunctions ??

Merci.

1 réponse

Messages postés
4
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
19 septembre 2008

Oui c'est a specifier dans ta fonction driverEntry, tu défini tes callback, mais c'est le ressourceManager qui se charge de t'envoyer les différents IRPs.

Tu peu interagir sur tes IRP, en ajoutant dans driverEntry le callBack suivant :

DriverObject->MajorFunction [IRP_MJ_DEVICE_CONTROL] = functionCtrl;

ou
DriverObject->MajorFunction [IRP_MJ_DEVICE_INTERNAL_CONTROL] = functionIoctl;

Par la suite si tu veu faire appel à ces callBack :

Exemple d'IOCTL :

#define IOCTL_SEND_DEVICE_INT    CTL_CODE(FILE_DEVICE_UNKNOWN,1003,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)

tu peu prendre l'exemple suivant :

sendIrp(PDEVICE_OBJECT)
{

NTSTATUS   ntStatus;
IO_STATUS_BLOCK   ioStatus;
KEVENT   event;
PIO_STACK_LOCATION   irpNextStack;

// On crée un IRP
        irp = IoBuildDeviceIoControlRequest(
            IOCTL_SEND_DEVICE_INT, // Tu specifie l'IOCTL à utiliser
            SlotConnected,  // type PDEVICE_OBJECT ( driver de niveau inférieur)
            BufferLocalInterrupt, // data à transmettre  
            LengthLocal, // longueur Data
            BufferLocalInterrupt, // Buffer en sortie
            LengthLocal,      // Longueur en sortie
            FALSE,
            &event,
            &ioStatus
            );

// On récupère le contenu du pointeur sur la pile suivante
irpNextStack = IoGetNextIrpStackLocation(Irp);

// On précise quelle fonction callBack est visé.
irpNextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;

// On envoi au driver de niveau inférieur
ntStatus = IoCallDriver(SlotConnected, Irp);

//  ....     Traitemen retour etc....

return ntstatus;
}

Ensuite coté fonction callback :

NTSTATUS
functionIoctl(
PDEVICE_OBJECT DeviceObject,
PIRP                           Irp
)
{

    PIO_STACK_LOCATION irpStack;
    NTSTATUS                           ntStatus;

// Récupere le contenu du pointeur sur la pile courrante
IrpStack = IoGetCurrentIrpStackLocation(Irp);

switch ( irpStack->Parameters.DeviceIoControl.IoControlCode)
{
    case IOCTL_SEND_DEVICE_INT: // On retrouve l'IOCTL crée au dessus et pour lequel on souhaite effectuer                                                                   //un traitement

          break;

    default :
       Irp->IoStatus.Information = 0;

       break;
}

END:

IoCompleteRequest (Irp, IO_NO_INCREMENT);

return ntStatus;

}

Voila j'espere que c'est assez claire.