Lol, ajde kad sam vec zapoceo temu da bude u njoj nesto i korisno.. evo vam primjer koda kako radit sa drajverima, servisima:
Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[])
{
int izbor;
cout<<"Welkom tu d de_c0der drajver aplikejshn, chuz:"<<endl;
cout<<"1-za listanje drajvera/servisa"<<endl<<"2-za pokretanje drajvera/servisa"<<endl
<<"Vas izbor:"; cin>>izbor;
if (izbor==1)
{
HKEY hKey, hSubKey;
char SubkeyName[255], szValueName[16383], szValueData[200];
DWORD dwSize=255, dwValueSize=16383, dwValueDataSize=200;
DWORD dwValueType;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services", 0, KEY_READ, &hKey)!=ERROR_SUCCESS)
{ cout<<"Problem broj 1!!!!!"<<endl;
return 0; }
DWORD i=0, iSubKeyMaloDeristeDaTakoIzgledajuKratkiParametriMeniNijeDosadno=0;
while(RegEnumKeyEx(hKey, i++, SubkeyName, &dwSize, NULL, NULL, NULL, NULL)==ERROR_SUCCESS)
{
dwSize=255;
cout<<i<<".)"<<SubkeyName<<endl;
RegOpenKeyEx(hKey, SubkeyName, 0, KEY_READ, &hSubKey);
iSubKeyMaloDeristeDaTakoIzgledajuKratkiParametriMeniNijeDosadno=0;
//Idemo izlistat Value-e tako da znamo o kakavom drajveru/servisu se radi
while(RegEnumValue(hSubKey, iSubKeyMaloDeristeDaTakoIzgledajuKratkiParametriMeniNijeDosadno++,
szValueName, &dwSize, NULL, NULL, NULL, NULL)==ERROR_SUCCESS)
{
dwSize=255; //ovo smo naucili iz prosle greske :)
RegQueryValueEx(hSubKey, szValueName, 0, &dwValueType, (PBYTE)szValueData, &dwValueDataSize);
if (dwValueType==4)
{
int podatak=atoi(szValueData);
cout<<" ->"<<szValueName<<":"<<podatak<<endl;
} else cout<<" ->"<<szValueName<<":"<<szValueData<<endl;
}
}
RegCloseKey(hKey);
} else if(izbor==2) {char putanja[100]; //stack buffer overflow al koga briga
cout<<"Upisi putanju do drajvera:"<<endl;
cin>>putanja; //BO
HANDLE hSCManager;
HANDLE hService;
SERVICE_STATUS ss;
hSCManager = (SC_HANDLE)OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if(hSCManager)
{
hService = (SC_HANDLE) CreateService((SC_HANDLE) hSCManager, "Probni", "Probni primjer", SERVICE_START | DELETE | SERVICE_STOP, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE,
putanja, NULL, NULL, NULL, NULL, NULL); //putanja npr. je C:\probni.sys
if(!hService)
{
hService = (SC_HANDLE)OpenService((SC_HANDLE)hSCManager, "Probni", SERVICE_START | DELETE | SERVICE_STOP);
}
if(hService)
{
cout<<"Startamo ga.."<<endl;
StartService((SC_HANDLE)hService, 0, NULL);
printf("Pritisni enter da ga zatvorimo\r\n");
getchar();
ControlService((SC_HANDLE)hService, SERVICE_CONTROL_STOP, &ss);
CloseServiceHandle((SC_HANDLE)hService);
DeleteService((SC_HANDLE)hService);
}
CloseServiceHandle((SC_HANDLE)hSCManager);
}
} else cout<<"Nepostojeca opcija"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
U attachu imate probni drajver u slucaju da nemate skinut DDK, evo i koda:
Code:
#include <ntddk.h>
void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
DbgPrint("Drajver odlazi doma..\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = DriverUnload;
DbgPrint(*RegistryPath);
DbgPrint("Welcome to my world.. :)");
return STATUS_SUCCESS;
}
Znaci StartService preko SCM handle-a poziva DriverEntry rutinu :)
pozdrav
edit:
ako drajver ima bug i SERVICE_BOOT_START flag Start mu je postavljen onda ce komp se prebacit u LKGC (last known good configuration) a ako je vec u LKGC-u onda ce nastavit bootat pa kud puklo da puklo ukoliko ErrorControl flag nije postavljen na critical jer u tom slucaju se pojavljuje blue screen of deadth :D .. znaci ako netko zeli vidjet kako taj screen izgleda nek napise neki supalj drajver, tj. ne mora bit supalj, dovoljno da prepise odredjen dio neke bitne memorije i da se izmjeni HKLM\... LKGC settings za loadanje drajvera prilikom boota, zatim resetirajte i to bi bilo to ;D