Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 399
#1

DeviceIoControl не возвращает 0 при открытие драйвера

06.04.2013, 12:27. Просмотров 659. Ответов 0
Метки нет (Все метки)

При попытке послать драйверу IRP , Функция DeviceIoControl не нулевое значение , а GetLastError возвращает 1 (ERR_NO_RESULT ), т.е. :

C++
1
2
3
4
5
6
if(DeviceIoControl(hand, IOCTL_LAD_OFF, NULL, NULL, NULL, NULL, NULL, NULL) )
{
cout<< "DeviceIoControl OK"<<endl;
}
else
printf("Error %d in call to DeviceIoControl\n", GetLastError());
С чем может быть связанно?

Вот код драйвера :
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
#include "Ioctl.h"
#include "Driver.h"
 
/*##################################################################################*/
/********************Точка добавления нового устройства*************************************************/
/*##################################################################################*/
NTSTATUS AddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo )
{
DbgPrint("AddDevice\n");
/*переменная для хранения статуса ( возвращаемые значния системных функций )*/
NTSTATUS status;
/*здесь будет храниться адрес созданного объекта-устрйоства*/
PDEVICE_OBJECT fdo;
/*переменные для хранения имени объекта-устройства*/
UNICODE_STRING  NtDeviceName, DosDeviceName;        
/*формирование символьную ссылку ( имя видимое пользователем)*/
RtlInitUnicodeString( &NtDeviceName, L"\\Device\\LedTestD" );
/*формирование символьную ссылку ( имя видимое ядром)*/
RtlInitUnicodeString( &DosDeviceName,  L"\\DosDevices\\LEDD");              
/*создание объект-устрйоства*/
status  = IoCreateDevice(  DriverObject,    sizeof( DEVICE_EXTENSION ), &NtDeviceName,
    FILE_DEVICE_UNKNOWN, 0,FALSE , &fdo );      
 
/*проверяем возвращаемый статус на успех*/                          
                            if(!NT_SUCCESS( status ) )
                            {
/*в случае ошибки при создании устройства  удаляем выделенную для него память*/ 
                            IoDeleteDevice( fdo );                      
                            }                               
 fdo->Flags = fdo->Flags | (DO_BUFFERED_IO | DO_POWER_PAGABLE);
 fdo->Flags = fdo->Flags & ~DO_DEVICE_INITIALIZING;
/*присоединяем к стеку устрйоств*/
 
       
/*создаём символьную ссылку*/
status = IoCreateSymbolicLink( &DosDeviceName, &NtDeviceName );
/*проверяем возвращаемый статус на успех*/                          
                            if(!NT_SUCCESS( status ) )                                                  
                            return status;                          
/*Получаем указатель на область, предназначенную под
 структуру расширение устройства*/
 
 
return STATUS_SUCCESS;                          
}
 
NTSTATUS DispatchPower( IN PDEVICE_OBJECT fdo, IN PIRP Irp)
    {           
        DbgPrint("DispatchPower\n");
return  CompleteIrp(Irp,STATUS_SUCCESS,0);
    }
    
NTSTATUS DispatchPnp( IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    {          
        DbgPrint("DispatchPnp\n");
return  CompleteIrp(Irp,STATUS_SUCCESS,0);
    }   
    
/*##################################################################################*/
/********************Точка диспетчерезации(обработка IRP пакетов)************************************/
/*##################################################################################*/  
NTSTATUS DispatchWmi( IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    {
    DbgPrint("DispatchWmi\n");
    /*Указатель на стековую область*/
    PIO_STACK_LOCATION pIrpStack; 
  /*Сохраним адрес стековой области*/
    pIrpStack = IoGetCurrentIrpStackLocation( Irp ); 
    /*выполним требуемые действия*/
    switch( pIrpStack -> Parameters.DeviceIoControl.IoControlCode ) 
    {
    case IOCTL_LAD_OFF:
    __asm{
    mov AL,0xED
    out   60h,AL
    loopK1:
    in AL,64h
    and AL,2
    cmp AL,0
    jne loopK1
    mov AL,0
    out 60h,AL
    }
    break;
    case IOCTL_LAD_ON:
    __asm{
    mov AL,0xED
    out   60h,AL
    loopK2:
    in AL,64h
    and AL,2
    cmp AL,0
    jne loopK2
    mov AL,3
    out 60h,AL
    }
    break;
    }
    return STATUS_SUCCESS;
    }
    
 
NTSTATUS DispatchCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint("DispatchCreate\n");
return  CompleteIrp(Irp,STATUS_SUCCESS,0);
}   
 
NTSTATUS DispatchClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint("DispatchClose\n");
return  CompleteIrp(Irp,STATUS_SUCCESS,0);
}   
 
/*##################################################################################*/
/********************Точка выгрузки объект-драйвера*****************************************************/
/*##################################################################################*/
VOID DriverUnload( IN PDRIVER_OBJECT DriverObject )
{
DbgPrint("DriverUnload\n");
UNICODE_STRING DosDeviceName;
RtlInitUnicodeString(&DosDeviceName, L"\\Device\\LEDD" );
IoDeleteSymbolicLink(&DosDeviceName);
IoDeleteDevice(DriverObject->DeviceObject);
}
 
//Чтобы не создавать большое количество прототипов , DriverEntry распаложенна в конце 
 
/*##################################################################################*/
/********************функция инициализации драйвера ***************************************************/
/*##################################################################################*/
extern "C"  
NTSTATUS DriverEntry( IN PDRIVER_OBJECT  DriverObject , IN PUNICODE_STRING RegistryPath )
{
/*Фактически здесь мы должны проинициализировать необходимые  поля экземпляра ( объекта ) 
частично документированной структуры  PDEVICE_OBJECT выделенной нам Диспетчером I/O */
DbgPrint("DriverEntry\n");
/*регестрируем в объекте-драйвере точку выгрузки*/
DriverObject->DriverUnload = DriverUnload;
/*регестрируем в объекте-драйвере точку для расширения ( добавления ) объекта-устройства*/
DriverObject->DriverExtension->AddDevice  = AddDevice;
/*регестрируем в объекте-драйвере точку  обработки запроса IRP  от PnP*/
DriverObject->MajorFunction[ IRP_MJ_PNP] = DispatchPnp;
/*регестрируем в объекте-драйвере точку  обработки запроса IRP  от Power I/O*/
DriverObject->MajorFunction[ IRP_MJ_POWER] = DispatchPower;
/*регестрируем в объекте-драйвере точку  обработки запроса IRP  от Power  WMI*/
DriverObject->MajorFunction[ IRP_MJ_SYSTEM_CONTROL] = DispatchWmi;
/*регестрируем в объекте-драйвере точку  вызываемую при открытие драйвера*/
DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
/*регестрируем в объекте-драйвере точку  вызываемую при закрытие драйвера*/
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
/*возвращаем Диспетчеру I/O код о успешной инициализации объекта-драйвера,*/
/*другими словами возвращаем управдение  */
return STATUS_SUCCESS;
}
Хочу просто помигать светодиодами клавиатуры.

Добавлено через 9 минут
Ещё бывает глюк, если обращаться к структуре расширения устройства, то вылазит синий экран и при последующей установки драйвера под таким же именем приводит так же к синему экрану . В реестре эти имена не зарегистрированы , по крайней мере я их там не вижу . При установки удаётся выловить отладочные сообщения от DriverEntry и AddDevice, как и должно быть по специфике WDM , а вот при удаление ( с диспетчера устройств ) , сообщения от DriverUnload не выводятся , т.е. PnP менеджер её не вызывает, из за этого ( я так думаю ) остаётся запись в реестре и последующая установка не к чему хорошему не приводи ( синий экран ) , если после удаления с диспетчера устройств , удалить так же запись в реестре и перезагрузить , то установка проходит нормально, что может быть не так? Так же выводятся отладочные сообщения от DispatchCreate и DispatchClose при открытие и закрытие соответственно. Заранее благодарен.

Добавлено через 8 часов 0 минут
Проблема была в том , что я использовал IRP_MJ_SYSTEM_CONTROL вместо IRP_MJ_DEVICE_CONTROL. Теперь новая лажа , процессор выдаёт исключение при обращение к портам I/O - " Необработанное исключение в "0x754f97de" в "test.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000000"." Оно и понятно , т.к. драйвер выполняет поток приложения , как быть ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2013, 12:27
Ответы с готовыми решениями:

Функция DeviceIoControl
Мне нужно полное описание функции DeviceIoControl или подскажите книгу, где...

Описание API DeviceIoControl
подскажите где взять подробное описание функции DeviceIoControl (тут не далеко...

Отправка устройству информации через DeviceIoControl
Теперь пытаюсь разобраться с DeviceIoControl. В прошлой программе с помощью...

Использование функции DeviceIoControl с кодом IOCTL_SCSI_PASS_THROUGH
Всем доброго времени суток. Пытаюсь передать диску скази запрос для чтения...

Перечень констант кодов управления для DeviceIoControl
Здравствуйте ! Подскажите, пожалуйста, где я могу найти список значений...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2013, 12:27

OpenEventLog возвращает 0, GetLastError возвращает 1314 (Недостаточно прав)
Добрый день! В программе используется OpenEventLog, она возвращает нулевой...

API DeviceIoControl
В оригинальном коде с примером (рабочий код): WINBASEAPI BOOL WINAPI...

Некомпелируеца программа на DeviceIoControl
Здраствуйте, помогите пожалуйсто, нашел в нете код, а он некомпелируеца, вот...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru