IOCTL_STORAGE_PERSISTENT_RESERVE_OUT IOCTL (ntddstor.h)
O driver de classe de armazenamento genérico (classpnp.sys) expõe uma interface IOCTL (controle de E/S) para emitir comandos de Reserva Persistente. O comportamento do dispositivo de armazenamento quando um comando de Reserva Persistente é recebido é descrito na especificação comandos primários SCSI – 2 (SPC-2). A interface IOCTL exige que o chamador tenha acesso de leitura/gravação ao dispositivo físico para comandos de Reserva Persistente. Aplicativos, serviços e drivers no modo kernel do usuário podem usar esse IOCTL para controlar reservas persistentes. Se chamado de um driver, esse IOCTL deve ser chamado de um thread em execução no IRQL < DISPATCH_LEVEL. Esse IOCTL é definido com FILE_READ_ACCESS e FILE_WRITE_ACCESS, exigindo que um identificador de dispositivo tenha permissões de leitura e gravação para emitir o comando Reserva Persistente.
Código principal
Buffer de entrada
O buffer em Irp-AssociatedIrp.SystemBuffer> contém uma estrutura PERSISTENT_RESERVE_COMMAND. Você deve alocar o buffer do pool nãopagado e deve alinhá-lo corretamente para o dispositivo e o adaptador de destino.
PR_OUT. ServiceAction pode ser um dos seguintes:
- RESERVATION_ACTION_REGISTER
- RESERVATION_ACTION_RESERVE
- RESERVATION_ACTION_RELEASE
- RESERVATION_ACTION_CLEAR
- RESERVATION_ACTION_PREEMPT
- RESERVATION_ACTION_PREEMPT_ABORT
- RESERVATION_ACTION_REGISTER_IGNORE_EXISTING
PR_OUT. O escopo pode ser um dos seguintes:
- RESERVATION_SCOPE_LU
- RESERVATION_SCOPE_ELEMENT
PR_OUT. O tipo pode ser um dos seguintes:
- RESERVATION_TYPE_WRITE_EXCLUSIVE
- RESERVATION_TYPE_EXCLUSIVE
- RESERVATION_TYPE_WRITE_EXCLUSIVE_REGISTRANTS
- RESERVATION_TYPE_EXCLUSIVE_REGISTRANTS
PR_OUT. ParameterList é usado para manter a estrutura PRO_PARAMETER_LIST . Essa estrutura é necessária e deve ser contígua com o restante da estrutura PERSISTENT_RESERVE_COMMAND .
Comprimento do buffer de entrada
O comprimento de uma estrutura PERSISTENT_RESERVE_COMMAND .
Buffer de saída
Nenhum.
Comprimento do buffer de saída
Nenhum.
Bloco de status
O campo Informações é definido como zero.
O campo Status é definido como um dos valores a seguir.
Valor | Significado |
---|---|
STATUS_DEVICE_BUSY (ERROR_BUSY) | O comando falhou devido a um conflito de reserva (para obter mais informações, consulte a especificação ScSI Primary Commands – 2 (SPC-2). |
STATUS_INFO_LENGTH_MISMATCH | O comprimento do buffer de entrada para o IOCTL é menor que sizeof(PERSISTENT_RESERVE_COMMAND) ou o tamanho especificado na estrutura de dados PERSISTENT_RESERVE_COMMAND é menor que sizeof(PERSISTENT_RESERVE_COMMAND). |
STATUS_INVALID_DEVICE_REQUEST (ERROR_INVALID_FUNCTION) | O código de controle de E/S (IOCTL_STORAGE_PERSISTENT_RESERVE_OUT) não é compatível com os drivers de armazenamento. |
STATUS_INVALID_PARAMETER (ERROR_INVALID_PARAMETER) | A estrutura do buffer de entrada é dimensionada ou preenchida incorretamente. |
STATUS_INVALID_USER_BUFFER (ERROR_INVALID_USER_BUFFER) | O buffer de entrada não está alinhado corretamente para o dispositivo ou adaptador. Essa status só pode ser retornada quando um driver envia um IOCTL para a pilha de armazenamento. Essa status não é retornada quando um aplicativo de modo de usuário envia o IOCTL por meio da API DeviceIoControl, pois o Gerenciador de E/S alinha automaticamente os buffers. |
STATUS_IO_DEVICE_ERROR (ERROR_IO_DEVICE) | O dispositivo não dá suporte ao comando Reserva Persistente. |
STATUS_SUCCESS | A operação foi bem-sucedida. |
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | ntddstor.h (inclua Ntddstor.h) |