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

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

17.07.2014, 17:20. Показов 9893. Ответов 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
21.07.2014, 21:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Shakielpel Посмотреть сообщение
Что мне понравилось, что при клике правой кнопкой и нажатии установить оно устанавливается и появляется в списке служб, но не запускается ( почему? если попытаться его КМД менеджером запустить (да я знаю что нельзя) ), то он говорит что он отключен и до свидания, выполняется метод Unload сразу.
Не запускаться может по разным причинам.
Например, на 64-битных Windows от Vista и старше загрузка драйвера блокируется,
если нет цифровой подписи. Но я думаю, причина более прозаична.
И кстати, такого не может быть, чтобы Unload отрабатывал без вызова DriverEntry.

Цитата Сообщение от Shakielpel Посмотреть сообщение
Тот инф что я сейчас использую, по моему там просто замещается оригинальный драйвер...он не устанавливается по инсталу, но устанавливается если обновить существующий драйвер и появляется на месте старого.
Очень сумбурно изложено. Суть лишь слегка проглядывает сквозь листву во мраке...

Bash
1
2
[Version]
Signature=$CHICAGO$
Для INF-файла это очень мало. Нужно хотя бы Class, ClassGuid и DriverVer поставить,
про CatalogFile вообще молчу.

Bash
1
2
3
[ClassInstall32]
AddReg=ClassInstall32AddReg
CopyFiles=CopyClassFilters
ClassInstall32 нужен только в том случае, если вы регистрируете в системе новый Device
Setup Class. А такое на практике требуется действительно редко. Даже MSDN пишет:
"You should only create a new device setup class if absolutely necessary".

Посмотрите INF-файл от moufiltr - это типичный установочный файл для драйвера устройства.
Там есть все - и ClassGuid, и секция Manufacturer, и регистрация через UpperFilters.
WDF-специфика (co-installers), правда, немного "смазывает" общую картину, но никто не
мешает посмотреть на примеры из более ранних DDK (у меня в блоге есть).

И еще раз напомню: используйте inf2cat.exe, он быстро выявляет основные ошибки в INF.
А корректно написанный INF-файл должен проходить тесты inf2cat.exe даже без предупреждений.

Цитата Сообщение от Shakielpel Посмотреть сообщение
если этот инф попытаться установить обновлением существующего драйвера, то при установке он откуда то знает производителя, а записи о производителе есть только в первом инф файле, ну и в общем устанавливается он также как и первый в этом случае.
Данные об установленных INF-файлах хранятся в системе (.pnf-файлы, насколько я знаю).

Цитата Сообщение от Shakielpel Посмотреть сообщение
видимо он просто находит первый файл и ставит все по нему, ибо если первый убрать, то обновлением драйвера он не устанавливается, говорит что отсутствуют данные об устройстве.
Странно, что что-то вообще работает. Там же INF практически голый, система даже не знает, к
какому классу оборудования он относится (нет Class и ClassGuid) !
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
21.07.2014, 22:09  [ТС]
И кстати, такого не может быть, чтобы Unload отрабатывал без вызова DriverEntry.
оно тоже отрабатывает, а потом сразу же анлоад. Винда XP на виртуальной машине.

Добавлено через 3 минуты
Очень сумбурно изложено. Суть лишь слегка проглядывает сквозь листву во мраке...
я в списке устройств (диспетчер устройств) жму правой кнопкой на устройстве которое является усб мышью, и жму обновить драйвер, когда драйвер обновляется, вместо старого названия, появляется мое название устройства - это же фильтр, он должен быть рядом с тем что я фильтрую быть, а тут выходит что он вместо него.

Добавлено через 4 минуты
Посмотрите INF-файл от moufiltr - это типичный установочный файл для драйвера устройства.
Там есть все - и ClassGuid, и секция Manufacturer, и регистрация через UpperFilters.
WDF-специфика (co-installers), правда, немного "смазывает" общую картину, но никто не
мешает посмотреть на примеры из более ранних DDK (у меня в блоге есть).
я первый инф так и собрал, я взял инф от fairFly но, он не ставится по инсталу - это нормально? я так понимаю, что и через setupAPI или как ее там он также не поставится, а это был бы легкий способ его автоматической установки. но вообще он единственный с которым драйвер работает ) просто его ставить нужно через диспетчер устройств, как в описании по установке FireFly и написано

Добавлено через 38 секунд
И еще раз напомню: используйте inf2cat.exe, он быстро выявляет основные ошибки в INF.
А корректно написанный INF-файл должен проходить тесты inf2cat.exe даже без предупреждений.
посмотрю
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.07.2014, 22:37
Цитата Сообщение от Shakielpel Посмотреть сообщение
я в списке устройств (диспетчер устройств) жму правой кнопкой на устройстве которое является усб мышью, и жму обновить драйвер, когда драйвер обновляется, вместо старого названия, появляется мое название устройства - это же фильтр, он должен быть рядом с тем что я фильтрую быть, а тут выходит что он вместо него.
А где написано, что это фильтр ? Как система это поймет ?
Вы же в INF ничего не написали.

Цитата Сообщение от Shakielpel Посмотреть сообщение
я первый инф так и собрал, я взял инф от fairFly но, он не ставится по инсталу - это нормально? я так понимаю, что и через setupAPI или как ее там он также не поставится, а это был бы легкий способ его автоматической установки. но вообще он единственный с которым драйвер работает ) просто его ставить нужно через диспетчер устройств, как в описании по установке FireFly и написано
Просто копи-пастить код в надежде, что он заработает - безнадежно.
Радикальную меру порекомендую: открываете MSDN, раздел INF-файлов и все, что касается
установки драйверов, читаете от корки до корки, непонятные термины выписываете отдельно,
затем по каждому ищете объяснение - в том же MSDN, в Гугле, здесь, и т.д., до полного
прояснения. Затем читаете снова все от корки до корки, пока теоретических вопросов не останется.
И только потом садитесь и пишете нормальный, а не кастрированный, INF-файл.
С валидацией через inf2cat и пробами на 32-битной и 64-битной виртуалках.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
22.07.2014, 06:34  [ТС]
Это будет работать.
Здесь только одна тонкость: для работы со своим IOCTL-интерфейсом в
фильтрующем драйвере нужно создавать дополнительный DEVICE_OBJECT с
символьной ссылкой и общаться с драйвером исключительно через него.
И этот объект не нужно аттачить к стеку устройств, он должен
находиться как бы "сбоку", вне стека. У Уолтера Они в главе
"фильтрующие драйверы" (стр. 709, кажется ) эта техника описана.
в этой книге как то лаконично упущена тема того как этот объект создать, потому что его нужно привязать к объекту драйвера, объект драйвера у нас 1 на всех, и вот мы пишем 2 раза подряд

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
IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject)
 
{
    NTSTATUS                           status;
    PDEVICE_OBJECT                 deviceObject;
    PDEVICE_OBJECT                 deviceObjectEXTRA;
    PDEVICE_EXTENSION           deviceExtension = NULL;
    PEXTRADEVICE_EXTENSION  EXTRAdeviceExtension = 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
        );
 
  status = IoCreateDevice(
        DriverObject,
        sizeof(EXTRAdeviceExtension),
        Name32,                      
        FILE_DEVICE_UNKNOWN,
        FILE_DEVICE_SECURE_OPEN | FILE_AUTOGENERATED_DEVICE_NAME,
        FALSE,
        &deviceObjectEXTRA
        );
итого мы привязали 2 объекта к одному драйверу? и как же к ним обращаться теперь? например в анлоаде идет обращение ObjectDriver->ObjectDevice = null - и вот что мы тут обнулили? вообщем у меня тут когнитивный дисонанс возникает.

когда делаешь DeviceIoControl вызывается функция драйвер объекта
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=CtlDispatch; вот тут мне то же не очень понятно, все функции определены в драйвере, т.е. функцию вызова из приложения мне некуда больше записать. И меня терзают смутные сомнения...

Добавлено через 4 минуты
Просто копи-пастить код в надежде, что он заработает - безнадежно.
Радикальную меру порекомендую: открываете MSDN, раздел INF-файлов и все, что касается
но еще безнадежней пытаться чему то научится по MSDN там много чего написано, но еще ниразу мне не удалось понять к чему это все написано, это скорей справочник, учится по нему все равно что по большой советской энциклопедии

Добавлено через 12 минут
а хотя нет, там прям так 2 девайса и создаются, просто определение edo пропущено....но я все равно не понял, как его после этого уничтожить, т.к. как к нему из драйвера обратиться я не понимать.

Добавлено через 4 часа 12 минут
также, как обратиться к этому объекту из приложения? ведь драйвер уже запущен....да и сервис вроде как тоже.

т.е. мне все равно нужно делать CreateFile.... - потому что иначе неясно где взять хендл на драйвер.
Ну а имя на которое мы создавали линк, оно фигурирует только в OpenService, т.е. нужно и сервис запускать? т.е. на "боковой" объект будет отдельный сервис и его и запускать нужно?... а иначе зачем нужен линк вообще? кажется мне что я ничего не понимаю )

Добавлено через 5 минут
йоу, похоже я достучался до объекта)) ибо получил бсод) IRQL_NOT_LESS_OR_EQUAL, а можно как то тормознуть отладку до бсода? я даже скачал SoftICE установил, но ничего не понял

Добавлено через 10 минут
ан нет, бсод проиходит еще до того как я успеваю чего либо вызвать, собственно он по событию от мыши и случается )

Добавлено через 1 час 1 минуту
он заходит в ентри, заходит в адд девайс, и даже по 2 раза заходит в IRP_MJ_INTERNAL_DEVICE_CONTROL и IRP_MJ_DEVICE_CONTROL еще до того как я двигал мышкой или вообще что то делал. причем во втором даже срабатывает как то условие с моим IOCL. я поставил условие что если вошли IRP_MJ_INTERNAL_DEVICE_CONTROL то это должно быть устройство подключенное к пнп иначе выход (так как в книжке написано флаг в девайс екстеншене сделал), а в IRP_MJ_DEVICE_CONTROL что не подключенное. В противном случае return, и вот когда двигаешь мышкой он все равно вылетает....
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.07.2014, 10:03
Цитата Сообщение от Shakielpel Посмотреть сообщение
итого мы привязали 2 объекта к одному драйверу? и как же к ним обращаться теперь?
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
typedef struct _DEVICE_EXTENSION
{
    int Tag;
    
    // ...
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 
// ...
 
NTSTATUS
DriverDispatch(
    __in    DEVICE_OBJECT             * pDeviceObj,
    __in    IRP                       * pIrp
    )
{
    DEVICE_EXTENSION *pDeviceExt = pDeviceObj->DeviceExtension;
    
    switch (pDeviceExt->Tag)
    {
        case MY_FILTER_DEVICE:
        {
            // ...
        }
        break;
        
        case MY_CONTROL_DEVICE:
        {
            // ...
        }
        break;
    }
}
например в анлоаде идет обращение ObjectDriver->ObjectDevice = null - и вот что мы тут обнулили? вообщем у меня тут когнитивный дисонанс возникает.
DRIVER_OBJECT::DeviceObject указывает на первое устройство в списке.
Двигаться по нему можно с помощью DEVICE_OBJECT::NextDevice, пока не
будет получен NULL. И вообще, в Unload удаляются только legacy-девайсы, а
для приаттаченных к PnP-стеку устройств есть IRP_MN_REMOVE_DEVICE.

также, как обратиться к этому объекту из приложения? ведь драйвер уже запущен....да и сервис вроде как тоже.
т.е. мне все равно нужно делать CreateFile.... - потому что иначе неясно где взять хендл на драйвер.
Хэндл, только не на драйвер, а на устройство. Через символьную ссылку - IoCreateSymbolicLink.

Ну а имя на которое мы создавали линк, оно фигурирует только в OpenService, т.е. нужно и сервис запускать? т.е. на "боковой" объект будет отдельный сервис и его и запускать нужно?... а иначе зачем нужен линк вообще? кажется мне что я ничего не понимаю )
Драйвер один. Создает одно устройство для управления (EDO), в DriverEntry, например, и сразу
символьную ссылку на него. По символьной ссылке устройство можно открывать через CreateFile.
Второе устройство, которое цепляется в стек, создается в AddDevice. Это Filter DO.

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

йоу, похоже я достучался до объекта)) ибо получил бсод) IRQL_NOT_LESS_OR_EQUAL, а можно как то тормознуть отладку до бсода? я даже скачал SoftICE установил, но ничего не понял
SoftICE на свалочку. При всем уважении, продукт давно уже не поддерживается и даже
на XP запустить его проблема. Советую сразу переходить на WinDBG.

он заходит в ентри, заходит в адд девайс, и даже по 2 раза заходит в IRP_MJ_INTERNAL_DEVICE_CONTROL и IRP_MJ_DEVICE_CONTROL еще до того как я двигал мышкой или вообще что то делал.
Это нормально.

причем во втором даже срабатывает как то условие с моим IOCL. я поставил условие что если вошли IRP_MJ_INTERNAL_DEVICE_CONTROL то это должно быть устройство подключенное к пнп иначе выход (так как в
книжке написано флаг в девайс екстеншене сделал), а в IRP_MJ_DEVICE_CONTROL что не подключенное.
Нет-нет, так нельзя. Мышиные и клавиатурные драйверы тоже поддерживают IRP_MJ_DEVICE_CONTROL.
Способ отличать Filter DO от Extension DO я привел выше. Остальное есть в MSDN, но Вы же его не любите...
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
22.07.2014, 22:34  [ТС]
Нет-нет, так нельзя. Мышиные и клавиатурные драйверы тоже поддерживают IRP_MJ_DEVICE_CONTROL.
Способ отличать Filter DO от Extension DO я привел выше. Остальное есть в MSDN, но Вы же его не любите...
дык я так и делаю, просто где какое устройство определяется флагом, у вас это Tag, поменял на если НЕ

Добавлено через 1 час 55 минут
не замечал раньше этой ошибки, но теперь она вылазит постоянно, и ничего не могу с ней сделать
оказывается "девайс сбоку" не создается

и мы все время вылетаем по этому условию
C
1
2
3
4
if (!NT_SUCCESS(edoStatus)) {
        KdPrint((edoStatus,"Oshibka sozdanija EDO\n" ));
        return edoStatus;
    }
почему? и дебаг статуса не выводит ( А как подключится WinDbg я хз, т.к. когда процесс существует мышке уже кранты ))
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
//в заголовочном файле константы
#define FIDO_EXTENSION 0
#define EDO_EXTENSION  1
#define WIN32_DEVICE_NAME L"\\DosDevices\\mssnddv"
#define NT_DEVICE_NAME L"\\Device\\MyExtra%d"
//------------------------------------------------------------------
// LaserPU_AddDevice()
// Добавление драйвера в стек драйверов мыши
//------------------------------------------------------------------
NTSTATUS
LaserPUAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject)
 
{
    NTSTATUS                status;
    PDEVICE_OBJECT          deviceObject;
    PDEVICE_EXTENSION       deviceExtension = NULL;
    UNICODE_STRING edonameLink;
    UNICODE_STRING edoname;
    PDEVICE_OBJECT          edo;
    NTSTATUS                             edoStatus;
    PEXTRA_DEVICE_EXTENSION ExtraDeviceExtension = 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;
    }
 
    KdPrint((
        "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.
                                
    KdPrint((
        "AddDevice: %x to %x->%x \n",
        deviceObject,
        deviceExtension->NextLowerDriver,
        PhysicalDeviceObject
        ));
 
    deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    //добавим объект "сбоку"
    deviceExtension->flag = FIDO_EXTENSION;
   
   //создание имени в правильном формате ++
    RtlInitUnicodeString(&edoname,NT_DEVICE_NAME);
    //создание имени в правильном формате --
    //win32  имя в правильном формате
     RtlInitUnicodeString(&edonameLink,WIN32_DEVICE_NAME);
    //win32  имя в правильном формате--
    
    
    
    edoStatus = IoCreateDevice(DriverObject,sizeof(EXTRA_DEVICE_EXTENSION) ,    &edoname,FILE_DEVICE_UNKNOWN,0,FALSE,&edo);
    
     if (!NT_SUCCESS(edoStatus)) {
        KdPrint((edoStatus,"Oshibka sozdanija EDO\n" ));
        return edoStatus;
    }
    
    ExtraDeviceExtension = (PEXTRA_DEVICE_EXTENSION) edo->DeviceExtension;  
    ExtraDeviceExtension->flag = EDO_EXTENSION;
    ExtraDeviceExtension->pdx = deviceExtension;
    deviceExtension->edx = ExtraDeviceExtension;
    
     edoStatus =   IoCreateSymbolicLink(&edonameLink,&edoname);//создаем линк между нт и вин32 именами
      if (!NT_SUCCESS(edoStatus)) {
        KdPrint(("Oshibka sozdanija Linka\n" ,edoStatus));
        IoDeleteDevice(edo);
        return edoStatus;
    }
 
    return STATUS_SUCCESS;
}
Добавлено через 6 минут
и дебаг статуса не выводит = KdPrint не выводит edoStatus )

Добавлено через 1 час 56 минут
перегрузил винду...ошибка пропала....ну еще добавил FILE_DEVICE_SECURE_OPEN вместо нуля....

Добавлено через 43 минуты
это должно работать? потому что пока что оно не работает, хендл не получается. И синий экран забодал, не пойму откуда он вылазит (

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm2.Button2Click(Sender: TObject);
const
  SERVICE_NAME: pChar = 'mssnddv';
  IOCTL_READ = ($800 shl 2) or ($22 shl 16);
var
  hDrv: THandle;
  cbRet :DWORD;
  res :Word;
begin
 
  hDrv := CreateFile('\\\\.\\mssnddv',
                       GENERIC_READ or GENERIC_WRITE, 0, nil,
                       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hDrv = Invalid_handle_value then
  begin
    showmessage('не получилось');
    exit;
  end;
 
     //куда записать результат чтения
    DeviceIoControl(hDrv,IOCTL_READ,nil,2, @Res,2,cbRet,0);
 
end;
Добавлено через 1 час 43 минуты
дык я так и делаю, просто где какое устройство определяется флагом, у вас это Tag, поменял на если НЕ
а еще, как правильно проверять этот таг? я создаю 2 структуры Device_EXTENSION, в книге написано нужно создавать 1 общую COMMON_DEVICE_EXTENSION и на основе их 2 моих и в этой общей флаг TAG.

Т.к у меня конструкция typedef struct Device_EXTENSION : public COMMON_DEVICE_EXTENSION вызывала синтаксическую ошибку, то я убрал общую структуру и в обоих оставил просто одинаковое поле, и таким образом когда я проверяю флаг, я всегда объявляю указатель PDEVICE_EXTENSION deviceExtension в независимости от девайса, может это совсем не правильно и это и вызывает бсод?

Добавлено через 26 минут
мда....закоментировал все что добавил и все равно бсод....ппц

Добавлено через 16 минут
чуял же что дело гиблое )) скажите лучше как без мыши пс/2 в порте заставить винду думать что там кто то есть )

Добавлено через 1 час 14 минут
грохнул все и начал все заново )
добавил объект сбоку без екстеншена, добавил его анлоад (правда потестить его видимо не удалось он че то туда не заходит). добавил в основной екстеншен флаг и проверку на флаг в итернал девайс и пропускание пакета.. бсод пока не приходил )
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.07.2014, 22:41
Цитата Сообщение от Shakielpel Посмотреть сообщение
не замечал раньше этой ошибки, но теперь она вылазит постоянно, и ничего не могу с ней сделать
оказывается "девайс сбоку" не создается
и мы все время вылетаем по этому условию
C
1
2
3
4
if (!NT_SUCCESS(edoStatus)) {
 KdPrint((edoStatus,"Oshibka sozdanija EDO\n" ));
 return edoStatus;
 }
почему? и дебаг статуса не выводит
Во-первых, сначала текст, потом аргументы, а не наоборот:
C
1
KdPrint(("Can't create EDO (status = 0x%.8lx).\r\n", edoStatus));
Во-вторых, KdPrint работает только в checked-сборках.
Можно поменять на DbgPrint. Уверены, что WinDBG подключен правильно ?
Он вообще что-нибудь выводит при старте отлаживаемой машины ?

А как подключится WinDbg я хз
Я запускаю WinDBG батником примерно такого содержания:
Bash
1
2
3
@echo off
 
start "WinDBG" /d "C:\WinDDK\Debuggers\" /b "WinDBG.exe" -k com:pipe,port=\\.\pipe\debug_pipe,resets=0,reconnect
На виртуальной машине включен (через msconfig) режим отладки с
использованием COM-порта, который перенаправляется в канал (debug_pipe).
На Vista и выше там нужно еще дополнительно в ключе Debug Print Filter
прописать REG_DWORD-переменную DEFAULT со значением 0xf (15).

Да, еще отладчик должен быть настроен на автоматическое скачивание
отладочных символов Windows с сервера Microsoft, проще всего завести
где-нибудь папку и прописать путь к ней через системную переменную
_NT_SYMBOL_PATH, как это описано в документации для WinDBG.

И синий экран забодал, не пойму откуда он вылазит (
Ничего, подключите WinDBG - сразу будете знать. С точностью до
номера строки в исходном файле.

а еще, как правильно проверять этот таг? я создаю 2 структуры Device_EXTENSION, в книге написано нужно создавать 1 общую COMMON_DEVICE_EXTENSION и на основе их 2 моих и в этой общей флаг TAG.
Суть в том, что DEVICE_EXTENSION для всех устройств, создаваемых драйвером,
должна быть одинаковой. Хотя бы первое поле. И при создании устройства
сразу нужно записать в его DEVICE_EXTENSION соответствующий тэг.
Тогда, имея полученный откуда-либо DEVICE_OBJECT, можно по тэгу в его
DEVICE_EXTENSION сразу узнать, что это за устройство - Filter DO, Extension DO
или еще что-то. Кстати, использовать именно тэги никто не заставляет.
К примеру, можно для каждого устройства завести в DEVICE_EXTENSION
указатель на свою копию Major Table с адресами обработчиков IRP_MJ_XXX.
Получится нечто в стиле виртуальных методов из C++. Когда в драйвере
много разных типов устройств, эта стратегия может быть выгоднее, так как
вместо развесистых if-ов или switch-case весь диспатчинг сведется к
одному вызову функции через указатель.

Т.к у меня конструкция typedef struct Device_EXTENSION : public COMMON_DEVICE_EXTENSION вызывала синтаксическую ошибку, то я убрал общую структуру и в обоих оставил просто одинаковое поле, и таким образом когда я проверяю флаг, я всегда объявляю указатель PDEVICE_EXTENSION deviceExtension в независимости от девайса, может это совсем не правильно и это и вызывает бсод?
Это же C, не C++, здест нет наследования и спецификаторов доступа.
По поводу BSOD - займитесь подключением WinDBG, тогда будете точно
знать, в чем причина.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
22.07.2014, 23:04  [ТС]
добавил IRP_MJ_DEVICE_CONTROL бсода нет, старые колбеки работают, а хендл на девайс все равно неверный (

Добавлено через 6 минут
я сделал ход конем и сделал всего одну структуру DEVICE_EXTENSION, а в ней ссылку на саму себя, теперь у меня везде экземпляр структуры того же самого типа в обоих девайсах.

Добавлено через 33 секунды
почему хендл не получается? ( код я выше писал...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.07.2014, 23:06
Причина ошибки в NTSTATUS/GetLastError.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
22.07.2014, 23:41  [ТС]
код 2, файл нот фаунд? ну я вообщем то это и подозревал, но понятнее от этого не стало )

Добавлено через 5 минут
'\\\\.\\mssnddv' - так 123 - неверный путь к файлу , Pchar('\\\\.\\mssnddv') - 53, PChar('mssnddv') - 2

Добавлено через 47 секунд
ERROR_BAD_NETPATH53 (0x35)
The network path was not found.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.07.2014, 23:47
Цитата Сообщение от Shakielpel Посмотреть сообщение
код 2, файл нот фаунд? ну я вообщем то это и подозревал, но понятнее от этого не стало )
Значит, символьной ссылки нет (WinObj смотреть надо, есть ли она в каталоге GLOBAL??).
Или драйвер еще не запущен. Вообще, можете весь код от "а" до "я" выложить ?
Надо пройтись по нему как следует, да с пристрастием
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
22.07.2014, 23:54  [ТС]
старые замечания я не исправлял ) ибо итак пока хватает ужасов

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
/*++
#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->MajorFunction[IRP_MJ_DEVICE_CONTROL]     =  LaserPU_DispatchIODeviceControl; //тут  мы должны вызывать колбек оригинальный
    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;
     UNICODE_STRING edonameLink;
    UNICODE_STRING edoname;
    PDEVICE_OBJECT          edo;
    NTSTATUS                             edoStatus;
    PDEVICE_EXTENSION ExtraDeviceExtension = 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;
    }
 
    KdPrint((
        "AddDevice PDO (0x%x) FDO (0x%x)\n",
        PhysicalDeviceObject,
        deviceObject
        ));
 
    // Получаем указатель на расширение нашего устройства.
    deviceExtension = (PDEVICE_EXTENSION) deviceObject->DeviceExtension;
    
    deviceExtension->flag = FIDO_EXTENSION;
 
    // Сохраняю для дальнейшего использования.
    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.
                                
    KdPrint((
        "AddDevice: %x to %x->%x \n",
        deviceObject,
        deviceExtension->NextLowerDriver,
        PhysicalDeviceObject
        ));
 
    deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
    //добавим объект "сбоку"
    
   
   //создание имени в правильном формате ++
    RtlInitUnicodeString(&edoname,NT_DEVICE_NAME);
    //создание имени в правильном формате --
    //win32  имя в правильном формате
     RtlInitUnicodeString(&edonameLink,WIN32_DEVICE_NAME);
    //win32  имя в правильном формате--
    
    
    //edoStatus = IoCreateDevice(DriverObject,sizeof(EXTRA_DEVICE_EXTENSION) ,  &edoname,FILE_DEVICE_UNKNOWN,FILE_DEVICE_SECURE_OPEN,FALSE,&edo);
    edoStatus = IoCreateDevice(DriverObject,sizeof(DEVICE_EXTENSION)  , &edoname,FILE_DEVICE_UNKNOWN,FILE_DEVICE_SECURE_OPEN,FALSE,&edo);
    
     if (!NT_SUCCESS(edoStatus)) {
        KdPrint((edoStatus,"Oshibka sozdanija EDO\n" ));
        return edoStatus;
    }
    
       ExtraDeviceExtension = (PDEVICE_EXTENSION) edo->DeviceExtension; 
       ExtraDeviceExtension->flag = EDO_EXTENSION;
       ExtraDeviceExtension->pdx = deviceExtension;
      //deviceExtension->edx = ExtraDeviceExtension;
    
     edoStatus =   IoCreateSymbolicLink(&edonameLink,&edoname);//создаем линк между нт и вин32 именами
      if (!NT_SUCCESS(edoStatus)) {
        KdPrint(("Oshibka sozdanija Linka\n" ,edoStatus));
        IoDeleteDevice(edo);
       return edoStatus;
       }
 
 
 
    return STATUS_SUCCESS;
}
 
 
//---------------------------------------------------------------------
// LaserPU_Unload()
// Выгрузка драйвера
//---------------------------------------------------------------------
VOID
LaserPUUnload(
    IN PDRIVER_OBJECT DriverObject
    )
 
{
    PAGED_CODE();
 
    ASSERT(DriverObject->DeviceObject == NULL);
    DriverObject->DeviceObject->NextDevice;
    ASSERT(DriverObject->DeviceObject == NULL);
 
    KdPrint(("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
        //
        KdPrint(("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;
    
    if (!(deviceExtension->flag == FIDO_EXTENSION)) 
   {
     KdPrint(( "ne tot object v PassThrough\n"));
     return STATUS_SUCCESS;
   }
 
    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_DispatchIODeviceControl()
// В данной функции мы должны получить вызов от приложения и вызвать колбек от низлежащего по стеку устройсва
// который в свою очередь должен вызвать LaserPU_ServiceCallback нашего устройства, подключенного к стеку
//---------------------------------------------------------------------
NTSTATUS LaserPU_DispatchIODeviceControl(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    )
{ 
     PDEVICE_EXTENSION deviceExtension;
    PIO_STACK_LOCATION          irpStack;
    NTSTATUS                    status;
     KdPrint(( "Mi Vizvalis iz prilogenija\n"));
    //return STATUS_SHARING_VIOLATION;
    
     deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    if (!(deviceExtension->flag ==  EDO_EXTENSION)) 
    {
      KdPrint(( "ne tot object  IO\n"));
      return STATUS_SUCCESS;
    }
     
     irpStack = IoGetCurrentIrpStackLocation(Irp);
  
   switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
   {
    case IOCTL_TEST_MyMy:
        KdPrint(( "Mi poluchili ioctl\n"));
         //status = STATUS_SUCCESS;
        //Irp->IoStatus.Status = status;
         //IoCompleteRequest (Irp, IO_NO_INCREMENT);
   
   }
   
   return STATUS_SUCCESS;
    
}
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
23.07.2014, 00:02  [ТС]
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
//---------------------------------------------------------------------
// 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;
 
    KdPrint(( "Wot i sluchilos DispatchDeviceControl\n"));
 
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    
    if (!(deviceExtension->flag == FIDO_EXTENSION)) 
   {
     KdPrint(( "ne tot object v devaice control\n"));
     return STATUS_SUCCESS;
   }
    
    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;
 
    KdPrint(( "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; 
                KdPrint(( "LB\n"));
                }
            else if (InputDataStart->ButtonFlags == MOUSE_RIGHT_BUTTON_DOWN)
                {
                //MouseInputData->ButtonFlags = 0x400;              
                //MouseInputData -> ButtonData  = 0xff88;   
                KdPrint(( "RB\n"));
                }
            else
                {
                //MouseInputData->ButtonFlags = 0x0;
                }
    }
 
 
    (*(PSERVICE_CALLBACK_ROUTINE) deviceExtension->UpperConnectData.ClassService)(
        deviceExtension->UpperConnectData.ClassDeviceObject,
        InputDataStart,
        InputDataEnd,
        InputDataConsumed
        );
    return;
}
Добавлено через 1 минуту
h

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
/*++
 
Copyright (c) Microsoft Corporation.  All rights reserved.
 
    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
    PURPOSE.
 
 
Module Name:
 
    LaserPU.h
 
Abstract:
 
    This is the header for the Windows Driver Framework version
    of the firefly filter driver.
 
Environment:
 
    Kernel mode
 
--*/
 
#include <ntddk.h>
#include <wdf.h>
#define NTSTRSAFE_LIB
#include <ntstrsafe.h>
#include <initguid.h>
#include <wdmguid.h>
#include <ntddmou.h>
 
//
// Our drivers generated include from firefly.mof
// See makefile.inc for wmi commands
//
//#include "fireflymof.h"
 
// Our drivers modules includes
//#include "filter.h"
//#include "wmi.h"
//#include "vfeature.h"
//#include "magic.h"
 
//
// WDFDRIVER Object Events
//
#define IOCTL_TEST_MyMy CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_NEITHER,FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_MOUSE_CONNECT    CTL_CODE(FILE_DEVICE_MOUSE, 0x0080, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_MOUSE_DISCONNECT CTL_CODE(FILE_DEVICE_MOUSE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_MOUSE_ENABLE     CTL_CODE(FILE_DEVICE_MOUSE, 0x0200, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_INTERNAL_MOUSE_DISABLE    CTL_CODE(FILE_DEVICE_MOUSE, 0x0400, METHOD_NEITHER, FILE_ANY_ACCESS)
 
 
 
#define POOL_TAG   'liFT'
 
//
// These are the states Filter transition to upon
// receiving a specific PnP Irp. Refer to the PnP Device States
// diagram in DDK documentation for better understanding.
//
typedef struct _CONNECT_DATA {
    IN PDEVICE_OBJECT ClassDeviceObject;
    IN PVOID ClassService;
} CONNECT_DATA, *PCONNECT_DATA;
 
typedef
VOID
(*PSERVICE_CALLBACK_ROUTINE) (
    IN PVOID NormalContext,
   IN PVOID SystemArgument1,
   IN PVOID SystemArgument2,
   IN OUT PVOID SystemArgument3 );
 
typedef enum _DEVICE_PNP_STATE {
 
    NotStarted = 0,         // Not started yet
    Started,                // Device has received the START_DEVICE IRP
    StopPending,            // Device has received the QUERY_STOP IRP
    Stopped,                // Device has received the STOP_DEVICE IRP
    RemovePending,          // Device has received the QUERY_REMOVE IRP
    SurpriseRemovePending,  // Device has received the SURPRISE_REMOVE IRP
    Deleted                 // Device has received the REMOVE_DEVICE IRP
 
} DEVICE_PNP_STATE;
 
#define INITIALIZE_PNP_STATE(_Data_)    \
        (_Data_)->DevicePnPState =  NotStarted;\
        (_Data_)->PreviousPnPState = NotStarted;
 
#define SET_NEW_PNP_STATE(_Data_, _state_) \
        (_Data_)->PreviousPnPState =  (_Data_)->DevicePnPState;\
        (_Data_)->DevicePnPState = (_state_);
 
#define RESTORE_PREVIOUS_PNP_STATE(_Data_)   \
        (_Data_)->DevicePnPState =   (_Data_)->PreviousPnPState;\
 
typedef enum _DEVICE_TYPE {
 
    DEVICE_TYPE_INVALID = 0,         // Invalid Type;
    DEVICE_TYPE_FIDO,                // Device is a filter device.
    DEVICE_TYPE_CDO,                 // Device is a control device.
 
} DEVICE_TYPE;
 
#define FIDO_EXTENSION 0
#define EDO_EXTENSION  1
#define WIN32_DEVICE_NAME L"\\DosDevices\\mssnddv"
#define NT_DEVICE_NAME L"\\Device\\MyExtra%d"
 
 
 
 
 
 
 
typedef struct _COMMON_DEVICE_DATA
{
 
    DEVICE_TYPE Type;
 
} COMMON_DEVICE_DATA, *PCOMMON_DEVICE_DATA;
 
 
typedef struct _DEVICE_EXTENSION 
{
    ULONG flag;
    //struct _DEVICE_EXTENSION*  edx;//в девайс экстеншне основном ссылка на  дополнительный  девайс экстеншн
    struct _DEVICE_EXTENSION*  pdx;
    
    COMMON_DEVICE_DATA Common;
    
    
    //
    // A back pointer to the device object.
    //
    PDEVICE_OBJECT  PhysicalDeviceObject;
 
    PDEVICE_OBJECT  Self;
 
    //
    // The top of the stack before this filter was added.
    //
 
    PDEVICE_OBJECT  NextLowerDriver;
 
    //
    // current PnP state of the device
    //
 
    DEVICE_PNP_STATE  DevicePnPState;
 
    //
    // Remembers the previous pnp state
    //
 
    DEVICE_PNP_STATE    PreviousPnPState;
 
    //
    // Removelock to track IRPs so that device can be removed and
    // the driver can be unloaded safely.
    //
    IO_REMOVE_LOCK RemoveLock;
 
    CONNECT_DATA UpperConnectData;
 
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 
typedef struct _EXTRA_DEVICE_EXTENSION 
{
    ULONG flag;
    PDEVICE_EXTENSION* pdx; //в девайс екстенсион доп объекта ссылка на основной объект
    PDEVICE_OBJECT  Self;
} EXTRA_DEVICE_EXTENSION, *PEXTRA_DEVICE_EXTENSION;
//
 
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_DispatchIODeviceControl(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
    );
 
DRIVER_INITIALIZE DriverEntry;
Добавлено через 6 минут
там его нашел я

Добавлено через 11 секунд
в Global
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.07.2014, 02:07
Бросается в глаза вот что: EDO создается каждый раз с одним и тем же
именем и символьной ссылкой. Это неправильно. В системе может быть
два и более стеков клавиатуры и мыши - по одному стеку на каждое
физически подключенное устройство и еще один стек для RDP.
В Windows 8 и выше, кстати, немного по-другому: там по одному стеку
на каждое физ. устройство и по одному на каждую активную RDP-сессию.
Так что AddDevice в общем случае может вызываться два раза и более.

Можно перенести код создания EDO в DriverEntry, например.
Только учитывайте, что драйвер не будет полностью выгружен, пока
есть хотя бы одна ссылка на DEVICE_OBJECT.

По поводу остального напишу позже, как будет время.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
23.07.2014, 17:39  [ТС]
ну у меня все встало на том, что я из приложения не могу создать даже хендл ( это проблема номер 1 сейчас

Добавлено через 14 часов 37 минут
Delphi
1
2
hDrv := CreateFile('\\.\mssnddv', GENERIC_READ or GENERIC_WRITE,
                  FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
сделал по примеру
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
hDevice         : THANDLE;
  hDevice:= CreateFile('\\.\EcpOmaDevice0',
                       GENERIC_READ or GENERIC_WRITE,
                       FILE_SHARE_READ or FILE_SHARE_WRITE,
                       Nil,
                       OPEN_EXISTING,
                       0,
                       0);
  if (hDevice = INVALID_HANDLE_VALUE) then
   begin
     ErrorBox('Ошибка инициализации. Драйвер не установлен.');
     Result:=False;
     exit;
   end;
ошибка 2 (
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.07.2014, 22:44
Цитата Сообщение от Shakielpel Посмотреть сообщение
ну у меня все встало на том, что я из приложения не могу создать даже хендл ( это проблема номер 1 сейчас
Нужно добавить обработчики IRP_MJ_CREATE, IRP_MJ_CLEANUP и IRP_MJ_CLOSE.
Без них CreateFile не будет отрабатывать. Логика обработки проста: если Filter DO -
отправляем IRP вниз (IoSkipCurrentIrpStackLocation -> IoCallDriver), если EDO -
тогда завершаем запрос с кодом STATUS_SUCCESS.

Добавлено через 3 минуты
При создании Filter DO указывать флаги типа FILE_DEVICE_SECURE_OPEN
не нужно, PnP-менеджер все равно скопирует их из устройства уровнем ниже.
FILE_AUTOGENERATED_DEVICE_NAME тоже не нужен. Filter DO вообще не
требуется имя, это EDO оно необходимо для создания символьной ссылки.

Добавлено через 3 минуты
Нужно где-то позаботиться о том, чтобы ненужные EDO тоже удалялись.
Например, в обработчике IRP_MN_REMOVE_DEVICE.

Добавлено через 2 минуты
LaserPU_DispatchIODeviceControl написана неправильно.
При получении IRP для Filter DO нужно не возвращать STATUS_SUCCESS, а
посылать IRP дальше вниз, как это сделано в DispatchPassThrough.

Добавлено через 1 минуту
Вообще, IRP нужно или завершать, или посылать вниз, или ставить в
очередь для последующего завершения. Просто возвращать какой-то
статус без вызова хотя бы IoCompleteRequest - грубая ошибка.

Добавлено через 3 минуты
LaserPU_DispatchDeviceControl надо полностью переписать.
1
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
24.07.2014, 02:18  [ТС]
Нужно добавить обработчики IRP_MJ_CREATE, IRP_MJ_CLEANUP и IRP_MJ_CLOSE.
Без них CreateFile не будет отрабатывать. Логика обработки проста: если Filter DO -
отправляем IRP вниз (IoSkipCurrentIrpStackLocation -> IoCallDriver), если EDO -
тогда завершаем запрос с кодом STATUS_SUCCESS.
но там ведь в начале присвоен всем обработчикам DispatchPassThrough, и вроде бы то на то и выходит, разве нет?

Добавлено через 1 час 12 минут
заработало, оказалось что EDO нужно создавать прежде чем назначаются обработчики, ну впрочем не так чтобы совсем заработало, но по крайней мере находится хендл, и вызывается LaserPU_DispatchIODeviceControl из приложения, а это уже большое достижение, очень хорошее.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.07.2014, 09:03
Цитата Сообщение от Shakielpel Посмотреть сообщение
но там ведь в начале присвоен всем обработчикам DispatchPassThrough, и вроде бы то на то и выходит, разве нет?
Нет.
Например, IRP_MJ_CREATE мыши и клавиатуры может возвращать ошибку, в
зависимости от того, из какого процесса открывается устройство и с какими правами.

Добавлено через 1 минуту
Цитата Сообщение от Shakielpel Посмотреть сообщение
заработало, оказалось что EDO нужно создавать прежде чем назначаются обработчики
Да нет же, просто сделайте свои обработчики для DispatchCreate, DispatchCleanup и
DispatchClose с логикой, которую я описал выше, и CreateFile должна отрабатывать
нормально после этого.
0
4 / 4 / 4
Регистрация: 04.05.2014
Сообщений: 287
24.07.2014, 19:17  [ТС]
Да нет же, просто сделайте свои обработчики для DispatchCreate, DispatchCleanup и
DispatchClose с логикой, которую я описал выше, и CreateFile должна отрабатывать
нормально после этого.
да но логика, которую вы описали и есть в DispatchPassThrough, я только добавил завершение пакета, если это EDO, а не просто возврат флага успех, я вынес их отдельными строчками зачем то (т.е. там в цикле заполнялось, я еще после цикла отдельно присваиваю), но ничего это не помогало, и кроме того меня настораживало, что в DispatchPassThrough ни одного EDO пакета не приходило, и я создание EDO перенес в функцию инициализации, над присвоением и тогда по крайней мере заработали запросы в драйвер )

Добавлено через 32 минуты
хм, добавил удаление устройства, теперь если удалить в диспетчере устройств драйвер, а потом обратно поставить, то GreateFile работать не будет, а после перезагрузки виндовс будет... хотя пока нет нормального инфа об этом наверное можно не заморачиваться...

Добавлено через 21 минуту
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 LaserPU_DispatchIODeviceControl(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    )
{ 
     PDEVICE_EXTENSION deviceExtension;
    PIO_STACK_LOCATION          irpStack;
    NTSTATUS                    status;
     KdPrint(( "Mi Vizvalis iz prilogenija\n"));
    //return STATUS_SHARING_VIOLATION;
    
     deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    if (!(deviceExtension->flag ==  EDO_EXTENSION)) 
    {
      KdPrint(( "ne tot object  IO\n"));
      IoSkipCurrentIrpStackLocation (Irp);
     status = IoCallDriver (deviceExtension->NextLowerDriver, Irp);
        // IoReleaseRemoveLock(&deviceExtension->RemoveLock, Irp); 
      return status;
    }
     
     irpStack = IoGetCurrentIrpStackLocation(Irp);
  
   switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
   {
    //case IOCTL_TEST_MyMy:
        KdPrint(( "Mi poluchili ioctl\n",irpStack->Parameters.DeviceIoControl.IoControlCode));
   
   }
   
   Irp->IoStatus.Status=STATUS_SUCCESS;
    IoCompleteRequest (Irp,IO_NO_INCREMENT); 
    return STATUS_SUCCESS;
    
}
чо та в swich оно просто не заходит

Добавлено через 15 минут
да емае! убрал свитч, но вместо IOCTL kdPrint выводит пустое место....и как понять в чем косяк?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
24.07.2014, 20:17
Цитата Сообщение от Shakielpel Посмотреть сообщение
да но логика, которую вы описали и есть в DispatchPassThrough, я только добавил завершение пакета, если это EDO
Где ? Где там завершение пакета ?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
NTSTATUS
LaserPU_DispatchPassThrough(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp)
{
 
   // ...
  
   if (!(deviceExtension->flag == FIDO_EXTENSION)) 
   {
     KdPrint(( "ne tot object v PassThrough\n"));
     return STATUS_SUCCESS;
   }
Это не завершение. Здесь просто возвращается STATUS_SUCCESS.
То же самое касается других функций.

Для завершения пакета требуется установить поля Status и Information в
блоке Irp->IoStatus, после чего вызвать IoCompleteRequest.
Тогда это будет завершение. Фраза "RTFM!" так и просится.

Цитата Сообщение от Shakielpel Посмотреть сообщение
хм, добавил удаление устройства, теперь если удалить в диспетчере устройств драйвер, а потом обратно поставить, то GreateFile работать не будет, а после перезагрузки виндовс будет.
Надо прибирать за собой. Это не user mode, где достаточно грохнуть процесс и
все хэндлы закроются системой. Символьные ссылки на EDO нужно удалить, затем и
сами EDO, и вообще все ресурсы, которые использовались драйвером.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2014, 20:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через 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