Partilhar via


Depurando um descarregamento de driver com falha

Um driver não será descarregado se houver uma referência vazada para DeviceObject ou DriverObject. Essa é uma causa comum de descarregamentos de driver com falha.

Além de IoCreateDevice, há várias funções que fazem referência a DriverObject e DeviceObject. Se você não seguir as diretrizes para usar as funções, acabará vazando a referência.

Aqui está um exemplo de como depurar esse problema. Embora DeviceObject seja usado neste exemplo, essa técnica funciona para todos os objetos.

Corrigir um driver que falha ao descarregar

  1. Coloque um ponto de interrupção logo após o driver chamar IoCreateDevice. Obtenha o endereço DeviceObject .

  2. Localize o cabeçalho do objeto usando a extensão de objeto ! neste endereço de objeto:

    kd> !object 81a578c0 
    Object: 81a578c0  Type: (81bd0e70) Device
        ObjectHeader: 81a578a8
        HandleCount: 0  PointerCount: 3
        Directory Object: e1001208  Name: Serial0 
    

    A primeira variável no ObjectHeader é a contagem de ponteiros ou a contagem de referências.

  3. Coloque um ponto de interrupção de gravação na contagem de ponteiros usando o endereço do ObjectHeader:

    kd> ba w4 81a578a8 "k;g" 
    
  4. Use g (Go). O depurador produzirá um log.

  5. Procure o par de referência/desreferência incompatível , especificamente, uma desreferência ausente. (Observe que ObReferenceObject é implementado como uma macro dentro do kernel.)