Função ExQueueWorkItem (wdm.h)
ExQueueWorkItem insere um determinado item de trabalho em uma fila da qual um thread de trabalho do sistema remove o item e dá controle à rotina que o chamador forneceu para ExInitializeWorkItem.
Aviso
Use essa rotina com extrema cautela. Consulte a seção comentários abaixo.
Sintaxe
void ExQueueWorkItem(
[in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
[in] WORK_QUEUE_TYPE QueueType
);
Parâmetros
[in, out] WorkItem
Ponteiro para o item de trabalho. Este item de trabalho deve ter sido inicializado por uma chamada anterior para ExInitializeWorkItem .
[in] QueueType
Especifica a fila na qual o item de trabalho apontado por WorkItem deve ser inserido. QueueType pode ser um dos seguintes:
Valor | Significado |
---|---|
CriticalWorkQueue | Insira o WorkItem na fila da qual um thread do sistema com um atributo de prioridade em tempo real processará o item de trabalho. |
DelayedWorkQueue | Insira o WorkItem na fila da qual um thread do sistema com um atributo de prioridade variável processará o item de trabalho. |
O valor QueueType HyperCriticalWorkQueue é reservado para uso do sistema.
Valor de retorno
Nenhum
Observações
Os drivers de dispositivo devem usar IoQueueWorkItem em vez de ExQueueWorkItem . Os drivers devem usar ExQueueWorkItem e o ExInitializeWorkItem associado, somente nos casos em que o item de trabalho especificado não está associado a um objeto de dispositivo ou pilha de dispositivos. Em todos os outros casos, os drivers devem usar IoAllocateWorkItem, IoFreeWorkIteme IoQueueWorkItem porque somente essas rotinas garantem que o objeto de dispositivo associado ao item de trabalho especificado permaneça disponível até que o item de trabalho seja processado.
A rotina de retorno de chamada especificada no parâmetro de Rotina para ExInitializeWorkItem é chamada em um contexto do sistema no PASSIVE_LEVEL IRQL. Essa rotina fornecida pelo chamador é responsável por liberar o item de trabalho quando ele não é mais necessário chamando ExFreePool ou ExFreePoolWithTag.
Os threads de trabalho do sistema são um recurso limitado. Os drivers não devem reservar permanentemente um item de trabalho para uso do driver. Os itens de trabalho são projetados para operações que são concluídas rapidamente. Os drivers devem liberar todos os itens de trabalho que alocarem assim que possível.
Um driver não deve esperar que sua rotina de retorno de chamada conclua uma operação se ele já estiver segurando um objeto de sincronização e tentar adquirir outro. Para evitar deadlock, um driver deve liberar semáforos, mutexes, variáveis de recurso e assim por diante, antes de chamar ExQueueWorkItem.
O valor de QueueType determina a prioridade de runtime na qual a rotina de retorno de chamada é executada, da seguinte maneira:
Se o retorno de chamada for executado no thread do sistema com um atributo de prioridade em tempo real, a rotina de retorno de chamada não poderá ser preemptada, exceto por threads com prioridades mais altas em tempo real.
Se o retorno de chamada for executado no thread do sistema com um atributo de prioridade variável, o retorno de chamada poderá ser antecipado por threads com prioridades mais altas e em tempo real, e o retorno de chamada será agendado para executar round robin com outros threads da mesma prioridade para um quantum cada um.
Os threads em qualquer prioridade permanecem interrompíveis.
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino | Universal |
cabeçalho | wdm.h (include Wdm.h, Ntifs.h, Fltkernel.h) |
biblioteca | NtosKrnl.lib |
de DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |