В статье Майкрософта есть такая картинка: Я хотел бы получить подобный стек/список драйверов, задействованных в работе конкретного устройства. Здесь, на WASM, посоветовали использовать для получения данного стека утилиту WinDbg. Я спросил на StackOverflow, как это сделать и там мне сказали, что это возможно при помощи команды "!devstack" (есть сомнения, что это то, что нужно, но это - ладно). Команде "!devstack" требуется идентификатор устройства. Я не вполне понимаю, где его взять. Я попробовал поискать в выпадающем списке "Свойство", который находится через "Диспетчер устройств->[моё устройство]->Свойства->Сведения". Но не нашёл там ничего подходящего. Я попробовал через AIDA64 - тоже не нашёл. Наверняка это можно сделать через сам WinDbg - но я также не нашёл подходящей команды. Я нашёл, что USB-сниффер USBlyzer в окне "Device Stack" выдаёт нечто похожее на идентификаторы из примеров использования "!devstack". В WinDbg я открыл редактор (командную строку?) через "File->Kernel Debug->Local". И ввёл там "!devstack 0xFFFF-блаблабла" с идентификатором, взятым из USBlyzer-а. Но WinDbg сказал: "Could not read Type from DeviceObject 0xFFFF-блаблабла" Вопрос. Кто-нибудь может рассказать по шагам, как получить список драйверов, к примеру, навороченной Logitec-овской мыши при помощи WinDbg? Без фигни в духе: 1) Не, а там, на самом деле всё очень просто, берёшь WinDbg, открываешь его, и там, в принципе всё понятно, очевидно и удобно. А если что, там есть справка. 2) Там же этот, как его, mouclass.sys, вот это - драйвер. А зачем вам стек-то, я не пойму? Вы расскажите, какую задачу решаете? Постановку, ТЗ. 3) Это тебе надо для начала прочитать 100500 страниц "Работа с ядром Windows" Павла Йосифовича. Там всё есть.
Windows Internals (PDF): https://repo.zenk-security.com/Linu...ions/Windows Internals Part 2_6th Edition.pdf В этой книге два раза встречается !devstack: 1. > EXPERIMENT: Viewing a Device Stack > lkd> !devstack keyboardclass0 ... 2. > EXPERIMENT: Looking at Microsoft Shadow Copy Provider Filter Device Objects 1: kd> !devstack 88cfd908 В первом случае используется имя устройства keyboardclass0 Во втором - [виртуальный] адрес объекта DEVICE_OBJECT, который выделяется один раз при загрузке драйвера (включении винды). Могу сказать, что список зарегистрированых Device-ов (т..е DEVICE_OBJECT-ов, но специалисты могут поправить меня) можно посмотреть програмулинкой WinObjEx64 https://github.com/hfiref0x/WinObjEx64 Можешь попробовать имена данных девайсов попередавать Ваще тут по-любому должны быть люди, способные разжевать детально. Ау, люди.
Да вроде всё тут прозрачно.. Имеем произвольный драйвер, который может обслуживать сразу несколько устройств одного класса. Для каждого из устройств, чз IoCreateDevice() драйвер создаёт структуру DEVICE_OBJECT. Структуру-же самого драйвера DRIVER_OBJECT, создаёт системный диспетчер в/в, и передаёт на неё указатель в функцию DriverEntry(). Внутри этой функции, драйвер заполняет некоторые поля своей структуры, прописывая в них адреса обработчиков IRP_MJ_xx. Код (Text): 0: kd> dt _driver_object --------------------------- ntdll!_DRIVER_OBJECT +0x000 Type : Int2B +0x002 Size : Int2B +0x008 DeviceObject : Ptr64 _DEVICE_OBJECT <--- объект устройства +0x010 Flags : Uint4B +0x018 DriverStart : Ptr64 Void +0x020 DriverSize : Uint4B +0x028 DriverSection : Ptr64 Void +0x030 DriverExtension : Ptr64 _DRIVER_EXTENSION +0x038 DriverName : _UNICODE_STRING +0x048 HardwareDatabase : Ptr64 _UNICODE_STRING +0x050 FastIoDispatch : Ptr64 _FAST_IO_DISPATCH +0x058 DriverInit : Ptr64 long <----- прописать линк на процедуру инициализации +0x060 DriverStartIo : Ptr64 void +0x068 DriverUnload : Ptr64 void <----- линк на процедуру выгрузки из памяти +0x070 MajorFunction : [28] Ptr64 long 0: kd> dt _device_object --------------------------- ntdll!_DEVICE_OBJECT +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 ReferenceCount : Int4B +0x008 DriverObject : Ptr64 _DRIVER_OBJECT <--- родитель +0x010 NextDevice : Ptr64 _DEVICE_OBJECT <--- нижнее устройство в стеке драйверов +0x018 AttachedDevice : Ptr64 _DEVICE_OBJECT <--- верхнее устройство в стеке драйверов +0x020 CurrentIrp : Ptr64 _IRP <--- текущий пакет IRP +0x028 Timer : Ptr64 _IO_TIMER +0x030 Flags : Uint4B +0x034 Characteristics : Uint4B +0x038 Vpb : Ptr64 _VPB +0x040 DeviceExtension : Ptr64 Void +0x048 DeviceType : Uint4B +0x04c StackSize : Char +0x050 Queue : <unnamed-tag> +0x098 AlignmentRequirement : Uint4B +0x0a0 DeviceQueue : _KDEVICE_QUEUE +0x0c8 Dpc : _KDPC +0x108 ActiveThreadCount : Uint4B +0x110 SecurityDescriptor : Ptr64 Void +0x118 DeviceLock : _KEVENT +0x130 SectorSize : Uint2B +0x132 Spare1 : Uint2B +0x138 DeviceObjectExtension : Ptr64 _DEVOBJ_EXTENSION +0x140 Reserved : Ptr64 Void 0: kd> Таким образом, чтобы просмотреть стек-драйверов, нужно сначала получить в WinDbg структуру конкретного драйвера командой !drvobj: Код (Text): 0: kd> !drvobj disk --------------------------------------- Driver object (fffffa80027a1670) is for: \Driver\Disk Driver Extension List: (id , addr) (fffff880019c38c0 fffffa80027a2020) Device Object list: fffffa80023e8790 fffffa80027a5060 fffffa80027a3790 Как видим, драйвер disk.sys создал 3 девайса, а WinDbg возвратил лист указателей на их структуры DEVICE_OBJECT. Теперь имеем адреса, и можно передать их команде отладчика !devstack: Код (Text): 0: kd> !devstack fffffa80023e8790 --------------------------------------- !DevObj !DrvObj !DevExt ObjectName fffffa8002282040 \Driver\partmgr fffffa8002282190 > fffffa80023e8790 \Driver\Disk fffffa80023e88e0 DR4 fffffa8003f76b30 \Driver\secnvmeF fffffa8003f76c80 fffffa80024cb040 \Driver\IaNVMeF fffffa80024cb190 fffffa800259b4c0 \Driver\USBSTOR fffffa800259b610 00000081 !DevNode fffffa80023f02b0: DeviceInst is "USBSTOR\Disk&Ven_ADATA&Prod_USB_Flash_Drive&Rev_0.00\0000000FEA63A5&0" ServiceName is "disk" При желании можно просмотреть основную информацию из структуры DEVICE_OBJECT, а не её позицию в стеке драйверов - это команда !devobj: Код (Text): 0: kd> !devobj fffffa80023e8790 --------------------------------------- Device object (fffffa80023e8790) is for: DR4 \Driver\Disk DriverObject fffffa80027a1670 Current Irp 00000000. RefCount 0. Type 00000007. Flags 01002050 Vpb fffffa80023e1aa0. Dacl fffff9a1050a95d0. DevExt fffffa80023e88e0. DevObjExt fffffa80023e8f88. Dope fffffa8001f2e6e0. ExtensionFlags (0x00000800) Unknown flags 0x00000800 AttachedDevice (Upper) fffffa8002282040 \Driver\partmgr AttachedTo (Lower) fffffa8003f76b30 \Driver\secnvmeF Device queue is not busy.