Partilhar via


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 SCSI Primary Commands – 2 (SPC-2). A interface IOCTL requer 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 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 Persistent Reserve Out.

Código principal

IRP_MJ_DEVICE_CONTROL

Buffer de entrada

O buffer em > 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 de destino e o adaptador.

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 de Informações do está 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 é suportado pelos 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. Esse status só pode ser retornado quando um driver envia um IOCTL para a pilha de armazenamento. Esse status não é retornado 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 Persistent Reserve Out.
STATUS_SUCCESS A operação foi bem-sucedida.

Requisitos

Requisito Valor
cabeçalho ntddstor.h (include Ntddstor.h)