1. Для создания PNP устройства не нужна железяка. Для примера можно посмотреть RamDisk идущий в составе DDK (могу прислать)
2. Для получения DEVICE_OBJECT можно сделать следующее: ZwOpenDirectoryObject\ZwQueryDirectoryObject перечислить все элементы в каталоге \\Driver, ObReferenceObjectByName — получаем указатель на DRIVER_OBJECT, pDrv->DeviceObject/pDrv->NextDevice. Таким обазом мы получим указатели на все DEVICE_OBJECT среди которых так же не PNP.
Так же можно использзовать IoGetDeviceProperty (DevicePropertyPhysicalDeviceObjectName) — получать имя PDO и запрашивать ObReferenceObjectByName. В этом случае запрос идет только к PNP устройствам