[pso] PsCreateSystemThread + KeWaitForSingleObject

Mugurel Ionut Andreica pso@cursuri.cs.pub.ro
Sun, 1 May 2005 06:28:03 -0700 (PDT)


     Hm.. Se pare ca am mai multe probleme decat ma
asteptam la tema 3 pe Windows :)
     Mai am un singur "bug" acum, fara de care totul
merge OK (adica trec toate testele, insa..
comportamentul nu este cel corect..).
     Am o problema la asteptarea ca system thread-ul
creat sa se termine. Daca fac KeWaitForSingleObject pe
handle-ul catre thread-ul creat cu
PsCreateSystemThread obtin eroarea :
"IRQL_NOT_LESS_OR_EQUAL" (+ blue screen-ul atasat
erorii..).. ceea ce este destul de ciudat, avand in
vedere ca KeWaitForSingleObject este apelata la
IRQL_PASSIVE. Pentru a testa mai bine aceasta eroare
si a o izola de restul temei, am scris un driver care,
in DriverEntry apeleaza doar functia "teststuff"
scrisa mai jos.. (+ seteaza functia DriverUnload, care
nu executa nimic.. caci trebuia sa si scot driver-ul
dupa aceea..)



NTSTATUS system_thread_test(PVOID ctx)
{
	DbgPrint("!\n");
	return STATUS_SUCCESS;
}

void teststuff(void)
{
	OBJECT_ATTRIBUTES oattr;
	NTSTATUS ret;
	HANDLE sth;
	LARGE_INTEGER li;

	InitializeObjectAttributes(&oattr, NULL,
OBJ_KERNEL_HANDLE, NULL, NULL);

	ret = PsCreateSystemThread(&sth, THREAD_ALL_ACCESS,
&oattr, NULL, NULL, system_thread_test, NULL);

	if (ret != STATUS_SUCCESS)
		DbgPrint("error creating system thread!\n");
	else
	{
		li.QuadPart = -1000000000000000;

		KeWaitForSingleObject(sth, Executive, KernelMode,
FALSE, &li);

		ZwClose(sth);
	}
}



      Este OK sa fac PsCreateSystemThread din
contextul curent (numai pe Windows 2000 este nevoie sa
ruleze din contextul procesului sistem.. pe Windows XP
e bine si asa..). Si dovada ca lucuruile merg bine
este ca fara apelul lui KeWaitForSingleObject apare
"!" in Dbgview, semn ca functia dorita a fost apelata.
      Cand apelez si KeWaitForSingleObject, insa,
primesc eroare mentionata mai sus [m-am gandit si ca
poate nu trebuie sa dau ca parametru direct handle-ul
thread-ului, ci un pointer la acest handle.. adica
"&sth" in loc de "sth".. pt ca in cazul unui semafor,
parametrul dat este "&semafor".. insa, in acest caz,
iau alta eroare.. cum ca se incearca scrierea unei
zone de memorie read-only.. asa ca probabil varianta
cu "sth" este mai corecta ; de asemenea, am apelat
KeWaitForSingleObject si fara parametrul
PLARGE_INTEGER.. care este optional.. adica am pus
NULL acolo.. rezultatele sunt aceleasi].
      Eu ma gandesc ca poate nu am initializat bine
atributele system thread-ului.. caci nu i-am dar nici
un nume.. dar am mai vazut asa ceva printr-un exemplu
gasit pe Internet.. Asadar.. are cineva vreo idee
pentru care nu se obtine comportamentul dorit ? [
eventual, poate incearca cineva acest "test" si pe
propria masina virtuala.. caci poate mi-am bushit-o eu
pe a mea.. dintr-un motiv sau altul.. ] 


PS : Sarbatori fericite! :)



		
__________________________________ 
Do you Yahoo!? 
Make Yahoo! your home page 
http://www.yahoo.com/r/hs