Função WdfDeviceInitSetRemoveLockOptions (wdfdevice.h)
[Aplica-se somente ao KMDF]
O método WdfDeviceInitSetRemoveLockOptions faz com que a estrutura adquira um bloqueio de remoção antes de entregar um IRP de qualquer tipo para o driver.
Sintaxe
void WdfDeviceInitSetRemoveLockOptions(
[in] PWDFDEVICE_INIT DeviceInit,
[in] PWDF_REMOVE_LOCK_OPTIONS Options
);
Parâmetros
[in] DeviceInit
Um ponteiro fornecido pelo chamador para uma estrutura WDFDEVICE_INIT .
[in] Options
Um ponteiro para uma estrutura WDF_REMOVE_LOCK_OPTIONS .
Retornar valor
Nenhum
Comentários
Por padrão, a estrutura adquire um bloqueio de remoção antes de entregar IRPs dos seguintes tipos principais ao driver:
- IRP_MJ_PNP
- IRP_MJ_POWER
- IRP_MJ_SYSTEM_CONTROL
Quando o IRP é concluído, a estrutura libera o bloqueio de remoção.
A partir do KMDF 1.11, o driver pode opcionalmente chamar WdfDeviceInitSetRemoveLockOptions para fazer com que a estrutura adquira um bloqueio de remoção antes de entregar todos os tipos de IRP, não apenas aqueles listados acima.
Se o driver tiver clientes no modo kernel que enviam E/S sem sincronização com o estado PnP do seu dispositivo, você poderá enfrentar falhas devido à chegada de IRPs de E/S após a remoção do objeto do dispositivo de estrutura. Nesse caso, você pode chamar WdfDeviceInitSetRemoveLockOptions. Em seguida, quando um cliente envia uma solicitação de E/S para seu dispositivo:
- Se o dispositivo ainda não tiver sido removido, o bloqueio de remoção será adquirido com êxito e a solicitação será entregue. Se a remoção ocorrer mais tarde, a estrutura chamará IoReleaseRemoveLockAndWait , que bloqueia até que todas as aquisições de bloqueio bem-sucedidas sejam liberadas (as solicitações de E/S são concluídas).
- Se o dispositivo já tiver processado IRP_MN_REMOVE_DEVICE, mas houver uma referência pendente a um objeto de dispositivo WDM impedindo que o dispositivo seja liberado, o bloqueio de remoção não será adquirido e a estrutura concluirá a solicitação imediatamente.
Depois que um driver chama WdfDeviceInitSetRemoveLockOptions, a configuração permanece em vigor durante o tempo de vida do objeto do dispositivo de estrutura.
Para obter mais informações sobre como remover bloqueios, consulte Usando Remover Bloqueios.
Exemplos
Este exemplo de código inicializa uma estrutura WDF_REMOVE_LOCK_OPTIONS e chama WdfDeviceInitSetRemoveLockOptions.
WDF_REMOVE_LOCK_OPTIONS RemoveLockOptions;
WDF_REMOVE_LOCK_OPTIONS_INIT(
&RemoveLockOptions,
WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO
);
WdfDeviceInitSetRemoveLockOptions(
DeviceInit,
&RemoveLockOptions
);
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Universal |
Versão mínima do KMDF | 1.11 |
Cabeçalho | wdfdevice.h (inclua Wdf.h) |
Biblioteca | Wdf01000.sys (consulte Controle de versão da biblioteca de estrutura.) |
IRQL | <= DISPATCH_LEVEL |
Regras de conformidade da DDI | DriverCreate(kmdf) |