windows - Kan synkroniseret I/O afbrydes automatisk, selvom driveren ikke fuldender IRP?

Indlæg af Hanne Mølgaard Plasc

Problem



I brugerens tilstandskode:


CreateFile(A device);
ReadFile(The device handle); // synchronously


I overensstemmelse med driverens IRP\_MJ\_READ afsendelsesrutine:


// To hold the irp. It will never complete the irp.
// This driver doesn't even have a cancel routine.
Sleep(INFINITE); 


Når jeg afslutter brugertilstandsappen tvunget efter at have læst ReadFile (), kan I/O'en blive annulleret?

Hvis det var asynkront I/O, kunne appen ikke afsluttes.

Men hvis jeg/O er synkroniseret, annullerer I/O-manager automatisk det?


Hvis ja, hvordan?

Bedste reference


For det første implementeres både asynkront og synkront I/O med IRP'er. Bruger-tilstand API ReadFile kalder en intern NT API (systemopkald) NtReadFile, som ender med at sende en IRP. Hvis driveren returnerer STATUS\_PENDING, returnerer NT API samme status. Hvis brugertilstandsapplikationen gør et synkront opkald til ReadFile, vil ReadFile vente på filhåndtaget for at I/O-programmet skal fuldføres. Driveren kan også fuldføre IRP synkront (uanset hvordan bruger-tilstand API kaldes). Jeg tror, ​​at dette er tilfældet, hvor du er interesseret i.


IRP'er er forbundet med den tråd, der sendte dem. Så når en tråd afsluttes (for eksempel på grund af at dræbe processen), forsøger I/O-manager at annullere alle IRP'erne, der er knyttet til den pågældende tråd. Tråden kan ikke opsiges, før alle IRP'erne er afsluttet.


Når du lukker et håndtag, sender I/O-lederen driveren IRP\_MJ\_CLEANUP og IRP\_MJ\_CLOSE. Det er den driver , der annullerer afventer IRP'er (eller blot fuldfører dem som annulleret) i dette tilfælde.


Evnen til at annullere en IRP afhænger af førerens samarbejde. Føreren skal udtrykkeligt gøre IRP-annullerbar ved at kalde IoSetCancelRoutine. [3]


Hvis driveren bare blokerer uden at gøre IRP'en annullerbar, vil IRP'en ikke blive annulleret.

Andre referencer 1


På Vista og op kan du bruge CancelSynchronousIo til at markere alle ventende IO for en tråd som annulleret. NtCancelIoFile (ansvarsfraskrivelse: Jeg har ikke testet denne funktion) kan bruges til at annullere IO for en bestemt fil. Effekten af ​​disse opkald varierer afhængigt af driverens implementering. Set fra brugertilstandsapplikationen bør effekten være en øjeblikkelig annullering, selvom føreren måske holder op med at vente længe, ​​før IO-anmodningen er fuldstændig ryddet op.


http://www.microsoft.com/whdc/driver/kernel/iocancel.mspx har mange oplysninger om annullering. [4]