Compartilhar via


Função WdfWaitLockAcquire (wdfsync.h)

[Aplica-se a KMDF e UMDF]

O método WdfWaitLockAcquire adquire um bloqueio de espera especificado.

Sintaxe

NTSTATUS WdfWaitLockAcquire(
  [in]           WDFWAITLOCK Lock,
  [in, optional] PLONGLONG   Timeout
);

Parâmetros

[in] Lock

Um identificador para um objeto de bloqueio de espera da estrutura, obtido por uma chamada anterior para WdfWaitLockCreate.

[in, optional] Timeout

Um ponteiro opcional para um valor de tempo limite. O valor de tempo limite é especificado em unidades de tempo do sistema (intervalos de 100 nanossegundos).

Se o ponteiro não for NULL, a estrutura cancelará a tentativa de obter o bloqueio se ele não for concluído dentro do período de tempo limite especificado. Os valores de tempo limite podem ser negativos, positivos ou zero, da seguinte maneira:

  • Se o valor de tempo limite for negativo, o tempo de expiração será relativo à hora atual do sistema.
  • Se o valor de tempo limite for positivo, o tempo de expiração será especificado como um tempo absoluto (que na verdade é relativo a 1º de janeiro de 1601).
  • Se o valor de tempo limite for zero, WdfWaitLockAcquire tentará adquirir o bloqueio e retornará imediatamente, independentemente de ter adquirido o bloqueio ou não.
Os tempos de expiração relativos não são afetados por nenhuma alteração no tempo de sistema que possa ocorrer dentro do período de tempo limite especificado. Os tempos de expiração absolutos refletem as alterações de tempo do sistema.

A estrutura fornece funções de conversão de tempo que convertem valores de tempo em unidades de tempo do sistema.

Se o chamador fornecer um ponteiro NULL , o método aguardará indefinidamente até que ele tenha adquirido o bloqueio.

Retornar valor

WdfWaitLockAcquire pode retornar os seguintes valores NTSTATUS:

Código de retorno Descrição
STATUS_SUCCESS
O chamador adquiriu o bloqueio de espera.
STATUS_TIMEOUT
O intervalo de tempo limite especificado expirou antes da aquisição do bloqueio.
 

Observe que NT_SUCCESS(status) é igual a TRUE para todos esses valores status.

O chamador não precisará marcar o valor retornado se o ponteiro Timeout for NULL, pois nesse caso WdfWaitLockAcquire retornará somente depois de adquirir o bloqueio.

Um bug marcar ocorrerá se o driver fornecer um identificador de objeto inválido.

Comentários

O método WdfWaitLockAcquire não retorna até que adquira o bloqueio de espera ou até que o período de tempo limite expire.

WdfWaitLockAcquire chama KeEnterCriticalRegion antes de adquirir o bloqueio de espera. Como resultado, quando o método retorna, as APCs de kernel normais são desabilitadas. WdfWaitLockAcquire não altera o IRQL do chamador.

Se o ponteiro Timeout for NULL ou se o valor de tempo limite não for zero, WdfWaitLockAcquire deverá ser chamado em IRQL = PASSIVE_LEVEL.

Se o valor de tempo limite for zero, WdfWaitLockAcquire deverá ser chamado em IRQL < DISPATCH_LEVEL. Observe que isso está em desacordo com o arquivo de cabeçalho (wdfsync.h), que indica que esse método pode ser chamado em DISPATCH_LEVEL.

Para obter mais informações sobre bloqueios de espera, consulte Técnicas de sincronização para drivers de Framework-Based.

Exemplos

O exemplo de código a seguir adquire um bloqueio de espera, adiciona um objeto de dispositivo a uma coleção de objetos e libera o bloqueio de espera.

WdfWaitLockAcquire(
                   FilterDeviceCollectionLock,
                   NULL
                   );
status = WdfCollectionAdd(
                          FilterDeviceCollection,
                          deviceHandle
                          );
if (!NT_SUCCESS(status)) {
    addFailed = TRUE;
}
WdfWaitLockRelease(FilterDeviceCollectionLock);

Requisitos

Requisito Valor
Plataforma de Destino Universal
Versão mínima do KMDF 1.0
Versão mínima do UMDF 2,0
Cabeçalho wdfsync.h (inclua Wdf.h)
Biblioteca Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL Consulte a seção Observações.
Regras de conformidade de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfWaitlock(kmdf), WdfWaitlockRelease(kmdf)

Confira também

KeEnterCriticalRegion

WdfWaitLockCreate

WdfWaitLockRelease