Troubleshooting Windows Drivers#
Check For Device Problems#
- 
use DeviceManager to see if the device has a problem code 
- 
check all devices for problem 
pnputil /enum-devices /problem
- check specific device instance path
pnputil /enum-devices /instanceid <device instance path>
Check For Device Installation Problems#
[!TLDR] Analyzing the Setupapi.dev.log File
Check the%windir%\\inf\setupapi.dev.logdriver installation log file; lines beginning with "!" are warnings and "!!!" are error failures
SetupAPI Text Logs: Device Driver Installation Logs#
Plug n Play Manager and SetupAPI log information about installation events:
|Log|Purpose
1|
|---|--------|
|C:\Windows\INF\setupapi.dev.log|Device Installation Log on device/driver installs|
|C:\Windows\INF\setupapi.app.log|App Installation Log on app installs associated w/device driver installs|
SetupAPI Logging Registry Settings#
SetupAPI logging supports:
- global event level: controls log verbosity level; see Setting the Event Level for a Text Log
- global event category: determines the type of operations that can make log entries; see Enabling Event Categories for a Text Log
Interpreting SetupAPI Log File#
SetupAPI text logs internal format:
- 
log entry: is one line in a text log 
- 
text log header: info about the os and computer architecture. see Format of a Text Log Header. 
- 
text log sections: records the events during a single device installation; sections used to conceptually organize log entries in meaningful way 
- 
non-section log entries: associated with operations not tied to specific section; appear in order they're written. see Format of Log Entries That Are Not Part of a Text Log Section 
 their log entry format: entry_prefix time_stamp event_category formatted_message
| Entry Prefix | Message type | 
|---|---|
| "!!! " | error message | 
| "! " | warning message | 
| " " | info message | 
| " . " | info message | 
| Event Category | SetupAPI operation | 
|---|---|
| "...: " | Vendor-supplied operation | 
| "bak: " | Backup data | 
| "cci: " | Class installer or co-installer operation | 
| "cpy: " | Copy files | 
| "dvi: " | Device installation | 
| "flq: " | Manage file queues | 
| "inf: " | Manage INF files | 
| "ndv: " | New device wizard | 
| "prp: " | Manage device and driver properties | 
| "reg: " | Manage registry settings | 
| "set: " | General setup | 
| "sig: " | Verify digital signatures | 
| "sto: " | Manage the driver store | 
| "ui : " | Manage user interface dialog boxes | 
| "ump: " | User-mode PnP manager | 
Example Log File#
>>>  [Device Install - PCI\VEN_104C&DEV_8019&SUBSYS_8010104C&REV_00\3&61aaa01&0&38]
>>>  2005/02/13 22:06:28.109: Section start
...
 Additional section body log entries
...
     dvi: {Build Driver List}
     dvi:      Enumerating all INFs...
     dvi:      Found driver match:
     dvi:           HardwareID - PCI\VEN_104C&DEV_8019
     dvi:           InfName    - C:\WINDOWS\inf\1394.inf
     dvi:           DevDesc    - Texas Instruments OHCI Compliant IEEE 1394 Host Controller
     dvi:           DrvDesc    - Texas Instruments OHCI Compliant IEEE 1394 Host Controller
     dvi:           Provider   - Microsoft
     dvi:           Mfg        - Texas Instruments
     dvi:           InstallSec - TIOHCI_Install
     dvi:           ActualSec  - TIOHCI_Install.NT
     dvi:           Rank       - 0x00002001
     dvi:           DrvDate    - 10/01/2002
     dvi:           Version    - 6.0.5033.0 
!!!  inf:      InfCache: Error flagging 1394.inf for match string pci\ven_104c&dev_8019
     dvi: {Build Driver List - exit(0x00000000)}
...
 Additional section body log entries 
...
<<<  [2005/02/13 22:06:29.000: Section end]
<<<  [Exit Status(0x00000000)]
  . ump: Start service install for: PCI\VEN_104C&DEV_8019&SUBSYS_8010104C&REV_00\3&61aaa01&0&38
  . ump: Creating Install Process: rundll32.exe
>>>  [Device Install - PCI\VEN_104C&DEV_8019&SUBSYS_8010104C&REV_00\3&61aaa01&0&38]
>>>  2005/02/13 22:06:28.109: Section start
Common Installation Errors Errors#
| Error code | Description | 
|---|---|
| 0x000005B4 (ERROR_TIMEOUT) | The device installation took too long and was stopped.  See SetupApi logs for more information about the device installation and where the time was spent. Some common causes of timeouts are: A co-installer executing for too long. This could be because the co-installer is performing some unsupported operation that has hung or is too long running. For example, a co-installer is executed in a non-interactive session, so it can't do something that needs to wait on user input. Co-installers are deprecated and should be avoided. For more information, see universal INFs. Starting or restarting a device at the end of device installation has hung. | 
| 0xe0000219 (ERROR_NO_ASSOCIATED_SERVICE) | The driver package being installed on the device didn't specify an associated service for the device. For more information, see the SPSVCINST_ASSOCSERVICE flag in the INF AddService Directive documentation. | 
| 0xe0000248 (ERROR_DEVICE_INSTALL_BLOCKED) | The installation of the device was blocked due to group policy settings. For more information, see controlling device installation using Group Policy and Mobile Device Management policies for device installation. | 
| 0x000001e0 (ERROR_PNP_QUERY_REMOVE_DEVICE_TIMEOUT) | At the end of device installation, one or more devices will be restarted to pick up new files or settings changed during the device installation. As part of this restart operation, a query remove operation is performed on the device or devices being restarted. This error indicates that something hung or took too long during the query remove operation for the device being installed. For more information, see SetupApi logs. | 
| 0x000001e1 (ERROR_PNP_QUERY_REMOVE_RELATED_DEVICE_TIMEOUT) | At the end of device installation, one or more devices will be restarted to pick up new files or settings changed during the device installation. As part of this restart operation, a query remove operation is performed on the device or devices being restarted. This error indicates that something hung or took too long during the query remove operation for one of the device or devices being restarted. For more information, see SetupApi logs. | 
| 0x000001e2 (ERROR_PNP_QUERY_REMOVE_UNRELATED_DEVICE_TIMEOUT) | At the end of device installation, one or more devices will be restarted to pick up new files or settings changed during the device installation. As part of this restart operation, a query remove operation is performed on the device or devices being restarted. This error indicates that that query remove operation wasn't able to be performed in a timely manner due to a query remove operation being performed on another device on the system. For more information, see SetupApi logs. | 
Misbehaving Or Bad Drivers#
Approach 1: AutoRuns#
- TLDR: use Sysinternals: AutoRuns to find bad behaving/suspect drivers (Reference)
- 
Configuration - Options->Hide Microsoft Entries: enable this and unhide everything else
- Options->Scan Options->Verify code signatures: enable
- Options->Scan Options->Check VirusTotal.com: optional; useful but lots of false positives
- 
Key Points 
- 
Red: no digital signature. if "LargeCorp" driver, extremely suspect/dangers (failed/didn't care to pass WHL Quality Assurance); if open-source driver, likely won't be signed bc of cost
- Yellow: driver image not found; usually safe to remove
- Most Important Categories: 'Drivers','Services','ScheduledTasks','Logon'
- Drivers: most difficult bc Windows often can't remove kernel/device driver, marks it for deletion at reboot, which often silently fails
 [!danger]- Usual Suspects/Bad Offenders Driver Problems AMDRyzenMasterDriverV*seems latest versions are less dangerous and gets uninstalled, anyway better to remove RM unless you have gun pointed at your head AsrDrv*ASRock drivers, anything ASRock should be removed; literally banned as it provides full kernel access Asusgio2anything ASUS should be removed, the worst. If you have ROG peripherals you may need to keep the ROG drivers. Armoury-Crate software is a virus-like, will cause BSOD and all sort of issues, stay away EneIo,EneTechIo,*Io64.sysRGB software drivers usually terrible written, suffering from performance and serious security holes gdrv,gdrv2GigaByte software, 2nd worse after ASUS, remove everything. Known to cause BSODs NTIOLib_MSISimple_OC,NTIOLib_OCKit,MSI Command Centernot the worst but hitting performances. Remove all MSI software, you can do the same without usually. Nice to change options without rebooting but then once done disable the driver NPF*,Network Packet Filter driversused by many network utils (e.g. PowerLine adapters, etc) so must check if needed; can always disable/re-enable on-demand instead of deleting - Application Drivers: usually fine since they should only be loaded on demand on app start (e.g. CPU-Z,HWInfo,GPU-Z)
- HW drivers: dangerous as can can cause your system to stop booting; always use system snapshots
- Services: pretty easy bc easily discoverable/traceable
 [!warning]- Usual Suspects/Bad Offenders Driver Problems HW peripheral vendors install superflous services e.g. RazerGameService anti-cheat from games 'Automatic','DelayedStart' 3rd-party services if service is for disabled/on-demand feature, requiring always-on background execution is sign of lurking issues (process likely running 'sleep mode' causing perf issues, micro-stuttering, zombie kernel objects/child processes). workaround by setting to 'Disabled' or Manual
- 
ScheduledTasks: tricky b/c big troubleshooting headache - usually disabling works in short-to-midterm but breaks in mid-to-longterm (e.g. update requires Task but upgrade didn't re-enable Task)
- root cause analysis is headache b/c likely won't remember manually disabling task
- then relying on dice roll of how robust app's logging is but if you had to disable the task manually, app was probably poorly written to begin with
- safest to disable tasks for uninstalled software
- 
Logon: subtle footguns abound 
- 
safest to mainly disable uninstalled/'yellow' registry keys 
- then use another tool to disable startups e.g.
- NirSoft WhatInStartup
- SystemInformer
- TaskManager/msconfig
 
Approach 2: SCManager#
sc.exe: Service Control Manager CLI to manipulate services; drivers run as special kernel service
- 
TLDR: attempt forensics on driver with sc
- 
query driver to glean useful info 
 Batchfilesc queryex ssgdio sc qc ssgdio sc qdescription ssgdio sc GetDisplayName ssgdio sc GetKeyName ssgdio sc EnumDepend ssgdio
- 
disable service and reboot 
 Batchfilesc stop ssgdio sc config ssgdio start= disabled [restart_machine]
- 
delete driver 
 Batchfilesc delete ssgdio
- 
sccommand details
- 
sc.exe: Service Control Manager cli to manipulate services (drivers run as special kernel service)BatchfileSyntax: sc <"\\ServerName"> [command] [service name] <option1> <option2>... Help: sc [command]
- 
Global Commands: operate on SCManager; does not take service name Command Description sc [command]get help for command bootok\|badIndicates whether the last boot should be saved as the last-known-good boot configurationLockLocks the Service Database QueryLockQueries the LockStatus for the SCManager Database 
- 
Service Commands: operates on services; requires service name Command Description queryQueries the status for a service, or enumerates the status for types of services queryexQueries the extended status for a service, or enumerates the status for types of services startStarts a service pauseSends a PAUSE control request to a service interrogateSends an INTERROGATE control request to a service continueSends a CONTINUE control request to a service stopSends a STOP request to a service configChanges the configuration of a service (persistent) descriptionChanges the description of a service failureChanges the actions taken by a service upon failure failureflagChanges the failure actions flag of a service sidtypeChanges the service SID type of a service privsChanges the required privileges of a service managedaccountChanges the service to mark the service account password as managed by LSA qcQueries the configuration information for a service qdescriptionQueries the description for a service qfailureQueries the actions taken by a service upon failure qfailureflagQueries the failure actions flag of a service qsidtypeQueries the service SID type of a service qprivsQueries the required privileges of a service qtriggerinfoQueries the trigger parameters of a service qpreferrednodeQueries the preferred NUMA node of a service qmanagedaccountQueries whether a services uses an account with a password managed by LSA qprotectionQueries the process protection level of a service quserserviceQueries for a local instance of a user service template deleteDeletes a service (from the registry) createCreates a service. (adds it to the registry) controlSends a control to a service sdshowDisplays a service's security descriptor sdsetSets a service's security descriptor showsidDisplays the service SID string corresponding to an arbitrary name triggerinfoConfigures the trigger parameters of a service preferrednodeSets the preferred NUMA node of a service GetDisplayNameGets the DisplayName for a service GetKeyNameGets the ServiceKeyName for a service EnumDependEnumerates Service Dependencies 
- 
query/queryexoptions- 
query service status: sc query [servicename]
- 
find matching services: sc query [option]
 Option Value Type Description state=active,inactive,allservice state to enumerate; default: activebufsize=intsize in bytes of enumeration buffer; default: 4096ri=intresume index number to begin enumeration; default: 0group=stringservice group to enumerate; default: all groups
- 
- 
syntax examples Batchfilesc query - Enumerates status for active services & drivers sc query eventlog - Displays status for the eventlog service sc queryex eventlog - Displays extended status for the eventlog service sc query type= driver - Enumerates only active drivers sc query type= service - Enumerates only Win32 services sc query state= all - Enumerates all services & drivers sc query bufsize= 50 - Enumerates with a 50 byte buffer sc query ri= 14 - Enumerates with resume index = 14 sc queryex group= "" - Enumerates active services not in a group sc query type= interact - Enumerates all interactive services sc query type= driver group= NDIS - Enumerates all NDIS drivers
Approach 3: pnputil#
- 
find bad offender's by looking at zombie processes using Pavel's Object Explorer 
- 
ex: Razer's shitty GameManagerService.exethat's forced on users for no reason
- 
for list/inspect drivers: 
- 
Sysinternals AutoRuns 
- Nirsoft DriverView
- Nirsoft DevManView
- Nirsoft InstalledDriverList
- 
command line 
 Batchfiledriverquery /V pnputil /enum-drivers pnputil /enum-devices pnputil /enum-interfaces
- 
for deleting drivers: 
- 
BCUninstaller 
- BleachBit
- 
command line 
 Batchfilepnputil /delete-driver oem####.inf /uninstall /forcePowerShellGet-CimInstance Win32_SystemDriver -Filter "name='LGBusEnum'" | Invoke-CimMethod -MethodName Delete Get-CimInstance Win32_SystemDriver -Filter "name='LGJoyXlCore'" | Invoke-CimMethod -MethodName Delete Get-CimInstance Win32_SystemDriver -Filter "name='LGVirHid'" | Invoke-CimMethod -MethodName Delete Get-CimInstance Win32_SystemDriver -Filter "name='LVRS64'" | Invoke-CimMethod -MethodName Delete