2 * Unit tests for lsa functions
4 * Copyright (c) 2006 Robert Reif
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 DEFINE_GUID(GUID_NULL
,0,0,0,0,0,0,0,0,0,0,0);
29 static HMODULE hadvapi32
;
30 static NTSTATUS (WINAPI
*pLsaClose
)(LSA_HANDLE
);
31 static NTSTATUS (WINAPI
*pLsaEnumerateAccountRights
)(LSA_HANDLE
,PSID
,PLSA_UNICODE_STRING
*,PULONG
);
32 static NTSTATUS (WINAPI
*pLsaFreeMemory
)(PVOID
);
33 static NTSTATUS (WINAPI
*pLsaOpenPolicy
)(PLSA_UNICODE_STRING
,PLSA_OBJECT_ATTRIBUTES
,ACCESS_MASK
,PLSA_HANDLE
);
34 static NTSTATUS (WINAPI
*pLsaQueryInformationPolicy
)(LSA_HANDLE
,POLICY_INFORMATION_CLASS
,PVOID
*);
35 static BOOL (WINAPI
*pConvertSidToStringSidA
)(PSID
,LPSTR
*);
36 static BOOL (WINAPI
*pConvertStringSidToSidA
)(LPCSTR
,PSID
*);
37 static NTSTATUS (WINAPI
*pLsaLookupNames2
)(LSA_HANDLE
,ULONG
,ULONG
,PLSA_UNICODE_STRING
,PLSA_REFERENCED_DOMAIN_LIST
*,PLSA_TRANSLATED_SID2
*);
38 static NTSTATUS (WINAPI
*pLsaLookupSids
)(LSA_HANDLE
,ULONG
,PSID
*,LSA_REFERENCED_DOMAIN_LIST
**,LSA_TRANSLATED_NAME
**);
39 static PVOID (WINAPI
*pFreeSid
)(PSID
);
41 static BOOL
init(void)
43 hadvapi32
= GetModuleHandleA("advapi32.dll");
45 pLsaClose
= (void*)GetProcAddress(hadvapi32
, "LsaClose");
46 pLsaEnumerateAccountRights
= (void*)GetProcAddress(hadvapi32
, "LsaEnumerateAccountRights");
47 pLsaFreeMemory
= (void*)GetProcAddress(hadvapi32
, "LsaFreeMemory");
48 pLsaOpenPolicy
= (void*)GetProcAddress(hadvapi32
, "LsaOpenPolicy");
49 pLsaQueryInformationPolicy
= (void*)GetProcAddress(hadvapi32
, "LsaQueryInformationPolicy");
50 pConvertSidToStringSidA
= (void*)GetProcAddress(hadvapi32
, "ConvertSidToStringSidA");
51 pConvertStringSidToSidA
= (void*)GetProcAddress(hadvapi32
, "ConvertStringSidToSidA");
52 pLsaLookupNames2
= (void*)GetProcAddress(hadvapi32
, "LsaLookupNames2");
53 pLsaLookupSids
= (void*)GetProcAddress(hadvapi32
, "LsaLookupSids");
54 pFreeSid
= (void*)GetProcAddress(hadvapi32
, "FreeSid");
56 if (pLsaClose
&& pLsaEnumerateAccountRights
&& pLsaFreeMemory
&& pLsaOpenPolicy
&& pLsaQueryInformationPolicy
&& pConvertSidToStringSidA
&& pConvertStringSidToSidA
&& pFreeSid
)
62 static void test_lsa(void)
64 static WCHAR machineW
[] = {'W','i','n','e','N','o','M','a','c','h','i','n','e',0};
65 LSA_UNICODE_STRING machine
;
68 LSA_OBJECT_ATTRIBUTES object_attributes
;
70 ZeroMemory(&object_attributes
, sizeof(object_attributes
));
71 object_attributes
.Length
= sizeof(object_attributes
);
73 machine
.Buffer
= machineW
;
74 machine
.Length
= sizeof(machineW
) - 2;
75 machine
.MaximumLength
= sizeof(machineW
);
77 status
= pLsaOpenPolicy( &machine
, &object_attributes
, POLICY_LOOKUP_NAMES
, &handle
);
78 ok(status
== RPC_NT_SERVER_UNAVAILABLE
,
79 "LsaOpenPolicy(POLICY_LOOKUP_NAMES) for invalid machine returned 0x%08x\n", status
);
81 status
= pLsaOpenPolicy( NULL
, &object_attributes
, POLICY_ALL_ACCESS
, &handle
);
82 ok(status
== STATUS_SUCCESS
|| status
== STATUS_ACCESS_DENIED
,
83 "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status
);
85 /* try a more restricted access mask if necessary */
86 if (status
== STATUS_ACCESS_DENIED
) {
87 trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES\n");
88 status
= pLsaOpenPolicy( NULL
, &object_attributes
, POLICY_VIEW_LOCAL_INFORMATION
|POLICY_LOOKUP_NAMES
, &handle
);
89 ok(status
== STATUS_SUCCESS
, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION|POLICY_LOOKUP_NAMES) returned 0x%08x\n", status
);
92 if (status
== STATUS_SUCCESS
) {
93 PPOLICY_AUDIT_EVENTS_INFO audit_events_info
;
94 PPOLICY_PRIMARY_DOMAIN_INFO primary_domain_info
;
95 PPOLICY_ACCOUNT_DOMAIN_INFO account_domain_info
;
96 PPOLICY_DNS_DOMAIN_INFO dns_domain_info
;
100 status
= pLsaQueryInformationPolicy(handle
, PolicyAuditEventsInformation
, (PVOID
*)&audit_events_info
);
101 if (status
== STATUS_ACCESS_DENIED
)
102 skip("Not enough rights to retrieve PolicyAuditEventsInformation\n");
104 ok(status
== STATUS_SUCCESS
, "LsaQueryInformationPolicy(PolicyAuditEventsInformation) failed, returned 0x%08x\n", status
);
105 if (status
== STATUS_SUCCESS
) {
106 pLsaFreeMemory((LPVOID
)audit_events_info
);
109 status
= pLsaQueryInformationPolicy(handle
, PolicyPrimaryDomainInformation
, (PVOID
*)&primary_domain_info
);
110 ok(status
== STATUS_SUCCESS
, "LsaQueryInformationPolicy(PolicyPrimaryDomainInformation) failed, returned 0x%08x\n", status
);
111 if (status
== STATUS_SUCCESS
) {
112 if (primary_domain_info
->Sid
) {
114 if (pConvertSidToStringSidA(primary_domain_info
->Sid
, &strsid
))
116 if (primary_domain_info
->Name
.Buffer
) {
119 len
= WideCharToMultiByte( CP_ACP
, 0, primary_domain_info
->Name
.Buffer
, -1, NULL
, 0, NULL
, NULL
);
120 name
= LocalAlloc( 0, len
);
121 WideCharToMultiByte( CP_ACP
, 0, primary_domain_info
->Name
.Buffer
, -1, name
, len
, NULL
, NULL
);
122 trace(" name: %s sid: %s\n", name
, strsid
);
125 trace(" name: NULL sid: %s\n", strsid
);
129 trace("invalid sid\n");
132 trace("Running on a standalone system.\n");
133 pLsaFreeMemory((LPVOID
)primary_domain_info
);
136 status
= pLsaQueryInformationPolicy(handle
, PolicyAccountDomainInformation
, (PVOID
*)&account_domain_info
);
137 ok(status
== STATUS_SUCCESS
, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) failed, returned 0x%08x\n", status
);
138 if (status
== STATUS_SUCCESS
) {
139 pLsaFreeMemory((LPVOID
)account_domain_info
);
142 /* This isn't supported in NT4 */
143 status
= pLsaQueryInformationPolicy(handle
, PolicyDnsDomainInformation
, (PVOID
*)&dns_domain_info
);
144 ok(status
== STATUS_SUCCESS
|| status
== STATUS_INVALID_PARAMETER
,
145 "LsaQueryInformationPolicy(PolicyDnsDomainInformation) failed, returned 0x%08x\n", status
);
146 if (status
== STATUS_SUCCESS
) {
147 if (dns_domain_info
->Sid
|| !IsEqualGUID(&dns_domain_info
->DomainGuid
, &GUID_NULL
)) {
152 LPSTR guidstr
= NULL
;
156 pConvertSidToStringSidA(dns_domain_info
->Sid
, &strsid
);
157 StringFromGUID2(&dns_domain_info
->DomainGuid
, guidstrW
, sizeof(guidstrW
)/sizeof(WCHAR
));
158 len
= WideCharToMultiByte( CP_ACP
, 0, guidstrW
, -1, NULL
, 0, NULL
, NULL
);
159 guidstr
= LocalAlloc( 0, len
);
160 WideCharToMultiByte( CP_ACP
, 0, guidstrW
, -1, guidstr
, len
, NULL
, NULL
);
161 if (dns_domain_info
->Name
.Buffer
) {
162 len
= WideCharToMultiByte( CP_ACP
, 0, dns_domain_info
->Name
.Buffer
, -1, NULL
, 0, NULL
, NULL
);
163 name
= LocalAlloc( 0, len
);
164 WideCharToMultiByte( CP_ACP
, 0, dns_domain_info
->Name
.Buffer
, -1, name
, len
, NULL
, NULL
);
166 if (dns_domain_info
->DnsDomainName
.Buffer
) {
167 len
= WideCharToMultiByte( CP_ACP
, 0, dns_domain_info
->DnsDomainName
.Buffer
, -1, NULL
, 0, NULL
, NULL
);
168 domain
= LocalAlloc( 0, len
);
169 WideCharToMultiByte( CP_ACP
, 0, dns_domain_info
->DnsDomainName
.Buffer
, -1, domain
, len
, NULL
, NULL
);
171 if (dns_domain_info
->DnsForestName
.Buffer
) {
172 len
= WideCharToMultiByte( CP_ACP
, 0, dns_domain_info
->DnsForestName
.Buffer
, -1, NULL
, 0, NULL
, NULL
);
173 forest
= LocalAlloc( 0, len
);
174 WideCharToMultiByte( CP_ACP
, 0, dns_domain_info
->DnsForestName
.Buffer
, -1, forest
, len
, NULL
, NULL
);
176 trace(" name: %s domain: %s forest: %s guid: %s sid: %s\n",
177 name
? name
: "NULL", domain
? domain
: "NULL",
178 forest
? forest
: "NULL", guidstr
, strsid
? strsid
: "NULL");
182 LocalFree( guidstr
);
186 trace("Running on a standalone system.\n");
187 pLsaFreeMemory((LPVOID
)dns_domain_info
);
190 /* We need a valid SID to pass to LsaEnumerateAccountRights */
191 ret
= OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY
, &token
);
192 ok(ret
, "Unable to obtain process token, error %u\n", GetLastError( ));
196 TOKEN_USER
*token_user
= (TOKEN_USER
*) buffer
;
197 ret
= GetTokenInformation( token
, TokenUser
, (LPVOID
) token_user
, sizeof(buffer
), &len
);
198 ok(ret
|| GetLastError( ) == ERROR_INSUFFICIENT_BUFFER
, "Unable to obtain token information, error %u\n", GetLastError( ));
199 if (! ret
&& GetLastError( ) == ERROR_INSUFFICIENT_BUFFER
) {
200 trace("Resizing buffer to %u.\n", len
);
201 token_user
= LocalAlloc( 0, len
);
202 if (token_user
!= NULL
)
203 ret
= GetTokenInformation( token
, TokenUser
, (LPVOID
) token_user
, len
, &len
);
207 PLSA_UNICODE_STRING rights
;
209 rights
= (PLSA_UNICODE_STRING
) 0xdeadbeaf;
210 rights_count
= 0xcafecafe;
211 status
= pLsaEnumerateAccountRights(handle
, token_user
->User
.Sid
, &rights
, &rights_count
);
212 ok(status
== STATUS_SUCCESS
|| status
== STATUS_OBJECT_NAME_NOT_FOUND
, "Unexpected status 0x%x\n", status
);
213 if (status
== STATUS_SUCCESS
)
214 pLsaFreeMemory( rights
);
216 ok(rights
== NULL
&& rights_count
== 0, "Expected rights and rights_count to be set to 0 on failure\n");
218 if (token_user
!= NULL
&& token_user
!= (TOKEN_USER
*) buffer
)
219 LocalFree( token_user
);
220 CloseHandle( token
);
223 status
= pLsaClose(handle
);
224 ok(status
== STATUS_SUCCESS
, "LsaClose() failed, returned 0x%08x\n", status
);
228 static void get_sid_info(PSID psid
, LPSTR
*user
, LPSTR
*dom
)
230 static char account
[257], domain
[257];
231 DWORD user_size
, dom_size
;
238 user_size
= dom_size
= 257;
239 account
[0] = domain
[0] = 0;
240 ret
= LookupAccountSidA(NULL
, psid
, account
, &user_size
, domain
, &dom_size
, &use
);
241 ok(ret
, "LookupAccountSidA failed %u\n", GetLastError());
244 static void test_LsaLookupNames2(void)
246 static const WCHAR n1
[] = {'L','O','C','A','L',' ','S','E','R','V','I','C','E'};
247 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'};
251 LSA_OBJECT_ATTRIBUTES attrs
;
252 PLSA_REFERENCED_DOMAIN_LIST domains
;
253 PLSA_TRANSLATED_SID2 sids
;
254 LSA_UNICODE_STRING name
[3];
255 LPSTR account
, sid_dom
;
257 if (!pLsaLookupNames2
)
259 win_skip("LsaLookupNames2 not available\n");
263 if ((PRIMARYLANGID(LANGIDFROMLCID(GetSystemDefaultLCID())) != LANG_ENGLISH
) ||
264 (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH
))
266 skip("Non-English locale (skipping LsaLookupNames2 tests)\n");
270 memset(&attrs
, 0, sizeof(attrs
));
271 attrs
.Length
= sizeof(attrs
);
273 status
= pLsaOpenPolicy(NULL
, &attrs
, POLICY_ALL_ACCESS
, &handle
);
274 ok(status
== STATUS_SUCCESS
|| status
== STATUS_ACCESS_DENIED
,
275 "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status
);
277 /* try a more restricted access mask if necessary */
278 if (status
== STATUS_ACCESS_DENIED
)
280 trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
281 status
= pLsaOpenPolicy(NULL
, &attrs
, POLICY_LOOKUP_NAMES
, &handle
);
282 ok(status
== STATUS_SUCCESS
, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status
);
284 if (status
!= STATUS_SUCCESS
)
286 skip("Cannot acquire policy handle\n");
290 name
[0].Buffer
= HeapAlloc(GetProcessHeap(), 0, sizeof(n1
));
291 name
[0].Length
= name
[0].MaximumLength
= sizeof(n1
);
292 memcpy(name
[0].Buffer
, n1
, sizeof(n1
));
294 name
[1].Buffer
= HeapAlloc(GetProcessHeap(), 0, sizeof(n1
));
295 name
[1].Length
= name
[1].MaximumLength
= sizeof(n1
) - sizeof(WCHAR
);
296 memcpy(name
[1].Buffer
, n1
, sizeof(n1
) - sizeof(WCHAR
));
298 name
[2].Buffer
= HeapAlloc(GetProcessHeap(), 0, sizeof(n2
));
299 name
[2].Length
= name
[2].MaximumLength
= sizeof(n2
);
300 memcpy(name
[2].Buffer
, n2
, sizeof(n2
));
302 /* account name only */
305 status
= pLsaLookupNames2(handle
, 0, 1, &name
[0], &domains
, &sids
);
306 ok(status
== STATUS_SUCCESS
, "expected STATUS_SUCCESS, got %x)\n", status
);
307 ok(sids
[0].Use
== SidTypeWellKnownGroup
, "expected SidTypeWellKnownGroup, got %u\n", sids
[0].Use
);
308 ok(sids
[0].Flags
== 0, "expected 0, got 0x%08x\n", sids
[0].Flags
);
309 ok(domains
->Entries
== 1, "expected 1, got %u\n", domains
->Entries
);
310 get_sid_info(sids
[0].Sid
, &account
, &sid_dom
);
311 ok(!strcmp(account
, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account
);
312 ok(!strcmp(sid_dom
, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom
);
313 pLsaFreeMemory(sids
);
314 pLsaFreeMemory(domains
);
316 /* unknown account name */
319 status
= pLsaLookupNames2(handle
, 0, 1, &name
[1], &domains
, &sids
);
320 ok(status
== STATUS_NONE_MAPPED
, "expected STATUS_NONE_MAPPED, got %x)\n", status
);
321 ok(sids
[0].Use
== SidTypeUnknown
, "expected SidTypeUnknown, got %u\n", sids
[0].Use
);
322 ok(sids
[0].Flags
== 0, "expected 0, got 0x%08x\n", sids
[0].Flags
);
323 ok(domains
->Entries
== 0, "expected 0, got %u\n", domains
->Entries
);
324 pLsaFreeMemory(sids
);
325 pLsaFreeMemory(domains
);
327 /* account + domain */
330 status
= pLsaLookupNames2(handle
, 0, 1, &name
[2], &domains
, &sids
);
331 ok(status
== STATUS_SUCCESS
, "expected STATUS_SUCCESS, got %x)\n", status
);
332 ok(sids
[0].Use
== SidTypeWellKnownGroup
, "expected SidTypeWellKnownGroup, got %u\n", sids
[0].Use
);
333 ok(sids
[0].Flags
== 0, "expected 0, got 0x%08x\n", sids
[0].Flags
);
334 ok(domains
->Entries
== 1, "expected 1, got %u\n", domains
->Entries
);
335 get_sid_info(sids
[0].Sid
, &account
, &sid_dom
);
336 ok(!strcmp(account
, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account
);
337 ok(!strcmp(sid_dom
, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom
);
338 pLsaFreeMemory(sids
);
339 pLsaFreeMemory(domains
);
344 status
= pLsaLookupNames2(handle
, 0, 3, name
, &domains
, &sids
);
345 ok(status
== STATUS_SOME_NOT_MAPPED
, "expected STATUS_SOME_NOT_MAPPED, got %x)\n", status
);
346 ok(sids
[0].Use
== SidTypeWellKnownGroup
, "expected SidTypeWellKnownGroup, got %u\n", sids
[0].Use
);
347 ok(sids
[1].Use
== SidTypeUnknown
, "expected SidTypeUnknown, got %u\n", sids
[1].Use
);
348 ok(sids
[2].Use
== SidTypeWellKnownGroup
, "expected SidTypeWellKnownGroup, got %u\n", sids
[2].Use
);
349 ok(sids
[0].DomainIndex
== 0, "expected 0, got %u\n", sids
[0].DomainIndex
);
350 ok(domains
->Entries
== 1, "expected 1, got %u\n", domains
->Entries
);
351 pLsaFreeMemory(sids
);
352 pLsaFreeMemory(domains
);
354 HeapFree(GetProcessHeap(), 0, name
[0].Buffer
);
355 HeapFree(GetProcessHeap(), 0, name
[1].Buffer
);
356 HeapFree(GetProcessHeap(), 0, name
[2].Buffer
);
358 status
= pLsaClose(handle
);
359 ok(status
== STATUS_SUCCESS
, "LsaClose() failed, returned 0x%08x\n", status
);
362 static void test_LsaLookupSids(void)
364 LSA_REFERENCED_DOMAIN_LIST
*list
;
365 LSA_OBJECT_ATTRIBUTES attrs
;
366 LSA_TRANSLATED_NAME
*names
;
374 memset(&attrs
, 0, sizeof(attrs
));
375 attrs
.Length
= sizeof(attrs
);
377 status
= pLsaOpenPolicy(NULL
, &attrs
, POLICY_LOOKUP_NAMES
, &policy
);
378 ok(status
== STATUS_SUCCESS
, "got 0x%08x\n", status
);
380 ret
= OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED
, &token
);
381 ok(ret
, "got %d\n", ret
);
383 ret
= GetTokenInformation(token
, TokenUser
, NULL
, 0, &size
);
384 ok(!ret
, "got %d\n", ret
);
386 user
= HeapAlloc(GetProcessHeap(), 0, size
);
387 ret
= GetTokenInformation(token
, TokenUser
, user
, size
, &size
);
388 ok(ret
, "got %d\n", ret
);
390 status
= pLsaLookupSids(policy
, 1, &user
->User
.Sid
, &list
, &names
);
391 ok(status
== STATUS_SUCCESS
, "got 0x%08x\n", status
);
393 ok(list
->Entries
> 0, "got %d\n", list
->Entries
);
396 ok((char*)list
->Domains
- (char*)list
> 0, "%p, %p\n", list
, list
->Domains
);
397 ok((char*)list
->Domains
[0].Sid
- (char*)list
->Domains
> 0, "%p, %p\n", list
->Domains
, list
->Domains
[0].Sid
);
398 ok(list
->Domains
[0].Name
.MaximumLength
> list
->Domains
[0].Name
.Length
, "got %d, %d\n", list
->Domains
[0].Name
.MaximumLength
,
399 list
->Domains
[0].Name
.Length
);
402 pLsaFreeMemory(names
);
403 pLsaFreeMemory(list
);
405 HeapFree(GetProcessHeap(), 0, user
);
409 status
= pLsaClose(policy
);
410 ok(status
== STATUS_SUCCESS
, "got 0x%08x\n", status
);
413 static void test_LsaLookupSids_NullBuffers(void)
415 LSA_REFERENCED_DOMAIN_LIST
*list
;
416 LSA_OBJECT_ATTRIBUTES attrs
;
417 LSA_TRANSLATED_NAME
*names
;
423 memset(&attrs
, 0, sizeof(attrs
));
424 attrs
.Length
= sizeof(attrs
);
426 status
= pLsaOpenPolicy(NULL
, &attrs
, POLICY_LOOKUP_NAMES
, &policy
);
427 ok(status
== STATUS_SUCCESS
, "got 0x%08x\n", status
);
429 ret
= pConvertStringSidToSidA("S-1-1-0", &sid
);
430 ok(ret
== TRUE
, "pConvertStringSidToSidA returned false\n");
432 status
= pLsaLookupSids(policy
, 1, &sid
, &list
, &names
);
433 ok(status
== STATUS_SUCCESS
, "got 0x%08x\n", status
);
435 ok(list
->Entries
> 0, "got %d\n", list
->Entries
);
439 ok((char*)list
->Domains
- (char*)list
> 0, "%p, %p\n", list
, list
->Domains
);
440 ok((char*)list
->Domains
[0].Sid
- (char*)list
->Domains
> 0, "%p, %p\n", list
->Domains
, list
->Domains
[0].Sid
);
441 ok(list
->Domains
[0].Name
.MaximumLength
> list
->Domains
[0].Name
.Length
, "got %d, %d\n", list
->Domains
[0].Name
.MaximumLength
,
442 list
->Domains
[0].Name
.Length
);
443 ok(list
->Domains
[0].Name
.Buffer
!= NULL
, "domain[0] name buffer is null\n");
446 pLsaFreeMemory(names
);
447 pLsaFreeMemory(list
);
451 status
= pLsaClose(policy
);
452 ok(status
== STATUS_SUCCESS
, "got 0x%08x\n", status
);
458 win_skip("Needed functions are not available\n");
463 test_LsaLookupNames2();
464 test_LsaLookupSids();
465 test_LsaLookupSids_NullBuffers();