powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
5 сообщений из 5, страница 1 из 1
IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
    #38665910
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уперся рогом в проблему, которую описал здесь:
А как установить/обновить драйвер для одного конкретного модема?

Полный код того же самого проекта на VB6 я выкладывал:
Возможно ли программно установить модем?

Хочу раскрутить DEVICE_OBJECT structure забравшись туда через IoGetDeviceObjectPointer routine

Пытался через указатели для начала (!!!"Ntoskrnl.exe" -exe это не "опечатка", ф-цию эту он там находит, т.е. с этим я угадал):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Declare Function IoGetDeviceObjectPointer Lib "Ntoskrnl.exe" _
 (ByVal ObjectName As String, ByVal DesiredAccess As Long, _
 ByRef FileObject As Long, ByRef DeviceObject As Long) As Long
...
  Dim dwRes As Long
  Dim m_FileObject As Long
  Dim m_DeviceObject As Long
  dwRes = IoGetDeviceObjectPointer("ROOT\MODEM\0000", FILE_ALL_ACCESS, m_FileObject, m_DeviceObject)
  MsgBox dwRes



Стабильно дает краш.

Попытался ByRef DeviceObject As DEVICE_OBJECT, путь по идее правильный
Объявил на дурака вот так:
Код: vbnet
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.
Public Type DEVICE_OBJECT
  Type As Long
  Size As Long
  ReferenceCount As Long
  DriverObject As Long 'Ptr
  NextDevice As Long 'Ptr
  AttachedDevice As Long 'Ptr
  CurrentIrp As Long 'Ptr
  Timer As Long 'Ptr
  Flags As Long
  Characteristics As Long
  Vpb As Long 'Ptr
  DeviceExtension As Long 'Ptr
  DeviceType As Long
  StackSize As Long
  UnionListEntryWcb As Long
  AlignmentRequirement As Long
  DeviceQueue As Long
  Dpc As Long
  ActiveThreadCount As Long
  SecurityDescriptor As Long
  DeviceLock As Long
  SectorSize As Long
  Spare1 As Long
  DeviceObjectExtension As Long 'Ptr
  Reserved As Long 'Ptr
End Type



Все равно стабильный краш. И подозреваю так и будет пока не подсуну структуру правильного размера.
Только как ее правильно то записать, там еще вложенные структуры в том числе того же типа DEVICE_OBJECT.


Код: plaintext
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.
typedef struct _DEVICE_OBJECT {
  CSHORT                      Type;
  USHORT                      Size;
  LONG                        ReferenceCount;
  struct _DRIVER_OBJECT  *DriverObject;
  struct _DEVICE_OBJECT  *NextDevice;
  struct _DEVICE_OBJECT  *AttachedDevice;
  struct _IRP  *CurrentIrp;
  PIO_TIMER                   Timer;
  ULONG                       Flags;
  ULONG                       Characteristics;
  __volatile PVPB             Vpb;
  PVOID                       DeviceExtension;
  DEVICE_TYPE                 DeviceType;
  CCHAR                       StackSize;
  union {
    LIST_ENTRY         ListEntry;
    WAIT_CONTEXT_BLOCK Wcb;
  } Queue;
  ULONG                       AlignmentRequirement;
  KDEVICE_QUEUE               DeviceQueue;
  KDPC                        Dpc;
  ULONG                       ActiveThreadCount;
  PSECURITY_DESCRIPTOR        SecurityDescriptor;
  KEVENT                      DeviceLock;
  USHORT                      SectorSize;
  USHORT                      Spare1;
  struct _DEVOBJ_EXTENSION  *  DeviceObjectExtension;
  PVOID                       Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;



Есть идеи как бороться?

Через DDK на C++ пытался, но там другая проблема - мне не удалось сделать чтоб h-файлы не конфликтовали.
Хочется на VB6 в это въехать.
...
Рейтинг: 0 / 0
IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
    #38666010
Первый параметр неправильно передаётся. Остальное не смотрел.
UNICODE_STRING structure
...
Рейтинг: 0 / 0
IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
    #38666167
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й кварталПервый параметр неправильно передаётся. Остальное не смотрел.
UNICODE_STRING structure

Да, проглядел.
Скорее вот эта ссылка
UNICODE_STRING structure
И вот эта ф-ция:
RtlInitUnicodeString routine

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Кусок ниже по крайней мере не ругается.
 Public Type UNICODE_STRING
   Length As Integer
   MaximumLength As Integer
   buffer As Long
 End Type
Public Declare Sub RtlInitUnicodeString Lib "Ntoskrnl.exe" _
 (ByRef DestinationString As UNICODE_STRING, ByVal SourceString As String)
...
  RtlInitUnicodeString devName, "ROOT\MODEM\0000"



IoGetDeviceObjectPointer -продолжает ругаться крашем на ByRef as long в двух последних параметрах.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Declare Function IoGetDeviceObjectPointer Lib "Ntoskrnl.exe" _
 (ByRef ObjectName As UNICODE_STRING, ByVal DesiredAccess As Long, _
 ByRef FileObject As Long, ByRef DeviceObject As Long) As Long

  RtlInitUnicodeString devName, "ROOT\MODEM\0000"
  MsgBox "OK"
  Dim dwRes As Long
  Dim m_FileObject As Long
  Dim m_DeviceObject As Long
  dwRes = IoGetDeviceObjectPointer(devName, FILE_ALL_ACCESS, m_FileObject, m_DeviceObject)



Попробовал структуры ByRef (от балды пока, хрен там разберет без поллитра)
продолжает ругаться крашем

Код: vbnet
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.
Public Type DEVICE_OBJECT
  Type As Integer
  Size As Integer
  ReferenceCount As Long
  DriverObject As Long 'Ptr
  NextDevice As Long 'Ptr
  AttachedDevice As Long 'Ptr
  CurrentIrp As Long 'Ptr
  Timer As Long 'Ptr
  Flags As Long
  Characteristics As Long
  Vpb As Long 'Ptr
  DeviceExtension As Long 'Ptr
  DeviceType As Long
  StackSize As Long
  UnionListEntryWcb As Long
  AlignmentRequirement As Long
  DeviceQueue As Long
  Dpc As Long
  ActiveThreadCount As Long
  SecurityDescriptor As Long
  DeviceLock As Long
  SectorSize As Integer
  Spare1 As Integer
  DeviceObjectExtension As Long 'Ptr
  Reserved As Long 'Ptr
End Type

Public Type FILE_OBJECT
  Type As Integer
  Size As Integer
  DeviceObject As Long 'Ptr?
  Vpb As Long 'Ptr
  FsContext As Long 'Ptr
  FsContext2 As Long 'Ptr
  SectionObjectPointer As Long 'Ptr?
  PrivateCacheMap As Long 'Ptr
  FinalStatus As Long
  RelatedFileObject As Long 'Ptr
  LockOperation As Boolean
  DeletePending As Boolean
  ReadAccess As Boolean
  WriteAccess As Boolean
  DeleteAccess As Boolean
  SharedRead As Boolean
  SharedWrite As Boolean
  SharedDelete As Boolean
  Flags As Long
  FileName As UNICODE_STRING
  CurrentByteOffset As Long
  Waiters As Long
  Busy As Long
  LastLock As Long
  Lock As Long
  Event As Long
  CompletionContext As Long
  IrpListLock As Long
  IrpList As Long
  FileObjectExtension As Long
End Type



Размер бы их хоть узнать как-то?
Тогда б массив байтов попытался б подсунуть.
Там ведь дело тонкое. Байтов до хрена, а больше меньше - расстрел.
И еще 2 параметра, угадать нереально.
...
Рейтинг: 0 / 0
IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
    #38666269
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сурьезным вещам.

насчет union прочитай тут: http://bbs.vbstreets.ru/viewtopic.php?f=1&t=43788
...
Рейтинг: 0 / 0
IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
    #38666358
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyнасчет union
union легко обходится
например в Opal я тупо декларировал несколько структур и несколько вариантов одной и той же API чтоб не морочиться.
В случае DEVICE_OBJECT скорее всего достаточно одного Long вместо Union что там есть.

Вот как бы размер структуры подсчитать/угадать. Мне по сути надо добиться прежде всего чтоб ф-ция не крашила.
Тогда уже можно потихоньку выяснять ху is ху.

Один из вариантов - родить хоть что-то компилирующееся в C++ и распечатать размер.
А по другому никак?
И почему оно с Byref as Long вылетает? Некуда результаты класть?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / IoGetDeviceObjectPointer routine + DEVICE_OBJECT structure с VB6 шансы есть?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]