[pso] [tema1]Problema GetUserOf

Octavian Rinciog octavian.rinciog at gmail.com
Thu Mar 25 22:18:44 EET 2010


> In concluzie, "eroarea" s-ar putea considera ca este in codul de
> testare; pe de alta parte, ar fi gresit sa va bazati pe acest lucru
> (ca GetUserOf returneaza eroare pentru un pid care s-a terminat), deci
> puteti privi lipsa cleanup-urilor din cod ca un mod de a impune un
> comportament corect.

De ce ar fi o eroare? Programul meu de unde stie daca numarului
12000(un numar valid), i-a fost vreodata asignat un proces?
Pe o astfel de implementare folosirea PsSetCreateProcessNotifyRoutine
duce la erori, pentru din acea functie putem doar sa vedem ce procese
se inchid si acele piduri nu mai sunt valide. Nu putem sa vedem
numerele pentru care pana in momentul curent nu le-a fost asignat un
proces.

În data de 25 martie 2010, 13:32, Octavian Voicu
<octavian.voicu at gmail.com> a scris:
> 2010/3/21 Alexandra Arcalianu <arcalianualexandra at gmail.com>:
>> Am urmatoarea problema pe Windows la ultimul apel do_stop din functia
>> test_syscall.
>> Avem secventa:
>>     do_as_guest("test start %s -1 %d", syscall, STATUS_SUCCESS);
>>     do_stop(syscall, last_child, STATUS_INVALID_PARAMETER);
>> Adica procesul curent porneste un copil ce face start la monitorizare pentru
>> apelul syscall. Parintele asteapta acest copil, cu WaitForSingleObject
>> (pi.hProcess, INFINITE), dupa care apeleaza do_stop pentru pid-ul copilului
>> care __acum__ nu mai este un pid valid.
>> La mine functia GetUserOf() imi returneaza tot STATUS_SUCCESS pentru
>> acest pid invalid si nu inteleg de ce.
>> Problema e valabila pentru orice syscall valid.
>
> Problema ar fi din codul testerului:
>
> CreateProcessAsUser(token, NULL, dummy, NULL, NULL,
>                                        FALSE, 0, NULL, NULL, &si, &pi);
> WaitForSingleObject(pi.hProcess, INFINITE);
>
> Conform documentatiei, CreateProcessAsUser [1] returneaza in structura
> LPPROCESS_INFORMATION, printre altele, doua handle-uri: unul la
> procesul creat si altul la thread-ul creat:
>
> # lpProcessInformation [out]
> #   A pointer to a PROCESS_INFORMATION structure that receives
> identification information about the new process.
> #   Handles in PROCESS_INFORMATION must be closed with CloseHandle
> when they are no longer needed.
>
> Pana nu inchidem toate handle-urile, sistemul nu va elibera resursa
> respectiva. Cum noi mai avem un handle deschis la procesul respectiv
> (pi.hProcess, deschis implicit de CreateProcessAsUser), functia
> GetUserOf (mai exact ZwOpenProcess din cadrul ei) il va putea deschide
> si nu va aparea nicio eroare.
>
> In concluzie, "eroarea" s-ar putea considera ca este in codul de
> testare; pe de alta parte, ar fi gresit sa va bazati pe acest lucru
> (ca GetUserOf returneaza eroare pentru un pid care s-a terminat), deci
> puteti privi lipsa cleanup-urilor din cod ca un mod de a impune un
> comportament corect.
>
> Ca sa verifici daca asta era cauza comportamentului aparent incorect,
> adauga dupa WaitForSingleObject clean-up corespunzator:
> CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
>
> Octavian
>
> [1] http://msdn.microsoft.com/en-us/library/ms682429(VS.85).aspx
> _______________________________________________
> pso mailing list
> pso at cursuri.cs.pub.ro
> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>



-- 
Octavian Rinciog


More information about the pso mailing list