Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le traitement sécurisé des IRPs qui contiennent des codes de contrôle d’E/S dépend de la définition correcte des codes IOCTL et de l’examen attentif des paramètres reçus par le pilote avec l’IRP.
Lorsque vous définissez de nouveaux codes IOCTL, utilisez les règles suivantes :
Spécifiez toujours une valeur FunctionCode égale ou supérieure à 0x800.
Spécifiez toujours une valeur RequiredAccess . Le gestionnaire d’E/S n’envoie pas de dll IOCTL si l’appelant a des droits d’accès insuffisants.
Ne définissez pas de codes IOCTL qui permettent aux appelants de lire ou d’écrire des zones non spécifiques de la mémoire du noyau.
Lors du traitement des codes IOCTL au sein d’un pilote, utilisez les règles suivantes :
Chaque fois que les routines de distribution d’un pilote testent les codes IOCTL reçus, elles doivent toujours tester la valeur entière de 32 bits.
Les pilotes peuvent utiliser IoValidateDeviceIoControlAccess pour effectuer dynamiquement une vérification d’accès plus stricte que celle spécifiée par la valeur RequiredAccess dans la définition du code de contrôle d’E/S.
Ne jamais lire ou écrire plus de données que la mémoire tampon pointée par Irp-AssociatedIrp.SystemBuffer> peut contenir. Par conséquent, vérifiez toujours Parameters.DeviceIoControl.InputBufferLength ou Parameters.DeviceIoControl.OutputBufferLength dans la structure IO_STACK_LOCATION pour déterminer les limites de mémoire tampon.
Toujours mettre à zéro les mémoires tampons allouées par le pilote qui contiendront des données destinées à une application et provenant d'une demande IOCTL. De cette façon, vous ne copierez pas accidentellement des données sensibles dans l’application.
Pour les transferts METHOD_IN_DIRECT et METHOD_OUT_DIRECT, suivez les règles ci-dessus. En outre, recherchez une valeur NULL de retour de MmGetSystemAddressForMdlSafe, ce qui indique que le mappage a échoué ou qu’un tampon de longueur zéro a été fourni.
Pour les transferts METHOD_NEITHER, suivez les règles fournies dans Utilisation sans E/S tamponnée ni directe.