Une routine DispatchCreateClose unique
De nombreux conducteurs, en particulier les conducteurs de niveau inférieur dans une chaîne de conducteurs en couches, doivent simplement établir leur existence à la réception d’une demande de création et doivent simplement accuser réception d’une demande de clôture .
Par exemple, un pilote de port pour un contrôleur d’appareil avec un ou plusieurs pilotes de classe étroitement couplés qui appellent IoGetDeviceObjectPointer peut avoir une routine DispatchCreateClose minimale. La routine peut ne rien faire de plus que terminer l’IRP comme suit :
: :
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
Cette routine DispatchCreateClose minimale définit le membre Information du bloc d’E/S status sur zéro, indiquant que l’objet fichier est ouvert pour une demande de création ; Les informations n’ont aucune signification pour une demande de clôture. La routine définit le membre Status sur STATUS_SUCCESS et retourne également cette valeur status, indiquant que le pilote est prêt à accepter les demandes d’E/S.
Cette routine DispatchCreateClose minimale termine la création d’IRP sans augmenter la priorité de l’initiateur de l’IRP (IO_NO_INCREMENT), car l’expéditeur est supposé attendre un intervalle indéterminé, mais très petit, pour que la demande se termine.
La quantité de travail d’une routine DispatchCreateClose dépend en partie de la nature de l’appareil du conducteur ou de l’appareil sous-jacent et en partie de la conception du pilote. Si un pilote effectue des opérations très différentes pour créer et fermer des demandes, il doit gérer ces demandes dans des routines DispatchCreate et DispatchClose distinctes.
Pour gérer une demande de création afin d’ouvrir un objet de fichier représentant un appareil logique ou physique, un pilote de niveau supérieur doit effectuer les opérations suivantes :
Appelez IoGetCurrentIrpStackLocation pour obtenir un pointeur vers son emplacement de pile d’E/S dans l’IRP.
Vérifiez FileObject. FileName dans l’emplacement de la pile d’E/S et complétez l’IRP avec STATUS_SUCCESS si la chaîne Unicode dans FileName a une longueur nulle ; sinon, complétez l’IRP avec STATUS_INVALID_PARAMETER.
En suivant les étapes précédentes, aucune tentative d’ouverture d’un pseudofichier sur un appareil ne peut entraîner de problèmes ultérieurement. Par exemple, cela empêche les tentatives d’ouverture d’un \\device\parallel0\temp.dat inexistant.