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. Não inicializar um buffer pode resultar em dados de lixo em bytes não inicializados.

No exemplo a seguir, um driver retorna lixo 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 como 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 a uma solicitação em buffer. Como o sistema dá suporte à rotina 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 disso, esses drivers devem marcar 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.