Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/48: Рейтинг темы: голосов - 48, средняя оценка - 4.67
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287

Не удается найти указаный файл при попытке запуска драйвера

17.07.2014, 17:20. Показов 9896. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
инсталирую moufiltr или firefly и пытаюсь запускать их через kmdManager драйвер регистрируется, его видно в списке служб, но он не запущен. когда я нажимаю в kmd запустить мне выдается ошибка "не могу найти указанный файл", и усе

WinDDK\7600.16385.1\
Windows XP

почему? что делать?

Добавлено через 9 минут
в каталоге C:\WINDOWS\system32\drivers я файла moufiltr.sys действительно не наблюдаю, я скопировал его вручную, но он все равно тоже самое продолжает орать (
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2014, 17:20
Ответы с готовыми решениями:

MS visual Studio 2012 Не удается запустить программу. Не удается найти указаный файл
Перебила винду, установила студию и теперь она не работает..( #include <iostream> #include <locale> #include...

Не удается найти указаный файл
В чем здесь ошибка #include "stdafx.h" #include <math.h> #include <iostream> #include <time.h> #include <stdlib.h> ...

Не удается запустить программу. не удается найти указаный путь
Что я делаю не так? До этого работала на 7 винде 2012VS и было всё нормально. Но как только перешла на десятку... не могу избавиться от...

52
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.07.2014, 18:21
Moufilter и firefly - это PnP-драйверы, они должны ставиться через INF-файлы или
специально написанные программы типа devcon. А KmdManager здесь не помощник.
Читайте файлы "\input\hid\moufiltr.htm" и "\hid\firefly\firefly.htm", секция "Installation" -
там все написано.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
17.07.2014, 20:00  [ТС]
установил, а можно его как то переделать в нормальные драйверы? чтобы его можно динамически загружать и выгружать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.07.2014, 22:15
Это и есть нормальные драйверы. Они загружаются при инициализации
соответствующего узла оборудования, и выгружаются, когда необходимо
выполнить определенные действия, например, во время удаления устройства.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
19.07.2014, 01:50  [ТС]
Это и есть нормальные драйверы. Они загружаются при инициализации
соответствующего узла оборудования, и выгружаются, когда необходимо
выполнить определенные действия, например, во время удаления устройства.
а переделать их можно так, чтобы они загружались SCManager ом? в любом случае ручная установка меня никак не устраивает (

Добавлено через 5 минут
ну и тогда возникает вопрос, что это за файлы mof, inc,inf и что с ними делать?( вернее где найти инфу по тому как их сделать. Поэтому реально бы было бы меньше печали, если бы делать динамически загружаемый (
0
Универсальный программист
 Аватар для zhvan
41 / 33 / 9
Регистрация: 21.12.2013
Сообщений: 374
Записей в блоге: 1
19.07.2014, 01:54
Цитата Сообщение от Shakielpel Посмотреть сообщение
Поэтому реально бы было бы меньше печали, если бы делать динамически загружаемый
Цитата Сообщение от Shakielpel Посмотреть сообщение
а переделать их можно так, чтобы они загружались SCManager ом
конечно это возможно, например написать свое ядро под ос и собрать его, загрузчик переделать
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.07.2014, 02:06
Цитата Сообщение от Shakielpel Посмотреть сообщение
ну и тогда возникает вопрос, что это за файлы mof, inc,inf и что с ними делать?( вернее где найти инфу по тому как их сделать. Поэтому реально бы было бы меньше печали, если бы делать динамически загружаемый
PnP-драйверы и есть динамически загружаемые.
Система загружает их, когда определяет подключение устройства.
Какой смысл загружать, к примеру, фильтр клавиатуры, если она вообще не подключена ?

По поводу INF все есть в MSDN, в разделах по программированию драйверов.

Цитата Сообщение от Shakielpel Посмотреть сообщение
в любом случае ручная установка меня никак не устраивает
Ну так напишите инсталлятор, делов-то !
Например, можно создать виртуальное устройство на рутовой шине (SetupDiCreateDeviceInfoList ->
SetupDiCreateDeviceInfo -> SetupDiSetDeviceRegistryProperty с кодом SPDRP_HARDWAREID
(если нужно) -> SetupDiCallClassInstaller с кодом DIF_REGISTERDEVICE), а затем поставить
для него драйвер через UpdateDriverForPlugAndPlayDevices.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
19.07.2014, 09:36  [ТС]
c:\lastvm\fireddk\laser.c(43) : error C2082: redefinition of formal parameter 'DriverEntry'
1>errors in directory c:\lastvm\fireddk
1>c:\lastvm\fireddk\laser.c(43) : error C2082: redefinition of formal parameter 'DriverEntry'
1>c:\lastvm\fireddk\laser.c(43) : error C2143: syntax error : missing ';' before '{'
1>c:\lastvm\fireddk\laser.c(43) : error C2143: syntax error : missing ';' before '{'
1>c:\lastvm\fireddk\laser.c(52) : error C2065: 'DriverObject' : undeclared identifier
1>c:\lastvm\fireddk\laser.c(52) : error C2065: 'DriverObject' : undeclared identifier
1>c:\lastvm\fireddk\laser.c(52) : error C2223: left of '->MajorFunction' must point to struct/union
1>c:\lastvm\fireddk\laser.c(52) : error C2223: left of '->MajorFunction' must point to struct/union
1>c:\lastvm\fireddk\laser.c(60) : error C2065: 'DriverObject' : undeclared identifier
1>c:\lastvm\fireddk\laser.c(60) : error C2065: 'DriverObject' : undeclared identifier
Заголовочный файл:
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
#include <ntddk.h>
#include <wdf.h>
#define NTSTRSAFE_LIB
#include <ntstrsafe.h>
#include <initguid.h>
#include <wdmguid.h>
#include <ntddmou.h>
 
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUS LaserPUAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject);
VOID LaserPUUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS LaserPUDispatchPnp(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);
NTSTATUS LaserPU_CompleteIRP(IN PDEVICE_OBJECT   DeviceObject, IN PIRP Irp, IN PVOID Context);
NTSTATUS LaserPUDispatchPower(IN PDEVICE_OBJECT    DeviceObject, IN PIRP Irp);
NTSTATUS LaserPU_DispatchDeviceControl(IN PDEVICE_OBJECT   DeviceObject, IN PIRP  Irp);
NTSTATUS LaserPU_DispatchPassThrough(IN PDEVICE_OBJECT   DeviceObject, IN PIRP    Irp);
VOID
LaserPU_ServiceCallback(
    IN PDEVICE_OBJECT DeviceObject,
    IN PMOUSE_INPUT_DATA InputDataStart,
    IN PMOUSE_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
Основной.

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
#include "LaserPU.h"
 
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, LaserPUAddDevice)
#pragma alloc_text(PAGE, LaserPUUnload)
#pragma alloc_text(PAGE, LaserPUDispatchPnp)
#pragma alloc_text(PAGE, LaserPUDispatchPower)
#endif
 
//------------------------------------------------------------------
// DriverEntry()
// Инициализация драйвера при установке
//------------------------------------------------------------------
NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath)
 
{
    USHORT              regPathLen;
    ULONG               ulIndex;
    PDRIVER_DISPATCH  * dispatch;
 
    KdPrint(("Entered the Driver Entry\n"));
 
    // Заполняю массив главных функций указателем на функцию,
    // пропускающую пакеты вниз по стеку.
    for (ulIndex = 0, dispatch = DriverObject->MajorFunction;
         ulIndex <= IRP_MJ_MAXIMUM_FUNCTION;
         ulIndex++, dispatch++) {
 
        *dispatch = LaserPU_DispatchPassThrough;
    }
 
    // Обновляю указатели на используемые объекты
    DriverObject->MajorFunction[IRP_MJ_PNP]                         = LaserPUDispatchPnp;
    DriverObject->MajorFunction[IRP_MJ_POWER]                       = LaserPUDispatchPower;
    DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]     = LaserPU_DispatchDeviceControl;
    DriverObject->DriverExtension->AddDevice                        = LaserPUAddDevice;
    DriverObject->DriverUnload                                      = LaserPUUnload;
 
    return STATUS_SUCCESS;
}
компилятор драйвера что то от меня хочет, но никак не могу понять что. redefinition of formal parameter 'DriverEntry'

- почему так?

Добавлено через 2 минуты
МДА! выложил сюда и заметил ) в заголовочном файле в последней строке не хватает точки с запятой. делфи рулит короче )

Добавлено через 5 минут
блин, теперь осталось самое сложное, как к нему инф файл сделать (
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.07.2014, 10:46
Цитата Сообщение от Shakielpel Посмотреть сообщение
блин, теперь осталось самое сложное, как к нему инф файл сделать (
Это зависит от того, что за драйвер. Драйверы устройств, фильтры,
фильтры класса - все это ставится по-разному, а есть еще отдельные
правила для WDF-драйверов (например, использование co-installer-ов).

Начать можно отсюда:

INF File Sections and Directives
http://msdn.microsoft.com/en-u... 85%29.aspx

Создаете текстовый файл и потихоньку заполняете его секциями и директивами,
добиваясь того, чтобы установка работала и чтобы inf2cat.exe не выдавал ошибок.
Можно взять за образец какой-нибудь небольшой INF из примеров WDK и
переделать его под свои нужды.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
19.07.2014, 12:47  [ТС]
это фильтр драйвер сделанный в основном из firefly + moufiltr + еще какие то части из других примеров DDK

Отлов событий от мыши происходит не по обработке IRP_MJ_READ а путем подключения к очереди пакетов Mouclass'а. По задумке это должен быть драйвер-фильтр USB мыши.

самое печальное, что чтобы в этом хотя бы начать разбираться нужно потратить несколько дней, чтобы это хотя бы запустить ) всю сегодняшнюю ночь я методом научного тыка рисовал заголовочный файл)) т.к. исходник был только основного )
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.07.2014, 13:04
Цитата Сообщение от Shakielpel Посмотреть сообщение
самое печальное, что чтобы в этом хотя бы начать разбираться нужно потратить несколько дней, чтобы это хотя бы запустить )
Так только первый раз. Потом будет намного быстрее и проще.
У меня, например, уже есть готовые наработки фильтрующих драйверов из
прошлых проектов, INF-файлы к ним и инсталляторы, в итоге "шапка"
очередного аналогичного проекта пишется за час.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
19.07.2014, 17:14  [ТС]
сделал INF файл из Firefly, по сути просто переименовал Firefly на свое имя везде ) обновил существующий драйвер через оборудование....зря я это сделал ) кнопки мыши перестали работать, вернее они стали как то странно работать, все поудалял, перезагрузил винду старые вернулись на место)

а как его отдельно установить, а не вместо уже существующего?)

Добавлено через 2 часа 46 минут
DebugView ничего не показывает...

Добавлено через 15 минут
поставил в inf чтобы оно загружалось при старте виндовс. В результате В оборудовании висит с восклицательным знаком. В службах висит выключенная, запустил кмд менеджер, запустил службу, теперь говорит что работает, при этом разницы не видно, а главное в DebugView вообще ничего нет ( что не так то (

Добавлено через 10 минут
мде, если вместо ps/2 драйвера поставить то не работает драйвер, если вместо USB то не работает левая кнопка мыши, а правая хз как работает, т.е. драйвер чего то делает. Но дебаг вьювер ничего не показывает ( почему он ничего не показывает (

Добавлено через 1 минуту
хотя там 3 драйвера мыши 1 пс/2, и 2 усб, где то я тут читал что в WMVare одна усб за кнопки отвечает, другая за движения, может при переустановке просто слетает драйвер и ничего не работает (
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
19.07.2014, 19:56
Цитата Сообщение от Shakielpel Посмотреть сообщение
а как его отдельно установить, а не вместо уже существующего?)
Он и так ставится отдельно, это же filter driver.

Цитата Сообщение от Shakielpel Посмотреть сообщение
DebugView ничего не показывает.
Reading and Filtering Debugging Messages
http://msdn.microsoft.com/en-u... 85%29.aspx

Быстрый рецепт - создайте на отлаживаемой машине ключ реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\Debug Print Filter,
в нем REG_DWORD-переменную с именем DEFAULT и значением 0xf (15). И перезагрузитесь.
Другой способ - в WinDBG нажать 'break' и ввести команду 'ed Kd_DEFAULT_Mask 0xf'.

После этого отладочный вывод должен заработать.

И еще я советую сразу переходить на WinDBG, у него возможностей выше крыши,
там одних только команд, не считая всяких расширений - несколько сотен.

Цитата Сообщение от Shakielpel Посмотреть сообщение
поставил в inf чтобы оно загружалось при старте виндовс. В результате В оборудовании висит с восклицательным знаком. В службах висит выключенная, запустил кмд менеджер, запустил службу, теперь говорит что работает, при этом разницы не видно, а главное в DebugView вообще ничего нет ( что не так то (
PnP-драйверам "по барабану", какой тип запуска, система все равно будет их запускать при
инициализации соответствующего узла оборудования. Можете поставить demand start, auto start
или system start - разницы нет (хотя если задизейблить драйвер, он не загрузится вообще).

А KmdManager, как и работу напрямую со службами, здесь использовать не следует.
Писал выше - PnP-драйверы загружаются PnP-менеджером, а не диспетчером служб.

Цитата Сообщение от Shakielpel Посмотреть сообщение
мде, если вместо ps/2 драйвера поставить то не работает драйвер
"Firefly is a filter driver for an HID device."

Если мышь или клавиатура подключены через PS/2, они обслуживаются драйвером i8042prt.sys.
Если через USB, тогда mouhid/kbdhid.

А вообще, зря Вы взялись сразу за разбор больших сложных примеров.
Начинать следует с намного более простых вещей.
Ну например:

- найти kbdclass/mouclass, поставить хук на его DispatchRead;
- написать PnP-фильтр класса, повесить его над kbdclass/mouclass;
- написать для фильтра Extension Device Object (EDO), принимающий
команды из режима пользователя;
- написать для этого PnP-фильтра установочный INF;
- написать установщик, который ставит фильтр через INF;
- и т.д.

Короче, осваивать одну за другой составные темы. И только потом
пытаться писать нечто в стиле FireFly, тем более он написан с
использованием WDF, а это отдельная большая тема...
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
19.07.2014, 22:48  [ТС]
усе, инсталируется, дебагируется, и я даж нашел почему он вырубал кнопки. при движении мыши он вызывает LaserPU_ServiceCallback функцию в которой присваивается нечто непонятное в пакет полученный от моускласса видимо, правда ни в одно условие он не попадает, а попадает в самое последнее где MouseInputData->ButtonFlags = 0x0; все нафиг обнуляется ) я это закомментировал и теперь....как бы работает, только не делает ничего.

Наведите на мысль что нужно делать чтобы он по вызову IODeviceControl передавал пакет вниз по стеку, которого от мыши не получал, а все что он получает мне вообщем то по барабану, так что эту часть вообще надо ликвидировать ) есть где нибудь инфа как этот пакет выглядит? можно его вручную собрать? или нужно обязательно что то от мыши получать и переделывать?(вот это совсем не желательно, от мыши получать что то)

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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
/*++
 
Module Name:
 
    LaserPU.c
 
Abstract:
 
    Этот модуль содержит код драйвера-фильтра для LPU.
 
Environment:
 
    Kernel mode
 
Revision History:
 
    Валерий Петриев - Написан 20 ноября 2005 г.
 
    (На основе примера Firefly в DDK 2003)
 
--*/
 
 
#include "LaserPU.h"
 
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, LaserPUAddDevice)
#pragma alloc_text(PAGE, LaserPUUnload)
#pragma alloc_text(PAGE, LaserPUDispatchPnp)
#pragma alloc_text(PAGE, LaserPUDispatchPower)
#endif
 
//------------------------------------------------------------------
// DriverEntry()
// Инициализация драйвера при установке
//------------------------------------------------------------------
NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath)
 
{
    USHORT              regPathLen;
    ULONG               ulIndex;
    PDRIVER_DISPATCH  * dispatch;
 
    DebugPrint(("Entered the Driver Entry\n"));
 
    // Заполняю массив главных функций указателем на функцию,
    // пропускающую пакеты вниз по стеку.
    for (ulIndex = 0, dispatch = DriverObject->MajorFunction;
         ulIndex <= IRP_MJ_MAXIMUM_FUNCTION;
         ulIndex++, dispatch++) {
 
        *dispatch = LaserPU_DispatchPassThrough;
    }
 
    // Обновляю указатели на используемые объекты
    DriverObject->MajorFunction[IRP_MJ_PNP]                         = LaserPUDispatchPnp;
    DriverObject->MajorFunction[IRP_MJ_POWER]                       = LaserPUDispatchPower;
    DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]     = LaserPU_DispatchDeviceControl;
    DriverObject->DriverExtension->AddDevice                        = LaserPUAddDevice;
    DriverObject->DriverUnload                                      = LaserPUUnload;
 
    return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------
// LaserPU_AddDevice()
// Добавление драйвера в стек драйверов мыши
//------------------------------------------------------------------
NTSTATUS
LaserPUAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject)
 
{
    NTSTATUS                status;
    PDEVICE_OBJECT          deviceObject;
    PDEVICE_EXTENSION       deviceExtension = NULL;
 
    PAGED_CODE();
    
    // Создаем объект-фильтр устройства. 
    status = IoCreateDevice(
        DriverObject,
        sizeof(DEVICE_EXTENSION),
        NULL,                       // No Name
        FILE_DEVICE_UNKNOWN,
        FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,
        FALSE,
        &deviceObject
        );
 
    if (!NT_SUCCESS(status)) {
 
        //
        // Returning failure here prevents the entire stack from functioning,
        // but most likely the rest of the stack will not be able to create
        // device objects either, so it is still OK.
        //
        return status;
    }
 
    DebugPrint((
        "AddDevice PDO (0x%x) FDO (0x%x)\n",
        PhysicalDeviceObject,
        deviceObject
        ));
 
    // Получаем указатель на расширение нашего устройства.
    deviceExtension = (PDEVICE_EXTENSION) deviceObject->DeviceExtension;
 
    // Сохраняю для дальнейшего использования.
    deviceExtension->Self = deviceObject;
    deviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
 
    // Создаем объект устройства, находящегося в данный момент на вершине стека;
    // Сохраняем указатель на него и подключаем фильтр к вершине стека.
    deviceExtension->NextLowerDriver = IoAttachDeviceToDeviceStack(
        deviceObject,
        PhysicalDeviceObject
        );
 
    // Если не подсоединился - проблема в PnP, удалить объект устройства
    if (NULL == deviceExtension->NextLowerDriver) {
        IoDeleteDevice(deviceObject);
        return STATUS_UNSUCCESSFUL;
    }
 
    // Копирование флагов устройства из устройства ниже по стеку.
    deviceObject->Flags |= deviceExtension->NextLowerDriver->Flags &
                            (DO_BUFFERED_IO | DO_DIRECT_IO |
                            DO_POWER_PAGABLE  | DO_POWER_INRUSH);
 
    deviceObject->DeviceType = deviceExtension->NextLowerDriver->DeviceType;
 
    deviceObject->Characteristics =
                          deviceExtension->NextLowerDriver->Characteristics;
 
    // Инициализирование состояния устройства.   
    INITIALIZE_PNP_STATE(deviceExtension);
 
 
    IoInitializeRemoveLock (&deviceExtension->RemoveLock , 
                            POOL_TAG,
                            1, // MaxLockedMinutes 
                            5); // HighWatermark, this parameter is 
                                // used only on checked build.
                                
    DebugPrint((
        "AddDevice: %x to %x->%x \n",
        deviceObject,
        deviceExtension->NextLowerDriver,
        PhysicalDeviceObject
        ));
 
    deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
    return STATUS_SUCCESS;
}
 
 
//---------------------------------------------------------------------
// LaserPU_Unload()
// Выгрузка драйвера
//---------------------------------------------------------------------
VOID
LaserPUUnload(
    IN PDRIVER_OBJECT DriverObject
    )
 
{
    PAGED_CODE();
 
    ASSERT(DriverObject->DeviceObject == NULL);
 
    DebugPrint(("unload\n"));
 
    return;
}
 
 
//-------------------------------------------------------------------
// LaserPU_DispatchPnp()
// Обработка PnP пакетов. Мы обрабатываем PnP пакеты, чтобы вовремя отсоединиться
//-------------------------------------------------------------------
NTSTATUS
LaserPUDispatchPnp(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp)
 
{
    PDEVICE_EXTENSION           deviceExtension;
    PIO_STACK_LOCATION          irpStack, nextStack;
    NTSTATUS                    status;
    KEVENT                      event;
 
    PAGED_CODE();
 
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
    // Получить ячейку стека для нашего драйвера.
    irpStack = IoGetCurrentIrpStackLocation(Irp);
 
   status = IoAcquireRemoveLock (&deviceExtension->RemoveLock, Irp);
    if (!NT_SUCCESS (status)) {
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    }
    
    // Просмотр доп. функции в пакете.
    switch(irpStack->MinorFunction) {
 
    case IRP_MN_START_DEVICE:
 
        // Драйвер стартует.
        // Нельзя работать с драйвером, пока пакет не обработается 
        // всеми драйверами стека.
        KeInitializeEvent(&event,
                          NotificationEvent,
                          FALSE
                          );
 
        IoCopyCurrentIrpStackLocationToNext(Irp);
 
        IoSetCompletionRoutine(
            Irp,
            LaserPU_CompleteIRP,
            &event,
            TRUE,
            TRUE,
            TRUE
            );
 
        status = IoCallDriver(deviceExtension->NextLowerDriver, Irp);
 
        if (STATUS_PENDING == status) {
 
            KeWaitForSingleObject(
               &event,
               Executive, // Waiting for reason of a driver
               KernelMode, // Waiting in kernel mode
               FALSE, // No alert
               NULL // No timeout
               );
 
            status = Irp->IoStatus.Status;
        }
 
        if (NT_SUCCESS(status)) {
            
            // Устройство стартовало.
            SET_NEW_PNP_STATE(deviceExtension, Started);
        }
 
        //
        // We must now complete the IRP, since we stopped it in the
        // completion routine with STATUS_MORE_PROCESSING_REQUIRED.
        //
        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp); 
        return status;
 
    case IRP_MN_REMOVE_DEVICE:
 
        SET_NEW_PNP_STATE(deviceExtension, Deleted);
 
        //
        // Wait for all outstanding requests to complete
        //
        DebugPrint(("Waiting for outstanding requests\n"));
        IoReleaseRemoveLockAndWait(&deviceExtension->RemoveLock, Irp);
        
        IoSkipCurrentIrpStackLocation(Irp);
        status = IoCallDriver(deviceExtension->NextLowerDriver, Irp);
 
        IoDetachDevice(deviceExtension->NextLowerDriver);
        IoDeleteDevice(DeviceObject);
        return status;
 
    case IRP_MN_QUERY_STOP_DEVICE:
        SET_NEW_PNP_STATE(deviceExtension, StopPending);
        status = STATUS_SUCCESS;
        break;
 
    case IRP_MN_CANCEL_STOP_DEVICE:
 
        //
        // Check to see whether you have received cancel-stop
        // without first receiving a query-stop. This could happen if someone
        // above us fails a query-stop and passes down the subsequent
        // cancel-stop.
        //
 
        if(StopPending == deviceExtension->DevicePnPState)
        {
            //
            // We did receive a query-stop, so restore.
            //
            RESTORE_PREVIOUS_PNP_STATE(deviceExtension);
        }
        status = STATUS_SUCCESS; // We must not fail this IRP.
        break;
 
    case IRP_MN_STOP_DEVICE:
        SET_NEW_PNP_STATE(deviceExtension, StopPending);
        status = STATUS_SUCCESS;
        break;
 
    case IRP_MN_QUERY_REMOVE_DEVICE:
 
        SET_NEW_PNP_STATE(deviceExtension, RemovePending);
        status = STATUS_SUCCESS;
        break;
 
    case IRP_MN_SURPRISE_REMOVAL:
 
        SET_NEW_PNP_STATE(deviceExtension, SurpriseRemovePending);
        status = STATUS_SUCCESS;
        break;
 
    case IRP_MN_CANCEL_REMOVE_DEVICE:
 
        //
        // Check to see whether you have received cancel-remove
        // without first receiving a query-remove. This could happen if
        // someone above us fails a query-remove and passes down the
        // subsequent cancel-remove.
        //
        if (RemovePending == deviceExtension->DevicePnPState) {
 
            //
            // We did receive a query-remove, so restore.
            //
            RESTORE_PREVIOUS_PNP_STATE(deviceExtension);
        }
 
        status = STATUS_SUCCESS; // We must not fail this IRP.
        break;
 
    default:
 
        //
        // If you don't handle any IRP you must leave the
        // status as is.
        //
        status = Irp->IoStatus.Status;
        break;
    }
 
    //
    // Pass the IRP down and forget it.
    //
    Irp->IoStatus.Status = status;
    IoSkipCurrentIrpStackLocation (Irp);
    status = IoCallDriver (deviceExtension->NextLowerDriver, Irp);
    IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp); 
    return status;
}
 
//---------------------------------------------------------------------
// LaserPU_CompleteIRP()
// Позволяет драйверу посылать IRP вниз по стеку, отлавливать их на обратном пути
// (используется в LaserPU_DispatchPnp)
//---------------------------------------------------------------------
NTSTATUS
LaserPU_CompleteIRP(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp,
    IN PVOID            Context)
 
{
    UNREFERENCED_PARAMETER(DeviceObject);
 
    //
    // We could switch on the major and minor functions of the IRP to perform
    // different functions, but we know that Context is an event that needs
    // to be set.
    //
    KeSetEvent((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
 
    //
    // Allows the caller to use the IRP after it is completed
    //
    return STATUS_MORE_PROCESSING_REQUIRED;
}
 
//---------------------------------------------------------------------
// LaserPU_DispatchPower()
// Управление энергопотреблением
//---------------------------------------------------------------------
NTSTATUS
LaserPUDispatchPower(
    IN PDEVICE_OBJECT    DeviceObject,
    IN PIRP              Irp)
 
{
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS status;
    
    PAGED_CODE();
 
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
    status = IoAcquireRemoveLock (&deviceExtension->RemoveLock, Irp);
    if (!NT_SUCCESS (status)) { // may be device is being removed.
        Irp->IoStatus.Status = status;
        PoStartNextPowerIrp(Irp);
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    }
 
    PoStartNextPowerIrp(Irp);
 
    IoSkipCurrentIrpStackLocation(Irp);
    status =  PoCallDriver(deviceExtension->NextLowerDriver, Irp);
    IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp); 
    return status;
    
}
 
//---------------------------------------------------------------------
// LaserPU_DispatchPassThrough()
// Функция, пропускающая пакеты, которые мы не обрабатываем
//---------------------------------------------------------------------
NTSTATUS
LaserPU_DispatchPassThrough(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp)
 
{
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS status;
    
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
    status = IoAcquireRemoveLock (&deviceExtension->RemoveLock, Irp);
    if (!NT_SUCCESS (status)) {
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    }
    
   IoSkipCurrentIrpStackLocation (Irp);
   status = IoCallDriver (deviceExtension->NextLowerDriver, Irp);
   IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp); 
   return status;
   
}
 
//---------------------------------------------------------------------
// LaserPU_DispatchDeviceControl()
// В данной функции подсоединяемся к очереди пакетов Mouclass для их фильтрации
// Для этого регистрируется сервис возврата LaserPU_ServiceCallback
//---------------------------------------------------------------------
NTSTATUS
LaserPU_DispatchDeviceControl(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    )
{
    PDEVICE_EXTENSION deviceExtension;
    PIO_STACK_LOCATION          irpStack;
    PCONNECT_DATA               connectData;
    NTSTATUS                    status;
 
    DebugPrint(( "Wot i sluchilos DispatchDeviceControl\n"));
 
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    Irp->IoStatus.Information = 0;
    irpStack = IoGetCurrentIrpStackLocation(Irp);
        
    status = IoAcquireRemoveLock (&deviceExtension->RemoveLock, Irp);
 
    if (!NT_SUCCESS (status)) {
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    }
    
    // Подключение классового драйвера к драйверу порта
    if (irpStack->Parameters.DeviceIoControl.IoControlCode ==
                        IOCTL_INTERNAL_MOUSE_CONNECT) {
 
        // Допустимо только одно подключение
        if (deviceExtension->UpperConnectData.ClassService != NULL) {
            return STATUS_SHARING_VIOLATION;
        }
        
        if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
                        sizeof(CONNECT_DATA)) {
        
        // Недопустимый буфер
            return STATUS_INVALID_PARAMETER;
        }
        
        // Копируем параметры в расширение устройства
        connectData = ((PCONNECT_DATA)
            (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
 
        deviceExtension->UpperConnectData = *connectData;
 
        // Подключаюсь к очереди пакетов.
        // Как только появится пакет, адресованный системе - 
        // вызов LaserPU_ServiceCallback
        connectData->ClassDeviceObject = deviceExtension->Self;
        connectData->ClassService = LaserPU_ServiceCallback;
    }
 
    if (irpStack->Parameters.DeviceIoControl.IoControlCode == 
                        IOCTL_INTERNAL_MOUSE_DISCONNECT) {
 
        // Очистка параметров соединения в расширении устройства
        deviceExtension->UpperConnectData.ClassDeviceObject = NULL;
        deviceExtension->UpperConnectData.ClassService = NULL;
 
        status = STATUS_NOT_IMPLEMENTED;
        }
            
   IoSkipCurrentIrpStackLocation (Irp);
   status = IoCallDriver (deviceExtension->NextLowerDriver, Irp);
   IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp); 
   return status;
}
 
 
//---------------------------------------------------------------------
// LaserPU_ServiceCallback()
// В данную функцию собственно передается управление при возникновении
// события от мыши. Передачу управления производит менеджер ввода\вывода
// когда Mouclass заполнит внутреннюю очередь пакетов.
//---------------------------------------------------------------------
VOID
LaserPU_ServiceCallback(
    IN PDEVICE_OBJECT DeviceObject,
    IN PMOUSE_INPUT_DATA InputDataStart,
    IN PMOUSE_INPUT_DATA InputDataEnd,
    IN OUT PULONG InputDataConsumed
    )
 
{
    PDEVICE_EXTENSION deviceExtension;
    PIO_STACK_LOCATION          irpStack;
    PCONNECT_DATA               connectData;
    PMOUSE_INPUT_DATA           MouseInputData;
    NTSTATUS                    status;
    
    int num;
    int i;
 
    DebugPrint(( "Entered LaserPU_ServiceCallback\n"));
        
 
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
    //
    // UpperConnectData must be called at DISPATCH
    //
 
    for (MouseInputData = InputDataStart;
         MouseInputData < InputDataEnd;
         MouseInputData++) 
    {
 
        MouseInputData->LastX = 0x0;
        MouseInputData->LastY = 0x0;
 
        // обработка нажатия левой и правой кнопок мыши
        // если левая кнопка - текст вниз, правая - текст вверх
        // в противном случае - очистка событий
        
        if (MouseInputData->ButtonFlags == MOUSE_LEFT_BUTTON_DOWN)
                {
                MouseInputData->ButtonFlags = 0x400;                
                MouseInputData -> ButtonData  = 0x78;   
                DebugPrint(( "LB\n"));
                }
            else if (InputDataStart->ButtonFlags == MOUSE_RIGHT_BUTTON_DOWN)
                {
                MouseInputData->ButtonFlags = 0x400;                
                MouseInputData -> ButtonData  = 0xff88; 
                DebugPrint(( "RB\n"));
                }
            else
                {
                MouseInputData->ButtonFlags = 0x0;
                }
    }
 
 
    (*(PSERVICE_CALLBACK_ROUTINE) deviceExtension->UpperConnectData.ClassService)(
        deviceExtension->UpperConnectData.ClassDeviceObject,
        InputDataStart,
        InputDataEnd,
        InputDataConsumed
        );
    return;
}
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
19.07.2014, 23:46  [ТС]
т.е. получается мне нужна функция pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL], а не DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL],

нет, все понятно, но я не понял )

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
NTSTATUS CtlDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
{
    PIO_STACK_LOCATION pIrpStack;
    PUSHORT pIOBuffer; 
 
    USHORT Port;
    USHORT ValueToPort;
 
    pIrpStack=IoGetCurrentIrpStackLocation(Irp);
    pIOBuffer=Irp->AssociatedIrp.SystemBuffer;               
 
    switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
    {
 
        case IOCTL_READ:
            Port=pIOBuffer[0];
            pIOBuffer[0]=READ_PORT_UCHAR((PUCHAR)Port);
            Irp->IoStatus.Information=2;
            break; 
 
        case IOCTL_WRITE:
            Port=pIOBuffer[0];
            ValueToPort=pIOBuffer[1];
            WRITE_PORT_USHORT((PUSHORT)Port,(USHORT)ValueToPort);
            Irp->IoStatus.Information=0;
            break;
 
    }
 
   //IoSkipCurrentIrpStackLocation (Irp); - в стеке вроде как и нет этого пакета, это не нужно?
   status = IoCallDriver (deviceExtension->NextLowerDriver, Irp);
   //IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp);  - вот это же мне точно не нужно? это ведь только мой пакет...
   return status;
 
}
т.е. мне что то этакое нужно сделать.....только пакет как то самому придумать )

Добавлено через 27 минут
как вызвать колбэк, без появления входных данных?
connectData->ClassDeviceObject = deviceExtension->Self;
connectData->ClassService = LaserPU_ServiceCallback;
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.07.2014, 00:04
Цитата Сообщение от Shakielpel Посмотреть сообщение
Наведите на мысль что нужно делать чтобы он по вызову IODeviceControl передавал пакет вниз по стеку, которого от мыши не получал
Значит, так.
Стеки драйверов клавиатуры и мыши очень похожи и состоят из двух основных
компонентов - функциональный драйвер (i8042prt.sys для PS/2 или kbdhid.sys/
mouhid.sys для USB) и драйвер класса (kbdclass и mouclass).
Функциональный драйвер загружается раньше драйвера класса и его DEVICE_OBJECT
располагаются в стеке устройств ниже, чем устройство драйвера класса.

После построения стека устройств драйвер класса посылает функциональному
драйверу управляющий код IOCTL_INTERNAL_KEYBOARD(MOUSE)_CONNECT, в
котором передает указатель на свою callback-функцию, которую тот должен
вызывать каждый раз при получении от устройства сигналов ввода.
При вызове callback-функции драйвер класса записывает полученные данные в
очередной IRP, присланный ему из csrss.exe потоком ввода (Raw Input
Thread, RIT).

В LaserPU_DispatchDeviceControl код IOCTL_INTERNAL_MOUSE_CONNECT
перехватывается и здесь нужно заменить адрес callback-функции на свой
(LaserPU_ServiceCallback), сохранив при этом оригинальный.

При любых событиях мыши функциональный драйвер будет вызывать вашу
LaserPU_ServiceCallback, а уже она - оригинальную. Кстати, стоит отметить,
что данная функция вызывается на DISPATCH_LEVEL, и это накладывает
определенные ограничения на код в ней.

Теперь о том, как эмулировать ввод с мыши. Очевидно, нужно заставить
свой драйвер вызывать оригинальную callback-функцию, например по
какому-то IOCTL-коду (используя DeviceIoControl). Это будет работать.
Здесь только одна тонкость: для работы со своим IOCTL-интерфейсом в
фильтрующем драйвере нужно создавать дополнительный DEVICE_OBJECT с
символьной ссылкой и общаться с драйвером исключительно через него.
И этот объект не нужно аттачить к стеку устройств, он должен
находиться как бы "сбоку", вне стека. У Уолтера Они в главе
"фильтрующие драйверы" (стр. 709, кажется ) эта техника описана.

Если вы попытаетесь работать со своим фильтрующим драйвером через
стек устройства, к которому он подключен, диспетчер I/O будет
направлять все IRP верхнему устройству в стеке, и есть очень
большая вероятность, что они просто не дойдут до вашего драйвера.
Или же будут трудности на стадии открытия устройства (CreateFile).

По поводу кода.

1) IoAttachDeviceToDeviceStack всегда полезно заменить на
IoAttachDeviceToDeviceStackSafe - она исключает "гонки", когда
устройство уже в стеке и стало участником системы обработки IRP,
но указатель в DEVICE_EXTENSION еще не записан. Для данного
драйвера это не существенно (т.к. AddDevice и содержимое стека
полностью контролируется PnP-менеджером), но для других типов
драйверов может быть очень важным.

2) В функции LaserPU_CompleteIRP упущен важный момент:
C
1
2
3
4
if (Irp->PendingReturned)
{
    IoMarkIrpPending(Irp);
}
Completion-функции отвечают за распостранение флага SL_PENDING_RETURNED,
исключением могут быть только функции завершения своих собственных IRP,
находящиеся на самом верхнем уровне цепочки вызовов.
IRP_MN_START_DEVICE легко может возвращать STATUS_PENDING, кстати говоря.

3) На Windows Vista и выше PoStartNextPowerIrp и PoCallDriver не
являются обязательными, Power IRP можно обрабатывать обычным способом,
то есть, через IoSkipCurrentIrpStackLocation/IoCallDriver.
2
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
20.07.2014, 00:30  [ТС]
Очевидно, нужно заставить
свой драйвер вызывать оригинальную callback-функцию, например по
какому-то IOCTL-коду (используя DeviceIoControl).
а как выглядит вызов оригинальной callback функции?, про IOCTL я понял, но я хоть убей не пойму как вызвать этот кол бэк
0
Универсальный программист
 Аватар для zhvan
41 / 33 / 9
Регистрация: 21.12.2013
Сообщений: 374
Записей в блоге: 1
20.07.2014, 00:33
Цитата Сообщение от Shakielpel Посмотреть сообщение
а как выглядит вызов оригинальной callback функции?
как то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdlib.h>
// функция сравнения целых чисел по модулю
int compare_abs(const void *a, const void *b) {
   int a1 = *(int*)a;
   int b1 = *(int*)b;
   return abs(a1) - abs(b1);
}
int main() {
   int m[10] = {1,-3,5,-100,7,33,44,67,-4, 0};
   // сортировка массива m по возрастанию модулей
   qsort(m, 10, sizeof(int), compare_abs);
   return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.07.2014, 00:40
C
1
2
3
4
5
6
7
8
9
10
11
typedef
VOID
(_stdcall * PFN_MOUCLS_CB)(
    __in    DEVICE_OBJECT     * /* pDeviceObj         */,
    __in    MOUSE_INPUT_DATA  * /* pInputDataStart    */,
    __in    MOUSE_INPUT_DATA  * /* pInputDataEnd      */,
    __inout ULONG             * /* pInputDataConsumed */
    );
 
PFN_MOUCLS_CB MouclassSvcCallback = pDeviceExt->OriginalSvcCallback;
MouClassSvcCallback(pDeviceObj, pInDataFrom, pInDataTo, &nItemsConsumed);
2
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
21.07.2014, 17:03  [ТС]
попытался сварганить новый инф файл, а точнее скопировать то что по этому поводу написано в книге Walter Oney. Что мне понравилось, что при клике правой кнопкой и нажатии установить оно устанавливается и появляется в списке служб, но не запускается ( почему? если попытаться его КМД менеджером запустить (да я знаю что нельзя) ), то он говорит что он отключен и до свидания, выполняется метод Unload сразу.

Тот инф что я сейчас использую, по моему там просто замещается оригинальный драйвер...он не устанавливается по инсталу, но устанавливается если обновить существующий драйвер и появляется на месте старого.

Bash
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
[Version]
Signature=$CHICAGO$
 
[ClassInstall32]
AddReg=ClassInstall32AddReg
CopyFiles=CopyClassFilters
 
[ClassInstall32AddReg]
HKR,,UpperFilters,0x00010000,LaserPU
 
[ClassInstall32.Services]
AddService=LaserPU,,LaserPUAddService
 
 
[CopyClassFilters]
LaserPU.sys,,,2
 
 
 
[DefaultInstall]
CopyFiles=CopyClassFilters
AddReg=FilterAddReg
 
[DefaultInstall.Services]
AddService=LaserPU,,FilterAddService
 
[SourceDisksFiles]
LaserPU.sys=1
 
[SourceDisksNames]
1="Filter install disk"
 
[DestinationDirs]
DefaultDestDir=12
 
[CopyClassFilters]
LaserPU.sys,,,2
 
[FilterAddService]
ServiceType=1
ErrorControl=1
StartType=3
ServiceBinary=%12%\LaserPU.sys
 
[FilterAddReg]
HKLM,%CLASSKEY%,UpperFilters,0x00010008,LaserPU
[Strings]
CLASSKEY=System\CurrentControlSet\Class\{4D36E96F-E325-11CE-BFC1-08002BE10318}
Добавлено через 5 минут
если этот инф попытаться установить обновлением существующего драйвера, то при установке он откуда то знает производителя, а записи о производителе есть только в первом инф файле, ну и в общем устанавливается он также как и первый в этом случае.

Добавлено через 2 часа 7 минут
видимо он просто находит первый файл и ставит все по нему, ибо если первый убрать, то обновлением драйвера он не устанавливается, говорит что отсутствуют данные об устройстве.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2014, 17:03
Помогаю со студенческими работами здесь

Ошибка при установке драйвера "Не удается найти указанный файл"
Указываю путь к дровам для китайского МТ6235 (нужна как веб камера) в ручную , а именно к файлу .inf. пишет что система обнаружила...

Ошибка при попытке запуска проекта: Не удалось загрузить файл или сборку
using System; using System.Threading; namespace Потоки__использующие_один_объект { class Class1 { public...

Запуск драйвера в win10 возвращает код ошибки 2 (не удается найти указанный файл)
Отмечу сразу, что меня пока не интересует правильность работы самого драйвера, я собирал решение в vs19 под win10, решение собралось и я...

При попытке создания выражения в вычисляемом столбце ошибка Не удается найти столбец
Создаю новый столбец, называю его &quot;Средняя дальность плавания&quot;,в свойствах нахожу строку Expression и пишу туда: . Выхожу из редактора...

"Не удаётся найти указанный файл" после запуска программы
в Microsoft Visual Studio 2008 при попытке запуска программы выходит сообщение &quot;Не удаётся запустить программу&quot; дальше путь к файлу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru