KeRemoveQueue 함수(ntifs.h)

KeRemoveQueue 루틴은 호출 스레드에 지정된 큐 개체의 큐에서 제거된 항목에 대한 포인터를 제공하거나 호출자가 큐 개체에서 선택적 시간 제한 간격까지 대기할 수 있도록 합니다.

구문

PLIST_ENTRY KeRemoveQueue(
  [in, out]      PRKQUEUE        Queue,
  [in]           KPROCESSOR_MODE WaitMode,
  [in, optional] PLARGE_INTEGER  Timeout
);

매개 변수

[in, out] Queue

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

[in] WaitMode

호출자가 대기 중인 프로세서 모드로, KernelMode 또는 UserMode일 수 있습니다. 스택의 모든 항목이 IRQL >= DISPATCH_LEVEL 액세스할 수 있는 경우 호출자는 KernelMode를 지정해야 합니다.

[in, optional] Timeout

대기가 만료되는 절대 또는 상대 시간을 100나노초 단위로 지정하는 변수에 대한 포인터입니다. Timeout 값이 음수이면 만료 시간은 현재 시스템 시간을 기준으로 합니다. 그렇지 않으면 절대입니다. 절대 만료 시간은 시스템 시간의 변경 내용을 추적합니다. 상대 만료 시간은 시스템 시간 변경의 영향을 받지 않습니다. 이 포인터는 NULL일 수 있습니다.

반환 값

KeRemoveQueue 는 다음 중 하나를 반환합니다.

  • 지정된 큐 개체에서 큐에서 제거된 항목(사용할 수 있는 경우)에 대한 포인터입니다.
  • STATUS_TIMEOUT 항목을 사용할 수 있게 되기 전에 지정된 시간 제한 간격이 만료된 경우
  • STATUS_USER_APC 호출 스레드의 컨텍스트에서 사용자 모드 APC가 전달된 경우
  • 큐가 실행된 경우 STATUS_ABANDONED

설명

KeRemoveQueue의 호출자는 항목 멤버에 액세스하기 전에 반환 값이 STATUS_TIMEOUT 또는 STATUS_USER_APC 여부를 테스트해야 합니다. NULL에 대해 KeRemoveQueue의 반환 값을 테스트하는 것은 프로그래밍 오류입니다.

Timeout에 0 값을 지정하면 큐가 현재 비어 있는 경우 호출자가 항목을 기다리지 않을 것임을 나타냅니다. **NULL*시간 제한 포인터를 지정하면 호출자가 항목을 무기한 대기할 의향이 있음을 나타냅니다.

WaitMode 매개 변수가 UserMode인 경우 대기 중에 커널 스택을 교환할 수 있습니다. 따라서 호출자는 WaitModeUserMode로 설정된 KeRemoveQueue를 호출할 때 스택에 매개 변수를 전달하려고 시도해서는 안됩니다.

KeRemoveQueue 호출에서 WaitModeKernelMode로 지정하면 호출 스레드의 커널 스택이 교환되지 않고 APC(사용자 모드 비동기 프로시저 호출)가 전달되지 않습니다. 스레드가 IRQL PASSIVE_LEVEL KeRemoveQueue 를 호출할 때 I/O 관리자가 IRP를 완료하는 데 사용하는 것과 같은 커널 모드 APC가 전달되는 것을 방지하지는 않습니다. 이러한 커널 모드 APC를 전달해도 호출 스레드가 큐 개체에서 대기하거나 커널 APC가 실행된 후 항목이 있는 실행을 위해 디스패치되지 않습니다.

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

요구 사항

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

추가 정보

KeInsertHeadQueue

KeInsertQueue