Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
balrak
6 / 6 / 1
Регистрация: 01.04.2012
Сообщений: 81
#1

Driver мониторинга - C++

23.06.2012, 20:03. Просмотров 770. Ответов 0
Метки нет (Все метки)

помогите разобраться с драйвером


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
#include "ntddk.h"
 
struct SYS_SERVICE_TABLE { 
    void **ServiceTable; 
    unsigned long CounterTable; 
    unsigned long ServiceLimit; 
    void **ArgumentsTable; 
}; 
 
 
 
const WCHAR devicename[]=L"\\Device\\Protector";
const WCHAR devicelink[]=L"\\DosDevices\\PROTECTOR";
 
 
KEVENT event; 
 
 
 
ULONG Index,RealCallee;
char* output;
extern struct SYS_SERVICE_TABLE* KeServiceDescriptorTable; 
 
 
//this function decides whether we should allow NtCreateSection() call to be successfull
ULONG __stdcall check(PULONG arg)
{
 
    HANDLE hand = 0 ;PFILE_OBJECT file = 0; POBJECT_HANDLE_INFORMATION info; ULONG a; char* buff;
    ANSI_STRING str; LARGE_INTEGER li; li.QuadPart = -10000;
 
//check the flags. If PAGE_EXECUTE access to the section is not requested,
//it does not make sense to be bothered about it    
if((arg[4]&0xf0)==0)return 1;
if((arg[5]&0x01000000)==0)return 1;
 
 
//get the file name via the file handle
hand = (HANDLE)arg[6];
ObReferenceObjectByHandle(hand, 0, 0, KernelMode, &file, &info);
if(!file)return 1;
RtlUnicodeStringToAnsiString(&str, &file->FileName, 1);
 
a = str.Length; 
buff = str.Buffer;
while(1)
{
    if(buff[a] == '.'){a++; break;}
    a--;
}
ObDereferenceObject(file);
 
//if it is not executable, it does not make sense to be bothered about it
//return 1
if(_stricmp(&buff[a], "exe")){RtlFreeAnsiString(&str); return 1;}
 
//now we are going to ask user's opinion. Write file name to the buffer, and wait until
//the user indicates the response (1 as a first DWORD means we can proceed)
 
//synchronize access to the buffer
KeWaitForSingleObject(&event, Executive, KernelMode, 0, 0);
 
 
// set first 2 DWORD of a buffer to zero, copy the string into the buffer, and loop
//until the user sets first DWORD to 1. The value of the second DWORD indicates user's 
//response
strcpy(&output[8], buff);
RtlFreeAnsiString(&str);
 
 
 
a = 1;
memmove(&output[0], &a, 4);
while(1)
{
KeDelayExecutionThread(KernelMode, 0, &li);
memmove(&a, &output[0], 4);
if(!a)break;
}
memmove(&a, &output[4], 4);
KeSetEvent(&event, 0, 0);
 
return a;
}
 
 
//just saves execution contect and calls check() 
_declspec(naked) Proxy()
{
 
_asm{
 
//save execution contect and calls check() -the rest depends upon the value check() returns
// if it is 1, proceed to the actual callee. Otherwise,return STATUS_ACCESS_DENIED
pushfd
pushad
mov ebx, esp
add ebx, 40
push ebx
call check
cmp eax, 1
jne block
 
//proceed to the actual callee
popad
popfd
jmp RealCallee
 
//return STATUS_ACCESS_DENIED
block:popad
mov ebx, dword ptr[esp+8]
mov dword ptr[ebx],0
mov eax, 0xC0000022L
popfd
ret 32
 
}
}
 
 
NTSTATUS DrvDispatch(IN PDEVICE_OBJECT device,IN PIRP Irp)
 
{
    UCHAR* buff = 0; ULONG a,base;
 
 
 
PIO_STACK_LOCATION loc = IoGetCurrentIrpStackLocation(Irp);
 
if(loc->Parameters.DeviceIoControl.IoControlCode == 1000)
{
buff = (UCHAR*)Irp->AssociatedIrp.SystemBuffer;
 
 
// hook service dispatch table
memmove(&Index, buff, 4);
a= 4 * Index + (ULONG)KeServiceDescriptorTable->ServiceTable;
base=(ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a), 4, 0);
a = (ULONG)&Proxy;
 
_asm
{
mov eax, base
mov ebx, dword ptr[eax]
mov RealCallee, ebx
mov ebx, a
mov dword ptr[eax], ebx
}
 
MmUnmapIoSpace(base, 4);
 
memmove(&a, &buff[4], 4);
output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a), 256, 0);
}
 
 
 
Irp->IoStatus.Status = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return 0;
}
 
 
 
// nothing special
NTSTATUS DrvCreateClose(IN PDEVICE_OBJECT device, IN PIRP Irp)
 
{
    
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return 0;
 
}
 
 
 
// nothing special -just a cleanup
void DrvUnload(IN PDRIVER_OBJECT driver)
{
UNICODE_STRING devlink;
ULONG a,base;
 
//unhook dispatch table
a = 4 * Index + (ULONG)KeServiceDescriptorTable->ServiceTable;
base = (ULONG)MmMapIoSpace(MmGetPhysicalAddress((void*)a), 4, 0);
 
_asm
{
mov eax, base
mov ebx, RealCallee
mov dword ptr[eax], ebx
}
 
MmUnmapIoSpace(base, 4);
MmUnmapIoSpace(output, 256);
 
RtlInitUnicodeString(&devlink, devicelink);
IoDeleteSymbolicLink(&devlink);
IoDeleteDevice(driver->DeviceObject);
}
 
 
//DriverEntry just creates our device - nothing special here
NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver, IN PUNICODE_STRING path)
{
 
PDEVICE_OBJECT devobject = 0;
 
UNICODE_STRING devlink, devname;
 
ULONG a, b;
 
 
 
RtlInitUnicodeString(&devname, devicename);
RtlInitUnicodeString(&devlink, devicelink);
 
IoCreateDevice(driver, 256, &devname, FILE_DEVICE_UNKNOWN, 0, TRUE, &devobject);
IoCreateSymbolicLink(&devlink, &devname);
 
 
 
driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch;
driver->MajorFunction[IRP_MJ_CREATE] = DrvCreateClose;
driver->MajorFunction[IRP_MJ_CLOSE] = DrvCreateClose;
driver->DriverUnload = DrvUnload;
KeInitializeEvent(&event, SynchronizationEvent, 1);
return 0;
}
при сборке выдает 3 warning
1>d:\protector\protector.c(41) : warning C4047: 'function' : 'POBJECT_HANDLE_INFORMATION' differs in levels of indirection from 'POBJECT_HANDLE_INFORMATION *'
1>warnings in directory d:\protector
1>d:\protector\protector.c(41) : warning C4047: 'function' : 'POBJECT_HANDLE_INFORMATION' differs in levels of indirection from 'POBJECT_HANDLE_INFORMATION *'
1>d:\protector\protector.c(41) : warning C4024: 'ObReferenceObjectByHandle' : different types for formal and actual parameter 6
1>d:\protector\protector.c(41) : warning C4024: 'ObReferenceObjectByHandle' : different types for formal and actual parameter 6
1>d:\protector\protector.c(151) : warning C4022: 'MmUnmapIoSpace' : pointer mismatch for actual parameter 1
1>d:\protector\protector.c(151) : warning C4022: 'MmUnmapIoSpace' : pointer mismatch for actual parameter 1
1>d:\protector\protector.c(197) : warning C4022: 'MmUnmapIoSpace' : pointer mismatch for actual parameter 1
1>d:\protector\protector.c(197) : warning C4022: 'MmUnmapIoSpace' : pointer mismatch for actual parameter 1

В OACR выдает

warning 28155 : The function being assigned or passed should be a DRIVER_DISPATCH function: Add the declaration 'DRIVER_DISPATCH DrvDispatch;' before the current first declaration of DrvDispatch.


warning 28169 : The dispatch function 'DrvDispatch' does not have any __drv_dispatchType annotations: This can be corrected by adding appropriate __drv_dispatchType annotations to the function. Unnecessary casts can cause this warning.


Огромное спасибо за помошь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Driver мониторинга (C++):

Программа дла мониторинга температуры CPU - C++
Здравствуйте, уважаемые программисты! "Хочу посмотреть, умеешь ли ты докапываться до истины", - сказал работодатель и задал мне такую...

Написать программу мониторинга объявлений с сайта ati.su - C++
Здравствуйте! я хочу попробовать написать программу мониторинга объявлений с сайта ati.su с внедрением antigate . Подскажите пожалуйста как...

Как написать приложение для мониторинга событий с указанием времени? - C++
Разработать приложение для мониторинга событий с указанием времени, прошедшего от начала события, и отображающего стадию завершения события...

Device driver file not found - C++
Ребят всем привет!!! Подскажите пожалуйста пытаюсь запустить через Dev C++ код программы,пишет ошибку Device driver file not...

Windows-приложение для мониторинга состояния SMART регистров жесткого диска - C++
Доброго времени суток дорогие ребята! Возможно кто-то уже сталкивался с такой задачей.Не составить ли вам труда помочь студенту. Буду...

Любая информация по NDIS Intermediate driver. - C++
Если Вы когда-нибудь занимались написанием NDIS Intermediate driver, помогите пожайлуста! Буду рад любой информации на данную тему. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2012, 20:03
Привет! Вот еще темы с ответами:

Программа мониторинга состояния охранных датчиков - C++
“Разработка программного комплекса для мониторинга энергосистемы компании”. 1. Исходные данные Охранные датчики(на движение, открытие,...

Windows Driver Kit - C++
Здравствуйте. ОС Windows 7 Максимальная 32bit. Отсюда качал Windows Driver Kit 7.1.0. Образ запускал в DAEMON Tools Lite 4.35 (работает без...

MS SQL driver type 4 ошибка: [Microsoft][SQLServer JDBC Driver]No ResultSet set was produced. - Java БД
Всем привет! Может мне кто-нибудь помочь с моей проблемой связанной с MS SQL driver type 4? Я использую для разработки проекта следующее:...

wpd file system volume driver has a driver problem - Windows 7
Добрый вечер. Выносной хард видит диск но его нельзя открыть. Пробовал встроенным фиксом, он пишет wpd file system volume driver has a...


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

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

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