ExQueueWorkItem 함수(wdm.h)
ExQueueWorkItem 은 시스템 작업자 스레드가 항목을 제거하고 호출자가 ExInitializeWorkItem에 제공한 루틴을 제어하는 큐에 지정된 작업 항목을 삽입합니다.
경고
이 루틴은 매우 주의해서 사용합니다. 아래의 설명 섹션을 참조하세요.
구문
void ExQueueWorkItem(
[in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
[in] WORK_QUEUE_TYPE QueueType
);
매개 변수
[in, out] WorkItem
작업 항목에 대한 포인터입니다. 이 작업 항목은 ExInitializeWorkItem에 대한 이전 호출을 통해 초기화되어야 합니다.
[in] QueueType
WorkItem에서 가리키는 작업 항목을 삽입할 큐를 지정합니다. QueueType 은 다음 중 하나일 수 있습니다.
값 | 의미 |
---|---|
CriticalWorkQueue | 실시간 우선 순위 특성이 있는 시스템 스레드가 작업 항목을 처리할 큐에 WorkItem 을 삽입합니다. |
DelayedWorkQueue | 변수 우선 순위 특성이 있는 시스템 스레드가 작업 항목을 처리하는 큐에 WorkItem 을 삽입합니다. |
QueueType 값 HyperCriticalWorkQueue는 시스템 사용을 위해 예약되어 있습니다.
반환 값
없음
설명
디바이스 드라이버는 ExQueueWorkItem 대신 IoQueueWorkItem을 사용해야 합니다. 드라이버는 지정된 작업 항목이 디바이스 개체 또는 디바이스 스택과 연결되지 않은 경우에만 ExQueueWorkItem 및 연결된 ExInitializeWorkItem을 사용해야 합니다. 다른 모든 경우에서 드라이버는 IoAllocateWorkItem, IoFreeWorkItem 및 IoQueueWorkItem 을 사용해야 합니다. 이러한 루틴만 작업 항목이 처리될 때까지 지정된 작업 항목과 연결된 디바이스 개체를 계속 사용할 수 있도록 하기 때문입니다.
ExInitializeWorkItem에 대한 Routine 매개 변수에 지정된 콜백 루틴은 IRQL PASSIVE_LEVEL 시스템 컨텍스트에서 호출됩니다. 이 호출자 제공 루틴은 ExFreePool 또는 ExFreePoolWithTag를 호출하여 더 이상 필요하지 않은 경우 작업 항목을 해제해야 합니다.
시스템 작업자 스레드는 제한된 리소스입니다. 드라이버는 드라이버 사용을 위해 작업 항목을 영구적으로 예약해서는 안됩니다. 작업 항목은 신속하게 완료되는 작업을 위해 설계되었습니다. 드라이버는 가능한 한 빨리 할당하는 작업 항목을 해제해야 합니다.
드라이버는 이미 하나의 동기화 개체를 보유하고 있고 다른 동기화 개체를 획득하려고 시도할 수 있는 경우 콜백 루틴이 작업을 완료할 때까지 기다리지 않아야 합니다. 교착 상태를 방지하려면 드라이버는 ExQueueWorkItem을 호출하기 전에 현재 보유한 세마포, 뮤텍스, 리소스 변수 등을 해제해야 합니다.
QueueType 값은 다음과 같이 콜백 루틴이 실행되는 런타임 우선 순위를 결정합니다.
콜백이 실시간 우선 순위 특성이 있는 시스템 스레드에서 실행되는 경우 실시간 우선 순위가 높은 스레드를 제외하고 콜백 루틴을 선점할 수 없습니다.
콜백이 변수 우선 순위 특성을 사용하여 시스템 스레드에서 실행되는 경우 더 높은 변수 및 실시간 우선 순위가 있는 스레드에서 콜백을 선점할 수 있으며 콜백은 각각 양자에 대해 동일한 우선 순위의 다른 스레드와 함께 라운드 로빈을 실행하도록 예약됩니다.
두 우선 순위의 스레드는 중단 가능한 상태로 유지됩니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | wdm.h(Wdm.h, Ntifs.h, Fltkernel.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |