Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Säker bearbetning av IRP:er som innehåller I/O-kontrollkoder beror på korrekt definiering av IOCTL-koder och noggrann granskning av parametrar som drivrutinen tar emot med IRP:en.
När du definierar nya IOCTL-koder använder du följande regler:
Ange alltid ett FunctionCode-värde som är lika med eller större än 0x800.
Ange alltid värdet RequiredAccess . I/O-chefen skickar inte IOCTLs om anroparen inte har tillräckliga åtkomsträttigheter.
Definiera inte IOCTL-koder som tillåter anropare att läsa eller skriva icke-specifika områden i kernelminnet.
När du bearbetar IOCTL-koder inom en drivrutin använder du följande regler:
När drivrutinsutskicksrutiner tar emot IOCTL-koder måste de alltid testa hela 32-bitarsvärdet.
Drivrutiner kan använda IoValidateDeviceIoControlAccess för att dynamiskt utföra striktare åtkomstkontroll än den som anges av värdet RequiredAccess i definitionen av I/O-kontrollkoden.
Läs eller skriv aldrig mer data än bufferten som pekas på av Irp-AssociatedIrp.SystemBuffer> kan innehålla. Kontrollera därför alltid Parameters.DeviceIoControl.InputBufferLength eller Parameters.DeviceIoControl.OutputBufferLength i IO_STACK_LOCATION-strukturen för att fastställa buffertgränser.
Alltid nollställ drivrutinsallokerade buffertar som kommer att innehålla data avsedda för ett program som initierade en IOCTL-begäran. På så sätt kopierar du inte känsliga data av misstag till programmet.
Följ reglerna ovan för METHOD_IN_DIRECT och METHOD_OUT_DIRECT överföringar. Kontrollera dessutom om det finns ett NULL-returvärde från MmGetSystemAddressForMdlSafe, vilket indikerar att mappningen misslyckades eller att en buffert med noll längd angavs.
För METHOD_NEITHER överföringar följer du de regler som anges i Använda varken buffrad eller direkt I/O.