NTSTATUS GetProcessLuid( IN PETHREAD Thread OPTIONAL, IN PEPROCESS Process OPTIONAL, OUT PLUID Luid) { NTSTATUS Status; PACCESS_TOKEN Token = NULL; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; BOOLEAN CopyOnOpen, EffectiveOnly; if (Thread && Process) return STATUS_INVALID_PARAMETER; /* If nothing has been specified, use the current thread */ if (!Thread && !Process) Thread = PsGetCurrentThread(); if (Thread) { /* Use a thread token */ ASSERT(!Process); Token = PsReferenceImpersonationToken(Thread, &CopyOnOpen, &EffectiveOnly, &ImpersonationLevel); /* If we don't have a thread token, use a process token */ if (!Token) Process = PsGetThreadProcess(Thread); } if (!Token && Process) { /* Use a process token */ Token = PsReferencePrimaryToken(Process); /* If we don't have a token, fail */ if (!Token) return STATUS_NO_TOKEN; } ASSERT(Token); /* Query the LUID */ Status = SeQueryAuthenticationIdToken(Token, Luid); /* Get rid of the token and return */ ObDereferenceObject(Token); return Status; }
PEPROCESS GetEProcess() { return PsGetThreadProcess(Id); }