int main(void) { xlibvirt_domain_t* domain; domain = build_domain(); xlibvirt_boot_domain(domain); return 0; }
/****************************************************************************** * LsaLookupSids [ADVAPI32.@] * * Looks up the names that correspond to an array of SIDs. * * PARAMS * PolicyHandle [I] Handle to a Policy object. * Count [I] Number of SIDs in the Sids array. * Sids [I] Array of SIDs to lookup. * ReferencedDomains [O] Array of domains where the sids were found. * Names [O] Array of names corresponding to Sids. * * RETURNS * Success: STATUS_SUCCESS, * STATUS_SOME_NOT_MAPPED * Failure: STATUS_NONE_MAPPED or NTSTATUS code. */ NTSTATUS WINAPI LsaLookupSids( IN LSA_HANDLE PolicyHandle, IN ULONG Count, IN PSID *Sids, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_NAME *Names ) { ULONG i, mapped, size; ULONG name_size, domain_size; SID_NAME_USE use; TRACE("(%p,%u,%p,%p,%p) stub\n", PolicyHandle, Count, Sids, ReferencedDomains, Names); size = sizeof(LSA_TRANSLATED_NAME) * Count; if (!(*Names = HeapAlloc( GetProcessHeap(), 0, size) )) return STATUS_NO_MEMORY; if (!(*ReferencedDomains = HeapAlloc( GetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST)) )) { HeapFree( GetProcessHeap(), 0, *Names); return STATUS_NO_MEMORY; } (*ReferencedDomains)->Entries = 0; (*ReferencedDomains)->Domains = NULL; mapped = 0; for (i = 0; i < Count; i++) { name_size = domain_size = 0; (*Names)[i].Use = SidTypeUnknown; (*Names)[i].DomainIndex = -1; (*Names)[i].Name.Length = 0; (*Names)[i].Name.MaximumLength = 0; (*Names)[i].Name.Buffer = NULL; if (!LookupAccountSidW(NULL, Sids[i], NULL, &name_size, NULL, &domain_size, &use) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { LSA_UNICODE_STRING domain; mapped++; if (domain_size) { domain.Length = (domain_size - 1) * sizeof(WCHAR); domain.MaximumLength = domain_size*sizeof(WCHAR); domain.Buffer = HeapAlloc(GetProcessHeap(),0,domain.MaximumLength); } else { domain.Length = 0; domain.MaximumLength = 0; domain.Buffer = NULL; } (*Names)[i].Name.Length = (name_size - 1) * sizeof(WCHAR); (*Names)[i].Name.MaximumLength = name_size * sizeof(WCHAR); (*Names)[i].Name.Buffer = HeapAlloc(GetProcessHeap(), 0, name_size * sizeof(WCHAR)); LookupAccountSidW(NULL, Sids[i], (*Names)[i].Name.Buffer, &name_size, domain.Buffer, &domain_size, &use); (*Names)[i].Use = use; if (domain_size) (*Names)[i].DomainIndex = build_domain(*ReferencedDomains, &domain); } } TRACE("mapped %u out of %u\n",mapped,Count); if (mapped == Count) return STATUS_SUCCESS; if (mapped) return STATUS_SOME_NOT_MAPPED; return STATUS_NONE_MAPPED; }
/****************************************************************************** * LsaLookupNames2 [ADVAPI32.@] * */ NTSTATUS WINAPI LsaLookupNames2( LSA_HANDLE policy, ULONG flags, ULONG count, PLSA_UNICODE_STRING names, PLSA_REFERENCED_DOMAIN_LIST *domains, PLSA_TRANSLATED_SID2 *sids ) { ULONG i, sid_size_total = 0, domain_size_max = 0, size; ULONG sid_size, domain_size, mapped; BOOL handled = FALSE; SID_NAME_USE use; SID *sid; TRACE("(%p,0x%08x,0x%08x,%p,%p,%p)\n", policy, flags, count, names, domains, sids); mapped = 0; for (i = 0; i < count; i++) { handled = FALSE; sid_size = domain_size = 0; lookup_name( &names[i], NULL, &sid_size, NULL, &domain_size, &use, &handled ); if (handled) { sid_size_total += sid_size; if (domain_size) { if (domain_size > domain_size_max) domain_size_max = domain_size; } mapped++; } } TRACE("mapped %u out of %u\n", mapped, count); size = sizeof(LSA_TRANSLATED_SID2) * count + sid_size_total; if (!(*sids = HeapAlloc( GetProcessHeap(), 0, size) )) return STATUS_NO_MEMORY; sid = (SID *)(*sids + count); if (!(*domains = HeapAlloc( GetProcessHeap(), 0, sizeof(LSA_REFERENCED_DOMAIN_LIST) ))) { HeapFree( GetProcessHeap(), 0, *sids ); return STATUS_NO_MEMORY; } (*domains)->Entries = 0; (*domains)->Domains = NULL; for (i = 0; i < count; i++) { LSA_UNICODE_STRING domain; domain.Length = domain_size_max*sizeof(WCHAR); domain.MaximumLength = domain_size_max*sizeof(WCHAR); domain.Buffer = HeapAlloc(GetProcessHeap(),0,domain.Length); (*sids)[i].Use = SidTypeUnknown; (*sids)[i].DomainIndex = -1; (*sids)[i].Flags = 0; handled = FALSE; sid_size = sid_size_total; domain_size = domain_size_max; lookup_name( &names[i], sid, &sid_size, domain.Buffer, &domain_size, &use, &handled ); if (handled) { (*sids)[i].Sid = sid; (*sids)[i].Use = use; sid += sid_size; sid_size_total -= sid_size; if (domain_size) { domain.Length = domain_size * sizeof(WCHAR); (*sids)[i].DomainIndex = build_domain(*domains, &domain); } else HeapFree(GetProcessHeap(),0,domain.Buffer); } else HeapFree(GetProcessHeap(),0,domain.Buffer); } if (mapped == count) return STATUS_SUCCESS; if (mapped > 0 && mapped < count) return STATUS_SOME_NOT_MAPPED; return STATUS_NONE_MAPPED; }