KeInsertHeadQueue 함수(ntifs.h)

입력을 즉시 사용하여 스레드 대기를 충족할 수 없는 경우 KeInsertHeadQueue 루틴은 지정된 큐의 헤드에 항목을 삽입합니다.

구문

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

매개 변수

[in, out] Queue

호출자가 비페이지 풀에 상주 스토리지를 제공하는 초기화된 큐 개체에 대한 포인터입니다. 이 구조체는 다음과 같이 정의됩니다.

typedef struct _KQUEUE {
    DISPATCHER_HEADER Header;
    LIST_ENTRY EntryListHead;
    ULONG CurrentCount;
    ULONG MaximumCount;
    LIST_ENTRY ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
멤버 의미
머리글 큐 헤더
EntryListHead 큐의 첫 번째 항목에 대한 포인터
CurrentCount 큐의 항목 수
MaximumCount 큐에 포함될 수 있는 최대 항목 수
ThreadListHead 스레드 목록의 첫 번째 항목에 대한 포인터

[in, out] Entry

삽입할 큐 항목에 대한 포인터입니다. 이 포인터는 상주 시스템 공간 주소여야 합니다.

반환 값

KeInsertHeadQueue 는 지정된 큐의 이전 신호 상태를 반환합니다. KeInsertHeadQueue가 호출되기 전에 0(신호되지 않음)으로 설정된 경우 KeInsertHeadQueue는 0을 반환하므로 항목이 큐에 대기되지 않았습니다. 0이 아닌 경우(신호) KeInsertHeadQueueKeInsertHeadQueue 가 호출되기 전에 큐에 대기된 항목 수를 반환합니다.

설명

KeInsertHeadQueue에서 큐에 대기할 항목은 비페이지 풀에서 할당되어야 합니다. 예를 들어 호출자 정의 항목에 대한 메모리는 ExAllocatePoolWithTag를 사용하여 할당할 수 있습니다. 호출자가 고정 크기의 항목을 할당하는 경우 ExInitializeNPagedLookasideList 를 사용하여 lookaside 목록을 만들고 ExAllocateFromNPagedLookasideList 를 사용하여 할당하는 것이 특히 크기가 PAGE_SIZE 배수가 아닌 항목에 대해 ExAllocatePoolWithTag를 자주 호출하는 것보다 더 효율적입니다.

KeInsertHeadQueue를 호출할 때 큐 개체에서 대기 중인 스레드가 있으면 이 호출을 통해 단일 스레드의 대기가 충족됩니다. 스레드는 지정된 Entry 포인터를 사용하여 실행을 위해 디스패치 됩니다 .

KeInsertHeadQueue가 호출될 때 현재 큐 개체에서 대기 중인 스레드가 없는 경우 지정된 항목이 큐에 삽입되고 큐 개체의 신호 상태가 증가합니다.

드라이버 관리 내부 큐 사용에 대한 자세한 내용은 드라이버 관리 큐를 참조하세요.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport)

추가 정보

ExAllocateFromNPagedLookasideList

ExAllocatePoolWithTag

ExInitializeNPagedLookasideList

KeInitializeQueue

KeInsertQueue

KeRemoveQueue