dodawanie, uruchamianie uslugi, rejestr

0

Witam.
Uczę się tworzyć sterowniki.
Mam problem z testowaniem sterownika "hello world". Problem polega na tym że nie mogę go załadować. Znaczy to że nie znalazłem programu dzięki któremu mógłbym dynamicznie ładować sterownik z rozszerzeniem .sys. (znalazłem tylko programu ładujące pliki .inf).
Postanowiłem napisać loadera. Jak postanowiłem tak zrobiłem. Jednak napotkałem problemy z jego działaniem i nie potrafię sobie poradzić z jego debugowaniem.

#include <windows.h>
#include <iostream>

using namespace std;

int main()
{
	SC_HANDLE hSCM;
	hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if(!hSCM)
	{
		cout << "nie udalo sie utworzyc uchwyty do SCManagera\n";
		return 0;
	}
	else
	{
		SC_HANDLE hCreateService;
		hCreateService = CreateService(hSCM,
			"mydriver",
			"mydriver",
			SERVICE_ALL_ACCESS,
			SERVICE_KERNEL_DRIVER,
			SERVICE_DEMAND_START,
			SERVICE_ERROR_NORMAL,
			"\"c:\\mydriver.sys\"",
			NULL,
			NULL,
			NULL,
			NULL,
			NULL);
		if(!hCreateService)
		{
			CloseServiceHandle(hCreateService);
			CloseServiceHandle(hSCM);
			cout << "nie udalo sie utworzyc serwisu\n";
			return 0;
		}
		else
		{
			SC_HANDLE hOpenService;
			hOpenService = OpenService(hSCM, "mydriver", SERVICE_ALL_ACCESS);
			if(!hOpenService)
			{
				cout << "nie udalo sie otworzyc serwisu\n";
				CloseServiceHandle(hOpenService);
				CloseServiceHandle(hSCM);
				return 0;
			}
			else
			{
				cout << "udalo sie otworzyc serwis\n";
				cout << "startujemy serwis..\n";
				if(StartService(hOpenService, 0, NULL) == 0)
				{
					cout << "blad, nie udalo sie wystartowac serwisu\n";
					if(GetLastError() == ERROR_ACCESS_DENIED)
					{
						cout << "error: ERROR_ACCESS_DENIED\n";
					}
					if(GetLastError() == ERROR_INVALID_HANDLE)
					{
						cout << "error: ERROR_INVALID_HANDLE\n";
					}
					if(GetLastError() == ERROR_PATH_NOT_FOUND)
					{
						cout << "error: ERROR_PATH_NOT_FOUND\n";
					}
					if(GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
					{
						cout << "error: ERROR_SERVICE_ALREADY_RUNNING\n";
					}
					if(GetLastError() == ERROR_SERVICE_DATABASE_LOCKED)
					{
						cout << "error: ERROR_SERVICE_DATABASE_LOCKED\n";
					}
					if(GetLastError() == ERROR_SERVICE_DEPENDENCY_DELETED)
					{
						cout << "error: ERROR_SERVICE_DEPENDENCY_DELETED\n";
					}
					if(GetLastError() == ERROR_SERVICE_DEPENDENCY_FAIL)
					{
						cout << "error: ERROR_SERVICE_DEPENDENCY_FAIL\n";
					}
					if(GetLastError() == ERROR_SERVICE_DISABLED)
					{
						cout << "error: ERROR_SERVICE_DISABLED\n";
					}
					if(GetLastError() == ERROR_SERVICE_LOGON_FAILED)
					{
						cout << "error: ERROR_SERVICE_LOGON_FAILED\n";
					}
					if(GetLastError() == ERROR_SERVICE_MARKED_FOR_DELETE)
					{
						cout << "error: ERROR_SERVICE_MARKED_FOR_DELETE\n";
					}
					if(GetLastError() == ERROR_SERVICE_NO_THREAD)
					{
						cout << "error: ERROR_SERVICE_NO_THREAD\n";
					}
					if(GetLastError() == ERROR_SERVICE_REQUEST_TIMEOUT)
					{
						cout << "error: ERROR_SERVICE_REQUEST_TIMEOUT\n";
					}

					CloseServiceHandle(hOpenService);
					CloseServiceHandle(hSCM);
					return 0;
				}
				else
				{
					cout << "serwis wystartowal\n";
				}
			}
		}
	}
	return 0;
}
 

Zdaję sobie sprawę że ten kod nie jest idealny chodź by z tego względu że w momencie gdy usługa będzie już istniała w systemie, program posprząta i wyjdzie z kodem 0, przed jej uruchomieniem.(zaznaczam tylko że mam tego świadomość)
Jednak gdy usługa nie istnieje, zostaje ona dodana, otworzona jednak nie chcę wystartować. Funkcja StartService zwraca mi 0.
Pierwszy problem to właśnie sprawdzenie czemu nie zostaje uruchomiona. Jak widać w kodzie próbowałem sprawdzić wartości zwracane przez funkcje GetLastError. Nie wiem czy ten sposób który, znajduję się w kodzie ma jakiś sens, ale wydaję mi się że gdzieś widziałem taki sposób porównania.(proszę nie odsyłajcie mnie do msdn'a bym zapoznał się z ta funkcją. Próbowałem, na razie nie mogę jej pojąć, jest zbyt skomplikowana dla mnie póki co)
Po drodze napotkałem kolejny problem, związany z tworzeniem usługi.
Chodzi o to, że kiedy funkcja CreateService doda usługę do rejestru("mydriver), to nie jestem wstanie wyczyścić rejestru tak, by dodanie usługi o tej samej nazwie było możliwe. Dokładniej chodzi o to że mogę dodać(w przypadku tego kodu) usługę o nazwie innej niż "mydriver" np. "mydriver1". Oczywiście usuwałem ja ręcznie z rejestru: HKLM\system\ControlSet001(003,CurrentControlSet)\service.
Wyszukiwałem w rejestrze stringu "mydriver" jednak nie nigdzie ten string nie był znaleziony.
Stąd też pytanie, czy tworzony jest jeszcze jakiś inny klucz, który powoduję że funkcja CreateService znajduję już jakieś wpisy dotyczące "mydriver" ?(obecnie dodałem już mydriver, mydriver1, mydriver2, mydriver3 i nie mogę już z nich korzystać)
Kolejna sprawą(jako że moim celem jest sprawdzenie działania tego sterownika) jest możliwość załadowania go z lini poleceń. Istnieje taka?
Mam nadzieję że opisałem problemy dokładnie.

0
if(GetLastError() == ERROR_ACCESS_DENIED)

masakra.

const char *errormsg;
switch (GetLastError()) {
  case ERROR_ACCESS_DENIED  : errormsg = "ERROR_ACCESS_DENIED";  break;
  case ERROR_INVALID_HANDLE : errormsg = "ERROR_INVALID_HANDLE"; break;
  case ERROR_PATH_NOT_FOUND : errormsg = "ERROR_PATH_NOT_FOUND"; break;
  // etc
}
cout<<"error: "<<errormsg<<endl;
0

Poszperałem i udało mi się dojść do tego że:
-rejestr trzeba przeładować by zmiany w nim odniosły skutek...
-StartService zwraca błąd 123 czyli ERROR_INVALID_NAME. Niby wszystko jasne ale jednak ścieżka w rejestrze jest poprawna(c:\mydriver.sys). Zacząłem więc kombinować i wzorując się na innych plikach sprawdzałem wariacje z cudzysłowami, dwoma slash'ami oraz wielkościa litery dysku jednak błąd jest ciągle ten sam. Stanąłem w miejscu.
Będę bardzo wdzięczny za wszelkie pomysły.

@Azarien fajnie, chodzi o ilość operacji jakie procesor musi wykonać żeby przetrawić te moje if'y?