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 de WDFDEVICE_INIT.
[in] Options
Um ponteiro para uma estrutura WDF_REMOVE_LOCK_OPTIONS.
Valor de retorno
Nenhum
Observações
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 fazer com que a estrutura adquira um bloqueio de remoção antes de fornecer 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á sofrer falhas devido a IRPs de E/S que chegam após a remoção do objeto do dispositivo da 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 da estrutura.
Para obter mais informações sobre como remover bloqueios, consulte Usando Remover Bloqueios.
Exemplos
Este exemplo de código inicializa uma estrutura de 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
);