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.