Partager via


KeInsertHeadQueue, fonction (ntifs.h)

La routine KeInsertHeadQueue insère une entrée à la tête de la file d’attente donnée s’il ne peut pas utiliser immédiatement l’entrée pour satisfaire une attente de thread.

Syntaxe

LONG KeInsertHeadQueue(
  [in, out] PRKQUEUE    Queue,
  [in, out] PLIST_ENTRY Entry
);

Paramètres

[in, out] Queue

Pointeur vers un objet de file d’attente initialisé pour lequel l’appelant fournit un stockage résident dans un pool non paginé. Cette structure est définie comme suit :

typedef struct _KQUEUE {
    DISPATCHER_HEADER Header;
    LIST_ENTRY EntryListHead;
    ULONG CurrentCount;
    ULONG MaximumCount;
    LIST_ENTRY ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
Membre Signification
d’en-tête En-tête de file d’attente
EntryListHead Pointeur vers la première entrée dans la file d’attente
CurrentCount Nombre d’entrées dans la file d’attente
MaximumCount Nombre maximal d’entrées que la file d’attente peut contenir
ThreadListHead Pointeur vers la première entrée de la liste de threads

[in, out] Entry

Pointeur vers l’entrée de file d’attente à insérer. Ce pointeur doit être une adresse d’espace système résident.

Valeur de retour

KeInsertHeadQueue retourne l’état de signal précédent de la file d’attente donnée. S’il a été défini sur zéro (non signalé) avant KeInsertHeadQueue a été appelé, KeInsertHeadQueue retourne zéro, ce qui signifie qu’aucune entrée n’a été mise en file d’attente. S’il était différent de zéro (signalé), KeInsertHeadQueue retourne le nombre d’entrées mises en file d’attente avant KeInsertHeadQueue a été appelée.

Remarques

Les entrées à mettre en file d’attente par KeInsertHeadQueue doivent être allouées à partir du pool non paginé. Par exemple, la mémoire des entrées définies par l’appelant peut être allouée avec ExAllocatePoolWithTag. Si l’appelant alloue des entrées d’une taille fixe, la création d’une liste lookaside avec ExInitializeNPagedLookasideList et l’allocation à partir de celle-ci avec ExAllocateFromNPagedLookasideList est plus efficace que d’effectuer des appels fréquents à ExAllocatePoolWithTag, en particulier pour les entrées dont la taille n’est pas multiple de PAGE_SIZE.

Si des threads attendent sur l’objet file d’attente lorsque KeInsertHeadQueue est appelé, l’attente d’un seul thread est satisfaite par cet appel. Le thread est distribué pour l’exécution avec le pointeur d’entrée donné.

Si aucun thread n’attend actuellement sur l’objet file d’attente quand KeInsertHeadQueue est appelé, l’entrée donnée est insérée dans la file d’attente et l’état du signal de l’objet de file d’attente est incrémenté.

Pour plus d’informations sur l’utilisation de files d’attente internes gérées par le pilote, consultez Driver-Managed files d’attente.

Exigences

Exigence Valeur
plateforme cible Universel
d’en-tête ntifs.h (include Ntifs.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
règles de conformité DDI HwStorPortProhibitedDDIs(storport)

Voir aussi

ExAllocateFromNPagedLookasideList

ExAllocatePoolWithTag

ExInitializeNPagedLookasideList

KeInitializeQueue

keInsertQueue

KeRemoveQueue