Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/126: Рейтинг темы: голосов - 126, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 14.11.2012
Сообщений: 6

Драйвер манипулирования лед лампочек на клавиатуре c++

21.06.2013, 14:56. Показов 25207. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте нашёл программу для манипуляции лед лампочек на клавиатуре..откомпилировал фйл получил файл драйвера всё как надо зарегистрировал и запустил DbgView пишет всё хорошо драйвер запущен но ничего не происходит
вот код самого драйвера
C++
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#include <ntddk.h>
 
// status register bits
#define IBUFFER_FULL 0x02
#define OBUFFER_FULL 0x01
 
#define IOCTL_CODE1 CTL_CODE(\
    FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
#define IOCTL_CODE2 CTL_CODE(\
    FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
#define IOCTL_SCROLLLOCK_ON CTL_CODE(\
    FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
#define IOCTL_SCROLLLOCK_OFF CTL_CODE(\
    FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject);
 
// Предварительные объявления функций:
NTSTATUS CompleteIrp(PIRP Irp, NTSTATUS status, ULONG info);
NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
NTSTATUS CloseHandle_IRPprocessing(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
NTSTATUS Write_IRPhandler(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
NTSTATUS Read_IRPhandler(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
//NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
NTSTATUS DeviceControlRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
 
 
//#pragma alloc_text(INIT, DriverEntry)
//#pragma alloc_text(PAGE, UnloadRoutine)
 
 
int CheckKeyboardBuffer() {
  UCHAR state;
  int i = 0;
 
  for(i = 0; i<100; i++) {
 
    state = READ_PORT_UCHAR((PUCHAR)0x64);
    KeStallExecutionProcessor(665);
 
    if(!(state & IBUFFER_FULL)) {
      return TRUE;
    }       
  }
 
  return FALSE;
 
}
 
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
  UNICODE_STRING usDeviceNameUnicodeString;
  UNICODE_STRING usDeviceLinkUnicodeString;
 
  PDEVICE_OBJECT DeviceObject = NULL;
  NTSTATUS Res;
 
 
  DriverObject->DriverUnload = UnloadRoutine;
 
  DbgPrint("TestDriver begin started!\n");
  DbgPrint("IOCTL_CODE1 = %x\n", IOCTL_CODE1);
  DbgPrint("IOCTL_CODE2 = %x\n", IOCTL_CODE2);
  DbgPrint("IOCTL_SCROLLLOCK_ON = %x\n", IOCTL_SCROLLLOCK_ON);
  DbgPrint("IOCTL_SCROLLLOCK_OFF = %x\n", IOCTL_SCROLLLOCK_OFF);
 
  DriverObject->MajorFunction[IRP_MJ_CREATE]= CreateFile_IRPprocessing;
  DriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseHandle_IRPprocessing;
  DriverObject->MajorFunction[IRP_MJ_WRITE] = Write_IRPhandler;
  DriverObject->MajorFunction[IRP_MJ_READ]  = Read_IRPhandler;
    
  // вариант с одной подрограммой
  //DriverObject->MajorFunction[IRP_MJ_READ]  = ReadWrite_IRPhandler;
  //DriverObject->MajorFunction[IRP_MJ_WRITE] = ReadWrite_IRPhandler;
  
  DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DeviceControlRoutine;
 
  // Подготовка Unicode-строк
  // не работает RtlInitUnicodeString (&usDeviceNameUnicodeString, L"\\Device\\TestDevice");
  RtlInitUnicodeString (&usDeviceNameUnicodeString, L"\\Device\\TestDriver");
  
  // Создание устройства
  Res = IoCreateDevice(DriverObject, 
                       sizeof(PDEVICE_OBJECT),
                       &usDeviceNameUnicodeString,
                       FILE_DEVICE_UNKNOWN,
                       0,
                       FALSE,
                       &DeviceObject);
 
  // Выход в случае ошибки при создании устройства
  if (!NT_SUCCESS(Res)) {
    DbgPrint("ERROR: Device not created!\n");
    return STATUS_UNSUCCESSFUL;
  }
 
  // не работает RtlInitUnicodeString (&usDeviceLinkUnicodeString, L"\\??\\TestDevice");  
  RtlInitUnicodeString (&usDeviceLinkUnicodeString, L"\\DosDevices\\TestDriver");
  
 
 
  // Создание символьной ссылки 
  Res = IoCreateSymbolicLink (&usDeviceLinkUnicodeString, &usDeviceNameUnicodeString);
  if (!NT_SUCCESS(Res)) {
    IoDeleteDevice(DeviceObject);
    DbgPrint("ERROR: Symbolic link not created!\n");
    return STATUS_UNSUCCESSFUL;
  }
  
  DbgPrint("TestDriver allready started!\n");
 
  return STATUS_SUCCESS;
}
 
VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject)
{
  UNICODE_STRING deviceLink;
  RtlInitUnicodeString(&deviceLink, L"\\Device\\TestDriver");
  IoDeleteSymbolicLink(&deviceLink);
  IoDeleteDevice(DriverObject->DeviceObject);  
 
  DbgPrint("TestDriver stopped!\n");
}
 
 
 
NTSTATUS CompleteIrp(PIRP Irp, NTSTATUS status, ULONG info)
{
  Irp->IoStatus.Status = status;
  Irp->IoStatus.Information = info;
  IoCompleteRequest(Irp,IO_NO_INCREMENT);return status;
}
 
 
NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
  //PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    
  DbgPrint("CreateFile processing!\n");
 
  return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
}
 
 
NTSTATUS CloseHandle_IRPprocessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
  //PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    
  DbgPrint("CloseHandle processing!\n");
 
  return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
}
 
 
 
NTSTATUS Write_IRPhandler(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
  //PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    
  DbgPrint("Write processing!\n");
 
  return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
}
 
 
 
NTSTATUS Read_IRPhandler(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
  //PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    
  DbgPrint("Read processing!\n");
 
  return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
}
 
 
 
NTSTATUS DeviceControlRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp) 
{
  
  NTSTATUS Res = STATUS_SUCCESS;
  PVOID pIOBuffer;       // буфер для обмена с приложением 
 
  PIO_STACK_LOCATION pIrpStack;
 
  pIrpStack = IoGetCurrentIrpStackLocation(Irp);
  pIOBuffer = Irp->AssociatedIrp.SystemBuffer;
 
  DbgPrint("DeviceControl Processing...\n");
 
  // выбор кода операции
  switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode) {
    
    case IOCTL_CODE1:
      DbgPrint("Processing IOCTL_CODE1...\n");
      break;
 
    case IOCTL_CODE2:
      DbgPrint("Processing IOCTL_CODE2...\n");
      break;
 
    case IOCTL_SCROLLLOCK_ON:
      DbgPrint("Processing IOCTL_SCROLLLOCK_ON...\n");
  
      if(CheckKeyboardBuffer()) {
        WRITE_PORT_UCHAR((PUCHAR)0x60,0xED);
      WRITE_PORT_UCHAR((PUCHAR)0x60,1);
      }
 
      break;
 
    case IOCTL_SCROLLLOCK_OFF:
      DbgPrint("Processing IOCTL_SCROLLLOCK_OFF...\n");
  
      if(CheckKeyboardBuffer()) {
        WRITE_PORT_UCHAR((PUCHAR)0x60,0xED);
      WRITE_PORT_UCHAR((PUCHAR)0x60,0);
      }
 
      break;     
  }
 
  return CompleteIrp(Irp,STATUS_SUCCESS,0); // Успешное завершение
 
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2013, 14:56
Ответы с готовыми решениями:

В комнате n лампочек. Сколькими способами можно зажечь k лампочек?
Помогите плиз... я некоторые задачи решила, но когда наткнулась на эти то, что то не могу понять что от меня хотят эти преподы... ...

Команды манипулирования битами
Объясните пожалуйста, как сделать вот такое, совершенно не могу понять как это реализовать. Заменить четверки битов 1010 в элементе...

манипулирования web-страницами
загружаю в webbrouser страницу. Заполняю программно поля логин и пароль и нажимаю кнопку для входа. Загружается следующая страница, но...

42
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
31.07.2013, 20:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mikl___ Посмотреть сообщение
VadimCher,
кажется я нашел причину по которой в mtut_29-07.asm для сокращения кода для обнуления регистра ЕВХ использовалась однобайтовая команда xchg ebx,eax при старте приложения в Windows XP ЕАХ равно нулю, для семерки это не так, то есть стоит заменить строку и приложение должно заработать, проверьте и отпишитесь пожалуйста...
текст mtut_29-07.asm
В результате exe файл собрался нормально. Когда я запустил его, нажал на светомузыка на клавиатуре отъехала мышь ps/2, а на клаве не было ничего (она USB). Музыка играет нормально.

Добавлено через 11 минут
Цитата Сообщение от VadimCher Посмотреть сообщение
В результате exe файл собрался нормально. Когда я запустил его, нажал на светомузыка на клавиатуре отъехала мышь ps/2, а на клаве не было ничего (она USB). Музыка играет нормально.
Нашел некий другой путь: http://www.skvozilka.com.ru/De... rt_win.htm и http://msdn.microsoft.com/libr... e/hh855052
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,771
01.08.2013, 04:17
Цитата Сообщение от VadimCher Посмотреть сообщение
Нашел некий другой путь:
Этот способ я здесь уже описывал
Цитата Сообщение от VadimCher Посмотреть сообщение
Музыка играет нормально.
Значит доступ к портам идет нормально, а вот доступ к USB-клавиатуре происходит не через 60h порт, как и предупреждал Убежденный
Цитата Сообщение от Убежденный Посмотреть сообщение
Работа с индикаторами клавиатуры через порты - это недокументированный механизм.
Вы не найдете его описания в MSDN, Windows Dev Center или в WDK.
Это значит, что он может работать вовсе не так, как ожидается. Или вообще не работать.
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 07:19
Цитата Сообщение от Mikl___ Посмотреть сообщение
Этот способ я здесь уже описывалЗначит доступ к портам идет нормально, а вот доступ к USB-клавиатуре происходит не через 60h порт, как и предупреждал Убежденный
Через DeviceIOControl как описывал Убежденный работает нормально, но только индикаторы. У меня же задача несколько иная- посылать коды клавиш на клавиатуру или произвольную последовательность байт.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 10:23
Цитата Сообщение от VadimCher Посмотреть сообщение
Проблема в том, что keyb_event для клавиш эммулирует набор клавиш, но не посылает обмен данных между компом и кейборд. Если подключить осцилограф это становится видно. Индикаторы честно отрабатывает, а вот с клавишами проблема.
Цитата Сообщение от VadimCher Посмотреть сообщение
Через DeviceIOControl как описывал Убежденный работает нормально, но только индикаторы. У меня же задача несколько иная- посылать коды клавиш на клавиатуру или произвольную последовательность байт.
Драйвер клавиатуры не посылает ей коды клавиш.
Он работает наоборот, в противоположном направлении: когда на клавиатуре что-то нажимается,
генерируется прерывание, после чего драйвер устройства (i8042prt, kbdhid и т.п.) вызывает
специальную callback-функцию драйвера класса (kbdclass). Полученные данные драйвер класса
запихивает в свою очередь, которую потом, элемент за элементом, отдает системе, в поток
обработки ввода (Raw Input Thread, RIT). Управляющие коды для индикаторов - это исключение
из правила, они передаются в направлении от системы к драйверу, после чего драйвер вызывает
соответствующие аппаратные механизмы, приводящие к зажиганию индикатора. Какие именно
механизмы - это "личное дело" драйвера, они зависят от типа клавиатуры, от материнской платы,
версии Windows и т.п. Это могут быть порты, или значения в определенных адресах памяти, или
операции ввода-вывода, отправленные в стек другого устройства, и т.д. В общем, черный ящик.

Если бы речь шла о том, что необходимо эмулировать нажатия клавиш на уровне драйвера, я
бы сказал "нет ничего проще, напишите фильтрующий драйвер и посадите его между kbdclass и
драйвером устройства клавиатуры, после чего подмените callback-функцию на свою и делайте с
нажатиями клавиш все, что угодно - хоть изменяйте, хоть запрещайте, хоть генерируйте свои".

Но отправлять в клавиатуру произвольные данные по проводу - это совсем другой уровень,
здесь драйвер клавиатуры не поможет. Можете даже не пытаться.
1
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 16:33
Цитата Сообщение от Убежденный Посмотреть сообщение
Драйвер клавиатуры не посылает ей коды клавиш.
Он работает наоборот, в противоположном направлении: когда на клавиатуре что-то нажимается,
генерируется прерывание, после чего драйвер устройства (i8042prt, kbdhid и т.п.) вызывает
специальную callback-функцию драйвера класса (kbdclass). Полученные данные драйвер класса
запихивает в свою очередь, которую потом, элемент за элементом, отдает системе, в поток
обработки ввода (Raw Input Thread, RIT). Управляющие коды для индикаторов - это исключение
из правила, они передаются в направлении от системы к драйверу, после чего драйвер вызывает
соответствующие аппаратные механизмы, приводящие к зажиганию индикатора. Какие именно
механизмы - это "личное дело" драйвера, они зависят от типа клавиатуры, от материнской платы,
версии Windows и т.п. Это могут быть порты, или значения в определенных адресах памяти, или
операции ввода-вывода, отправленные в стек другого устройства, и т.д. В общем, черный ящик.

Если бы речь шла о том, что необходимо эмулировать нажатия клавиш на уровне драйвера, я
бы сказал "нет ничего проще, напишите фильтрующий драйвер и посадите его между kbdclass и
драйвером устройства клавиатуры, после чего подмените callback-функцию на свою и делайте с
нажатиями клавиш все, что угодно - хоть изменяйте, хоть запрещайте, хоть генерируйте свои".

Но отправлять в клавиатуру произвольные данные по проводу - это совсем другой уровень,
здесь драйвер клавиатуры не поможет. Можете даже не пытаться.
Если команда на переключение индикаторов идет от компьютера к клавиатуре, то можно передавать последовательность байт в этом направлении. Любую последовательность. Другое дело, как на эту последовательность будет реагировать сама клавиатура, но это вопрос не актуальный. Главное- что-то передать произвольное. Механизм для этого есть, если переключаются индикаторы.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 16:51
Цитата Сообщение от VadimCher Посмотреть сообщение
Механизм для этого есть, если переключаются индикаторы.
Да, конечно.
Открываете устройство USB и шлете туда все, что захочется.
Можно воспользоваться библиотеками WinUSB или libusb.

Добавлено через 4 минуты
Если клавиатура определяется, как HID-устройство, с ней можно работать через HID-функции.
Это еще проще.
1
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 18:01
Цитата Сообщение от Убежденный Посмотреть сообщение
Да, конечно.
Открываете устройство USB и шлете туда все, что захочется.
Можно воспользоваться библиотеками WinUSB или libusb.

Добавлено через 4 минуты
Если клавиатура определяется, как HID-устройство, с ней можно работать через HID-функции.
Это еще проще.
Да, я читал об этом, но проблема в том, что HID функции не работают даже с индикаторами- существует защита системных устройств от записи. Драйвер, который вшит в exe файл и о котором идет речь выше в теме, по-видимому открывает доступ к системным портам. WriteFile не пишет в HID клавиатуру ничего и не должен (так как закрыт системой). http://www.gotdotnet.ru/forums/2/87759/
Чтобы открыть, надо писать драйвер, который работает в кернел моде. KMDF, например.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 18:13
Цитата Сообщение от VadimCher Посмотреть сообщение
проблема в том, что HID функции не работают даже с индикаторами- существует защита системных устройств от записи.

WriteFile не пишет в HID клавиатуру ничего и не должен (так как закрыт системой).
В интернете полно заблуждений.
Верить на слово нельзя никому, все нужно проверять практически.

Цитата Сообщение от VadimCher Посмотреть сообщение
Чтобы открыть, надо писать драйвер, который работает в кернел моде. KMDF, например.
Не обязательно.
1
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 18:26
Цитата Сообщение от Убежденный Посмотреть сообщение
В интернете полно заблуждений.
Верить на слово нельзя никому, все нужно проверять практически.



Не обязательно.
Я практически и проверил. JVCL347CompleteJCL241-Build4571 не позволяет писать в клаву.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 18:30
Цитата Сообщение от VadimCher Посмотреть сообщение
JVCL347CompleteJCL241-Build4571
Что это ?

Добавлено через 1 минуту
Цитата Сообщение от VadimCher Посмотреть сообщение
не позволяет писать в клаву.
Покажите код нахождения и открытия USB-устройства.
Без кода это все домыслы.
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 19:10
Цитата Сообщение от Убежденный Посмотреть сообщение
Что это ?

Добавлено через 1 минуту


Покажите код нахождения и открытия USB-устройства.
Без кода это все домыслы.
Путь к файлу проекта:
USBDemo_HID.rar\USBDemo_HID\USBDemo\KBRD \USBDemo\USBDemo\USBDemo.dproj
Вложения
Тип файла: rar USBDemo_HID.rar (885.2 Кб, 17 просмотров)
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 19:15
Цитата Сообщение от Yres Посмотреть сообщение
Здравствуйте нашёл программу для манипуляции лед лампочек на клавиатуре..откомпилировал фйл получил файл драйвера всё как надо зарегистрировал и запустил DbgView пишет всё хорошо драйвер запущен но ничего не происходит
вот код самого драйвера
C++
1
2
3
4
5
6
#include <ntddk.h>
 
// status register bits
#define IBUFFER_FULL 0x02
 
};
Выложите, пожалуйста, весь проект целиком в архиве. В какой версии Visual Studio он разрабатывался и какая версия WDK?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 19:26
Цитата Сообщение от VadimCher Посмотреть сообщение
Путь к файлу проекта:
USBDemo_HID.rar\USBDemo_HID\USBDemo\KBRD \USBDemo\USBDemo\USB Demo.dproj
А где сам класс, отвечающий за перечисление и открытие устройств HID ?
Я в Delphi не силен.

P.S. У меня на компьютере 2 HID-устройства: USB-клавиатура и USB UPS (бесперебойник).
Оба прекрасно открываются на запись.
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 19:32
Цитата Сообщение от Убежденный Посмотреть сообщение
А где сам класс, отвечающий за перечисление и открытие устройств HID ?
Я в Delphi не силен.

P.S. У меня на компьютере 2 HID-устройства: USB-клавиатура и USB UPS (бесперебойник).
Оба прекрасно открываются на запись.
Попробуйте 235 строчку в файле DevReader.pas проверить в файле после запуска программы и нажатия на кнопку "старт"- переменная Written больше нуля, если в верхнем окне выбрана клавиатура?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 19:46
Цитата Сообщение от VadimCher Посмотреть сообщение
Попробуйте 235 строчку в файле DevReader.pas проверить
Дело в том, что Delphi у меня нет. Сможете загрузить exe ?
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
01.08.2013, 21:01
Цитата Сообщение от Убежденный Посмотреть сообщение
Дело в том, что Delphi у меня нет. Сможете загрузить exe ?
Да, завтра сделаю с окошком отправленных байт
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.08.2013, 21:07
Код с SetupDi-функциями, который я приводил на первой странице темы,
открывает практически любое HID-устройство на запись, нужно только поменять
GUID клавиатуры на GUID интерфейса HID (получается через Hid_GetHidGuid), а
также не забыть установить для CreateFile желаемые права GENERIC_WRITE и
разделение доступа FILE_SHARE_READ | FILE_SHARE_WRITE.

Записывать данные в клавиатуру я не пробовал, неохота вешать систему
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,771
02.08.2013, 04:07
Цитата Сообщение от VadimCher Посмотреть сообщение
Драйвер, который вшит в exe файл и о котором идет речь выше в теме, по-видимому открывает доступ к системным портам.
Если речь идет о приложении mtut_29-07, то вот здесь содержимое драйвера r0pc.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
lights:;Посылаем процессору клавиатуры команду управления светодиодами
    mov al,0EDh
    out 60h,al
;Перед посылкой второго байта команды выполняем небольшую задержку
    mov ecx,100000000
@@: loop @b
;Выводим второй байт команды, младшие три бита которого определяют состояние 
;светодиодов на лицевой панели клавиатуры
        mov dl,80h;инициирую счетчик
a1: mov al,dl
    and al,7
    out 60h,al;разные сочетания Num, Caps и Scroll Lock
;Задерживаем выполнение программы
    mov ecx,100000000
@@: loop @b
    mov al,0EDh
    out 60h,al
;Задерживаем выполнение программы
    mov ecx,100000000
@@: loop @b
    dec dl
    jnz a1
; Выключаем все светодиоды
    mov al,0
    out 60h,al
    retn
работает с PS/2-клавиатурой, а для USB это не подходит
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
02.08.2013, 10:22
Цитата Сообщение от Убежденный Посмотреть сообщение
Код с SetupDi-функциями, который я приводил на первой странице темы,
открывает практически любое HID-устройство на запись, нужно только поменять
GUID клавиатуры на GUID интерфейса HID (получается через Hid_GetHidGuid), а
также не забыть установить для CreateFile желаемые права GENERIC_WRITE и
разделение доступа FILE_SHARE_READ | FILE_SHARE_WRITE.

Записывать данные в клавиатуру я не пробовал, неохота вешать систему
Pascal
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
constructor TJvHidDeviceController.Create(AOwner: TComponent);
const
  cHidGuid: TGUID = '{4d1e55b2-f16f-11cf-88cb-001111000030}';
begin
  inherited Create(AOwner);
  FDeviceChangeEvent := nil;
  FEnumerateEvent := nil;
  FDevUnplugEvent := nil;
  FNumCheckedInDevices := 0;
  FNumCheckedOutDevices := 0;
  FNumUnpluggedDevices := 0;
  FDevThreadSleepTime := 100;
  FVersion := cHidControllerClassVersion;
  FInDeviceChange := False;
 
  FList := TList.Create;
 
  if LoadSetupApi then
    LoadHid;
  if IsHidLoaded then
  begin
    HidD_GetHidGuid(FHidGuid);
    // only hook messages if there is a HID DLL
    FHWnd := AllocateHWnd(EventPipe);
    // this one executes after Create completed which ensures
    // that all global elements like Application.MainForm are initialized
    PostMessage(FHWnd, WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, -1);
  end
  else
    FHidGuid := cHidGuid;
end;
Так создается устройство, в которое я пытаюсь писать (HID). В него не пишет.
0
0 / 0 / 0
Регистрация: 22.07.2013
Сообщений: 20
02.08.2013, 11:23
Цитата Сообщение от Убежденный Посмотреть сообщение
Дело в том, что Delphi у меня нет. Сможете загрузить exe ?
Это exe в нижнем правом углу будет писать сколько байт отправлено в выбранное устройство после нажатия кнопки "старт".
Вложения
Тип файла: rar USBDemo.rar (236.5 Кб, 22 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2013, 11:23

лёд = лед?
Действует ли у поисковиков принцип кроссворда, где ё=е и й=и? И что такое многолинковая и однолинковая ссылки?

Команды манипулирования данными SQL
Как создать запросы . У меня таблицы все есть. select*from Zapisi insert into Наименование=Код_жанра Наименование=Код_исполнителя ...

Программа для манипулирования компьютером
доброе время суток. не подскажете, существует ли какая-нибудь программа для выполнения действий на компьютере в бот-режиме. под...

Программа манипулирования цифрами числа - Подскажите
Здравствуйте! Собственно... Проблема такая... Нужно написать программу, которая изменяла бы введенное число по приведенным ниже...

Программа-планировщик для манипулирования фотокамерой
Необходимо написать на языке Prolog программу-планировщик для манипулирования фотокамерой. Речь идет о подготовке фотокамеры к работе, т....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть не большие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru