С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 18.07.2017
Сообщений: 50

Как создать новый COM порт в диспетчере устройств с использованием fakemodem.sys?

13.01.2023, 10:32. Показов 1468. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Разбираюсь в процессе написания драйверов. Почитал Павла Йосифовича. Выкачал WDK, настроил Visual Studio, создал виртуалку с Windows. Вывел через KdPrint("Hello,world!"). И по скопипащенному из книги примеру при помощи драйвера и консольного приложения поменял приоритет треда. В последнем примере в функции DriverEntry создаётся (при помощи IoCreateSymbolycLink) текстовая ссылка (условно "MyDriver"), при помощи которой в main() приложения получается хэндлер:
C
1
HANDLE hDevice = CreateFile(L"\\\\.\\MyDriver", ...
Хочу создать виртуальный COM-порт. Для этого взял пример fakemode из майкрософтовских примеров. Я его успешно собрал, установил на виртуалку и запустил. COM-порт в диспетчере устройств не появился (что, наверное, логично). Значит, надо как-то сообщить драйверу о необходимости создания этого COM-порта. Но как? В DriverEntry у примера fakemodem нет создания текстовой ссылки:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NTSTATUS DriverEntry(
           IN PDRIVER_OBJECT  DriverObject,
           IN PUNICODE_STRING RegistryPath
           )
{
    NTSTATUS            status = STATUS_SUCCESS;
    WDF_DRIVER_CONFIG   config;
    KdPrint(("Fakemode Function Driver Sample - Driver Framework Edition.\n"));
    KdPrint(("Built %s %s\n", __DATE__, __TIME__));
    WDF_DRIVER_CONFIG_INIT( &config, FmEvtDeviceAdd );
    status = WdfDriverCreate(
                            DriverObject,
                            RegistryPath,
                            WDF_NO_OBJECT_ATTRIBUTES,
                            &config,          // Driver Config Info
                            WDF_NO_HANDLE
                            );
    if (!NT_SUCCESS(status)) {
        KdPrint( ("WdfDriverCreate failed with status 0x%x\n", status));
    }
    return status;
}
Но даже если как-нибудь (может, дописав в код fakemodem создание текстовой ссылки, а может , при помощи OpenDriver(...), но это не точно) удастся получить в приложении хэндлер, то что делать дальше? В примере от Microsoft нет кода приложения usermode для использования самого драйвера fakemodem.sys. Как ему внушить, что мне требуется создать COM-порт?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2023, 10:32
Ответы с готовыми решениями:

Новый ноутбук не видит внешний жесткий диск даже в диспетчере устройств
Есть внешний жесткий диск seagate srd0nf1, ноутбук на win8 отлично с ним работет.Новый ноутбук на win10 обсалютно никак не реагирует на...

Как создать ярлык для "сетевые адаптёры" в Диспетчере устройств
Как создать ярлык для "сетевые адаптёры" (в Диспетчере устройств) или даже конкретного сетевого адаптёра на рабочем столе? ...

Новый SSD не отображается в БИОСе, но отображается в диспетчере устройств при подключении через USB-переходник
Здравствуйте! купил SSD Kingston 120 Gb несколько часов назад. В биосе он не определялся, поэтому я решил сначала обновить биос. Скачал...

1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
17.01.2023, 13:22
На вашем месте я бы начал с классической модели драйверов WDM, а не как в примере выше WDF, где большинство действий происходят под капотом прозрачно. Когда освоите WDM, можно будет переходить на WDF. Плюс такого подхода в том, что вы будете понимать, что именно делаете и зачем записывать то или иное значение в служебные структуры драйвера.

Цитата Сообщение от flammmable Посмотреть сообщение
Значит, надо как-то сообщить драйверу о необходимости создания этого COM-порта. Но как?
Чтобы девайс появился в диспетчере, для начала нужно создать его IoCreateDevice() (модель драйвера WDM), и только потом привязывать к нему линк IoCreateSymbolicLink() для вызова из приложений юзера. Как-правило, это делается внутри процедуры точки-входа DriverEntry(), которая ожидает от диспетчера в/в указатель на основную структуру драйвера DRIVER_OBJECT. В этой структуре мы должны прописать указатели на остальные функции драйвера, обязательными из которых являются DriverUnload() и AddDevice() - первая выгружает драйвер из памяти, а вторая будет вызываться каждый раз, когда диспетчер PnP обнаружит подключённое к порту устройство.

Более того, в хвосте структуры DRIVER_OBJECT (по смещению 70h) имеется массив из 28-указателей на обработчики мажорных кодов IRP, куда нужно будет выборочно прописать обслуживаемые драйвером коды - поле так и называется "DRIVER_OBJECT.MajorFunction". Здесь имеет смысл воспользоваться отладчиком WinDbg, вот как он представляет эту структуру на системах х64:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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      <------- массив из 28 кодов IRP
Поля до смещения 58h включительно заполнит сама fn IoCreateDevice(), а нам нужно лишь указать адрес процедуры DriverUnload() в своём драйвере, и перечень мажорных кодов, которые мы собираемся обслуживать. Указатель на обязательную AddDevice() зарыт в поле DriverExtension по смещению 30h (в нём лежит линк на одноимённую структуру):
Code
1
2
3
4
5
6
7
8
0: kd> dt _driver_extension
ntdll!_DRIVER_EXTENSION
   +0x000 DriverObject          : Ptr64 _DRIVER_OBJECT
   +0x008 AddDevice             : Ptr64   long    <------- Прописать сюда адрес
   +0x010 Count                 : Uint4B
   +0x018 ServiceKeyName        :       _UNICODE_STRING
   +0x028 ClientDriverExtension : Ptr64 _IO_CLIENT_EXTENSION
   +0x030 FsFilterCallbacks     : Ptr64 _FS_FILTER_CALLBACKS
После этого можно вызывать функцию создания устройства IoCreateDevice(), которая имеет прототип ниже. Здесь в аргументе "DeviceType" передаём тип создаваемого устройства (полный список см. в хидере Ntddk.h, или здесь). Она возвратит указатель на структуру объекта нового устройства DEVICE_OBJECT:
Code
1
2
3
4
5
6
7
8
9
NTSTATUS IoCreateDevice(
  [in]      pDRIVER_OBJECT  DriverObject,         <--- адрес _DRIVER_OBJECT из аргумента DriverEntry()
  [in]      ULONG           DeviceExtensionSize,  <--- 0
  [in, opt] pUNICODE_STRING DeviceName,           <--- адрес строки: '\Device\VirtualCOM-1',0
  [in]      DEVICE_TYPE     DeviceType,           <--- FILE_DEVICE_SERIAL_PORT = 0x1b
  [in]      ULONG           DeviceCharacteristics,<--- 0
  [in]      BOOLEAN         Exclusive,            <--- 0
  [out]     pDEVICE_OBJECT  *DeviceObject         <--- адрес _DEVICE_OBJECT
);
Вот код на ассемблере, который проделывает всё вышесказанное.
Таким образом, отобразить устройство в диспетчере не проблема, но чтобы заставить его драйвер исправно функционировать, нужно согласно конкретному протоколу обмена, написать сотни строк кода. Обойти эту проблему можно двумя способами: (1)импортировать в свой драйвер функции системного serial.sys (тогда не нужно будет писать свои); или (2)просто не создавать свою, а утащить уже готовую структуру DRIVER_OBJECT у драйвера serial.sys.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
;// fasm-code
;//------------------------
format PE64 native at 10000h
entry  DriverEntry
 
include 'win64ax.inc'
include 'DDK\ntstatus.inc'
include 'DDK\ntddk.inc'
;//------------------------
section '.code' code readable writeable executable notpageable
  status    dd 0
  fdo       dd 0     ;// под указатель на "Functional DEVICE_OBJECT"
 
  uSymLink  du  '\??\VirtualCOM-1',0       ;// см.папку "GLOBAL??" в пространстве имён объектов ядра
  uDevName  du  '\Device\VirtualCOM-1',0  
;//------------------------
 
proc  DriverEntry pDriverObject, usRegistryPath
 
;// Заполняем поля структуры "DRIVER_OBJECT"
     mov     eax,[pDriverObject]
     mov    [eax+DRIVER_OBJECT.MajorFunction.IRP_MJ_CREATE],DispatchCreate
     mov    [eax+DRIVER_OBJECT.MajorFunction.IRP_MJ_CLOSE],DispatchClose
     mov    [eax+DRIVER_OBJECT.MajorFunction.IRP_MJ_DEVICE_CONTROL],DispatchCtrl
     mov    [eax+DRIVER_OBJECT.MajorFunction.IRP_MJ_POWER],DispatchPower
     mov    [eax+DRIVER_OBJECT.MajorFunction.IRP_MJ_PNP],DispatchPnP
     mov    [eax+DRIVER_OBJECT.DriverUnload],DriverUnload
 
     mov     ecx,[eax+DRIVER_OBJECT.DriverExtension]
     mov    [ecx+8],AddDevice
 
;// Создаём устройство "SerialPort"
     invoke  IoCreateDevice,[pDriverObject],0,uDevName,FILE_DEVICE_SERIAL_PORT,0,0,fdo
     or      eax,eax
     jnz     @exit
 
;// Привязываем к нему линк
     invoke  IoCreateSymbolicLink,uSymLink,uDevName
     or      eax,eax
     jnz     @DeleteDevice
 
     mov    [status],STATUS_SUCCESS
     jmp     @exit
 
@DeleteDevice:
     invoke  IoDeleteDevice,[pDeviceObject]
@exit:
     mov     eax,[status]
     ret
endp
;//********************************************************
;// Создаём процедуры драйвера для обработки запросов IRP
;//********************************************************
proc  AddDevice pDriverObject, pPhysicalDeviceObject
;// код процедуры ...
     mov     eax,STATUS_SUCCESS
     ret
endp
proc  DispatchCreate  pDeviceObject, pIrp
;// код процедуры ...
     mov     eax,STATUS_SUCCESS
     ret
endp
proc  DispatchClose  pDeviceObject, pIrp
;// код процедуры ...
     mov     eax,STATUS_SUCCESS
     ret
endp
proc  DispatchCtrl  pDeviceObject, pIrp
;// код процедуры ...
     mov     eax,STATUS_SUCCESS
     ret
endp
proc  DispatchPower  pDeviceObject, pIrp
;// код процедуры ...
     mov     eax,STATUS_SUCCESS
     ret
endp
proc  DispatchPnP  pDeviceObject, pIrp
;// код процедуры ...
     mov     eax,STATUS_SUCCESS
     ret
endp
Цитата Сообщение от flammmable Посмотреть сообщение
то что делать дальше?
Прежде чем писать свой дров СОМ-порта, разумно ознакомиться со-структурой системного "serial.sys" - отладчик покажет всю его подноготную. Правда он грузится системой только, когда СОМ-порты включены в биосе:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
0: kd> !drvobj serial 3
---------------------------------------------------------
Driver object (fffffa80`0298d700) is for:  \Driver\Serial
Driver Extension List: (id , addr)
 
Device Object list:
fffffa80`02b103d0   fffffa80`02b233d0   <--- один драйвер обслуживает 2-девайса: COM-1 и COM-2.
 
DriverEntry:   fffff880`03bb6650  serial  <---+-- точки-входа в процедуры..
DriverStartIo: 00000000                   <---+ 
DriverUnload:  fffff880`03ba9dd8  serial  <---+ 
AddDevice:     fffff880`03baaacc  serial  <---+ 
 
Dispatch routines:
[00] IRP_MJ_CREATE                      fffff88003ba9e38        serial+0xbe38
[01] IRP_MJ_CREATE_NAMED_PIPE           fffff80002aa7c60        nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE                       fffff88003bb2668        serial+0x14668
[03] IRP_MJ_READ                        fffff88003bb2e6c        serial+0x14e6c
[04] IRP_MJ_WRITE                       fffff88003bb4458        serial+0x16458
[05] IRP_MJ_QUERY_INFORMATION           fffff88003baa1b4        serial+0xc1b4
[06] IRP_MJ_SET_INFORMATION             fffff88003baa2ec        serial+0xc2ec
[07] IRP_MJ_QUERY_EA                    fffff80002aa7c60        nt!IopInvalidDeviceRequest
[08] IRP_MJ_SET_EA                      fffff80002aa7c60        nt!IopInvalidDeviceRequest
[09] IRP_MJ_FLUSH_BUFFERS               fffff88003ba9008        serial+0xb008
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    fffff80002aa7c60        nt!IopInvalidDeviceRequest
[0b] IRP_MJ_SET_VOLUME_INFORMATION      fffff80002aa7c60        nt!IopInvalidDeviceRequest
[0c] IRP_MJ_DIRECTORY_CONTROL           fffff80002aa7c60        nt!IopInvalidDeviceRequest
[0d] IRP_MJ_FILE_SYSTEM_CONTROL         fffff80002aa7c60        nt!IopInvalidDeviceRequest
[0e] IRP_MJ_DEVICE_CONTROL              fffff88003bb0908        serial+0x12908
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     fffff88003bb1cf4        serial+0x13cf4
[10] IRP_MJ_SHUTDOWN                    fffff80002aa7c60        nt!IopInvalidDeviceRequest
[11] IRP_MJ_LOCK_CONTROL                fffff80002aa7c60        nt!IopInvalidDeviceRequest
[12] IRP_MJ_CLEANUP                     fffff88003bb2bb8        serial+0x14bb8
[13] IRP_MJ_CREATE_MAILSLOT             fffff80002aa7c60        nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY              fffff80002aa7c60        nt!IopInvalidDeviceRequest
[15] IRP_MJ_SET_SECURITY                fffff80002aa7c60        nt!IopInvalidDeviceRequest
[16] IRP_MJ_POWER                       fffff88003badadc        serial+0xfadc
[17] IRP_MJ_SYSTEM_CONTROL              fffff88003bad7cc        serial+0xf7cc
[18] IRP_MJ_DEVICE_CHANGE               fffff80002aa7c60        nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA                 fffff80002aa7c60        nt!IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA                   fffff80002aa7c60        nt!IopInvalidDeviceRequest
[1b] IRP_MJ_PNP                         fffff88003baab94        serial+0xcb94
Здесь видно, что структура DRIVER_OBJECT serial.sys лежит по адресу fffffa80`0298d700 (первая строка лога). Так-же указаны адреса внутренних процедур DriverEntry(), DriverUnload(), AddDevice(), и типы обрабатываемых запросов IRP (nt!IopInvalidDeviceRequest означает необрабатываемая заглушка). К примеру, когда мы вызываем из своего/юзерского приложения CreateFile(), то управление получает процедура драйвера IRP_MJ_CREATE, когда закрываем дескриптор через CloseHandle() - IRP_MJ_CLOSE, и т.д. Таким образом, системный драйвер serial.sys обрабатывает всего 13 запросов, из 28-ми (1bh) возможных.

Поскольку лог уже вернул нам адрес структуры DRIVER_OBJECT=fffffa80`0298d700, мы можем просмотреть её содержимое в заполненном виде. Если взять значения из выделенных стрелками полей, то они совпадают с теми, что в логе выше:

kd> dt _driver_object

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
0: kd> dt _driver_object fffffa800298d700
ntdll!_DRIVER_OBJECT
   +0x000 Type             : 4
   +0x002 Size             : 336
   +0x008 DeviceObject     : 0xfffffa8002b103d0 _DEVICE_OBJECT
   +0x010 Flags            : 0x12
   +0x018 DriverStart      : 0xfffff88003b9e000 Void
   +0x020 DriverSize       : 0x1d000
   +0x028 DriverSection    : 0xfffffa80029cb680 Void
   +0x030 DriverExtension  : 0xfffffa800298d850 _DRIVER_EXTENSION
   +0x038 DriverName       : _UNICODE_STRING    "\Driver\Serial"
   +0x048 HardwareDatabase : 0xfffff80002f94568 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
   +0x050 FastIoDispatch   : (null)
   +0x058 DriverInit       : 0xfffff88003bb6650                <----- адрес DriverEntry()
   +0x060 DriverStartIo    : (null)
   +0x068 DriverUnload     : 0xfffff88003ba9dd8                <----- адрес DriverUnload()
   +0x070 MajorFunction    : [28] 0xfffff88003ba9e38           <----- массив указателей на обработчики!
 
0: kd> dt _driver_extension 0xfffffa800298d850
ntdll!_DRIVER_EXTENSION
   +0x000 DriverObject          : 0xfffffa800298d700 _DRIVER_OBJECT
   +0x008 AddDevice             : 0xfffff88003baaacc           <----- адрес AddDevice()
   +0x010 Count                 : 0
   +0x018 ServiceKeyName        : _UNICODE_STRING "Serial"
   +0x028 ClientDriverExtension : (null)
   +0x030 FsFilterCallbacks     : (null)
 
************************************************************************************
В первом поле "Type" хранится тип структуры, 
которое может принимать следующие значения (см.хидер Ntddk.h):
************************************************************************************
IO_TYPE_ADAPTER                 = 0x00000001
IO_TYPE_CONTROLLER              = 0x00000002
IO_TYPE_DEVICE                  = 0x00000003
IO_TYPE_DRIVER                  = 0x00000004  <--- наш клиент
IO_TYPE_FILE                    = 0x00000005
IO_TYPE_IRP                     = 0x00000006
IO_TYPE_MASTER_ADAPTER          = 0x00000007
IO_TYPE_OPEN_PACKET             = 0x00000008
IO_TYPE_TIMER                   = 0x00000009
IO_TYPE_VPB                     = 0x0000000a
IO_TYPE_ERROR_LOG               = 0x0000000b
IO_TYPE_ERROR_MESSAGE           = 0x0000000c
IO_TYPE_DEVICE_OBJECT_EXTENSION = 0x0000000d
 
************************************************************************************
Три поля "DriverStart/Size/Section" определяют расположение драйвера в памяти,
и если запросить дамп стартового адреса, то упрёмся в заголовок драйвера serial.sys:
************************************************************************************
0: kd> db 0xfffff88003b9e000 L128
fffff880`03b9e000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
fffff880`03b9e010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......
fffff880`03b9e020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffff880`03b9e030  00 00 00 00 00 00 00 00-00 00 00 00 e8 00 00 00  ................
fffff880`03b9e040  0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68  ........!..L.!Th
fffff880`03b9e050  69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f  is program canno
fffff880`03b9e060  74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20  t be run in DOS
fffff880`03b9e070  6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00  mode....$.......
fffff880`03b9e080  88 0b 0c b1 cc 6a 62 e2-cc 6a 62 e2 cc 6a 62 e2  .....jb..jb..jb.
fffff880`03b9e090  cc 6a 63 e2 8f 6a 62 e2-c5 12 f1 e2 cb 6a 62 e2  .jc..jb......jb.
fffff880`03b9e0a0  c5 12 f7 e2 cf 6a 62 e2-c5 12 e1 e2 c8 6a 62 e2  .....jb......jb.
fffff880`03b9e0b0  c5 12 eb e2 d9 6a 62 e2-c5 12 f6 e2 cd 6a 62 e2  .....jb......jb.
fffff880`03b9e0c0  c5 12 f3 e2 cd 6a 62 e2-52 69 63 68 cc 6a 62 e2  .....jb.Rich.jb.
fffff880`03b9e0d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fffff880`03b9e0e0  00 00 00 00 00 00 00 00-50 45 00 00 64 86 09 00  ........PE..d...
fffff880`03b9e0f0  a8 ca 5b 4a 00 00 00 00-00 00 00 00 f0 00 22 00  ..[J..........".
fffff880`03b9e100  0b 02 09 00 00 32 01 00-00 3c 00 00 00 00 00 00  .....2...<......
fffff880`03b9e110  50 86 01 00 00 10 00 00-00 00 01 00 00 00 00 00  P...............
fffff880`03b9e120  00 10 00 00 00 02 00 00                          ........
 
************************************************************************************
Запрос "!drvobj" вернул нам 2-линка на объекты устройств: "Device Object list"
Просматриваем структуру первого fffffa80`02b103d0, и его позицию в стеке:
************************************************************************************
0: kd> dt _device_object 0xfffffa8002b103d0
-------------------------------------------
ntdll!_DEVICE_OBJECT
   +0x000 Type             : 3
   +0x002 Size             : 0xbc0
   +0x004 ReferenceCount   : 0
   +0x008 DriverObject     : 0xfffffa80`0298d700 _DRIVER_OBJECT
   +0x010 NextDevice       : 0xfffffa80`02b233d0 _DEVICE_OBJECT  <--- линк на сл.устройство COM-2
   +0x018 AttachedDevice   : 0xfffffa80`02b100c0 _DEVICE_OBJECT  <--- к кому цепляется в стеке.
   +0x020 CurrentIrp       : (null)
   +0x028 Timer            : (null)
   +0x030 Flags            : 0x204c
   +0x034 Characteristics  : 0x100
   +0x038 Vpb              : (null)
   +0x040 DeviceExtension  : 0xfffffa80`02b10520 Void
   +0x048 DeviceType       : 0x1b
   +0x04c StackSize        : 6 ''
   +0x050 Queue            : <unnamed-tag>
   +0x098 AlignRequirement : 0
   +0x0a0 DeviceQueue      : _KDEVICE_QUEUE
   +0x0c8 Dpc              : _KDPC
   +0x108 ActiveThreadCount: 0
   +0x110 SecurityDesc     : 0xfffff8a0`0008d4e0 Void
   +0x118 DeviceLock       : _KEVENT
   +0x130 SectorSize       : 0
   +0x132 Spare1           : 1
   +0x138 DevObjExtension  : 0xfffffa80`02b10f90 _DEVOBJ_EXTENSION
   +0x140 Reserved         : (null)
 
0: kd> !devstack fffffa8002b103d0
---------------------------------
  !DevObj            !DrvObj           !DevExt            ObjectName
  fffffa8002b48d60   \Driver\Serenum   fffffa8002b48eb0
> fffffa8002b103d0   \Driver\Serial    fffffa8002b481c0   Serial1
  fffffa800223b550   \Driver\ACPI      fffffa8001862d50   0000005f
 
!DevNode fffffa800223fd90:
  DeviceInst  is "ACPI\PNP0501\2"
  ServiceName is "Serial"


Так выглядит картина в общих чертах..
Утилита "WinObj" от sysinternal позволит отследить, создалось-ли устройство fn IoCreateDevice(), и привязала-ли IoCreateSymbolicLink() к нему линк, в пространстве имён объектов ядра.
Миниатюры
Как создать новый COM порт в диспетчере устройств с использованием fakemodem.sys?   Как создать новый COM порт в диспетчере устройств с использованием fakemodem.sys?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2023, 13:22
Помогаю со студенческими работами здесь

В диспетчере устройств, в контроллерах запоминающих устройств висит желтый значек
Дело в том что в диспетчере устройств в контроллерах запоминающих устройств висит желтый значек, AUV9QTYS IDE Controller- диспетчер...

SSD в диспетчере устройств виден как HDD
Всем привет. Вчера заметил что SSD диск в диспетчере задач определен как HDD. Не так давно менял мат. плату. Это конечно не особо...

Флешка определяется в диспетчере устройств, но не отображается как диск
Есть Cf-карта на 32 ГБ, стоящая в ipod classic (через переходник CF to zif) При подключении к компьютеру звучит характерный звук...

Как заставить автоматически запускаться устройства в диспетчере устройств?
как заставить автоматически запускаться устройства в диспетчере устройств в Windows 10? Вроде как есть такая утилиты devcon.exe, но я не...

Отключил встроенное видео в диспетчере устройств, как починить?
После чего все потухло... Теперь не могу никуда зайти соответственно и исправить.. Подскажите что делать


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru