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 호출될 때 현재 큐 개체에서 대기 중인 스레드가 없는 경우 지정된 항목이 큐에 삽입되고 큐 개체의 신호 상태가 증가합니다.
드라이버 관리 내부 큐를 사용하는 방법에 대한 자세한 내용은 Driver-Managed 큐참조하세요.
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | 보편적 |
헤더 | ntifs.h(Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs(storport) |
참고 항목
ExAllocateFromNPagedLookasideList