[4/4] advapi32: Add tests for LsaLookupNames2.
Hans Leidekker
hans at codeweavers.com
Tue Aug 4 05:23:55 CDT 2009
diff --git a/dlls/advapi32/tests/lsa.c b/dlls/advapi32/tests/lsa.c
index e69e4e1..991b06b 100644
--- a/dlls/advapi32/tests/lsa.c
+++ b/dlls/advapi32/tests/lsa.c
@@ -41,7 +41,8 @@ static NTSTATUS (WINAPI *pLsaEnumerateAccountRights)(LSA_HANDLE,PSID,PLSA_UNICOD
static NTSTATUS (WINAPI *pLsaFreeMemory)(PVOID);
static NTSTATUS (WINAPI *pLsaOpenPolicy)(PLSA_UNICODE_STRING,PLSA_OBJECT_ATTRIBUTES,ACCESS_MASK,PLSA_HANDLE);
static NTSTATUS (WINAPI *pLsaQueryInformationPolicy)(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*);
-static BOOL (WINAPI *pConvertSidToStringSidA)(PSID pSid, LPSTR *str);
+static BOOL (WINAPI *pConvertSidToStringSidA)(PSID,LPSTR*);
+static NTSTATUS (WINAPI *pLsaLookupNames2)(LSA_HANDLE,ULONG,ULONG,PLSA_UNICODE_STRING,PLSA_REFERENCED_DOMAIN_LIST*,PLSA_TRANSLATED_SID2*);
static BOOL init(void)
{
@@ -53,6 +54,7 @@ static BOOL init(void)
pLsaOpenPolicy = (void*)GetProcAddress(hadvapi32, "LsaOpenPolicy");
pLsaQueryInformationPolicy = (void*)GetProcAddress(hadvapi32, "LsaQueryInformationPolicy");
pConvertSidToStringSidA = (void*)GetProcAddress(hadvapi32, "ConvertSidToStringSidA");
+ pLsaLookupNames2 = (void*)GetProcAddress(hadvapi32, "LsaLookupNames2");
if (pLsaClose && pLsaEnumerateAccountRights && pLsaFreeMemory && pLsaOpenPolicy && pLsaQueryInformationPolicy && pConvertSidToStringSidA)
return TRUE;
@@ -216,6 +218,139 @@ static void test_lsa(void)
}
}
+static void get_sid_info(PSID psid, LPSTR *user, LPSTR *dom)
+{
+ static char account[257], domain[257];
+ DWORD user_size, dom_size;
+ SID_NAME_USE use;
+ BOOL ret;
+
+ *user = account;
+ *dom = domain;
+
+ user_size = dom_size = 257;
+ account[0] = domain[0] = 0;
+ ret = LookupAccountSidA(NULL, psid, account, &user_size, domain, &dom_size, &use);
+ ok(ret, "LookupAccountSidA failed %u\n", GetLastError());
+}
+
+static void test_LsaLookupNames2(void)
+{
+ static const WCHAR n1[] = {'L','O','C','A','L',' ','S','E','R','V','I','C','E'};
+ static const WCHAR n2[] = {'N','T',' ','A','U','T','H','O','R','I','T','Y','\\','L','o','c','a','l','S','e','r','v','i','c','e'};
+
+ NTSTATUS status;
+ LSA_HANDLE handle;
+ LSA_OBJECT_ATTRIBUTES attrs;
+ PLSA_REFERENCED_DOMAIN_LIST domains;
+ PLSA_TRANSLATED_SID2 sids;
+ LSA_UNICODE_STRING name[3];
+ LPSTR account, sid_dom;
+
+ if (!pLsaLookupNames2)
+ {
+ win_skip("LsaLookupNames2 not avaliable\n");
+ return;
+ }
+
+ if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH)
+ {
+ skip("Non-english locale (skipping LsaLookupNames2 tests)\n");
+ return;
+ }
+
+ memset(&attrs, 0, sizeof(attrs));
+ attrs.Length = sizeof(attrs);
+
+ status = pLsaOpenPolicy(NULL, &attrs, POLICY_ALL_ACCESS, &handle);
+ ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED,
+ "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status);
+
+ /* try a more restricted access mask if necessary */
+ if (status == STATUS_ACCESS_DENIED)
+ {
+ trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
+ status = pLsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &handle);
+ ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status);
+ }
+ if (status != STATUS_SUCCESS)
+ {
+ skip("Cannot acquire policy handle\n");
+ return;
+ }
+
+ name[0].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1));
+ name[0].Length = name[0].MaximumLength = sizeof(n1);
+ memcpy(name[0].Buffer, n1, sizeof(n1));
+
+ name[1].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1));
+ name[1].Length = name[1].MaximumLength = sizeof(n1) - sizeof(WCHAR);
+ memcpy(name[1].Buffer, n1, sizeof(n1) - sizeof(WCHAR));
+
+ name[2].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n2));
+ name[2].Length = name[2].MaximumLength = sizeof(n2);
+ memcpy(name[2].Buffer, n2, sizeof(n2));
+
+ /* account name only */
+ sids = NULL;
+ domains = NULL;
+ status = pLsaLookupNames2(handle, 0, 1, &name[0], &domains, &sids);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %x)\n", status);
+ ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
+ ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags);
+ todo_wine ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries);
+ get_sid_info(sids[0].Sid, &account, &sid_dom);
+ ok(!strcmp(account, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account);
+ ok(!strcmp(sid_dom, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom);
+ pLsaFreeMemory(sids);
+ pLsaFreeMemory(domains);
+
+ /* unknown account name */
+ sids = NULL;
+ domains = NULL;
+ status = pLsaLookupNames2(handle, 0, 1, &name[1], &domains, &sids);
+ ok(status == STATUS_NONE_MAPPED, "expected STATUS_NONE_MAPPED, got %x)\n", status);
+ ok(sids[0].Use == SidTypeUnknown, "expected SidTypeUnknown, got %u\n", sids[0].Use);
+ ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags);
+ ok(domains->Entries == 0, "expected 0, got %u\n", domains->Entries);
+ pLsaFreeMemory(sids);
+ pLsaFreeMemory(domains);
+
+ /* account + domain */
+ sids = NULL;
+ domains = NULL;
+ status = pLsaLookupNames2(handle, 0, 1, &name[2], &domains, &sids);
+ ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %x)\n", status);
+ ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
+ ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags);
+ todo_wine ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries);
+ get_sid_info(sids[0].Sid, &account, &sid_dom);
+ ok(!strcmp(account, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account);
+ ok(!strcmp(sid_dom, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom);
+ pLsaFreeMemory(sids);
+ pLsaFreeMemory(domains);
+
+ /* all three */
+ sids = NULL;
+ domains = NULL;
+ status = pLsaLookupNames2(handle, 0, 3, name, &domains, &sids);
+ ok(status == STATUS_SOME_NOT_MAPPED, "expected STATUS_SOME_NOT_MAPPED, got %x)\n", status);
+ ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
+ ok(sids[1].Use == SidTypeUnknown, "expected SidTypeUnknown, got %u\n", sids[0].Use);
+ ok(sids[2].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use);
+ todo_wine ok(sids[0].DomainIndex == 0, "expected 0, got %u\n", sids[0].DomainIndex);
+ todo_wine ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries);
+ pLsaFreeMemory(sids);
+ pLsaFreeMemory(domains);
+
+ HeapFree(GetProcessHeap(), 0, name[0].Buffer);
+ HeapFree(GetProcessHeap(), 0, name[1].Buffer);
+ HeapFree(GetProcessHeap(), 0, name[2].Buffer);
+
+ status = pLsaClose(handle);
+ ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status);
+}
+
START_TEST(lsa)
{
if (!init()) {
@@ -224,4 +359,5 @@ START_TEST(lsa)
}
test_lsa();
+ test_LsaLookupNames2();
}
More information about the wine-patches
mailing list