INFO: Tips voor Windows NT-stuurprogramma voor ontwikkelaars - dingen te vermijden

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 186775 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Samenvatting

Hier volgen enkele tips voor het maken van apparaat stuur programma's van Windows NT. De tips gepresenteerd van toepassing op alle technologieën. U kunt dit ook gebruiken als een check list voor het oplossen van problemen met stuur programma's.

U moet een basis kennis van Windows NT architectuur en sommige ontwikkeling van apparaat stuur programma's ondervinden de informatie hieronder gebruiken effectief. Raadpleeg voor meer informatie over de ontwikkeling van apparaat stuur programma's de Windows NT device driver kit (DDK), dat beschikbaar via MSDN is Professionele lidmaatschap.

Meer informatie

Hieronder volgt een lijst van dingen die ontwikkelaars vermijdt wanneer u werkt met apparaat stuur programma's van Windows NT:

  1. Nooit meer terugkeren naar de STATUS_PENDING van een routine verzending zonder markering de I/O request packet (IRP) in behandeling (IoMarkIrpPending).
  2. Nooit KeSynchronizeExecution aanroepen vanuit een interrupt service routine (ISR). Het zal uw systeem impasse.
  3. Nooit DeviceObject-> vlaggen ingesteld op DO_BUFFERED_IO en DO_DIRECT_IO. Het kan verwarrend zijn voor het systeem en uiteindelijk leiden tot onherstelbare fout. Bovendien Stel nooit METHOD_BUFFERED, METHOD_NEITHER, METHOD_IN_DIRECT of METHOD_OUT_DIRECT in DeviceObject-> vlaggen, omdat deze waarden zijn alleen bij het definiëren van IOCTL's gebruikt.
  4. Nooit cher objecten toewijzen vanuit de wisselbare pool. Als u dit doet, zal incidenteel systeem foutstatussen veroorzaken.
  5. Nooit toewijzen vanuit het wisselbare geheugen of geheugen wisselbaar geheugen toegang tijdens het uitvoeren van IRQL > = DISPATCH_LEVEL. Er is een onherstelbare fout.
  6. Nooit wachten op een kernel cher-object voor een andere waarde dan nul interval IRQL > = DISPATCH_LEVEL. Er is een onherstelbare fout.
  7. Nooit een functie die ervoor zorgt de oproep-thread dat wacht rechtstreeks aanroepen of indirect tijdens het uitvoeren van IRQL > = DISPATCH_LEVEL. Het is een onherstelbare fout fout.
  8. Interrupt request level (IRQL) nooit lagere beneden het niveau waarop de hoofd routine is aangeroepen.
  9. Bel KeLowerIrql() nooit als u niet hebt genoemd KeRaiseIrql().
  10. Nooit een processor (KeStallExecutionProcessor) van meer dan 50 hokje microseconden.
  11. Houd nooit eventuele vergrendelingen spin langer dan nodig is. Voor een betere algemene systeem prestaties, doen niet Houd alle systeem draaien vergrendelingen meer dan 25 microseconden.
  12. Nooit bellen KeAcquireSpinLock en KeReleaseSpinLock, of KeAcquireSpinLockAtDpcLevel en KeReleaseSpinLockFromDpcLevel, terwijl actief IRQL groter zijn dan DISPATCH_LEVEL.
  13. Nooit vrij geven van spinlocks die is verkregen met KeAcquireSpinLock door het aanroepen van KeReleaseSpinLockFromDpcLevel, omdat de oorspronkelijke IRQL wordt niet worden hersteld.
  14. Nooit bellen KeAcquireSpinLock en KeReleaseSpinLock of andere routine die gebruikmaakt van een uitvoerend spinlocks een ISR of SynchCritSection routine(s).
  15. Vergeet nooit uit DO_DEVICE_INITIALIZING vlag bij het maken van een apparaatobject in een andere dan de DriverEntry-routine.
  16. Nooit een deferred procedure aanroep (DPC) object (met behulp van de wachtrij KeInsertQueueDpc) met meerdere threads op verschillende processors tegelijkertijd. Dat kan leiden tot onherstelbare fout.
  17. Deallocate nooit een periodieke timer uit een routine CutomerTimerDPC. U kunt timers uit DPC-routine opheffen.
  18. Nooit de dezelfde DPC-pointer doorgeven aan KeSetTimer of KeSetTimerEx (CustomTimerDpc) en KeInsertQueueDpc (CustomDpc), omdat deze Race conditions.
  19. Nooit IoStartNextPacket aanroepen tijdens het draaien is vergrendeld. Dit kan Impasse in uw systeem.
  20. Nooit IoCompleteRequest aanroepen tijdens het draaien is vergrendeld. Dit kan Impasse in uw systeem.
  21. Nooit IoCompleteRequest aanroepen zonder de voltooiings routine instellen op NULL als het stuur programma de voltooiings routine stelt.
  22. Vergeet nooit het blok i/o-status instellen in het ITC belt IoCompleteRequest.
  23. Nooit oproep IoMarkPending na een IRP queuing of te verzenden een ander stuur programma (IoCallDriver). Het ITC kan worden voltooid voordat de stuur programma roept IoMarkPending en een fouten controle kan plaats vinden. Voor stuur programma's met voltooiings routines de voltooiings routines moeten IoMarkPending aanroepen als ITC-> PendingReturned is ingesteld.
  24. Raak nooit een IRP nadat u hebt IoCompleteRequest opgeroepen.
  25. Nooit oproep IoCancelIrp op een IRP die geen eigendom is van uw stuur programma tenzij u weet dat het ITC is nog niet voltooid.
  26. Nooit bellen IoCancelIrp voor het IRP dat uw verzending routine is werken aan totdat uw verzending routine beller terugkeert.
  27. Nooit bellen IoMakeAssociatedIrp IRP's voor maken voor lagere stuur programma's uit een tussenliggende stuur programma. Het ITC u in het stuur programma voor de tussenliggende krijgt een IRP gekoppeld kan worden, en koppelt u kunt geen andere IRP's voor een ITC al gekoppeld.
  28. Oproep nooit op een IRP dat is ingesteld voor het uitvoeren van IoMakeAssociatedIrp buffer i/O.
  29. Gewoon nooit dereferentie virtueel aanwijzers naar apparaat-i/O registers en ze openen. Gebruik altijd de juiste hardware abstraction layer (HAL) functies voor toegang tot een apparaat.
  30. Nooit ITC of een apparaat objectvelden uit een ISR die mogelijk toegang tot gewijzigd in DISPATCH_LEVEL. Op een symmetrische multiprocessorsysteem dit kan leiden tot beschadiging van gegevens.
  31. Wijzig nooit gegevens tijdens de uitvoering op hoog IRQL als die gegevens mogelijk geschreven door lage IRQL code. Gebruik de KeSynchronizeExecution-routine.
  32. Een van de vergrendeling van de bestuurder spin nooit verkrijgen (als u een hebt) in de DispatchCleanup-routine voordat het systeem verkrijgen annuleren kring veld vergrendelen (IoAcquireCancelSpinLock). Na een consistente vergrendeling overname hiërarchie in het stuur programma is essentieel om te vermijden een potentiële impasse.
  33. Nooit IoAcquireCancelSpinLock aanroepen in uw annulerings routine omdat deze met het systeem annuleren of spinlocks gehouden namens haar wordt altijd genoemd.
  34. Vergeet nooit IoReleaseCancelSpinLock aanroepen voordat u terugkeert uit een routine annuleren.
  35. Gebruik nooit IRQL gebaseerde synchronisatie omdat dit werkt alleen op systemen met één processor. IRQL verhogen op één processor maskeren niet interrupts op andere processors.
  36. Gebruik nooit RtlCopyMemory voor overlappende geheugen adres ber eiken. Gebruik RtlMoveMemory.
  37. Stel nooit pagina formaten zijn constant, zelfs voor een bepaalde CPU. Gebruik PAGE_SIZE en andere pagina verwante constanten die zijn gedefinieerd in de header-bestanden naar onderhouden draagbaarheid.
  38. Nooit toegang tot registersleutels met uitzondering van Registry\Machine\Hardware en Registry\Machine\System van de DriverEntry-routine van een stuur programma geladen in Boot\System initialisatie fase.
  39. Maak nooit een Enum-sleutel voor het laden van een stuur programma onder een bestuurder registersleutel (Registry\Machine\System\CurrentControlSet\Services). Het systeem deze sleutel dynamisch gemaakt.
  40. Nooit proberen een fysiek apparaat initialiseren zonder beweren dat de noodzakelijke bus relatieve i/o-poorten, geheugen ber eiken, interrupt of direct geheugentoegang (DMA) kanaal poort hardwarebronnen in het register eerste.
  41. Nooit IoRegisterDriverReinitialization aanroepen vanuit uw DriverEntry routine, tenzij het STATUS_SUCCESS resultaat.
  42. Nooit KeSetEvent aanroepen met de parameter Wait is ingesteld op TRUE in een wisselbaar thread of stuur programma wisselbaar routine uitgevoerd IRQL PASSIVE_LEVEL. Dit type oproep een fatale paginafout veroorzaakt als uw routine gebeurt naar buiten worden gewisseld tussen de aanroepen van KeSetEvent en KeWait...Object (en).
  43. Nooit KeReleaseSemaphore aanroepen met de parameter wacht op TRUE instellen een thread wisselbaar of routine wisselbaar stuur programma dat wordt uitgevoerd IRQL PASSIVE_LEVEL. Als uw routine uit worden gewisseld tussen de aanroepen KeReleaseSemaphore en KeWait...Object (en), dit een gespreks type wordt een onherstelbare fout paginafout.
  44. Nooit KeReleaseMutex aanroepen met de parameter Wait is ingesteld op TRUE in een wisselbaar thread of stuur programma wisselbaar routine uitgevoerd IRQL PASSIVE_LEVEL. Als uw routine uit worden gewisseld tussen de aanroepen KeReleaseMutex en KeWait...Object (en), dit een gespreks type wordt een onherstelbare fout paginafout.
  45. Nooit KeBugCheckEx- of KeBugCheck aanroept vanuit een Windows NT-stuurprogramma voor retail om het systeem, tenzij een kritieke fout is opgetreden fout die zou systeemgeheugen is beschadigd of veroorzaakt uiteindelijk systeem voor fout controle. Probeer altijd voor het afhandelen van fout condities probleemloos.
  46. Nooit wordt ervan uitgegaan dat nauwkeurig op een één - IoTimer-routine wordt aangeroepen tweede grens omdat het interval waarin een bepaalde IoTimer routine aangeroepen uiteindelijk afhankelijk van de resolutie van de systeemklok.
  47. Nooit Win32s application programming interface (API) aanroepen uit een kernel-modus apparaat stuur programma.
  48. Gebruik nooit recursieve functies waardoor de stack overloopt omdat de thread kernelmodus stack niet dynamisch laten groeien. terwijl deze wordt uitgevoerd in de kernel-modus.
  49. Gebruik nooit interrupt-objectverwijzingen (PKINTERRUPT) te identificeren interrupts in een ISR die meer dan één interrupt verwerkt omdat de adres van de interruptobject u in de ISR krijgt niet altijd worden hetzelfde als die u hebt gekregen van IoConnectInterrupt. Gebruik alleen de ServiceContext-waarde die u opgeeft in de IoConnectInterrupt op de huidige nieuwe apparaat identificeren.
  50. Nooit een stuur programma verwijderen zonder CustomTimerDpc (KeCancelTimer) uit te schakelen. Als de DPC wordt gestart nadat het stuur programma verwijderd wordt, kan dit invloed niet bestaande code en veroorzaakt de fouten controle systeem.
  51. Nooit verwijderen van een stuur programma pas alle IRP's die de i/O CompletionRoutine van het stuur programma instellen in zijn voltooid. Als deze eigenschap het ITC haalt door de lagere bestuurder voltooid nadat het stuur programma verwijderd wordt, het systeem de niet-bestaande code uitvoeren en ervoor zorgen dat het systeem vastloopt, kan proberen.
  52. Schakel nooit apparaat onderbroken totdat het stuur programma nu is afgehandeld. U moet inschakelen nadat u het stuur programma volledig is geïnitialiseerd, en het is veilig voor het systeem voor interne structuren van de bestuurder in aanraking ISR en DPC.
  53. Nooit bellen buiten van het stuur programma terwijl een spinlock omdat het impasse veroorzaken.
  54. Nooit retour elke andere status dan STATUS_MORE_PROCESSING_REQUIRED van de i/o-CompletionRoutine voor een IRP gemaakt door het stuur programma met IoBuildAsynchronousFsdRequest/IoAllocateIrp, omdat het ITC niet is voorbereid voor de voltooiing gerelateerde nabewerkingen door het i/o-manager. Een dergelijke IRP expliciet moet worden vrijgemaakt (IoFreeIrp) door het stuur programma. Als het ITC is niet bedoeld voor hergebruik, dat vrijkomt in de CompletionRoutine voordat de status STATUS_MORE_PROCESSING_REQUIRED retourneren.
  55. Nooit een IRP met toewijzen IoBuildSynchronousFsdRequest/IoBuildDeviceIoControlRequest in een Willekeurige thread context omdat het ITC blijft gekoppeld aan de thread (Irp-> ThreadListEntry), totdat deze wordt vrij gegeven.
  56. Bel nooit IoInitializeIrp op een IRP is toegewezen met IoAllocateIrp met ChargeQuota parameter is ingesteld op TRUE. Wanneer u een IRP met ChargeQuota ingesteld op TRUE toewijst, blijft de i/o-manager de informatie over de groep waarvan het geheugen voor het ITC in de IRP interne vlag toegewezen.

    Als u IoInitializeIrp op een dergelijke IRP aanroept, is het geheugen toewijzings gegevens verloren als deze functie het hele ITC 'blind nul. Dit leidt tot een beschadigd geheugen bij het vrijmaken van het ITC. Ook nooit een IRP die afkomstig van de i/o-manager zijn opnieuw. Als u gebruiken een IRP wilt, moet u uw eigen met toewijzen IoAllocateIrp.
  57. Geef nooit WaitMode als UserMode in KeWaitForSingleObject/KeWaitForMultipleObjects als het Object in de stapel de thread is toegewezen. Het complement van dit is dat als het Object dat wordt gewacht op in de functie stapelen is gemaakt, moet u KernelMode als de WaitMode om te voorkomen dat de thread stack pager uit.
  58. Nooit verkrijgen bronnen zoals ERESOURCES en FastMutex(Unsafe) in de context van een thread gebruikers modus zonder bescherming van de code in een kritieke sectie.

    Aangezien de verwerving van deze bronnen de IRQL naar APC_LEVEL, niet verhogen als de thread is uitgesteld (uitgevoerd door een APC queuing) nadat deze de resource heeft verworven, leiden tot systeem beveiliging impasse en compromissen. Daarom moet u deze middelen ofwel door expliciet de IRQL APC_LEVEL of in een kritieke sectie verwer ven door het aanroepen van KeEnterCriticalRegion.

Referenties

MSDN apparaat stuur programma ontwerp handleiding voor Windows NT

Eigenschappen

Artikel ID: 186775 - Laatste beoordeling: zaterdag 26 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Win32 Device Driver Kit voor Windows NT 4.0
Trefwoorden: 
kbinfo kbmt KB186775 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:186775
Vrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.

Geef ons feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com