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.
O processamento seguro de IRPs que contêm códigos de controle de E/S depende da definição adequada de códigos IOCTL e do exame cuidadoso dos parâmetros que o driver recebe com o IRP.
Ao definir novos códigos IOCTL, use as seguintes regras:
Sempre especifique um valor FunctionCode que seja igual ou maior que 0x800.
Sempre especifique um valor RequiredAccess . O gerente de E/S não envia IOCTLs se o chamador tiver direitos de acesso insuficientes.
Não defina códigos IOCTL que permitam aos chamadores ler ou escrever áreas não específicas da memória do kernel.
Ao processar códigos IOCTL dentro de um driver, use as seguintes regras:
Sempre que o teste de rotinas de despacho de um motorista recebeu códigos IOCTL, eles sempre devem testar todo o valor de 32 bits.
Os drivers podem usar IoValidateDeviceIoControlAccess para executar dinamicamente uma verificação de acesso mais rigorosa do que a especificada pelo valor RequiredAccess na definição do código de controle de E/S.
Nunca leia ou grave mais dados do que o buffer apontado por Irp-AssociatedIrp.SystemBuffer> pode conter. Portanto, sempre verifique Parameters.DeviceIoControl.InputBufferLength ou Parameters.DeviceIoControl.OutputBufferLength na estrutura IO_STACK_LOCATION para determinar os limites de buffer.
Certifique-se de inicializar sempre os buffers alocados pelo driver, que conterão dados destinados a uma aplicação que originou uma solicitação IOCTL. Dessa forma, você não copiará acidentalmente dados confidenciais para o aplicativo.
Para transferências METHOD_IN_DIRECT e METHOD_OUT_DIRECT, siga as regras acima. Além disso, verifique se há um valor de retorno NULL de MmGetSystemAddressForMdlSafe, que indica que o mapeamento falhou ou que um buffer de comprimento zero foi fornecido.
Para transferências METHOD_NEITHER, siga as regras fornecidas em Usando Nem Buffer Nem E/S Direta.