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
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) |