Compartilhar via


IOCTL_STORAGE_PERSISTENT_RESERVE_IN 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 exige que o chamador tenha acesso de leitura 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, exigindo que um identificador de dispositivo tenha permissões de leitura para emitir o comando Reserva Persistente.

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_IN. ServiceAction pode ser um dos seguintes:

  • RESERVATION_ACTION_READ_KEYS
  • RESERVATION_ACTION_READ_RESERVATIONS

PR_IN. O tamanho da alocação é o tamanho (em bytes) do buffer alocado para a lista de parâmetros retornada.

Comprimento do buffer de entrada

O comprimento do buffer de entrada, em bytes.

Buffer de saída

Para PR_IN. ServiceAction = RESERVATION_ACTION_READ_KEYS, o buffer de saída contém uma estrutura de PRI_REGISTRATION_LIST e deve ser pelo menos sizeof(PRI_REGISTRATION_LIST).

Para PR_IN. ServiceAction = RESERVATION_ACTION_READ_RESERVATIONS, o buffer de saída contém uma estrutura PRI_RESERVATION_LIST e deve ser pelo menos sizeof(PRI_RESERVATION_LIST).

Se o buffer alocado for muito pequeno para retornar todos os dados de Reserva Persistente, o êxito será retornado e o tamanho necessário será retornado na lista de parâmetros campo AdditionalLength.

Comprimento do buffer de saída

O comprimento do buffer de saída, em bytes.

Bloco de status

O campo informações de é definido como o tamanho do buffer de saída. Para ServiceAction = RESERVATION_ACTION_READ_KEYS, o buffer de saída é uma estrutura PRI_REGISTRATION_LIST. Para ServiceAction = RESERVATION_ACTION_READ_RESERVATIONS, o buffer de saída é uma estrutura PRI_REGISTRATION_LIST.

O campo status de é definido como um dos seguintes:

Valor Significado
STATUS_BUFFER_OVERFLOW (ERROR_MORE_DATA) O buffer de saída é muito pequeno para manter a Reserva Persistente nos dados. O campo AdditionalLength do buffer de saída conterá o tamanho dos dados a serem retornados.
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_IN) 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 ou saída não está alinhado corretamente para o dispositivo ou adaptador. Esse status só poderia ser retornado quando um driver envia um IOCTL para a pilha de armazenamento. Esse status não será retornado quando um aplicativo de modo de usuário enviar 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 De reserva persistente.
STATUS_SUCCESS A operação foi bem-sucedida.

Requisitos

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