DispatchDeviceControl och DispatchInternalDeviceControl-rutiner

En drivrutins dispatchrutiner (se DRIVER_DISPATCH) hanterar IRP:er med I/O-funktionskoder för IRP_MJ_DEVICE_CONTROL respektive IRP_MJ_INTERNAL_DEVICE_CONTROL.

För varje vanlig typ av kringutrustning definierar systemet en uppsättning I/O-kontrollkoder för IRP_MJ_DEVICE_CONTROL begäranden. Nya drivrutiner för varje typ av enhet måste ha stöd för dessa begäranden. I de flesta fall exporteras inte dessa offentliga I/O-kontrollkoder för varje typ av enhet till program i användarläge.

Vissa av dessa systemdefinierade I/O-kontrollkoder används av drivrutiner på högre nivå som skapar IP-adresser för den underliggande enhetsdrivrutinen genom att anropa IoBuildDeviceIoControlRequest. Andra används av Win32-komponenter för att kommunicera med en underliggande enhetsdrivrutin genom att anropa Win32-funktionen DeviceIoControl (beskrivs i Microsoft Windows SDK-dokumentationen) som i sin tur anropar en systemtjänst. I/O-chefen konfigurerar en IRP och lagrar den viktigaste funktionskoden IRP_MJ_DEVICE_CONTROL och den angivna I/O-kontrollkoden i IO_STACK_LOCATION-strukturenParameters.DeviceIoControl.IoControlCode. Sedan anropar I/O-chefen DispatchDeviceControl-rutinen för den högsta drivrutinen i kedjan.

För vissa drivrutiner som tillhandahålls av systemet och som är utformade för att samverka med och stödja nya drivrutiner definierar operativsystemet även en uppsättning I/O-kontrollkoder för IRP_MJ_INTERNAL_DEVICE_CONTROL begäranden. I de flesta fall tillåter dessa offentliga I/O-kontrollkoder att tilläggsdrivrutiner på högre nivå samverkar med en underliggande enhetsdrivrutin.

Som exempel stöder de systemlevererade parallella drivrutinerna en uppsättning interna I/O-kontrollkoder som skickas av leverantörsdrivrutiner i IRP_MJ_INTERNAL_DEVICE_CONTROL-begäranden. Mer information finns i designguiden för parallella enhetsdrivrutiner.

Nästan alla åtgärder som begärs via systemdefinierade I/O-kontrollkoder använder buffrad I/O, eftersom den här typen av begäran sällan kräver överföring av stora mängder data. Det vill säga, även drivrutiner som ställer in sina enhetsobjekt för direkt I/O skickas IRP:er för enhetskontrollbegäranden med data som ska överföras till eller från bufferten i Irp-AssociatedIrp.SystemBuffer> (med undantag för vissa typer av högsta nivå-drivrutiner som är nära kopplade till Win32-multimediadrivrutiner).

Dessutom kan en drivrutin definiera en uppsättning privata I/O-kontrollkoder som andra drivrutiner kan använda för att kommunicera med den. Nya offentliga I/O-kontrollkoder kan endast läggas till i systemet i samarbete med Microsoft Corporation, eftersom offentliga I/O-kontrollkoder är inbyggda i själva operativsystemet.

Specifik information om den uppsättning offentliga I/O-kontrollkoder som olika typer av drivrutiner måste ha stöd för och om hur du definierar privata I/O-kontrollkoder finns i de enhetsspecifika referensavsnitten i Windows Driver Kit (WDK).