Compartilhar via


Falha ao inicializar buffers de saída

Os drivers devem inicializar todos os buffers de saída com zeros antes de devolvê-los ao chamador. A falha na inicialização de um buffer pode resultar em dados inválidos em bytes não inicializados.

No exemplo a seguir, um driver retorna lixo de código em bytes não utilizados.

   case IOCTL_GET_NAME: {
      ...
      ...
      outputBufferLength = 
         ioStack->Parameters.DeviceIoControl.OutputBufferLength;
      outputBuffer = (PGET_NAME) Irp->AssociatedIrp.SystemBuffer;
 
      if (outputBufferLength >= sizeof(GET_NAME)) {
         length = outputBufferLength - sizeof(GET_NAME);
 
         ntStatus = IoGetDeviceProperty(
                        DeviceExtension->PhysicalDeviceObject,
                        DevicePropertyDriverKeyName,
                        length,
                        outputBuffer->DriverKeyName,
                        &length);

         outputBuffer->ActualLength =
                        length + sizeof(GET_NAME);

         Irp->IoStatus.Information = outputBufferLength;
 
      } else {
         ntStatus = STATUS_BUFFER_TOO_SMALL;
      }

Definir IoStatus.Information para o tamanho do buffer de saída faz com que todo o buffer de saída seja retornado ao chamador. O gerenciador de E/S não inicializa os dados além do tamanho do buffer de entrada: os buffers de entrada e saída se sobrepõem para uma solicitação em buffer. Como a rotina de suporte do sistema IoGetDeviceProperty não grava todo o buffer, esse IOCTL retorna dados não inicializados para o chamador.

Alguns drivers usam o campo Informações para retornar códigos que fornecem detalhes extras sobre solicitações de E/S. Antes de fazer isso, esses drivers devem verificar os sinalizadores IRP para garantir que IRP_INPUT_OPERATION não esteja definido. Quando esse sinalizador não está definido, o IOCTL ou FSCTL não tem um buffer de saída, portanto, o campo Informações não precisa fornecer um tamanho de buffer. Nesse caso. o driver pode usar com segurança o campo Informações para retornar seu próprio código.