Taron31
Messages postés199Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention28 février 2008
-
19 juin 2007 à 19:45
cs_moulefrite
Messages postés4Date d'inscriptionmardi 16 mars 2004StatutMembreDernière intervention19 septembre 2008
-
19 sept. 2008 à 16:46
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 ??
cs_moulefrite
Messages postés4Date d'inscriptionmardi 16 mars 2004StatutMembreDernière intervention19 septembre 2008 19 sept. 2008 à 16:46
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 :
// 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);
// 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