Rotinas DispatchDeviceControl e DispatchInternalDeviceControl
As rotinas de expedição de um driver (consulte DRIVER_DISPATCH) lidam com IRPs com códigos de função de E/S de IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL, respectivamente.
Para cada tipo comum de dispositivo periférico, o sistema define um conjunto de códigos de controle de E/S para solicitações de IRP_MJ_DEVICE_CONTROL . Novos drivers para cada tipo de dispositivo devem dar suporte a essas solicitações. Na maioria dos casos, esses códigos de controle de E/S públicos para cada tipo de dispositivo não são exportados para aplicativos no modo de usuário.
Alguns desses códigos de controle de E/S definidos pelo sistema são usados por drivers de nível superior que criam IRPs para o driver de dispositivo subjacente chamando IoBuildDeviceIoControlRequest. Outros são usados por componentes win32 para se comunicar com um driver de dispositivo subjacente chamando a função Win32 DeviceIoControl (descrita em SDK do Microsoft Windows documentação) que, por sua vez, chama um serviço do sistema. O gerenciador de E/S configura um IRP e armazena o código de função principal IRP_MJ_DEVICE_CONTROL e o código de controle de E/S especificado na estrutura IO_STACK_LOCATION em Parameters.DeviceIoControl.IoControlCode. Em seguida, o gerente de E/S chama a rotina DispatchDeviceControl do driver de nível mais alto da cadeia.
Para determinados drivers fornecidos pelo sistema projetados para interoperar e dar suporte a novos drivers, o sistema operacional também define um conjunto de códigos de controle de E/S para solicitações de IRP_MJ_INTERNAL_DEVICE_CONTROL . Na maioria dos casos, esses códigos de controle de E/S públicos permitem que drivers de nível superior do complemento interoperem com um driver de dispositivo subjacente.
Por exemplo, os drivers paralelos fornecidos pelo sistema dão suporte a um conjunto de códigos de controle de E/S internos que os drivers fornecidos pelo fornecedor enviam IRP_MJ_INTERNAL_DEVICE_CONTROL solicitações. Para obter mais informações, consulte Solicitações internas de controle de dispositivo para portas paralelas e Solicitações internas de controle de dispositivo para dispositivos paralelos.
Quase todas as operações solicitadas por meio de códigos de controle de E/S definidos pelo sistema usam E/S em buffer, pois esse tipo de solicitação raramente requer a transferência de grandes quantidades de dados. Ou seja, até mesmo os drivers que configuram seus objetos de dispositivo para E/S direta são enviados a IRPs para solicitações de controle de dispositivo com dados a serem transferidos para dentro ou fora do buffer em Irp-AssociatedIrp.SystemBuffer> (exceto para determinados tipos de drivers de dispositivo de nível mais alto com drivers multimídia Win32 estreitamente acoplados).
Além disso, um driver pode definir um conjunto de códigos de controle de E/S privados que outros drivers podem usar para se comunicar com ele. Novos códigos de controle de E/S públicos podem ser adicionados ao sistema somente com a cooperação da Microsoft Corporation, pois os códigos de controle de E/S públicos são integrados ao próprio sistema operacional.
Para obter informações específicas sobre o conjunto de códigos de controle de E/S públicos aos quais diferentes tipos de drivers devem dar suporte e definir códigos de controle de E/S privados, consulte as seções de referência específicas do dispositivo do WDK (Kit de Driver do Windows).