[pso] [tema1]Problema GetUserOf

Alexandra Arcalianu arcalianualexandra at gmail.com
Thu Mar 25 22:49:38 EET 2010


Hmm, dar din cate testez vad ca la un pid ce nu este in sistem(si nici nu a
fost), GetUserOf nu mai da STATUS_SUCCESS.
Asta insemna ca testul de pid invalid e cumva partajat de GetUserOf care ar
trebui sa pice cand primeste
ca parametru un pid ce nu e in sistem(si nici nu a fost) si rutina ce se
ruleaza la terminare proces, care ar
trebui sa ne dea pidurile ce nu mai sunt in sistem(dar au fost).
E considerata valida o astfel de abordare?

În data de 25 martie 2010, 22:39, Alexandra Arcalianu <
arcalianualexandra at gmail.com> a scris:

> Ai dreptate si eu am dat de aceeasi problema.
> Adica daca implementez cu PsSetCreateProcessNotifyRoutine trec testul care
> imi pica
> dar nu mi se pare ca as putea trece in general testul de pid invalid.
> Pentru mine un pid
> pe care nu l-am vazut in rutina de notificare a terminarii unui proces este
> un pid valid
> chiar daca nu exista in sistem.
>
> Stiu ca orice implementare in afara de varianta cu
> PsSetCreateProcessNotifyRoutine a
> devenit oficial incorecta, dar eu din enunt inteleg ca folosim aceasta
> rutina cand un
> proces se termina si trebuie sa il scoatem de exemplu din lista de piduri
> monitorizate
> pentru ca nu mai are ce cauta acolo. Nu vad partea unde se specifica ca un
> pid invalid
> se verifica folosindu-ne de PsSetCreateProcessNotifyRoutine.
>
>
>
> În data de 25 martie 2010, 22:18, Octavian Rinciog <
> octavian.rinciog at gmail.com> a scris:
>
> > 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<http://msdn.microsoft.com/en-us/library/ms682429%28VS.85%29.aspx>
>> > _______________________________________________
>> > pso mailing list
>> > pso at cursuri.cs.pub.ro
>> > http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>> >
>>
>>
>>
>> --
>> Octavian Rinciog
>> _______________________________________________
>> pso mailing list
>> pso at cursuri.cs.pub.ro
>> http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/lurker/list/pso.html/attachments/20100325/f5363781/attachment.htm>


More information about the pso mailing list