Скрытие, открытие процесса
21.02.2014, 10:40. Показов 2536. Ответов 6
Добрый вечер, написал драйвер, который скрывает и открывает процесс, ввод осуществляется по имени или по пиду. Скрывает/открывает правильно. Ошибка при нажатии символа отличного от 1 2 3.
| 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
| #include <ntddk.h>
#include "ioctl.h"
#define VER_PRODUCTBUILD 2600
#include "ntifs.h"
#include <stdlib.h>
#include <stdio.h>
PEPROCESS Process;
LIST_ENTRY * Ob[100], *buff;
LIST_ENTRY * head;
char gbuffer[1024];
char str[100][100];
int pids[100];
int k = 0;
int count = 0;
int pid;
int f,sysMark = 0;
EPROCESS *pr,*nextproc;
//*************************************************************
// макросы и глобальные переменные
#define GET_NEXT_ENTRY(type,field,p) ((type*)((char*)(p)->field.Flink-FIELD_OFFSET(type,field)))
#define GET_NEXT_PROCESS(proc) GET_NEXT_ENTRY(EPROCESS,ActiveProcessLinks,proc)
// смещение элемента двусвязного списка всех процессов в объекте процесса
#define ACTIVE_LIST_PROCESS_OFFSET 0x88
// возвращает указатель на элемент списка процессов объекта процесса
#define GET_ENTRY_PROCESS_LIST(process) (LIST_ENTRY*)((ULONG) process + ACTIVE_LIST_PROCESS_OFFSET)
#define SYM_LINK_NAME L"\\Global??\\Driver"
#define DEVICE_NAME L"\\Device\\DDriver"
UNICODE_STRING DevName;
UNICODE_STRING SymLinkName;
char *glWriteBuffer;
ULONG glSizeWriteBuffer;
//*************************************************************
// предварительное объявление функций
void HideProcess(int pid,char* nameproc);
char* ShowProcessListText();
void UnhideProcess(int pid,char* nameproc);
extern NTSTATUS PsLookupProcessByProcessId (HANDLE ProcessId, PEPROCESS *Process);
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath);
VOID DriverUnload (IN PDRIVER_OBJECT DriverObject);
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp);
NTSTATUS DispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp);
NTSTATUS DispatchControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp);
NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status,ULONG Info);
//*************************************************************
// описание функций
// функция инициализации драйвера
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){
PDEVICE_OBJECT DeviceObject; // указатель на объект устройство
NTSTATUS status = STATUS_SUCCESS; // статус завершения функции
DriverObject->MajorFunction [IRP_MJ_CREATE ] = DispatchCreate;
DriverObject->MajorFunction [IRP_MJ_CLOSE ] = DispatchClose;
DriverObject->MajorFunction [IRP_MJ_DEVICE_CONTROL] = DispatchControl;
DriverObject->DriverUnload = DriverUnload;
pr = PsGetCurrentProcess();
PsLookupProcessByProcessId(pr->UniqueProcessId,&Process);
buff = GET_ENTRY_PROCESS_LIST(Process);
head = buff->Blink;
nextproc = GET_NEXT_PROCESS(pr);
#if DBG
DbgPrint("Load driver %wZ",&DriverObject->DriverName);
#endif
RtlInitUnicodeString(&DevName, DEVICE_NAME);
RtlInitUnicodeString(&SymLinkName, SYM_LINK_NAME);
// создание устройства
status = IoCreateDevice(DriverObject, // указатель на объект драйвера
0, // размер области дополнительной памяти устройства
&DevName, // имя устройства
FILE_DEVICE_UNKNOWN, // идентификатор типа устройства
0, // дополнительная информация об устройстве
FALSE, // без эксклюзивного доступа
&DeviceObject); // адрес для сохранения указателя на объект устройства
if(!NT_SUCCESS(status))
return status;
#if DBG
DbgPrint("Create device %ws",DEVICE_NAME);
#endif
// создание символьной ссылки
status = IoCreateSymbolicLink(&SymLinkName, &DevName);
if (!NT_SUCCESS(status)){
IoDeleteDevice(DeviceObject);
return status;
}
#if DBG
DbgPrint("Create symbolic link %ws",SYM_LINK_NAME);
#endif
return status;
}
//----------------------------------------
// функция выгрузки драйвера
VOID DriverUnload (IN PDRIVER_OBJECT DriverObject){
for(f=0;f<count;f++){
if(pids[f]!=0)
UnhideProcess(pids[f],"");
}
// удаление символьной ссылки и объекта устройства
IoDeleteSymbolicLink(&SymLinkName);
IoDeleteDevice( DriverObject->DeviceObject);
if(glWriteBuffer)
ExFreePool(glWriteBuffer);
#if DBG
DbgPrint("Driver unload");
#endif
return;
}
//----------------------------------------
// функция для открытия объекта устройства
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp){
return CompleteIrp(pIrp,STATUS_SUCCESS,0); // Завершение IRP
}
//----------------------------------------
// функция для закрытия объекта устройства
NTSTATUS DispatchClose(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp){
return CompleteIrp(pIrp,STATUS_SUCCESS,0);
}
// основная функция обработки всех ioctl-запросов
NTSTATUS DispatchControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp){
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION IrpStack;
ULONG Info = 0;
ULONG inlen; // размер входного буфера
ULONG outlen; // размер выходного буфера
ULONG len;
unsigned char *in; // входной буфер
unsigned char *out; // выходной буфер
ULONG ioctl; // ioctl-код
char* buf; // вспомогательный буфер
ULONG i; // счётчик цикла
IrpStack = IoGetCurrentIrpStackLocation(pIrp);
// получаем ioctl-код
ioctl = IrpStack->Parameters.DeviceIoControl.IoControlCode;
// размер входного буфера
inlen = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
// размер выходного буфера
outlen = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
// проверяем тип ввода/вывода, ассоциированный с ioctl-кодом
if( (ioctl & 0x00000003) == METHOD_BUFFERED ){
// если буферизованный
// то системный буфер является и входным и выходным
out = in = pIrp->AssociatedIrp.SystemBuffer;
}
else{
// иначе получаем указатели из соответствующих полей IPR
in = IrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
out = pIrp->UserBuffer;
}
switch(ioctl){
case READ_IOCTL:
if(glWriteBuffer)
ExFreePool(glWriteBuffer);
glWriteBuffer = (char*) ExAllocatePool(PagedPool,50);
if(glWriteBuffer){
EPROCESS *proc,*cur;
int z =0;
char name[17],buffer[100],pidchar[20];
if(sysMark==0)
proc = pr;
else
proc = nextproc;
cur = proc;
do{
PsLookupProcessByProcessId(cur->UniqueProcessId,&Process);
ObDereferenceObject(Process);
buff = GET_ENTRY_PROCESS_LIST(Process);
RtlCopyMemory(name,cur->ImageFileName,16);
pid = cur->UniqueProcessId;
name[16] = 0;
if(sysMark==0){
strncpy(buffer, name, 16);
strcat(buffer, " ");
sprintf(pidchar,"%d",pid);
strcat(buffer, pidchar);
strcat(buffer, "\n");
strcat(gbuffer, buffer);
} else {
if(pid!=4){
strncpy(buffer, name, 16);
strcat(buffer, " ");
sprintf(pidchar,"%d",pid);
strcat(buffer, pidchar);
strcat(buffer, "\n");
strcat(gbuffer, buffer);
}
}
if(buff->Flink==head)
break;
cur = GET_NEXT_PROCESS(cur);
} while(cur != proc);
strcat(gbuffer,"----------------------------------------\n");
for(f=0;f<count;f++){
if(pids[f]!=0){
strcat(gbuffer,str[f]);
strcat(gbuffer, " ");
sprintf(pidchar,"%d",pids[f]);
strcat(gbuffer, pidchar);
strcat(gbuffer,"\n");
}
}
len = strlen(gbuffer);
RtlCopyMemory(out,gbuffer,len);
Info = len;
memset(gbuffer,0,1024);
}
break;
case WRITE_IOCTL:
// выделяем память
if(glWriteBuffer)
ExFreePool(glWriteBuffer);
glWriteBuffer = (char*) ExAllocatePool(PagedPool,inlen);
if(glWriteBuffer){
RtlCopyMemory(glWriteBuffer,in,inlen);
if(atoi(in)!=0){
HideProcess(atoi(in),"");
DbgPrint("ioctl hide number %s",in);
} else {
in[inlen] = '\0';
HideProcess(-1,in);
DbgPrint("ioctl hide str %s",in);
}
glSizeWriteBuffer = inlen;
}
break;
// код инвертирования переданной строки
case TEST_IOCTL:
if(glWriteBuffer)
ExFreePool(glWriteBuffer);
glWriteBuffer = (char*) ExAllocatePool(PagedPool,inlen);
if(glWriteBuffer){
RtlCopyMemory(glWriteBuffer,in,inlen);
if(atoi(in)!=0){
DbgPrint("ioctl unhide number %s",in);
UnhideProcess(atoi(in),"");
}
else{
in[inlen] = '\0';
DbgPrint("ioctl unhide str %s",in);
UnhideProcess(-1,in);
}
glSizeWriteBuffer = inlen;
}
break;
default:
status = STATUS_INVALID_PARAMETER;
break;
}
return CompleteIrp(pIrp,status,Info);
}
//----------------------------------------
// функция завершения операции с IRP-пакетом
NTSTATUS CompleteIrp(PIRP Irp, NTSTATUS status,ULONG Info){
Irp->IoStatus.Status = status; // статус завершении операции
Irp->IoStatus.Information = Info; // количество возращаемой информации
IoCompleteRequest(Irp,IO_NO_INCREMENT); // завершение операции ввода-вывода
return status;
}
//----------------------------------------
void HideProcess(int pid,char* nameproc){
EPROCESS *proc,*cur;
DbgPrint("Hide %s:%d",nameproc,pid);
proc=pr;
cur=proc;
do{
PsLookupProcessByProcessId(cur->UniqueProcessId,&Process);
ObDereferenceObject(Process);
buff = GET_ENTRY_PROCESS_LIST(Process);
DbgPrint("H do %d:%d",cur->UniqueProcessId,pid);
if(cur->UniqueProcessId == pid || !strcmp(cur->ImageFileName, nameproc)){
DbgPrint("%d:%d",cur->ImageFileName,nameproc);
if(cur == nextproc) nextproc=GET_NEXT_PROCESS(nextproc);
if(pid != -1){
pids[count] = pid;
DbgPrint("H C pid:%d",pid);
}else{
pids[count] = cur->UniqueProcessId;
DbgPrint("H C upid:%d",cur->UniqueProcessId);
}
strcpy(str[count],&cur->ImageFileName);
Ob[count] = buff;
count++;
buff->Flink->Blink = buff->Blink;
buff->Blink->Flink = buff->Flink;
}
if(buff->Flink == head)
break;
cur = GET_NEXT_PROCESS(cur);
} while(cur != proc);
return;
}
//----------------------------------------
void UnhideProcess(int pid,char* nameproc){
EPROCESS *proc,*cur;
NTSTATUS status;
int countpid,j;
DbgPrint("Unhide %s:%d",nameproc,pid);
if(pid==4 || !strcmp(nameproc,"System")){
for(j=0;j<count;j++){
if(pids[j] == 4){
sysMark = 1;
pids[j] = 0;
head->Flink->Blink=Ob[j];
Ob[j]->Flink=head->Flink;
Ob[j]->Blink=head;
head->Flink=Ob[j];
break;
}
}
} else {
for(j=0;j<count;j++){
PsLookupProcessByProcessId(pid,&Process);
ObDereferenceObject(Process);
buff = GET_ENTRY_PROCESS_LIST(Process);
if(pids[j] == pid || !strcmp(str[j], nameproc)){
DbgPrint("Unhide2");
sysMark = 0;
pids[j]=0;
Ob[j]->Blink = head->Flink;
Ob[j]->Flink = head->Flink->Flink;
head->Flink->Flink->Blink = Ob[j];
head->Flink->Flink = Ob[j];
}
}
}
return;
}
//----------------------------------------
//---------------------------------------- |
|
Программа
| 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
| #include <windows.h>
#include <stdio.h>
#define READ_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define WRITE_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN,0x802,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define TEST_IOCTL CTL_CODE(FILE_DEVICE_UNKNOWN,0x803,METHOD_NEITHER,FILE_ANY_ACCESS)
// имя драйвера
#define DRIVER_NAME "Driver"
// файл драйвера
#define DRIVER_FILE "Driver.sys"
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef long NTSTATUS;
typedef NTSTATUS (*NT_LOAD_DRIVER)(
IN PUNICODE_STRING DriverServiceName
);
typedef NTSTATUS (*NT_UNLOAD_DRIVER)(
IN PUNICODE_STRING DriverServiceName
);
bool LoadDriver(char *driver_name,WCHAR *driver_path);
bool UnloadDriver(char *driver_name);
BOOLEAN StopDriver(char* DriverName);
BOOLEAN StartDriver(char* DriverName);
BOOLEAN RemoveDriver(char* DriverName);
bool UnloadDriver(char *driver_name);
BOOLEAN InstallDriver(char* DriverName, char* LoadPath);
int main(){
char str[1000];
char buf[1000];
char in [2048]; // входной буфер
char out [2048]; // выходной буфер
int act;
DWORD BytesReturned;
GetFullPathNameA(DRIVER_FILE,1000,buf,NULL);
if(!InstallDriver(DRIVER_NAME,buf))
return 0;
if(!StartDriver(DRIVER_NAME))
return 0;
HANDLE file = CreateFileA("\\\\.\\Driver",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
printf("1 - print process list\n2 - hide process\n3 - open process\n");
while(1){
scanf("%d",&act);
switch (act){
case 1:
if( !DeviceIoControl(file,
READ_IOCTL,
NULL,
0,
out,
2048,
&BytesReturned,
NULL) )
printf("Error read\n");
out[BytesReturned] = 0;
printf("%s\n",out);
break;
case 2:
printf("Enter pid or name for hide\n");
scanf("%s",str);
//if(atoi(str)!=0){
strcpy(in,str);
if( !DeviceIoControl(file, // описатель открытого устройства драйвера
WRITE_IOCTL, // ioctl-код
in, // входной буфер
strlen(in), // размер входного буфера
NULL, // выходной буфер
0, // размер выходного буфера
&BytesReturned, // количество возвращённых байт
NULL) )
printf("Error write\n");
//}
break;
case 3:
printf("Enter pid or name for open\n");
scanf("%s",str);
//if(atoi(str)!=0){
strcpy(in,str);
if( !DeviceIoControl(file, // описатель открытого устройства драйвера
TEST_IOCTL, // ioctl-код
in, // входной буфер
strlen(in), // размер входного буфера
NULL, // выходной буфер
0, // размер выходного буфера
&BytesReturned, // количество возвращённых байт
NULL) )
printf("Error write\n");
//}
break;
default:
CloseHandle(file);
if(!StopDriver(DRIVER_NAME))
return 0;
if(!RemoveDriver(DRIVER_NAME))
return 0;
return 1;
}
}
return 0;
}
//----------------------------------------
bool LoadDriver(char *driver_name, WCHAR *driver_path){
HKEY service_key;
HKEY driver_key;
DWORD Type = 1;
DWORD Start = 2;
DWORD ErrorControl = 1;
UNICODE_STRING unistr;
NT_LOAD_DRIVER nld;
WCHAR un_driver_name[MAX_PATH];
WCHAR *un_path = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,
"SYSTEM\\CurrentControlSet\\Services",
0,
KEY_CREATE_SUB_KEY,
&service_key)
!= ERROR_SUCCESS)
return false;
if(RegCreateKeyExA(service_key,
driver_name,
0,
NULL,
0,
KEY_SET_VALUE,
NULL,
&driver_key,
NULL)
!= ERROR_SUCCESS){
RegCloseKey(service_key);
return false;
}
// устанавливаем значения
RegSetValueExA(driver_key,"Type",0,REG_DWORD,(BYTE*)&Type,4);
RegSetValueExA(driver_key,"Start",0,REG_DWORD,(BYTE*)&Start,4);
RegSetValueExA(driver_key,"ErrorControl",0,REG_DWORD,(BYTE*)&ErrorControl,4);
RegSetValueExW(driver_key,L"ImagePath",0,REG_EXPAND_SZ,(BYTE*)driver_path,2*wcslen(driver_path)+2);
RegSetValueExA(driver_key,"DisplayName",0,REG_SZ,(BYTE*)driver_name,strlen(driver_name));
// копируем строку "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
RtlCopyMemory(un_driver_name,un_path,2*wcslen(un_path));
// добавляем имя драйвера
MultiByteToWideChar(CP_ACP,0,driver_name,strlen(driver_name) + 1,un_driver_name + wcslen(un_path),MAX_PATH);
// инициализируем структуру UNICODE_STRING
unistr.Buffer = un_driver_name;
unistr.Length = 2*wcslen(un_driver_name);
unistr.MaximumLength = 2*wcslen(un_driver_name) + 2;
printf("Load registry path %S\n",un_driver_name);
// системный вызов загрузки драйвера
nld = (NT_LOAD_DRIVER)GetProcAddress(LoadLibraryA("ntdll.dll"),"NtLoadDriver");
printf("status = %p\n\n",nld(&unistr));
//NtLoadDriver(&unistr);
RegCloseKey(driver_key);
RegCloseKey(service_key);
return true;
}
//----------------------------------------
bool UnloadDriver(char *driver_name){
UNICODE_STRING unistr;
NT_UNLOAD_DRIVER unld;
WCHAR un_driver_name[MAX_PATH];
static WCHAR *un_path = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
// копируем строку "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"
RtlCopyMemory(un_driver_name,un_path,2*wcslen(un_path));
// добавляем имя драйвера
MultiByteToWideChar(CP_ACP,0,driver_name,strlen(driver_name) + 1,un_driver_name + wcslen(un_path),MAX_PATH);
// инициализируем структуру UNICODE_STRING
unistr.Buffer = un_driver_name;
unistr.Length = 2*wcslen(un_driver_name);
unistr.MaximumLength = 2*wcslen(un_driver_name) + 2;
printf("Unload registry path %S\n",un_driver_name);
// системный вызов загрузки драйвера
unld = (NT_LOAD_DRIVER)GetProcAddress(LoadLibraryA("ntdll.dll"),"NtUnloadDriver");
printf("status = %p\n\n",unld(&unistr));
//NtUnloadDriver(&unistr);
return true;
}
//----------------------------------------
//----------------------------------------
void PrintErrorMessage(DWORD err){
char *msg;
char *conmsg;
DWORD res= FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,
err, // код ошибки
0, // идентификатор языка по-умолчанию
(LPTSTR) &msg, 0, NULL);
if(res) {
conmsg=new char[strlen(msg)+1];
CharToOemA(msg,conmsg);
printf("%s",conmsg); // вывод сообщения на экран
LocalFree(msg); // освобождение буфера с текстом сообщения
delete [] conmsg;
}
return;
}
BOOLEAN InstallDriver(char* DriverName, char* LoadPath){
SC_HANDLE SCManager;
SC_HANDLE service;
DWORD err;
// открываю менеджер служб
SCManager=OpenSCManager(0, // локальный компьютер
0, // текущая база данных сервисов
SC_MANAGER_ALL_ACCESS // права доступа
);
if(!SCManager){
PrintErrorMessage(GetLastError());
return FALSE;
}
service = CreateServiceA(SCManager, // описатель диспетчера сервисов
DriverName, // имя устанавливаемого сервиса
DriverName, // отображаемое имя устанавливаемого сервиса
SERVICE_ALL_ACCESS, // тип доступа к сервису
SERVICE_KERNEL_DRIVER, // тип сервиса
SERVICE_DEMAND_START, // параметр запуска:
SERVICE_ERROR_NORMAL, // реакция на ошибки при старте сервиса
LoadPath, // путь к исполняемому файлу
NULL,
NULL,
NULL,
NULL,
NULL
);
if(service == NULL){
err = GetLastError();
if (err == ERROR_SERVICE_EXISTS)
return TRUE;
else{
PrintErrorMessage(err);
return FALSE;
}
}
CloseServiceHandle(service);
CloseServiceHandle(SCManager);
return TRUE;
}
//----------------------------------------
BOOLEAN RemoveDriver(char* DriverName){
SC_HANDLE service;
SC_HANDLE SCManager;
SCManager=OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
if(!SCManager){
PrintErrorMessage(GetLastError());
return FALSE;
}
service = OpenServiceA(SCManager,
DriverName,
SERVICE_ALL_ACCESS
);
if (service == NULL) {
PrintErrorMessage(GetLastError());
return FALSE;
}
if(!DeleteService(service)) {
PrintErrorMessage(GetLastError());
CloseServiceHandle(service);
CloseServiceHandle(SCManager);
return FALSE;
}
CloseServiceHandle(service);
CloseServiceHandle(SCManager);
return TRUE;
}
//----------------------------------------
BOOLEAN StartDriver(char* DriverName){
SC_HANDLE service;
SC_HANDLE SCManager;
DWORD err;
SCManager=OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
if(!SCManager){
PrintErrorMessage(GetLastError());
return FALSE;
}
service = OpenServiceA(SCManager, DriverName, SERVICE_ALL_ACCESS);
if (service == NULL) {
PrintErrorMessage(GetLastError());
return FALSE;
}
if (!StartService(service, 0, NULL)) {
err = GetLastError();
if(err == ERROR_SERVICE_ALREADY_RUNNING)
return TRUE;
else{
PrintErrorMessage(GetLastError());
return FALSE;
}
}
CloseServiceHandle(service);
CloseServiceHandle(SCManager);
return TRUE;
}
//----------------------------------------
BOOLEAN StopDriver(char* DriverName){
SC_HANDLE service;
SC_HANDLE SCManager;
SERVICE_STATUS serstatus;
SCManager=OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS);
if(!SCManager){
PrintErrorMessage(GetLastError());
return FALSE;
}
service = OpenServiceA(SCManager, DriverName, SERVICE_ALL_ACCESS);
if (service == NULL) {
PrintErrorMessage(GetLastError());
return FALSE;
}
if (!ControlService(service, SERVICE_CONTROL_STOP, &serstatus)){
PrintErrorMessage(GetLastError());
CloseServiceHandle(service);
CloseServiceHandle(SCManager);
return FALSE;
}
CloseServiceHandle(service);
CloseServiceHandle(SCManager);
return TRUE;
} |
|
0
|