[pso] GetCurrentUser

Octavian Voicu octavian.voicu at gmail.com
Thu Mar 25 13:09:40 EET 2010


On Thu, Mar 25, 2010 at 9:22 AM, Alin Popescu <alinpopescu at live.com> wrote:
> Ne poate explica cineva ce intoarce aceasta functie?

Functia este definita in sci_win.h. Antentul functiei este:

static NTSTATUS GetUserOf(HANDLE pid, TOKEN_USER **user);

In primul rand functia primeste ca parametru un id de proces (pid) si
un TOKEN_USER ** (adica un pointer la un pointer) si returneaza un
status code. Intuitiv, noi trimitem functiei adresa unui pointer si
functia ne va modifica pointerul, astfel incat va indica catre o zona
de memorie alocata de functie.

Daca functia intoarce un status de succes, ne va pune la adresa user
un pointer la un token ce reprezinta utilizatorul sub care ruleaza
procesul pid.

Exemplu:

TOKEN_USER *user;
if (GetUserOf(pid, &user) != STATUS_SUCCESS) { // handle error }
...
// cleanup
ExFreePoolWithTag(user, 'ot1t');

Similar functioneaza si functia GetCurrentUser. Pentru a verifica daca
doua token-uri coincid, folositi CheckUsers (toate definite in
sci_win.h).

Si acum, sa vedem cum functioneaza mai exact functia GetUserOf
(urmariti si codul in paralel):
- deschide un handle la procesul cu acel pid, folosind ZwOpenProcess [1]
- deschide token-ul de acces al procesului folosind ZwOpenProcessToken [2]
- face un query pentru a vedea cat de mare e token-ul asociat
utilizatorului sub care ruleaza procesul respectiv, folosind
ZwQueryInformationToken [3] cu parametrul TokenUser, dar fara niciun
buffer
- aloca un buffer (acum stie cat de mare trebuie sa fie)
- face un nou query, de data asta trimitand si bufferul
- intoarce pointerul la zona alocata prin parametrul TOKEN_USER **user

Octavian

[1] http://msdn.microsoft.com/en-us/library/aa491525.aspx
[2] http://msdn.microsoft.com/en-us/library/dd851993.aspx
[3] http://msdn.microsoft.com/en-us/library/dd851972.aspx


More information about the pso mailing list