Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.