Introdução aos códigos de controle de E/S
Os IOCTLs (códigos de controle de E/S) são usados para comunicação entre aplicativos e drivers no modo de usuário ou para comunicação interna entre drivers em uma pilha. Os códigos de controle de E/S são enviados usando IRPs.
Os aplicativos no modo de usuário enviam IOCTLs para drivers chamando DeviceIoControl, que é descrito em SDK do Microsoft Windows documentação. As chamadas para DeviceIoControl fazem com que o gerenciador de E/S crie uma solicitação de IRP_MJ_DEVICE_CONTROL e a envie para o driver mais alto.
Além disso, os drivers de nível superior podem enviar IOCTLs para drivers de nível inferior criando e enviando solicitações de IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL . Os drivers processam essas solicitações nas rotinas DispatchDeviceControl e DispatchInternalDeviceControl . (Os aplicativos do modo de usuário não podem enviar solicitações de IRP_MJ_INTERNAL_DEVICE_CONTROL .)
Alguns IOCTLs são "públicos" e outros são "privados". Os IOCTLs públicos normalmente são definidos pelo sistema e documentados pela Microsoft, no WDK (Windows Driver Kit) ou no SDK do Windows. Eles podem ser enviados por meio de chamadas de um componente do modo de usuário para DeviceIoControl ou podem ser enviados de um driver de modo kernel para outro, usando solicitações de IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL . Exemplos de IOCTLs públicos incluem códigos de controle de E/S da porta SCSI e solicitações de controle de dispositivo internas do mouse I8042prt.
Os IOCTLs privados, por outro lado, devem ser usados exclusivamente pelos componentes de software de um fornecedor para se comunicarem entre si. Os IOCTLs privados normalmente são definidos em um arquivo de cabeçalho fornecido pelo fornecedor e não são documentados publicamente. Assim como os IOCTLs públicos, eles podem ser enviados por meio de chamadas de um componente do modo de usuário para DeviceIoControl ou podem ser enviados de um driver no modo kernel para outro, usando solicitações de IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL .
Não há diferença entre a codificação de IOCTLs públicos e privados. No entanto, há diferenças nos códigos internos que podem ser usados em IOCTLs definidos pelo fornecedor, em comparação com aqueles que são usados para IOCTLs definidos pelo sistema. Se os IOCTLs públicos disponíveis não atenderem às suas necessidades, você poderá definir novas IOCTLs privadas que seus componentes de software podem usar para se comunicar uns com os outros. Para obter mais informações, consulte Definindo códigos de controle de E/S.