New
#71
Whoops, I left out a layer
Short version: it's the disk controller, though that doesn't necessarily mean the motherboard is at fault and not the HDD.
Detail: The "human" definition of a "device" is somewhat different to the way the OS uses that word, at least at this level. To you and me, a "device" is something distinct, like a HDD for example. To the OS, a DEVICE_OBJECT is an instance of a kernel-mode struct used by drivers to keep track of various "devices" they manage, be they discrete hardware components or more esoteric constructs. The relationship between DEVICE_OBJECTs, their symlinks, and the drivers which handle them cannot be fully appreciated without a debugger. In the example below, I've followed the "SCSI2" symlink to show that it leads to the ATAPI controller driver, at least on the machine where the example was generated:
3: kd> !object \global??
Object: fffff8a000006270 Type: (fffffa8003968f30) Directory
ObjectHeader: fffff8a000006240 (new version)
HandleCount: 1 PointerCount: 242
Directory Object: fffff8a000004ca0 Name: GLOBAL??
Hash Address Type Name
---- ------- ---- ----
...
fffff8a0002972c0 SymbolicLink Scsi2:
...
3: kd> !object fffff8a0002972c0
Object: fffff8a0002972c0 Type: (fffffa8003968de0) SymbolicLink
ObjectHeader: fffff8a000297290 (new version)
HandleCount: 0 PointerCount: 1
Directory Object: fffff8a000006270 Name: Scsi2:
Target String is '\Device\Ide\IdePort1'
3: kd> !object \device\ide\ideport1
Object: fffffa8005318050 Type: (fffffa80039ddde0) Device
ObjectHeader: fffffa8005318020 (new version)
HandleCount: 0 PointerCount: 2
Directory Object: fffff8a000272eb0 Name: IdePort1
3: kd> !devobj fffffa8005318050
Device object (fffffa8005318050) is for:
IdePort1 \Driver\atapi DriverObject fffffa8004f0fe70
Current Irp 00000000 RefCount 0 Type 00000004 Flags 00000050
Dacl fffff9a1002f9901 DevExt fffffa80053181a0 DevObjExt fffffa800531abe8
...