Hibák többprocesszoros környezetben

Az NT-alapú operációs rendszeren az illesztőprogramok többszálúak; egyszerre több I/O-kérést is fogadhatnak különböző szálakról. Az illesztőprogram tervezésekor feltételezni kell, hogy az SMP-rendszeren fog futni, és meg kell tennie a megfelelő intézkedéseket az adatintegritás biztosítása érdekében.

Pontosabban, amikor egy illesztőprogram megváltoztatja a globális vagy a fájlobjektum adatait, zárolást vagy összekapcsolt műveletsorozatot kell használnia a versenyfeltételek elkerülése érdekében.

Versenyhelyzettel találkozik, amikor globális vagy fájlobjektum-specifikus adatokra hivatkozik

A következő kódrészletben versenyállapot léphet fel, ha a sofőr a Data.LpcInfo-ban fér hozzá a globális adatokhoz:

   PLPC_INFO pLpcInfo = &Data.LpcInfo; //Pointer to global data
   ...
   ...
   // This saved pointer may be overwritten by another thread.
   pLpcInfo->LpcPortName.Buffer = ExAllocatePool(
                                     PagedPool,
                                     arg->PortName.Length);

A kódba egy IOCTL-hívás eredményeként beírt több szál memóriavesztést okozhat a mutató felülírása során. A probléma elkerülése érdekében az illesztőprogramnak az ExInterlockedXxx rutint vagy valamilyen típusú zárolást kell használnia a globális adatok módosításakor. A vezető követelményei határozzák meg a zár elfogadható típusait. További információ: Spin Locks, Kernel Dispatcher Objects és ExAcquireResourceSharedLite.

Az alábbi példa egy fájlspecifikus puffert (Endpoint-LocalAddress>) kísérel meg újratelepíteni a végpontcím tárolásához:

   Endpoint = FileObject->FsContext;

    if ( Endpoint->LocalAddress != NULL &&
         Endpoint->LocalAddressLength <
                   ListenEndpoint->LocalAddressLength ) {

      FREE_POOL (Endpoint->LocalAddress,
                 LOCAL_ADDRESS_POOL_TAG
                 );
      Endpoint->LocalAddress  = NULL;
   }

    if ( Endpoint->LocalAddress == NULL ) {
       Endpoint->LocalAddress =
            ALLOCATE_POOL (NonPagedPool,
                           ListenEndpoint->LocalAddressLength,
                           LOCAL_ADDRESS_POOL_TAG);
   }

Ebben a példában versenyállapot léphet fel a fájlobjektumhoz való hozzáféréssel. Mivel az illesztőprogram nem rendelkezik zárolásokkal, ugyanazon fájlobjektum két kérése is beírhatja ezt a függvényt. Az eredmény lehet hivatkozás felszabadított memóriára, többszörös kísérlet ugyanazon memória felszabadítására, vagy memóriaszivárgás. Ezeknek a hibáknak a elkerülése érdekében a két ha utasítást egy spin-zárban kell rögzíteni.