Introdução aos códigos de controle de E/S

Os códigos de controle de E/S (IOCTLs) são usados para comunicação entre aplicativos e drivers de 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 de modo de usuário enviam IOCTLs para drivers chamando DeviceIoControl, que é descrito SDK do Microsoft Windows documentação. Chamadas para DeviceIoControl faz com que o gerenciador de E/S crie uma solicitação IRP_MJ_DEVICE_CONTROL e envie-a 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 IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL segurança. Os drivers processam essas solicitações nas rotinas DispatchDeviceControl e DispatchInternalDeviceControl . (Os aplicativos no modo de usuário não podem enviar IRP_MJ_INTERNAL_DEVICE_CONTROL solicitações.)

Algumas IOCTLs são "públicas" e outras são "privadas". As IOCTLs públicas normalmente são definidas pelo sistema e documentadas pela Microsoft, no WDK (Kit de Driver do Windows) ou no SDK Windows. Eles podem ser enviados por meio de chamadas de um componente de modo de usuário para DeviceIoControl ou podem ser enviados de um driver de modo kernel para outro, usando IRP_MJ_DEVICE_CONTROL ou solicitações IRP_MJ_INTERNAL_DEVICE_CONTROL. Exemplos de IOCTLs públicos incluem códigos de controle de E /S de porta SCSI e solicitações de controle de dispositivo interno do mouse I8042prt.

As IOCTLs privadas, por outro lado, devem ser usadas exclusivamente pelos componentes de software de um fornecedor para se comunicar entre si. IOCTLs privados normalmente são definidos em um arquivo de header fornecido pelo fornecedor e não são documentados publicamente. Assim como as IOCTLs públicas, elas podem ser enviadas por meio de chamadas de um componente de modo de usuário para DeviceIoControl ou podem ser enviadas de um driver de modo kernel para outro, usando solicitações IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL.

Não há nenhuma diferença entre a codificação de IOCTLs públicas e privadas. No entanto, há diferenças nos códigos internos que podem ser usados em IOCTLs definidas pelo fornecedor, em comparação com aquelas usadas para IOCTLs definidas pelo sistema. Se as IOCTLs públicas disponíveis não se ajustarem às suas necessidades, você poderá definir novas IOCTLs privadas que seus componentes de software podem usar para se comunicar entre si. Para obter mais informações, consulte Definindo códigos de controle de E/S.