Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 quaisquer bytes não inicializados.
No exemplo a seguir, um driver retorna dados inúteis nos 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 o buffer inteiro, esse IOCTL retorna dados não inicializados para o chamador.
Alguns drivers usam o campo Informações para retornar códigos que fornecem detalhes adicionais sobre solicitações de E/S. Antes de fazer isso, esses drivers devem verificar os flags IRP para garantir que IRP_INPUT_OPERATION não esteja definido. Quando esse sinalizador não é 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. Neste caso. o condutor pode utilizar com segurança o campo Informação para devolver o seu próprio código.