structure DRIVER_OBJECT (wdm.h)
Chaque objet de pilote représente l’image d’un pilote en mode noyau chargé. Un pointeur vers l’objet pilote est un paramètre d’entrée vers l'DriverEntryd’un pilote, AddDeviceet facultatif Réinitialiser routines et à sa routine Décharger routine, le cas échéant.
Un objet de pilote est partiellement opaque. Les enregistreurs de pilotes doivent connaître certains membres d’un objet pilote pour initialiser un pilote et le décharger si le pilote est déchargé. Les membres suivants de l’objet de pilote sont accessibles aux pilotes.
Syntaxe
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
Membres
Type
Définit le membre CSHORTType.
Size
Définit le membre CSHORT Size.
DeviceObject
Pointeur vers les objets d’appareil créés par le pilote. Ce membre est automatiquement mis à jour lorsque le pilote appelle IoCreateDevice correctement. Un pilote peut utiliser ce membre et le NextDevice membre de DEVICE_OBJECT pour parcourir une liste de tous les objets d’appareil créés par le pilote.
Flags
Définit le membre ULONG Flags.
DriverStart
Définit le membre PVOIDDriverStart.
DriverSize
Définit le membre ULONGDriverSize.
DriverSection
Définit le membre PVOIDDriverSection.
DriverExtension
Pointeur vers l’extension du pilote. Le seul membre accessible de l’extension de pilote est DriverExtension->AddDevice, dans lequel la routine DriverEntry d’un pilote stocke la routine AddDevice du pilote.
DriverName
Définit le membre UNICODE_STRINGDriverName.
HardwareDatabase
Pointeur vers le chemin \Registry\Machine\Hardware vers les informations de configuration matérielle dans le Registre.
FastIoDispatch
Pointeur vers une structure définissant les points d’entrée d’E/S rapides du pilote. Ce membre est utilisé uniquement par les disques FSD et les pilotes de transport réseau.
DriverInit
Point d’entrée de la routine DriverEntry, qui est configuré par le gestionnaire d’E/S.
DriverStartIo
Point d’entrée de la routine StartIo du pilote, le cas échéant, défini par la routine DriverEntry lors de l’initialisation du pilote. Si aucun pilote n’a routine StartIo, ce membre est NULL.
DriverUnload
Point d’entrée de la routine Décharger du pilote, le cas échéant, défini par la routine DriverEntry lors de l’initialisation du pilote. Si un pilote n’a pas de routine décharger, ce membre est NULL.
MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]
Table de répartition composée d’un tableau de points d’entrée pour les routines DispatchXxx du pilote. Les valeurs d’index du tableau sont les valeurs IRP_MJ_XXX représentant chaque code de fonction principal IRP . Chaque pilote doit définir des points d’entrée dans ce tableau pour le IRP_MJ_XXX demandes que le pilote gère. Pour plus d’informations, consultez Écriture de routines de répartition.
Pour aider 'analyse du code pour les pilotes, le vérificateur de pilotes statiques (SDV) et d’autres outils de vérification, chaque routine DispatchXxx est déclarée à l’aide du type DRIVER_DISPATCH, comme illustré dans cet exemple de code :
DRIVER_DISPATCH DispatchXxx;
Ensuite, la routine de rappel est implémentée comme suit :
_Use_decl_annotations_
NTSTATUS
DispatchXxx(
struct _DEVICE_OBJECT *DeviceObject,
struct _IRP *Irp
)
{
// Function body
}
Le type de fonction DRIVER_DISPATCH est défini dans le fichier d’en-tête Wdm.h. Pour identifier plus précisément les erreurs lorsque vous exécutez les outils d’analyse du code, veillez à ajouter l'_Use_decl_annotations
_ annotation à votre définition de fonction. L’annotation _Use_decl_annotations_
garantit que les annotations appliquées au type de fonction DRIVER_DISPATCH dans le fichier d’en-tête sont utilisées. Pour plus d’informations sur les exigences relatives aux déclarations de fonction, consultez déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes WDM. Pour plus d’informations sur _Use_decl_annotations_
, consultez annoter le comportement de la fonction.
Remarques
La routine d’initialisation de chaque pilote en mode noyau doit être nommée DriverEntry afin que le système charge automatiquement le pilote. Si le nom de cette routine est autre chose, l’enregistreur de pilotes doit définir le nom de la routine d’initialisation pour l’éditeur de liens ; sinon, le chargeur système ou le gestionnaire d’E/S ne trouve pas l’adresse de transfert du pilote. Les noms d’autres routines de pilotes standard peuvent être choisis à la discrétion de l’enregistreur de pilotes.
Un pilote doit définir son DispatchXxx points d’entrée dans l’objet pilote transmis à la routine DriverEntry lors du chargement du pilote. Un pilote de périphérique doit définir un ou plusieurs DispatchXxx points d’entrée pour le IRP_MJ_XXX que tout pilote du même type d’appareil est requis pour gérer. Un pilote de niveau supérieur doit définir un ou plusieurs DispatchXxx points d’entrée pour tous les IRP_MJ_XXX qu’il doit transmettre au pilote de périphérique sous-jacent. Sinon, un pilote n’est pas envoyé d’IRPs pour une IRP_MJ_XXX pour laquelle il ne configure pas de routine DispatchXxx dans l’objet du pilote. Pour plus d’informations sur l’ensemble de IRP_MJ_XXX que les pilotes pour différents types d’appareils sous-jacents doivent être gérés, consultez codes de fonction principaux IRP.
La routine DriverEntry définit également les AddDevicedu pilote, StartIo et/ou Décharger points d’entrée, le cas échéant, dans l’objet pilote.
La chaîne HardwareDatabase peut être utilisée par les pilotes de périphérique pour obtenir des informations de configuration matérielle à partir du Registre lorsque le pilote est chargé. Un pilote reçoit un accès en lecture seule à cette chaîne.
L’entrée RegistryPath à la routine DriverEnt ry pointe vers la routine \Registry\Machine\System\CurrentControlSet\Services\DriverName, où l’entrée de valeur de DriverName identifie le pilote. Comme pour l'HardwareDatabase dans l’objet du pilote d’entrée, un pilote reçoit un accès en lecture seule à cette chaîne.
Les membres non documentés au sein d’un objet de pilote doivent être considérés comme inaccessibles. Les pilotes avec dépendances sur les emplacements des membres d’objet ou sur l’accès aux membres non documentés peuvent ne pas rester portables et interopérables avec d’autres pilotes au fil du temps.
Exigences
Exigence | Valeur |
---|---|
d’en-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |