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.
O processamento seguro de IRPs que contêm códigos de controle de E/S depende da definição correta 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 igual ou maior que 0x800.
Sempre especifique um valor RequiredAccess . O gerente de E/S não enviará IOCTLs se o chamador tiver direitos de acesso insuficientes.
Não defina códigos IOCTL que permitem que os chamadores leiam ou escrevam áreas não específicas da memória do kernel.
Ao processar códigos IOCTL em um driver, use as seguintes regras:
Sempre que as rotinas de despacho de um driver testarem os códigos IOCTL recebidos, elas devem sempre 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 escreva 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.
Sempre zere os buffers alocados pelo driver que conterão dados destinados ao aplicativo que originou a 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 um valor retornado NULL de MmGetSystemAddressForMdlSafe, que indica que o mapeamento falhou ou que um buffer de comprimento zero foi fornecido.
Para transferências de METHOD_NEITHER, siga as regras fornecidas no Uso de E/S não armazenada em buffer nem direta.