Dela via


Det gick inte att verifiera objekthanterare

Vissa drivrutiner måste manipulera objekt som skickas till dem av anropare eller hantera två filobjekt samtidigt. En modemdrivrutin kan till exempel ta emot ett handtag till ett händelseobjekt, eller en nätverksdrivrutin kan ta emot handtag till två olika filobjekt. Drivrutinen måste verifiera dessa handtag. Eftersom de skickas av en anropare och inte via I/O-chefen kan I/O-chefen inte utföra några verifieringskontroller.

I följande kodfragment har drivrutinen till exempel fått handtaget AscInfo-AddressHandle>, men har inte verifierat det innan obreferenceObjectByHandle anropas:

   //
   // This handle is embedded in a buffered request.
   //
   status = ObReferenceObjectByHandle(
                      AscInfo->AddressHandle,
                      0,
                      NULL,
                      KernelMode,
                      &fileObject,
                      NULL);

   if (NT_SUCCESS(status)) {
       if ( (fileObject->DeviceObject == DeviceObject) &&
            (fileObject->FsContext2 == TRANSPORT_SOCK) ) {

Även om anropet till ObReferenceObjectByHandle lyckas, kan koden inte se till att den returnerade pekaren refererar till ett filobjekt. den litar på att anroparen skickar rätt information.

Även om alla parametrar för anropet till ObReferenceObjectByHandle är korrekta och anropet lyckas, kan en drivrutin fortfarande få oväntade resultat om filobjektet inte är avsett för drivrutinen. I följande kodfragment förutsätter drivrutinen att ett lyckat anrop returnerar en pekare till det filobjekt som förväntades:

   status = ObReferenceObjectByHandle (
                             AcpInfo->Handle,
                             0L,
                             DesiredAccess,
                             *IoFileObjectType,
                             Irp->RequestorMode,
                             (PVOID *)&AcpEndpointFileObject,
                             NULL);

   if ( !NT_SUCCESS(status) ) {
      goto complete;
   }
   AcpEndpoint = AcpEndpointFileObject->FsContext;

   if ( AcpEndpoint->Type != BlockTypeEndpoint ) 

Även om ObReferenceObjectByHandle returnerar en pekare till ett filobjekt, har drivrutinen ingen garanti för att pekaren refererar till det filobjekt som förväntades. I det här fallet bör drivrutinen verifiera pekaren innan du kommer åt drivrutinsspecifika data i AcpEndpointFileObject-FsContext>.

För att undvika sådana problem bör en förare kontrollera giltiga data enligt följande:

  • Kontrollera objekttypen för att se till att det är vad drivrutinen förväntar sig.

  • Kontrollera att den begärda åtkomsten är lämplig för objekttypen och nödvändiga uppgifter. Om drivrutinen utför en snabb filkopia kontrollerar du till exempel att handtaget har läsbehörighet.

  • Se till att ange rätt åtkomstläge (UserMode eller KernelMode) och att åtkomstläget är kompatibelt med den begärda åtkomsten.

  • Om drivrutinen förväntar sig ett handtag till ett filobjekt som själva drivrutinen skapade verifierar du handtaget mot enhetsobjektet eller drivrutinen. Var dock noga med att inte bryta filter som skickar I/O-begäranden för konstiga enheter.

  • Om drivrutinen stöder flera typer av filobjekt (till exempel kontrollkanaler, adressobjekt och anslutningar för TDI-drivrutiner eller volym-, katalog- och filobjekt i filsystem) kontrollerar du att du har ett sätt att särskilja dem.