static NTSTATUS BuildTokenInformationBuffer(PLSA_TOKEN_INFORMATION_V1 *TokenInformation, PRPC_SID AccountDomainSid, PSAMPR_USER_INFO_BUFFER UserInfo, BOOL SpecialAccount) { PLSA_TOKEN_INFORMATION_V1 Buffer = NULL; ULONG i; NTSTATUS Status = STATUS_SUCCESS; Buffer = DispatchTable.AllocateLsaHeap(sizeof(LSA_TOKEN_INFORMATION_V1)); if (Buffer == NULL) { TRACE("Failed to allocate the local buffer!\n"); Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } /* FIXME: */ Buffer->ExpirationTime.QuadPart = -1; Status = BuildTokenUser(&Buffer->User, (PSID)AccountDomainSid, UserInfo->All.UserId); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenPrimaryGroup(&Buffer->PrimaryGroup, (PSID)AccountDomainSid, UserInfo->All.PrimaryGroupId); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenGroups(&Buffer->Groups, (PSID)AccountDomainSid, UserInfo->All.UserId, SpecialAccount); if (!NT_SUCCESS(Status)) goto done; *TokenInformation = Buffer; done: if (!NT_SUCCESS(Status)) { if (Buffer != NULL) { if (Buffer->User.User.Sid != NULL) DispatchTable.FreeLsaHeap(Buffer->User.User.Sid); if (Buffer->Groups != NULL) { for (i = 0; i < Buffer->Groups->GroupCount; i++) { if (Buffer->Groups->Groups[i].Sid != NULL) DispatchTable.FreeLsaHeap(Buffer->Groups->Groups[i].Sid); } DispatchTable.FreeLsaHeap(Buffer->Groups); } if (Buffer->PrimaryGroup.PrimaryGroup != NULL) DispatchTable.FreeLsaHeap(Buffer->PrimaryGroup.PrimaryGroup); if (Buffer->DefaultDacl.DefaultDacl != NULL) DispatchTable.FreeLsaHeap(Buffer->DefaultDacl.DefaultDacl); DispatchTable.FreeLsaHeap(Buffer); } } return Status; }
static NTSTATUS BuildTokenInformationBuffer(PLSA_TOKEN_INFORMATION_V1 *TokenInformation, PRPC_SID AccountDomainSid, ULONG RelativeId, PLUID LogonId) { PLSA_TOKEN_INFORMATION_V1 Buffer = NULL; PSID OwnerSid = NULL; PSID PrimaryGroupSid = NULL; ULONG i; NTSTATUS Status = STATUS_SUCCESS; Buffer = DispatchTable.AllocateLsaHeap(sizeof(LSA_TOKEN_INFORMATION_V1)); if (Buffer == NULL) { TRACE("Failed to allocate the local buffer!\n"); Status = STATUS_INSUFFICIENT_RESOURCES; goto done; } /* FIXME: */ Buffer->ExpirationTime.QuadPart = -1; Status = BuildTokenUser(&Buffer->User, (PSID)AccountDomainSid, RelativeId); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenGroups((PSID)AccountDomainSid, LogonId, &Buffer->Groups, &PrimaryGroupSid, &OwnerSid); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenPrimaryGroup(&Buffer->PrimaryGroup, PrimaryGroupSid); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenPrivileges(&Buffer->Privileges); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenOwner(&Buffer->Owner, OwnerSid); if (!NT_SUCCESS(Status)) goto done; Status = BuildTokenDefaultDacl(&Buffer->DefaultDacl, OwnerSid); if (!NT_SUCCESS(Status)) goto done; *TokenInformation = Buffer; done: if (!NT_SUCCESS(Status)) { if (Buffer != NULL) { if (Buffer->User.User.Sid != NULL) DispatchTable.FreeLsaHeap(Buffer->User.User.Sid); if (Buffer->Groups != NULL) { for (i = 0; i < Buffer->Groups->GroupCount; i++) { if (Buffer->Groups->Groups[i].Sid != NULL) DispatchTable.FreeLsaHeap(Buffer->Groups->Groups[i].Sid); } DispatchTable.FreeLsaHeap(Buffer->Groups); } if (Buffer->PrimaryGroup.PrimaryGroup != NULL) DispatchTable.FreeLsaHeap(Buffer->PrimaryGroup.PrimaryGroup); if (Buffer->Privileges != NULL) DispatchTable.FreeLsaHeap(Buffer->Privileges); if (Buffer->Owner.Owner != NULL) DispatchTable.FreeLsaHeap(Buffer->Owner.Owner); if (Buffer->DefaultDacl.DefaultDacl != NULL) DispatchTable.FreeLsaHeap(Buffer->DefaultDacl.DefaultDacl); DispatchTable.FreeLsaHeap(Buffer); } } return Status; }