Зависит от типа устройства. например, если это универсальное c устройство PCI, то доступ к аппаратному обеспечению осуществляется «напрямую» к HW, что означает Windows сопоставление PCI MMIO с некоторым виртуальным адресом, и драйвер взаимодействует с ним.
Microsoft рекомендовала использовать функцию HAL для предотвращения проблем с оптимизацией компилятора, например, использовать макрос READ_REGISTER_UCHAR()
для чтения BYTE из регистра устройства.
Например, USB подсистема с большим стеком и контроллером USB, который управляет доступом к устройству. поэтому в этом случае вам понадобится использовать функцию для доступа к реестру устройства.
Вы можете найти множество примеров драйверов Microsoft в GitHub