ReactOS 0.4.17-dev-218-g5635d24
security.c
Go to the documentation of this file.
1/*
2 * Unit tests for security functions
3 *
4 * Copyright (c) 2004 Mike McCormack
5 * Copyright (c) 2011 Dmitry Timoshkov
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include <stdarg.h>
23#include <stdio.h>
24
25#include "ntstatus.h"
26#define WIN32_NO_STATUS
27#include "windef.h"
28#include "winbase.h"
29#include "winerror.h"
30#include "winternl.h"
31#include "aclapi.h"
32#include "winnt.h"
33#include "sddl.h"
34#include "ntsecapi.h"
35#include "lmcons.h"
36
37#include "wine/test.h"
38
39#ifdef __REACTOS__
40/* FIXME: Removing these hacks requires fixing our incompatible wine/test.h and wine/debug.h. */
41#ifndef wine_dbg_sprintf
42static inline const char* wine_dbg_sprintf(const char* format, ...)
43{
44 static char buffer[256];
47 vsnprintf(buffer, sizeof(buffer), format, args);
48 va_end(args);
49 return buffer;
50}
51#endif
52
55BOOL WINAPI EqualDomainSid(_In_ PSID pSid1, _In_ PSID pSid2, _Out_ BOOL* pfEqual);
56#endif
57
58#ifndef PROCESS_QUERY_LIMITED_INFORMATION
59#define PROCESS_QUERY_LIMITED_INFORMATION 0x1000
60#endif
61
62/* PROCESS_ALL_ACCESS in Vista+ PSDKs is incompatible with older Windows versions */
63#define PROCESS_ALL_ACCESS_NT4 (PROCESS_ALL_ACCESS & ~0xf000)
64#define PROCESS_ALL_ACCESS_VISTA (PROCESS_ALL_ACCESS | 0xf000)
65
66#ifndef EVENT_QUERY_STATE
67#define EVENT_QUERY_STATE 0x0001
68#endif
69
70#ifndef SEMAPHORE_QUERY_STATE
71#define SEMAPHORE_QUERY_STATE 0x0001
72#endif
73
74#ifndef THREAD_SET_LIMITED_INFORMATION
75#define THREAD_SET_LIMITED_INFORMATION 0x0400
76#define THREAD_QUERY_LIMITED_INFORMATION 0x0800
77#endif
78
79#define THREAD_ALL_ACCESS_NT4 (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3ff)
80#define THREAD_ALL_ACCESS_VISTA (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff)
81
82#define expect_eq(expr, value, type, format) { type ret_ = expr; ok((value) == ret_, #expr " expected " format " got " format "\n", (value), (ret_)); }
83
84static BOOL (WINAPI *pAddMandatoryAce)(PACL,DWORD,DWORD,DWORD,PSID);
85static VOID (WINAPI *pBuildTrusteeWithSidA)( PTRUSTEEA pTrustee, PSID pSid );
86static VOID (WINAPI *pBuildTrusteeWithNameA)( PTRUSTEEA pTrustee, LPSTR pName );
87static VOID (WINAPI *pBuildTrusteeWithObjectsAndNameA)( PTRUSTEEA pTrustee,
93static VOID (WINAPI *pBuildTrusteeWithObjectsAndSidA)( PTRUSTEEA pTrustee,
97 PSID pSid );
98static LPSTR (WINAPI *pGetTrusteeNameA)( PTRUSTEEA pTrustee );
99static DWORD (WINAPI *pRtlAdjustPrivilege)(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
102static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)(LPCWSTR,PUNICODE_STRING,PWSTR*,CURDIR*);
103
105static int myARGC;
106static char** myARGV;
107
108static const char* debugstr_sid(PSID sid)
109{
110 LPSTR sidstr;
111 DWORD le = GetLastError();
112 const char *res;
113
114 if (!ConvertSidToStringSidA(sid, &sidstr))
115 res = wine_dbg_sprintf("ConvertSidToStringSidA failed le=%lu", GetLastError());
116 else
117 {
118 res = __wine_dbg_strdup(sidstr);
119 LocalFree(sidstr);
120 }
121 /* Restore the last error in case ConvertSidToStringSidA() modified it */
122 SetLastError(le);
123 return res;
124}
125
126struct sidRef
127{
129 const char *refStr;
130};
131
132static void init(void)
133{
135
136 hntdll = GetModuleHandleA("ntdll.dll");
137 pNtAccessCheck = (void *)GetProcAddress( hntdll, "NtAccessCheck" );
138 pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(hntdll, "RtlDosPathNameToNtPathName_U");
139
140 hmod = GetModuleHandleA("advapi32.dll");
141 pAddMandatoryAce = (void *)GetProcAddress(hmod, "AddMandatoryAce");
142
144}
145
147{
148 /* use free(sd); when done */
149 DWORD ret, length, needed;
151
152 needed = 0xdeadbeef;
153 SetLastError(0xdeadbeef);
155 NULL, 0, &needed);
156 ok_(__FILE__, line)(!ret, "GetKernelObjectSecurity should fail\n");
157 ok_(__FILE__, line)(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
158 ok_(__FILE__, line)(needed != 0xdeadbeef, "GetKernelObjectSecurity should return required buffer length\n");
159
160 length = needed;
161 sd = malloc(length);
162
163 needed = 0xdeadbeef;
164 SetLastError(0xdeadbeef);
166 sd, length, &needed);
167 ok_(__FILE__, line)(ret, "GetKernelObjectSecurity error %ld\n", GetLastError());
168 ok_(__FILE__, line)(needed == length || needed == 0 /* file, pipe */, "GetKernelObjectSecurity should return %lu instead of %lu\n", length, needed);
169 return sd;
170}
171
173{
174 BOOL res;
175 SECURITY_DESCRIPTOR *queriedSD = NULL;
176 PSID owner;
177 BOOL owner_defaulted;
178
180
181 res = GetSecurityDescriptorOwner(queriedSD, &owner, &owner_defaulted);
182 ok_(__FILE__, line)(res, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
183
184#ifdef __REACTOS__
185 /* The call to EqualSid below crashes on WS03. */
187#endif
188 ok_(__FILE__, line)(EqualSid(owner, expected), "Owner SIDs are not equal %s != %s\n",
190 ok_(__FILE__, line)(!owner_defaulted, "Defaulted is true\n");
191
192 free(queriedSD);
193}
194
196{
197 BOOL res;
198 SECURITY_DESCRIPTOR *queriedSD = NULL;
199 PSID group;
200 BOOL group_defaulted;
201
203
204 res = GetSecurityDescriptorGroup(queriedSD, &group, &group_defaulted);
205 ok_(__FILE__, line)(res, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
206
207#ifdef __REACTOS__
208 /* The call to EqualSid below crashes on WS03. */
210#endif
211 ok_(__FILE__, line)(EqualSid(group, expected), "Group SIDs are not equal %s != %s\n",
213 ok_(__FILE__, line)(!group_defaulted, "Defaulted is true\n");
214
215 free(queriedSD);
216}
217
219{
220 struct sidRef refs[] = {
221 { { {0x00,0x00,0x33,0x44,0x55,0x66} }, "S-1-860116326-1" },
222 { { {0x00,0x00,0x01,0x02,0x03,0x04} }, "S-1-16909060-1" },
223 { { {0x00,0x00,0x00,0x01,0x02,0x03} }, "S-1-66051-1" },
224 { { {0x00,0x00,0x00,0x00,0x01,0x02} }, "S-1-258-1" },
225 { { {0x00,0x00,0x00,0x00,0x00,0x02} }, "S-1-2-1" },
226 { { {0x00,0x00,0x00,0x00,0x00,0x0c} }, "S-1-12-1" },
227 };
228 static const struct
229 {
230 const char *name;
231 const char *sid;
232 unsigned int optional;
233 }
234 str_to_sid_tests[] =
235 {
236 { "WD", "S-1-1-0" },
237 { "wD", "S-1-1-0" },
238 { "CO", "S-1-3-0" },
239 { "CG", "S-1-3-1" },
240 { "OW", "S-1-3-4", 1 }, /* Vista+ */
241 { "NU", "S-1-5-2" },
242 { "IU", "S-1-5-4" },
243 { "SU", "S-1-5-6" },
244 { "AN", "S-1-5-7" },
245 { "ED", "S-1-5-9" },
246 { "PS", "S-1-5-10" },
247 { "AU", "S-1-5-11" },
248 { "RC", "S-1-5-12" },
249 { "SY", "S-1-5-18" },
250 { "LS", "S-1-5-19" },
251 { "NS", "S-1-5-20" },
252 { "LA", "S-1-5-21-*-*-*-500" },
253 { "LG", "S-1-5-21-*-*-*-501" },
254 { "BO", "S-1-5-32-551" },
255 { "BA", "S-1-5-32-544" },
256 { "BU", "S-1-5-32-545" },
257 { "BG", "S-1-5-32-546" },
258 { "PU", "S-1-5-32-547" },
259 { "AO", "S-1-5-32-548" },
260 { "SO", "S-1-5-32-549" },
261 { "PO", "S-1-5-32-550" },
262 { "RE", "S-1-5-32-552" },
263 { "RU", "S-1-5-32-554" },
264 { "RD", "S-1-5-32-555" },
265 { "NO", "S-1-5-32-556" },
266 { "AC", "S-1-15-2-1", 1 }, /* Win8+ */
267 { "CA", "", 1 },
268 { "DA", "", 1 },
269 { "DC", "", 1 },
270 { "DD", "", 1 },
271 { "DG", "", 1 },
272 { "DU", "", 1 },
273 { "EA", "", 1 },
274 { "PA", "", 1 },
275 { "RS", "", 1 },
276 { "SA", "", 1 },
277#ifdef __REACTOS__
278 { "s-1-12-1", "S-1-12-1", 1 }, /* Crashes on ReactOS if not optional. ROSTESTS-418 */
279 { "S-0x1-0XC-0x1a", "S-1-12-26", 1 }, /* Crashes on ReactOS if not optional. ROSTESTS-418 */
280#else
281 { "s-1-12-1", "S-1-12-1" },
282 { "S-0x1-0XC-0x1a", "S-1-12-26" },
283#endif
284 };
285
286 const char noSubAuthStr[] = "S-1-5";
287 unsigned int i;
288 PSID psid = NULL;
289 SID *pisid;
290 BOOL r, ret;
291 LPSTR str = NULL;
292
294 ok( !r, "expected failure with NULL parameters\n" );
296 return;
298 "expected GetLastError() is ERROR_INVALID_PARAMETER, got %ld\n",
299 GetLastError() );
300
301 r = ConvertStringSidToSidA( refs[0].refStr, NULL );
303 "expected GetLastError() is ERROR_INVALID_PARAMETER, got %ld\n",
304 GetLastError() );
305
306 r = ConvertStringSidToSidA( NULL, &psid );
308 "expected GetLastError() is ERROR_INVALID_PARAMETER, got %ld\n",
309 GetLastError() );
310
311 r = ConvertStringSidToSidA( noSubAuthStr, &psid );
312 ok( !r,
313 "expected failure with no sub authorities\n" );
315 "expected GetLastError() is ERROR_INVALID_SID, got %ld\n",
316 GetLastError() );
317
318 r = ConvertStringSidToSidA( "WDandmorecharacters", &psid );
319 ok( !r,
320 "expected failure with too many characters\n" );
322 "expected GetLastError() is ERROR_INVALID_SID, got %ld\n",
323 GetLastError() );
324
325 r = ConvertStringSidToSidA( "WD)", &psid );
326 ok( !r,
327 "expected failure with too many characters\n" );
329 "expected GetLastError() is ERROR_INVALID_SID, got %ld\n",
330 GetLastError() );
331
332 ok(ConvertStringSidToSidA("S-1-5-21-93476-23408-4576", &psid), "ConvertStringSidToSidA failed\n");
333 pisid = psid;
334 ok(pisid->SubAuthorityCount == 4, "Invalid sub authority count - expected 4, got %d\n", pisid->SubAuthorityCount);
335 ok(pisid->SubAuthority[0] == 21, "Invalid subauthority 0 - expected 21, got %ld\n", pisid->SubAuthority[0]);
336 ok(pisid->SubAuthority[3] == 4576, "Invalid subauthority 0 - expected 4576, got %ld\n", pisid->SubAuthority[3]);
337 LocalFree(str);
338 LocalFree(psid);
339
340 for( i = 0; i < ARRAY_SIZE(refs); i++ )
341 {
342 r = AllocateAndInitializeSid( &refs[i].auth, 1,1,0,0,0,0,0,0,0,
343 &psid );
344 ok( r, "failed to allocate sid\n" );
345 r = ConvertSidToStringSidA( psid, &str );
346 ok( r, "failed to convert sid\n" );
347 if (r)
348 {
349 ok( !strcmp( str, refs[i].refStr ),
350 "incorrect sid, expected %s, got %s\n", refs[i].refStr, str );
351 LocalFree( str );
352 }
353 if( psid )
354 FreeSid( psid );
355
356 r = ConvertStringSidToSidA( refs[i].refStr, &psid );
357 ok( r, "failed to parse sid string\n" );
358 pisid = psid;
359 ok( pisid &&
360 !memcmp( pisid->IdentifierAuthority.Value, refs[i].auth.Value,
361 sizeof(refs[i].auth) ),
362 "string sid %s didn't parse to expected value\n"
363 "(got 0x%04x%08lx, expected 0x%04x%08lx)\n",
364 refs[i].refStr,
366 pisid->IdentifierAuthority.Value[0] ),
368 pisid->IdentifierAuthority.Value[4] ),
370 pisid->IdentifierAuthority.Value[2] ) ),
371 MAKEWORD( refs[i].auth.Value[1], refs[i].auth.Value[0] ),
372 MAKELONG( MAKEWORD( refs[i].auth.Value[5], refs[i].auth.Value[4] ),
373 MAKEWORD( refs[i].auth.Value[3], refs[i].auth.Value[2] ) ) );
374 if( psid )
375 LocalFree( psid );
376 }
377
378 for (i = 0; i < ARRAY_SIZE(str_to_sid_tests); i++)
379 {
380 char *str;
381
382 ret = ConvertStringSidToSidA(str_to_sid_tests[i].name, &psid);
383 if (!ret && str_to_sid_tests[i].optional)
384 {
385 skip("%u: failed to convert %s.\n", i, str_to_sid_tests[i].name);
386 continue;
387 }
388 ok(ret, "%u: failed to convert string to sid.\n", i);
389
390 if (str_to_sid_tests[i].optional || !strcmp(str_to_sid_tests[i].name, "LA") ||
391 !strcmp(str_to_sid_tests[i].name, "LG"))
392 {
393 LocalFree(psid);
394 continue;
395 }
396
398 ok(ret, "%u: failed to convert SID to string.\n", i);
399 ok(!strcmp(str, str_to_sid_tests[i].sid), "%u: unexpected sid %s.\n", i, str);
400 LocalFree(psid);
401 LocalFree(str);
402 }
403}
404
405static void test_trustee(void)
406{
407 GUID ObjectType = {0x12345678, 0x1234, 0x5678, {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}};
408 GUID InheritedObjectType = {0x23456789, 0x2345, 0x6786, {0x2, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}};
409 GUID ZeroGuid;
411 OBJECTS_AND_SID oas;
412 TRUSTEEA trustee;
413 PSID psid;
414 char szObjectTypeName[] = "ObjectTypeName";
415 char szInheritedObjectTypeName[] = "InheritedObjectTypeName";
416 char szTrusteeName[] = "szTrusteeName";
417 SID_IDENTIFIER_AUTHORITY auth = { {0x11,0x22,0,0,0, 0} };
418
419 memset( &ZeroGuid, 0x00, sizeof (ZeroGuid) );
420
421 pBuildTrusteeWithSidA = (void *)GetProcAddress( hmod, "BuildTrusteeWithSidA" );
422 pBuildTrusteeWithNameA = (void *)GetProcAddress( hmod, "BuildTrusteeWithNameA" );
423 pBuildTrusteeWithObjectsAndNameA = (void *)GetProcAddress (hmod, "BuildTrusteeWithObjectsAndNameA" );
424 pBuildTrusteeWithObjectsAndSidA = (void *)GetProcAddress (hmod, "BuildTrusteeWithObjectsAndSidA" );
425 pGetTrusteeNameA = (void *)GetProcAddress (hmod, "GetTrusteeNameA" );
426 if( !pBuildTrusteeWithSidA || !pBuildTrusteeWithNameA ||
427 !pBuildTrusteeWithObjectsAndNameA || !pBuildTrusteeWithObjectsAndSidA ||
428 !pGetTrusteeNameA )
429 return;
430
431 if ( ! AllocateAndInitializeSid( &auth, 1, 42, 0,0,0,0,0,0,0,&psid ) )
432 {
433 trace( "failed to init SID\n" );
434 return;
435 }
436
437 /* test BuildTrusteeWithSidA */
438 memset( &trustee, 0xff, sizeof trustee );
439 pBuildTrusteeWithSidA( &trustee, psid );
440
441 ok( trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
443 "MultipleTrusteeOperation wrong\n");
444 ok( trustee.TrusteeForm == TRUSTEE_IS_SID, "TrusteeForm wrong\n");
445 ok( trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
446 ok( trustee.ptstrName == psid, "ptstrName wrong\n" );
447
448 /* test BuildTrusteeWithObjectsAndSidA (test 1) */
449 memset( &trustee, 0xff, sizeof trustee );
450 memset( &oas, 0xff, sizeof(oas) );
451 pBuildTrusteeWithObjectsAndSidA(&trustee, &oas, &ObjectType,
452 &InheritedObjectType, psid);
453
454 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
455 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
456 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_SID, "TrusteeForm wrong\n");
457 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
458 ok(trustee.ptstrName == (LPSTR)&oas, "ptstrName wrong\n");
459
461 ok(!memcmp(&oas.ObjectTypeGuid, &ObjectType, sizeof(GUID)), "ObjectTypeGuid wrong\n");
462 ok(!memcmp(&oas.InheritedObjectTypeGuid, &InheritedObjectType, sizeof(GUID)), "InheritedObjectTypeGuid wrong\n");
463 ok(oas.pSid == psid, "pSid wrong\n");
464
465 /* test GetTrusteeNameA */
466 ok(pGetTrusteeNameA(&trustee) == (LPSTR)&oas, "GetTrusteeName returned wrong value\n");
467
468 /* test BuildTrusteeWithObjectsAndSidA (test 2) */
469 memset( &trustee, 0xff, sizeof trustee );
470 memset( &oas, 0xff, sizeof(oas) );
471 pBuildTrusteeWithObjectsAndSidA(&trustee, &oas, NULL,
472 &InheritedObjectType, psid);
473
474 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
475 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
476 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_SID, "TrusteeForm wrong\n");
477 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
478 ok(trustee.ptstrName == (LPSTR)&oas, "ptstrName wrong\n");
479
480 ok(oas.ObjectsPresent == ACE_INHERITED_OBJECT_TYPE_PRESENT, "ObjectsPresent wrong\n");
481 ok(!memcmp(&oas.ObjectTypeGuid, &ZeroGuid, sizeof(GUID)), "ObjectTypeGuid wrong\n");
482 ok(!memcmp(&oas.InheritedObjectTypeGuid, &InheritedObjectType, sizeof(GUID)), "InheritedObjectTypeGuid wrong\n");
483 ok(oas.pSid == psid, "pSid wrong\n");
484
485 FreeSid( psid );
486
487 /* test BuildTrusteeWithNameA */
488 memset( &trustee, 0xff, sizeof trustee );
489 pBuildTrusteeWithNameA( &trustee, szTrusteeName );
490
491 ok( trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
493 "MultipleTrusteeOperation wrong\n");
494 ok( trustee.TrusteeForm == TRUSTEE_IS_NAME, "TrusteeForm wrong\n");
495 ok( trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
496 ok( trustee.ptstrName == szTrusteeName, "ptstrName wrong\n" );
497
498 /* test BuildTrusteeWithObjectsAndNameA (test 1) */
499 memset( &trustee, 0xff, sizeof trustee );
500 memset( &oan, 0xff, sizeof(oan) );
501 pBuildTrusteeWithObjectsAndNameA(&trustee, &oan, SE_KERNEL_OBJECT, szObjectTypeName,
502 szInheritedObjectTypeName, szTrusteeName);
503
504 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
505 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
506 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_NAME, "TrusteeForm wrong\n");
507 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
508 ok(trustee.ptstrName == (LPSTR)&oan, "ptstrName wrong\n");
509
511 ok(oan.ObjectType == SE_KERNEL_OBJECT, "ObjectType wrong\n");
512 ok(oan.InheritedObjectTypeName == szInheritedObjectTypeName, "InheritedObjectTypeName wrong\n");
513 ok(oan.ptstrName == szTrusteeName, "szTrusteeName wrong\n");
514
515 /* test GetTrusteeNameA */
516 ok(pGetTrusteeNameA(&trustee) == (LPSTR)&oan, "GetTrusteeName returned wrong value\n");
517
518 /* test BuildTrusteeWithObjectsAndNameA (test 2) */
519 memset( &trustee, 0xff, sizeof trustee );
520 memset( &oan, 0xff, sizeof(oan) );
521 pBuildTrusteeWithObjectsAndNameA(&trustee, &oan, SE_KERNEL_OBJECT, NULL,
522 szInheritedObjectTypeName, szTrusteeName);
523
524 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
525 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
526 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_NAME, "TrusteeForm wrong\n");
527 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
528 ok(trustee.ptstrName == (LPSTR)&oan, "ptstrName wrong\n");
529
530 ok(oan.ObjectsPresent == ACE_INHERITED_OBJECT_TYPE_PRESENT, "ObjectsPresent wrong\n");
531 ok(oan.ObjectType == SE_KERNEL_OBJECT, "ObjectType wrong\n");
532 ok(oan.InheritedObjectTypeName == szInheritedObjectTypeName, "InheritedObjectTypeName wrong\n");
533 ok(oan.ptstrName == szTrusteeName, "szTrusteeName wrong\n");
534
535 /* test BuildTrusteeWithObjectsAndNameA (test 3) */
536 memset( &trustee, 0xff, sizeof trustee );
537 memset( &oan, 0xff, sizeof(oan) );
538 pBuildTrusteeWithObjectsAndNameA(&trustee, &oan, SE_KERNEL_OBJECT, szObjectTypeName,
539 NULL, szTrusteeName);
540
541 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
542 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
543 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_NAME, "TrusteeForm wrong\n");
544 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
545 ok(trustee.ptstrName == (LPSTR)&oan, "ptstrName wrong\n");
546
547 ok(oan.ObjectsPresent == ACE_OBJECT_TYPE_PRESENT, "ObjectsPresent wrong\n");
548 ok(oan.ObjectType == SE_KERNEL_OBJECT, "ObjectType wrong\n");
549 ok(oan.InheritedObjectTypeName == NULL, "InheritedObjectTypeName wrong\n");
550 ok(oan.ptstrName == szTrusteeName, "szTrusteeName wrong\n");
551}
552
553/* If the first isn't defined, assume none is */
554#ifndef SE_MIN_WELL_KNOWN_PRIVILEGE
555#define SE_MIN_WELL_KNOWN_PRIVILEGE 2L
556#define SE_CREATE_TOKEN_PRIVILEGE 2L
557#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3L
558#define SE_LOCK_MEMORY_PRIVILEGE 4L
559#define SE_INCREASE_QUOTA_PRIVILEGE 5L
560#define SE_MACHINE_ACCOUNT_PRIVILEGE 6L
561#define SE_TCB_PRIVILEGE 7L
562#define SE_SECURITY_PRIVILEGE 8L
563#define SE_TAKE_OWNERSHIP_PRIVILEGE 9L
564#define SE_LOAD_DRIVER_PRIVILEGE 10L
565#define SE_SYSTEM_PROFILE_PRIVILEGE 11L
566#define SE_SYSTEMTIME_PRIVILEGE 12L
567#define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13L
568#define SE_INC_BASE_PRIORITY_PRIVILEGE 14L
569#define SE_CREATE_PAGEFILE_PRIVILEGE 15L
570#define SE_CREATE_PERMANENT_PRIVILEGE 16L
571#define SE_BACKUP_PRIVILEGE 17L
572#define SE_RESTORE_PRIVILEGE 18L
573#define SE_SHUTDOWN_PRIVILEGE 19L
574#define SE_DEBUG_PRIVILEGE 20L
575#define SE_AUDIT_PRIVILEGE 21L
576#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22L
577#define SE_CHANGE_NOTIFY_PRIVILEGE 23L
578#define SE_REMOTE_SHUTDOWN_PRIVILEGE 24L
579#define SE_UNDOCK_PRIVILEGE 25L
580#define SE_SYNC_AGENT_PRIVILEGE 26L
581#define SE_ENABLE_DELEGATION_PRIVILEGE 27L
582#define SE_MANAGE_VOLUME_PRIVILEGE 28L
583#define SE_IMPERSONATE_PRIVILEGE 29L
584#define SE_CREATE_GLOBAL_PRIVILEGE 30L
585#define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE
586#endif /* ndef SE_MIN_WELL_KNOWN_PRIVILEGE */
587
588static void test_allocateLuid(void)
589{
590 BOOL (WINAPI *pAllocateLocallyUniqueId)(PLUID);
591 LUID luid1, luid2;
592 BOOL ret;
593
594 pAllocateLocallyUniqueId = (void*)GetProcAddress(hmod, "AllocateLocallyUniqueId");
595 if (!pAllocateLocallyUniqueId) return;
596
597 ret = pAllocateLocallyUniqueId(&luid1);
599 return;
600
601 ok(ret,
602 "AllocateLocallyUniqueId failed: %ld\n", GetLastError());
603 ret = pAllocateLocallyUniqueId(&luid2);
604 ok( ret,
605 "AllocateLocallyUniqueId failed: %ld\n", GetLastError());
606 ok(luid1.LowPart > SE_MAX_WELL_KNOWN_PRIVILEGE || luid1.HighPart != 0,
607 "AllocateLocallyUniqueId returned a well-known LUID\n");
608 ok(luid1.LowPart != luid2.LowPart || luid1.HighPart != luid2.HighPart,
609 "AllocateLocallyUniqueId returned non-unique LUIDs\n");
610 ret = pAllocateLocallyUniqueId(NULL);
612 "AllocateLocallyUniqueId(NULL) didn't return ERROR_NOACCESS: %ld\n",
613 GetLastError());
614}
615
617{
618 BOOL (WINAPI *pLookupPrivilegeNameA)(LPCSTR, PLUID, LPSTR, LPDWORD);
619 char buf[MAX_PATH]; /* arbitrary, seems long enough */
620 DWORD cchName = sizeof(buf);
621 LUID luid = { 0, 0 };
622 LONG i;
623 BOOL ret;
624
625 /* check whether it's available first */
626 pLookupPrivilegeNameA = (void*)GetProcAddress(hmod, "LookupPrivilegeNameA");
627 if (!pLookupPrivilegeNameA) return;
629 ret = pLookupPrivilegeNameA(NULL, &luid, buf, &cchName);
631 return;
632
633 /* check with a short buffer */
634 cchName = 0;
636 ret = pLookupPrivilegeNameA(NULL, &luid, NULL, &cchName);
638 "LookupPrivilegeNameA didn't fail with ERROR_INSUFFICIENT_BUFFER: %ld\n",
639 GetLastError());
640 ok(cchName == strlen("SeCreateTokenPrivilege") + 1,
641 "LookupPrivilegeNameA returned an incorrect required length for\n"
642 "SeCreateTokenPrivilege (got %ld, expected %d)\n", cchName,
643 lstrlenA("SeCreateTokenPrivilege") + 1);
644 /* check a known value and its returned length on success */
645 cchName = sizeof(buf);
646 ok(pLookupPrivilegeNameA(NULL, &luid, buf, &cchName) &&
647 cchName == strlen("SeCreateTokenPrivilege"),
648 "LookupPrivilegeNameA returned an incorrect output length for\n"
649 "SeCreateTokenPrivilege (got %ld, expected %d)\n", cchName,
650 (int)strlen("SeCreateTokenPrivilege"));
651 /* check known values */
653 {
654 luid.LowPart = i;
655 cchName = sizeof(buf);
656 ret = pLookupPrivilegeNameA(NULL, &luid, buf, &cchName);
658 "LookupPrivilegeNameA(0.%ld) failed: %ld\n", i, GetLastError());
659 }
660 /* check a bogus LUID */
661 luid.LowPart = 0xdeadbeef;
662 cchName = sizeof(buf);
663 ret = pLookupPrivilegeNameA(NULL, &luid, buf, &cchName);
665 "LookupPrivilegeNameA didn't fail with ERROR_NO_SUCH_PRIVILEGE: %ld\n",
666 GetLastError());
667 /* check on a bogus system */
669 cchName = sizeof(buf);
670 ret = pLookupPrivilegeNameA("b0gu5.Nam3", &luid, buf, &cchName);
672 GetLastError() == RPC_S_INVALID_NET_ADDR) /* w2k8 */,
673 "LookupPrivilegeNameA didn't fail with RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR: %ld\n",
674 GetLastError());
675}
676
678{
679 const char *name;
681};
682
684{
685 static const struct NameToLUID privs[] = {
686 { "SeCreateTokenPrivilege", SE_CREATE_TOKEN_PRIVILEGE },
687 { "SeAssignPrimaryTokenPrivilege", SE_ASSIGNPRIMARYTOKEN_PRIVILEGE },
688 { "SeLockMemoryPrivilege", SE_LOCK_MEMORY_PRIVILEGE },
689 { "SeIncreaseQuotaPrivilege", SE_INCREASE_QUOTA_PRIVILEGE },
690 { "SeMachineAccountPrivilege", SE_MACHINE_ACCOUNT_PRIVILEGE },
691 { "SeTcbPrivilege", SE_TCB_PRIVILEGE },
692 { "SeSecurityPrivilege", SE_SECURITY_PRIVILEGE },
693 { "SeTakeOwnershipPrivilege", SE_TAKE_OWNERSHIP_PRIVILEGE },
694 { "SeLoadDriverPrivilege", SE_LOAD_DRIVER_PRIVILEGE },
695 { "SeSystemProfilePrivilege", SE_SYSTEM_PROFILE_PRIVILEGE },
696 { "SeSystemtimePrivilege", SE_SYSTEMTIME_PRIVILEGE },
697 { "SeProfileSingleProcessPrivilege", SE_PROF_SINGLE_PROCESS_PRIVILEGE },
698 { "SeIncreaseBasePriorityPrivilege", SE_INC_BASE_PRIORITY_PRIVILEGE },
699 { "SeCreatePagefilePrivilege", SE_CREATE_PAGEFILE_PRIVILEGE },
700 { "SeCreatePermanentPrivilege", SE_CREATE_PERMANENT_PRIVILEGE },
701 { "SeBackupPrivilege", SE_BACKUP_PRIVILEGE },
702 { "SeRestorePrivilege", SE_RESTORE_PRIVILEGE },
703 { "SeShutdownPrivilege", SE_SHUTDOWN_PRIVILEGE },
704 { "SeDebugPrivilege", SE_DEBUG_PRIVILEGE },
705 { "SeAuditPrivilege", SE_AUDIT_PRIVILEGE },
706 { "SeSystemEnvironmentPrivilege", SE_SYSTEM_ENVIRONMENT_PRIVILEGE },
707 { "SeChangeNotifyPrivilege", SE_CHANGE_NOTIFY_PRIVILEGE },
708 { "SeRemoteShutdownPrivilege", SE_REMOTE_SHUTDOWN_PRIVILEGE },
709 { "SeUndockPrivilege", SE_UNDOCK_PRIVILEGE },
710 { "SeSyncAgentPrivilege", SE_SYNC_AGENT_PRIVILEGE },
711 { "SeEnableDelegationPrivilege", SE_ENABLE_DELEGATION_PRIVILEGE },
712 { "SeManageVolumePrivilege", SE_MANAGE_VOLUME_PRIVILEGE },
713 { "SeImpersonatePrivilege", SE_IMPERSONATE_PRIVILEGE },
714 { "SeCreateGlobalPrivilege", SE_CREATE_GLOBAL_PRIVILEGE },
715 };
716 BOOL (WINAPI *pLookupPrivilegeValueA)(LPCSTR, LPCSTR, PLUID);
717 unsigned int i;
718 LUID luid;
719 BOOL ret;
720
721 /* check whether it's available first */
722 pLookupPrivilegeValueA = (void*)GetProcAddress(hmod, "LookupPrivilegeValueA");
723 if (!pLookupPrivilegeValueA) return;
724 ret = pLookupPrivilegeValueA(NULL, "SeCreateTokenPrivilege", &luid);
726 return;
727
728 /* check a bogus system name */
729 ret = pLookupPrivilegeValueA("b0gu5.Nam3", "SeCreateTokenPrivilege", &luid);
731 GetLastError() == RPC_S_INVALID_NET_ADDR) /* w2k8 */,
732 "LookupPrivilegeValueA didn't fail with RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR: %ld\n",
733 GetLastError());
734 /* check a NULL string */
735 ret = pLookupPrivilegeValueA(NULL, 0, &luid);
737 "LookupPrivilegeValueA didn't fail with ERROR_NO_SUCH_PRIVILEGE: %ld\n",
738 GetLastError());
739 /* check a bogus privilege name */
740 ret = pLookupPrivilegeValueA(NULL, "SeBogusPrivilege", &luid);
742 "LookupPrivilegeValueA didn't fail with ERROR_NO_SUCH_PRIVILEGE: %ld\n",
743 GetLastError());
744 /* check case insensitive */
745 ret = pLookupPrivilegeValueA(NULL, "sEcREATEtOKENpRIVILEGE", &luid);
746 ok( ret,
747 "LookupPrivilegeValueA(NULL, sEcREATEtOKENpRIVILEGE, &luid) failed: %ld\n",
748 GetLastError());
749 for (i = 0; i < ARRAY_SIZE(privs); i++)
750 {
751 /* Not all privileges are implemented on all Windows versions, so
752 * don't worry if the call fails
753 */
754 if (pLookupPrivilegeValueA(NULL, privs[i].name, &luid))
755 {
756 ok(luid.LowPart == privs[i].lowPart,
757 "LookupPrivilegeValueA returned an invalid LUID for %s\n",
758 privs[i].name);
759 }
760 }
761}
762
763static void test_FileSecurity(void)
764{
765 char wintmpdir [MAX_PATH];
766 char path [MAX_PATH];
767 char file [MAX_PATH];
768 HANDLE fh, token;
769 DWORD sdSize, retSize, rc, granted, priv_set_len;
770 PRIVILEGE_SET priv_set;
771 BOOL status;
772 BYTE *sd;
777
778 if (!GetTempPathA (sizeof (wintmpdir), wintmpdir)) {
779 win_skip ("GetTempPathA failed\n");
780 return;
781 }
782
783 /* Create a temporary directory and in it a temporary file */
784 strcat (strcpy (path, wintmpdir), "rary");
785 SetLastError(0xdeadbeef);
786 rc = CreateDirectoryA (path, NULL);
787 ok (rc || GetLastError() == ERROR_ALREADY_EXISTS, "CreateDirectoryA "
788 "failed for '%s' with %ld\n", path, GetLastError());
789
790 strcat (strcpy (file, path), "\\ess");
791 SetLastError(0xdeadbeef);
793 ok (fh != INVALID_HANDLE_VALUE, "CreateFileA "
794 "failed for '%s' with %ld\n", file, GetLastError());
795 CloseHandle (fh);
796
797 /* For the temporary file ... */
798
799 /* Get size needed */
800 retSize = 0;
801 SetLastError(0xdeadbeef);
802 rc = GetFileSecurityA (file, request, NULL, 0, &retSize);
803 if (!rc && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) {
804 win_skip("GetFileSecurityA is not implemented\n");
805 goto cleanup;
806 }
807 ok (!rc, "GetFileSecurityA "
808 "was expected to fail for '%s'\n", file);
809 ok (GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetFileSecurityA "
810 "returned %ld; expected ERROR_INSUFFICIENT_BUFFER\n", GetLastError());
811 ok (retSize > sizeof (SECURITY_DESCRIPTOR), "GetFileSecurityA returned size %ld\n", retSize);
812
813 sdSize = retSize;
814 sd = malloc(sdSize);
815
816 /* Get security descriptor for real */
817 retSize = -1;
818 SetLastError(0xdeadbeef);
819 rc = GetFileSecurityA (file, request, sd, sdSize, &retSize);
820 ok (rc, "GetFileSecurityA "
821 "was not expected to fail '%s': %ld\n", file, GetLastError());
822 ok (retSize == sdSize,
823 "GetFileSecurityA returned size %ld; expected %ld\n", retSize, sdSize);
824
825 /* Use it to set security descriptor */
826 SetLastError(0xdeadbeef);
828 ok (rc, "SetFileSecurityA "
829 "was not expected to fail '%s': %ld\n", file, GetLastError());
830
831 free(sd);
832
833 /* Repeat for the temporary directory ... */
834
835 /* Get size needed */
836 retSize = 0;
837 SetLastError(0xdeadbeef);
838 rc = GetFileSecurityA (path, request, NULL, 0, &retSize);
839 ok (!rc, "GetFileSecurityA "
840 "was expected to fail for '%s'\n", path);
841 ok (GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetFileSecurityA "
842 "returned %ld; expected ERROR_INSUFFICIENT_BUFFER\n", GetLastError());
843 ok (retSize > sizeof (SECURITY_DESCRIPTOR), "GetFileSecurityA returned size %ld\n", retSize);
844
845 sdSize = retSize;
846 sd = malloc(sdSize);
847
848 /* Get security descriptor for real */
849 retSize = -1;
850 SetLastError(0xdeadbeef);
851 rc = GetFileSecurityA (path, request, sd, sdSize, &retSize);
852 ok (rc, "GetFileSecurityA "
853 "was not expected to fail '%s': %ld\n", path, GetLastError());
854 ok (retSize == sdSize,
855 "GetFileSecurityA returned size %ld; expected %ld\n", retSize, sdSize);
856
857 /* Use it to set security descriptor */
858 SetLastError(0xdeadbeef);
860 ok (rc, "SetFileSecurityA "
861 "was not expected to fail '%s': %ld\n", path, GetLastError());
862 free(sd);
863
864 /* Old test */
865 strcpy (wintmpdir, "\\Should not exist");
866 SetLastError(0xdeadbeef);
867 rc = GetFileSecurityA (wintmpdir, OWNER_SECURITY_INFORMATION, NULL, 0, &sdSize);
868 ok (!rc, "GetFileSecurityA should fail for not existing directories/files\n");
870 "last error ERROR_FILE_NOT_FOUND expected, got %ld\n", GetLastError());
871
872cleanup:
873 /* Remove temporary file and directory */
876
877 /* Test file access permissions for a file with FILE_ATTRIBUTE_ARCHIVE */
878 SetLastError(0xdeadbeef);
879 rc = GetTempPathA(sizeof(wintmpdir), wintmpdir);
880 ok(rc, "GetTempPath error %ld\n", GetLastError());
881
882 SetLastError(0xdeadbeef);
883 rc = GetTempFileNameA(wintmpdir, "tmp", 0, file);
884 ok(rc, "GetTempFileName error %ld\n", GetLastError());
885
888 ok(rc == FILE_ATTRIBUTE_ARCHIVE, "expected FILE_ATTRIBUTE_ARCHIVE got %#lx\n", rc);
889
891 NULL, 0, &sdSize);
892 ok(!rc, "GetFileSecurity should fail\n");
894 "expected ERROR_INSUFFICIENT_BUFFER got %ld\n", GetLastError());
895 ok(sdSize > sizeof(SECURITY_DESCRIPTOR), "got sd size %ld\n", sdSize);
896
897 sd = malloc(sdSize);
898 retSize = 0xdeadbeef;
899 SetLastError(0xdeadbeef);
901 sd, sdSize, &retSize);
902 ok(rc, "GetFileSecurity error %ld\n", GetLastError());
903 ok(retSize == sdSize, "expected %ld, got %ld\n", sdSize, retSize);
904
905 SetLastError(0xdeadbeef);
907 ok(!rc, "OpenThreadToken should fail\n");
908 ok(GetLastError() == ERROR_NO_TOKEN, "expected ERROR_NO_TOKEN, got %ld\n", GetLastError());
909
910 SetLastError(0xdeadbeef);
912 ok(rc, "ImpersonateSelf error %ld\n", GetLastError());
913
914 SetLastError(0xdeadbeef);
916 ok(rc, "OpenThreadToken error %ld\n", GetLastError());
917
918 SetLastError(0xdeadbeef);
919 rc = RevertToSelf();
920 ok(rc, "RevertToSelf error %ld\n", GetLastError());
921
922 priv_set_len = sizeof(priv_set);
923 granted = 0xdeadbeef;
924 status = 0xdeadbeef;
925 SetLastError(0xdeadbeef);
926 rc = AccessCheck(sd, token, FILE_READ_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
927 ok(rc, "AccessCheck error %ld\n", GetLastError());
928 ok(status == 1, "expected 1, got %d\n", status);
929 ok(granted == FILE_READ_DATA, "expected FILE_READ_DATA, got %#lx\n", granted);
930
931 granted = 0xdeadbeef;
932 status = 0xdeadbeef;
933 SetLastError(0xdeadbeef);
934 rc = AccessCheck(sd, token, FILE_WRITE_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
935 ok(rc, "AccessCheck error %ld\n", GetLastError());
936 ok(status == 1, "expected 1, got %d\n", status);
937 ok(granted == FILE_WRITE_DATA, "expected FILE_WRITE_DATA, got %#lx\n", granted);
938
939 granted = 0xdeadbeef;
940 status = 0xdeadbeef;
941 SetLastError(0xdeadbeef);
942 rc = AccessCheck(sd, token, FILE_EXECUTE, &mapping, &priv_set, &priv_set_len, &granted, &status);
943 ok(rc, "AccessCheck error %ld\n", GetLastError());
944 ok(status == 1, "expected 1, got %d\n", status);
945 ok(granted == FILE_EXECUTE, "expected FILE_EXECUTE, got %#lx\n", granted);
946
947 granted = 0xdeadbeef;
948 status = 0xdeadbeef;
949 SetLastError(0xdeadbeef);
950 rc = AccessCheck(sd, token, DELETE, &mapping, &priv_set, &priv_set_len, &granted, &status);
951 ok(rc, "AccessCheck error %ld\n", GetLastError());
952 ok(status == 1, "expected 1, got %d\n", status);
953 ok(granted == DELETE, "expected DELETE, got %#lx\n", granted);
954
955 granted = 0xdeadbeef;
956 status = 0xdeadbeef;
957 SetLastError(0xdeadbeef);
958 rc = AccessCheck(sd, token, FILE_DELETE_CHILD, &mapping, &priv_set, &priv_set_len, &granted, &status);
959 ok(rc, "AccessCheck error %ld\n", GetLastError());
960 ok(status == 1, "expected 1, got %d\n", status);
961 ok(granted == FILE_DELETE_CHILD, "expected FILE_DELETE_CHILD, got %#lx\n", granted);
962
963 granted = 0xdeadbeef;
964 status = 0xdeadbeef;
965 SetLastError(0xdeadbeef);
966 rc = AccessCheck(sd, token, 0x1ff, &mapping, &priv_set, &priv_set_len, &granted, &status);
967 ok(rc, "AccessCheck error %ld\n", GetLastError());
968 ok(status == 1, "expected 1, got %d\n", status);
969 ok(granted == 0x1ff, "expected 0x1ff, got %#lx\n", granted);
970
971 granted = 0xdeadbeef;
972 status = 0xdeadbeef;
973 SetLastError(0xdeadbeef);
974 rc = AccessCheck(sd, token, FILE_ALL_ACCESS, &mapping, &priv_set, &priv_set_len, &granted, &status);
975 ok(rc, "AccessCheck error %ld\n", GetLastError());
976 ok(status == 1, "expected 1, got %d\n", status);
977 ok(granted == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", granted);
978
979 SetLastError(0xdeadbeef);
980 rc = AccessCheck(sd, token, 0xffffffff, &mapping, &priv_set, &priv_set_len, &granted, &status);
981 ok(!rc, "AccessCheck should fail\n");
982 ok(GetLastError() == ERROR_GENERIC_NOT_MAPPED, "expected ERROR_GENERIC_NOT_MAPPED, got %ld\n", GetLastError());
983
984 /* Test file access permissions for a file with FILE_ATTRIBUTE_READONLY */
985 SetLastError(0xdeadbeef);
987 ok(fh != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
988 retSize = 0xdeadbeef;
989 SetLastError(0xdeadbeef);
990 rc = WriteFile(fh, "1", 1, &retSize, NULL);
991 ok(!rc, "WriteFile should fail\n");
992 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
993 ok(retSize == 0, "expected 0, got %ld\n", retSize);
994 CloseHandle(fh);
995
1000 "expected FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY got %#lx\n", rc);
1001
1002 SetLastError(0xdeadbeef);
1004 ok(rc, "SetFileAttributes error %ld\n", GetLastError());
1005 SetLastError(0xdeadbeef);
1006 rc = DeleteFileA(file);
1007 ok(rc, "DeleteFile error %ld\n", GetLastError());
1008
1009 SetLastError(0xdeadbeef);
1011 ok(fh != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
1012 retSize = 0xdeadbeef;
1013 SetLastError(0xdeadbeef);
1014 rc = WriteFile(fh, "1", 1, &retSize, NULL);
1015 ok(!rc, "WriteFile should fail\n");
1016 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
1017 ok(retSize == 0, "expected 0, got %ld\n", retSize);
1018 CloseHandle(fh);
1019
1023 "expected FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY got %#lx\n", rc);
1024
1025 retSize = 0xdeadbeef;
1026 SetLastError(0xdeadbeef);
1028 sd, sdSize, &retSize);
1029 ok(rc, "GetFileSecurity error %ld\n", GetLastError());
1030 ok(retSize == sdSize, "expected %ld, got %ld\n", sdSize, retSize);
1031
1032 priv_set_len = sizeof(priv_set);
1033 granted = 0xdeadbeef;
1034 status = 0xdeadbeef;
1035 SetLastError(0xdeadbeef);
1036 rc = AccessCheck(sd, token, FILE_READ_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
1037 ok(rc, "AccessCheck error %ld\n", GetLastError());
1038 ok(status == 1, "expected 1, got %d\n", status);
1039 ok(granted == FILE_READ_DATA, "expected FILE_READ_DATA, got %#lx\n", granted);
1040
1041 granted = 0xdeadbeef;
1042 status = 0xdeadbeef;
1043 SetLastError(0xdeadbeef);
1044 rc = AccessCheck(sd, token, FILE_WRITE_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
1045 ok(rc, "AccessCheck error %ld\n", GetLastError());
1046todo_wine {
1047 ok(status == 1, "expected 1, got %d\n", status);
1048 ok(granted == FILE_WRITE_DATA, "expected FILE_WRITE_DATA, got %#lx\n", granted);
1049}
1050 granted = 0xdeadbeef;
1051 status = 0xdeadbeef;
1052 SetLastError(0xdeadbeef);
1053 rc = AccessCheck(sd, token, FILE_EXECUTE, &mapping, &priv_set, &priv_set_len, &granted, &status);
1054 ok(rc, "AccessCheck error %ld\n", GetLastError());
1055 ok(status == 1, "expected 1, got %d\n", status);
1056 ok(granted == FILE_EXECUTE, "expected FILE_EXECUTE, got %#lx\n", granted);
1057
1058 granted = 0xdeadbeef;
1059 status = 0xdeadbeef;
1060 SetLastError(0xdeadbeef);
1061 rc = AccessCheck(sd, token, DELETE, &mapping, &priv_set, &priv_set_len, &granted, &status);
1062 ok(rc, "AccessCheck error %ld\n", GetLastError());
1063 ok(status == 1, "expected 1, got %d\n", status);
1064 ok(granted == DELETE, "expected DELETE, got %#lx\n", granted);
1065
1066 granted = 0xdeadbeef;
1067 status = 0xdeadbeef;
1068 SetLastError(0xdeadbeef);
1069 rc = AccessCheck(sd, token, WRITE_OWNER, &mapping, &priv_set, &priv_set_len, &granted, &status);
1070 ok(rc, "AccessCheck error %ld\n", GetLastError());
1071 ok(status == 1, "expected 1, got %d\n", status);
1072 ok(granted == WRITE_OWNER, "expected WRITE_OWNER, got %#lx\n", granted);
1073
1074 granted = 0xdeadbeef;
1075 status = 0xdeadbeef;
1076 SetLastError(0xdeadbeef);
1077 rc = AccessCheck(sd, token, SYNCHRONIZE, &mapping, &priv_set, &priv_set_len, &granted, &status);
1078 ok(rc, "AccessCheck error %ld\n", GetLastError());
1079 ok(status == 1, "expected 1, got %d\n", status);
1080 ok(granted == SYNCHRONIZE, "expected SYNCHRONIZE, got %#lx\n", granted);
1081
1082 granted = 0xdeadbeef;
1083 status = 0xdeadbeef;
1084 SetLastError(0xdeadbeef);
1085 rc = AccessCheck(sd, token, FILE_DELETE_CHILD, &mapping, &priv_set, &priv_set_len, &granted, &status);
1086 ok(rc, "AccessCheck error %ld\n", GetLastError());
1087todo_wine {
1088 ok(status == 1, "expected 1, got %d\n", status);
1089 ok(granted == FILE_DELETE_CHILD, "expected FILE_DELETE_CHILD, got %#lx\n", granted);
1090}
1091 granted = 0xdeadbeef;
1092 status = 0xdeadbeef;
1093 SetLastError(0xdeadbeef);
1094 rc = AccessCheck(sd, token, 0x1ff, &mapping, &priv_set, &priv_set_len, &granted, &status);
1095 ok(rc, "AccessCheck error %ld\n", GetLastError());
1096todo_wine {
1097 ok(status == 1, "expected 1, got %d\n", status);
1098 ok(granted == 0x1ff, "expected 0x1ff, got %#lx\n", granted);
1099}
1100 granted = 0xdeadbeef;
1101 status = 0xdeadbeef;
1102 SetLastError(0xdeadbeef);
1103 rc = AccessCheck(sd, token, FILE_ALL_ACCESS, &mapping, &priv_set, &priv_set_len, &granted, &status);
1104 ok(rc, "AccessCheck error %ld\n", GetLastError());
1105todo_wine {
1106 ok(status == 1, "expected 1, got %d\n", status);
1107 ok(granted == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", granted);
1108}
1109 SetLastError(0xdeadbeef);
1110 rc = DeleteFileA(file);
1111 ok(!rc, "DeleteFile should fail\n");
1112 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
1113 SetLastError(0xdeadbeef);
1115 ok(rc, "SetFileAttributes error %ld\n", GetLastError());
1116 SetLastError(0xdeadbeef);
1117 rc = DeleteFileA(file);
1118 ok(rc, "DeleteFile error %ld\n", GetLastError());
1119
1121 free(sd);
1122}
1123
1124static void test_AccessCheck(void)
1125{
1126 PSID EveryoneSid = NULL, AdminSid = NULL, UsersSid = NULL;
1127 PACL Acl = NULL;
1132 ACCESS_MASK Access;
1134 HANDLE Token;
1135 HANDLE ProcessToken;
1136 BOOL ret;
1137 DWORD PrivSetLen;
1138 PRIVILEGE_SET *PrivSet;
1139 BOOL res;
1140 HMODULE NtDllModule;
1142 DWORD err;
1143 NTSTATUS ntret, ntAccessStatus;
1144
1145 NtDllModule = GetModuleHandleA("ntdll.dll");
1146 if (!NtDllModule)
1147 {
1148 skip("not running on NT, skipping test\n");
1149 return;
1150 }
1151 pRtlAdjustPrivilege = (void *)GetProcAddress(NtDllModule, "RtlAdjustPrivilege");
1152 if (!pRtlAdjustPrivilege)
1153 {
1154 win_skip("missing RtlAdjustPrivilege, skipping test\n");
1155 return;
1156 }
1157
1158 Acl = malloc(256);
1159 res = InitializeAcl(Acl, 256, ACL_REVISION);
1161 {
1162 skip("ACLs not implemented - skipping tests\n");
1163 free(Acl);
1164 return;
1165 }
1166 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
1167
1168 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
1169 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
1170
1172 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdminSid);
1173 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
1174
1176 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &UsersSid);
1177 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
1178
1180
1182 ok(res, "InitializeSecurityDescriptor failed with error %ld\n", GetLastError());
1183
1185 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1186
1187 PrivSetLen = FIELD_OFFSET(PRIVILEGE_SET, Privilege[16]);
1188 PrivSet = calloc(1, PrivSetLen);
1189 PrivSet->PrivilegeCount = 16;
1190
1192 ok(res, "OpenProcessToken failed with error %ld\n", GetLastError());
1193
1194 pRtlAdjustPrivilege(SE_SECURITY_PRIVILEGE, FALSE, TRUE, &Enabled);
1195
1196 res = DuplicateToken(ProcessToken, SecurityImpersonation, &Token);
1197 ok(res, "DuplicateToken failed with error %ld\n", GetLastError());
1198
1199 /* SD without owner/group */
1200 SetLastError(0xdeadbeef);
1201 Access = AccessStatus = 0x1abe11ed;
1203 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1204 err = GetLastError();
1205 ok(!ret && err == ERROR_INVALID_SECURITY_DESCR, "AccessCheck should have "
1206 "failed with ERROR_INVALID_SECURITY_DESCR, instead of %ld\n", err);
1207 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1208 "Access and/or AccessStatus were changed!\n");
1209
1210 /* Set owner and group */
1212 ok(res, "SetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
1214 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
1215
1216 /* Generic access mask */
1217 SetLastError(0xdeadbeef);
1218 Access = AccessStatus = 0x1abe11ed;
1220 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1221 err = GetLastError();
1222 ok(!ret && err == ERROR_GENERIC_NOT_MAPPED, "AccessCheck should have failed "
1223 "with ERROR_GENERIC_NOT_MAPPED, instead of %ld\n", err);
1224 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1225 "Access and/or AccessStatus were changed!\n");
1226
1227 /* Generic access mask - no privilegeset buffer */
1228 SetLastError(0xdeadbeef);
1229 Access = AccessStatus = 0x1abe11ed;
1231 NULL, &PrivSetLen, &Access, &AccessStatus);
1232 err = GetLastError();
1233 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1234 "with ERROR_NOACCESS, instead of %ld\n", err);
1235 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1236 "Access and/or AccessStatus were changed!\n");
1237
1238 /* Generic access mask - no returnlength */
1239 SetLastError(0xdeadbeef);
1240 Access = AccessStatus = 0x1abe11ed;
1242 PrivSet, NULL, &Access, &AccessStatus);
1243 err = GetLastError();
1244 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1245 "with ERROR_NOACCESS, instead of %ld\n", err);
1246 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1247 "Access and/or AccessStatus were changed!\n");
1248
1249 /* Generic access mask - no privilegeset buffer, no returnlength */
1250 SetLastError(0xdeadbeef);
1251 Access = AccessStatus = 0x1abe11ed;
1253 NULL, NULL, &Access, &AccessStatus);
1254 err = GetLastError();
1255 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1256 "with ERROR_NOACCESS, instead of %ld\n", err);
1257 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1258 "Access and/or AccessStatus were changed!\n");
1259
1260 /* sd with no dacl present */
1261 Access = AccessStatus = 0x1abe11ed;
1263 ok(ret, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1265 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1266 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1267 ok(AccessStatus && (Access == KEY_READ),
1268 "AccessCheck failed to grant access with error %ld\n",
1269 GetLastError());
1270
1271 /* sd with no dacl present - no privilegeset buffer */
1272 SetLastError(0xdeadbeef);
1273 Access = AccessStatus = 0x1abe11ed;
1275 NULL, &PrivSetLen, &Access, &AccessStatus);
1276 err = GetLastError();
1277 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1278 "with ERROR_NOACCESS, instead of %ld\n", err);
1279 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1280 "Access and/or AccessStatus were changed!\n");
1281
1282 if(pNtAccessCheck)
1283 {
1284 DWORD ntPrivSetLen = sizeof(PRIVILEGE_SET);
1285
1286 /* Generic access mask - no privilegeset buffer */
1287 SetLastError(0xdeadbeef);
1288 Access = ntAccessStatus = 0x1abe11ed;
1289 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1290 NULL, &ntPrivSetLen, &Access, &ntAccessStatus);
1291 err = GetLastError();
1292 ok(ntret == STATUS_ACCESS_VIOLATION,
1293 "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %lx\n", ntret);
1294 ok(err == 0xdeadbeef,
1295 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1296 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1297 "Access and/or AccessStatus were changed!\n");
1298 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", ntPrivSetLen);
1299
1300 /* Generic access mask - no returnlength */
1301 SetLastError(0xdeadbeef);
1302 Access = ntAccessStatus = 0x1abe11ed;
1303 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1304 PrivSet, NULL, &Access, &ntAccessStatus);
1305 err = GetLastError();
1306 ok(ntret == STATUS_ACCESS_VIOLATION,
1307 "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %lx\n", ntret);
1308 ok(err == 0xdeadbeef,
1309 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1310 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1311 "Access and/or AccessStatus were changed!\n");
1312
1313 /* Generic access mask - no privilegeset buffer, no returnlength */
1314 SetLastError(0xdeadbeef);
1315 Access = ntAccessStatus = 0x1abe11ed;
1316 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1317 NULL, NULL, &Access, &ntAccessStatus);
1318 err = GetLastError();
1319 ok(ntret == STATUS_ACCESS_VIOLATION,
1320 "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %lx\n", ntret);
1321 ok(err == 0xdeadbeef,
1322 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1323 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1324 "Access and/or AccessStatus were changed!\n");
1325
1326 /* Generic access mask - zero returnlength */
1327 SetLastError(0xdeadbeef);
1328 Access = ntAccessStatus = 0x1abe11ed;
1329 ntPrivSetLen = 0;
1330 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1331 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1332 err = GetLastError();
1334 "NtAccessCheck should have failed with STATUS_GENERIC_NOT_MAPPED, got %lx\n", ntret);
1335 ok(err == 0xdeadbeef,
1336 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1337 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1338 "Access and/or AccessStatus were changed!\n");
1339 ok(ntPrivSetLen == 0, "PrivSetLen returns %ld\n", ntPrivSetLen);
1340
1341 /* Generic access mask - insufficient returnlength */
1342 SetLastError(0xdeadbeef);
1343 Access = ntAccessStatus = 0x1abe11ed;
1344 ntPrivSetLen = sizeof(PRIVILEGE_SET)-1;
1345 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1346 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1347 err = GetLastError();
1349 "NtAccessCheck should have failed with STATUS_GENERIC_NOT_MAPPED, got %lx\n", ntret);
1350 ok(err == 0xdeadbeef,
1351 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1352 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1353 "Access and/or AccessStatus were changed!\n");
1354 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET)-1, "PrivSetLen returns %ld\n", ntPrivSetLen);
1355
1356 /* Key access mask - zero returnlength */
1357 SetLastError(0xdeadbeef);
1358 Access = ntAccessStatus = 0x1abe11ed;
1359 ntPrivSetLen = 0;
1360 ntret = pNtAccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
1361 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1362 err = GetLastError();
1363 ok(ntret == STATUS_BUFFER_TOO_SMALL,
1364 "NtAccessCheck should have failed with STATUS_BUFFER_TOO_SMALL, got %lx\n", ntret);
1365 ok(err == 0xdeadbeef,
1366 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1367 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1368 "Access and/or AccessStatus were changed!\n");
1369 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", ntPrivSetLen);
1370
1371 /* Key access mask - insufficient returnlength */
1372 SetLastError(0xdeadbeef);
1373 Access = ntAccessStatus = 0x1abe11ed;
1374 ntPrivSetLen = sizeof(PRIVILEGE_SET)-1;
1375 ntret = pNtAccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
1376 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1377 err = GetLastError();
1378 ok(ntret == STATUS_BUFFER_TOO_SMALL,
1379 "NtAccessCheck should have failed with STATUS_BUFFER_TOO_SMALL, got %lx\n", ntret);
1380 ok(err == 0xdeadbeef,
1381 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1382 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1383 "Access and/or AccessStatus were changed!\n");
1384 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", ntPrivSetLen);
1385 }
1386 else
1387 win_skip("NtAccessCheck unavailable. Skipping.\n");
1388
1389 /* sd with NULL dacl */
1390 Access = AccessStatus = 0x1abe11ed;
1392 ok(ret, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1394 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1395 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1396 ok(AccessStatus && (Access == KEY_READ),
1397 "AccessCheck failed to grant access with error %ld\n",
1398 GetLastError());
1400 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1401 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1402 ok(AccessStatus && (Access == KEY_ALL_ACCESS),
1403 "AccessCheck failed to grant access with error %ld\n",
1404 GetLastError());
1405
1406 /* sd with blank dacl */
1408 ok(ret, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1410 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1411 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1412 err = GetLastError();
1413 ok(!AccessStatus && err == ERROR_ACCESS_DENIED, "AccessCheck should have failed "
1414 "with ERROR_ACCESS_DENIED, instead of %ld\n", err);
1415 ok(!Access, "Should have failed to grant any access, got 0x%08lx\n", Access);
1416
1417 res = AddAccessAllowedAce(Acl, ACL_REVISION, KEY_READ, EveryoneSid);
1418 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
1419
1421 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError());
1422
1423 /* sd with dacl */
1424 Access = AccessStatus = 0x1abe11ed;
1426 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1427 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1428 ok(AccessStatus && (Access == KEY_READ),
1429 "AccessCheck failed to grant access with error %ld\n",
1430 GetLastError());
1431
1433 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1434 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1436 "AccessCheck failed to grant any access with error %ld\n",
1437 GetLastError());
1438 trace("AccessCheck with MAXIMUM_ALLOWED got Access 0x%08lx\n", Access);
1439
1440 /* Null PrivSet with null PrivSetLen pointer */
1441 SetLastError(0xdeadbeef);
1442 Access = AccessStatus = 0x1abe11ed;
1444 NULL, NULL, &Access, &AccessStatus);
1445 err = GetLastError();
1446 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1447 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1448 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1449 "Access and/or AccessStatus were changed!\n");
1450
1451 /* Null PrivSet with zero PrivSetLen */
1452 SetLastError(0xdeadbeef);
1453 Access = AccessStatus = 0x1abe11ed;
1454 PrivSetLen = 0;
1456 0, &PrivSetLen, &Access, &AccessStatus);
1457 err = GetLastError();
1458 todo_wine
1459 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1460 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1461 todo_wine
1462 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1463 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1464 "Access and/or AccessStatus were changed!\n");
1465
1466 /* Null PrivSet with insufficient PrivSetLen */
1467 SetLastError(0xdeadbeef);
1468 Access = AccessStatus = 0x1abe11ed;
1469 PrivSetLen = 1;
1471 0, &PrivSetLen, &Access, &AccessStatus);
1472 err = GetLastError();
1473 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1474 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1475 ok(PrivSetLen == 1, "PrivSetLen returns %ld\n", PrivSetLen);
1476 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1477 "Access and/or AccessStatus were changed!\n");
1478
1479 /* Null PrivSet with insufficient PrivSetLen */
1480 SetLastError(0xdeadbeef);
1481 Access = AccessStatus = 0x1abe11ed;
1482 PrivSetLen = sizeof(PRIVILEGE_SET) - 1;
1484 0, &PrivSetLen, &Access, &AccessStatus);
1485 err = GetLastError();
1486 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1487 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1488 ok(PrivSetLen == sizeof(PRIVILEGE_SET) - 1, "PrivSetLen returns %ld\n", PrivSetLen);
1489 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1490 "Access and/or AccessStatus were changed!\n");
1491
1492 /* Null PrivSet with minimal sufficient PrivSetLen */
1493 SetLastError(0xdeadbeef);
1494 Access = AccessStatus = 0x1abe11ed;
1495 PrivSetLen = sizeof(PRIVILEGE_SET);
1497 0, &PrivSetLen, &Access, &AccessStatus);
1498 err = GetLastError();
1499 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1500 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1501 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1502 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1503 "Access and/or AccessStatus were changed!\n");
1504
1505 /* Valid PrivSet with zero PrivSetLen */
1506 SetLastError(0xdeadbeef);
1507 Access = AccessStatus = 0x1abe11ed;
1508 PrivSetLen = 0;
1510 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1511 err = GetLastError();
1512 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1513 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1514 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1515 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1516 "Access and/or AccessStatus were changed!\n");
1517
1518 /* Valid PrivSet with insufficient PrivSetLen */
1519 SetLastError(0xdeadbeef);
1520 Access = AccessStatus = 0x1abe11ed;
1521 PrivSetLen = 1;
1523 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1524 err = GetLastError();
1525 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1526 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1527 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1528 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1529 "Access and/or AccessStatus were changed!\n");
1530
1531 /* Valid PrivSet with insufficient PrivSetLen */
1532 SetLastError(0xdeadbeef);
1533 Access = AccessStatus = 0x1abe11ed;
1534 PrivSetLen = sizeof(PRIVILEGE_SET) - 1;
1535 PrivSet->PrivilegeCount = 0xdeadbeef;
1537 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1538 err = GetLastError();
1539 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1540 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1541 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1542 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1543 "Access and/or AccessStatus were changed!\n");
1544 ok(PrivSet->PrivilegeCount == 0xdeadbeef, "buffer contents should not be changed\n");
1545
1546 /* Valid PrivSet with minimal sufficient PrivSetLen */
1547 SetLastError(0xdeadbeef);
1548 Access = AccessStatus = 0x1abe11ed;
1549 PrivSetLen = sizeof(PRIVILEGE_SET);
1550 memset(PrivSet, 0xcc, PrivSetLen);
1552 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1553 err = GetLastError();
1554 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1555 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1556 ok(AccessStatus && (Access == KEY_READ),
1557 "AccessCheck failed to grant access with error %ld\n", GetLastError());
1558 ok(PrivSet->PrivilegeCount == 0, "PrivilegeCount returns %ld, expects 0\n",
1559 PrivSet->PrivilegeCount);
1560
1561 /* Valid PrivSet with sufficient PrivSetLen */
1562 SetLastError(0xdeadbeef);
1563 Access = AccessStatus = 0x1abe11ed;
1564 PrivSetLen = sizeof(PRIVILEGE_SET) + 1;
1565 memset(PrivSet, 0xcc, PrivSetLen);
1567 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1568 err = GetLastError();
1569 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1570 todo_wine
1571 ok(PrivSetLen == sizeof(PRIVILEGE_SET) + 1, "PrivSetLen returns %ld\n", PrivSetLen);
1572 ok(AccessStatus && (Access == KEY_READ),
1573 "AccessCheck failed to grant access with error %ld\n", GetLastError());
1574 ok(PrivSet->PrivilegeCount == 0, "PrivilegeCount returns %ld, expects 0\n",
1575 PrivSet->PrivilegeCount);
1576
1577 PrivSetLen = FIELD_OFFSET(PRIVILEGE_SET, Privilege[16]);
1578
1579 /* Null PrivSet with valid PrivSetLen */
1580 SetLastError(0xdeadbeef);
1581 Access = AccessStatus = 0x1abe11ed;
1583 0, &PrivSetLen, &Access, &AccessStatus);
1584 err = GetLastError();
1585 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1586 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1587 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1588 "Access and/or AccessStatus were changed!\n");
1589
1590 /* Access denied by SD */
1591 SetLastError(0xdeadbeef);
1592 Access = AccessStatus = 0x1abe11ed;
1594 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1595 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1596 err = GetLastError();
1597 ok(!AccessStatus && err == ERROR_ACCESS_DENIED, "AccessCheck should have failed "
1598 "with ERROR_ACCESS_DENIED, instead of %ld\n", err);
1599 ok(!Access, "Should have failed to grant any access, got 0x%08lx\n", Access);
1600
1601 SetLastError(0xdeadbeef);
1602 PrivSet->PrivilegeCount = 16;
1604 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1606 "AccessCheck should have failed with ERROR_PRIVILEGE_NOT_HELD, instead of %ld\n",
1607 GetLastError());
1608
1610 ok(ret, "ImpersonateLoggedOnUser failed with error %ld\n", GetLastError());
1611 ret = pRtlAdjustPrivilege(SE_SECURITY_PRIVILEGE, TRUE, TRUE, &Enabled);
1612 if (!ret)
1613 {
1614 /* Valid PrivSet with zero PrivSetLen */
1615 SetLastError(0xdeadbeef);
1616 Access = AccessStatus = 0x1abe11ed;
1617 PrivSetLen = 0;
1619 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1620 err = GetLastError();
1621 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1622 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1623 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1624 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1625 "Access and/or AccessStatus were changed!\n");
1626
1627 /* Valid PrivSet with insufficient PrivSetLen */
1628 SetLastError(0xdeadbeef);
1629 Access = AccessStatus = 0x1abe11ed;
1630 PrivSetLen = sizeof(PRIVILEGE_SET) - 1;
1632 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1633 err = GetLastError();
1634 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1635 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1636 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1637 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1638 "Access and/or AccessStatus were changed!\n");
1639
1640 /* Valid PrivSet with minimal sufficient PrivSetLen */
1641 SetLastError(0xdeadbeef);
1642 Access = AccessStatus = 0x1abe11ed;
1643 PrivSetLen = sizeof(PRIVILEGE_SET);
1644 memset(PrivSet, 0xcc, PrivSetLen);
1646 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1647 ok(ret && AccessStatus && GetLastError() == 0xdeadbeef,
1648 "AccessCheck should have succeeded, error %ld\n",
1649 GetLastError());
1650 ok(Access == ACCESS_SYSTEM_SECURITY,
1651 "Access should be equal to ACCESS_SYSTEM_SECURITY instead of 0x%08lx\n",
1652 Access);
1653 ok(PrivSet->PrivilegeCount == 1, "PrivilegeCount returns %ld, expects 1\n",
1654 PrivSet->PrivilegeCount);
1655
1656 /* Valid PrivSet with large PrivSetLen */
1657 SetLastError(0xdeadbeef);
1658 Access = AccessStatus = 0x1abe11ed;
1659 PrivSetLen = FIELD_OFFSET(PRIVILEGE_SET, Privilege[16]);
1660 memset(PrivSet, 0xcc, PrivSetLen);
1662 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1663 ok(ret && AccessStatus && GetLastError() == 0xdeadbeef,
1664 "AccessCheck should have succeeded, error %ld\n",
1665 GetLastError());
1666 ok(Access == ACCESS_SYSTEM_SECURITY,
1667 "Access should be equal to ACCESS_SYSTEM_SECURITY instead of 0x%08lx\n",
1668 Access);
1669 ok(PrivSet->PrivilegeCount == 1, "PrivilegeCount returns %ld, expects 1\n",
1670 PrivSet->PrivilegeCount);
1671 }
1672 else
1673 trace("Couldn't get SE_SECURITY_PRIVILEGE (0x%08x), skipping ACCESS_SYSTEM_SECURITY test\n",
1674 ret);
1675 ret = RevertToSelf();
1676 ok(ret, "RevertToSelf failed with error %ld\n", GetLastError());
1677
1678 /* test INHERIT_ONLY_ACE */
1679 ret = InitializeAcl(Acl, 256, ACL_REVISION);
1680 ok(ret, "InitializeAcl failed with error %ld\n", GetLastError());
1681
1683 ok(ret, "AddAccessAllowedAceEx failed with error %ld\n", GetLastError());
1684
1686 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1687 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1688 err = GetLastError();
1689 ok(!AccessStatus && err == ERROR_ACCESS_DENIED, "AccessCheck should have failed "
1690 "with ERROR_ACCESS_DENIED, instead of %ld\n", err);
1691 ok(!Access, "Should have failed to grant any access, got 0x%08lx\n", Access);
1692
1694
1695 res = DuplicateToken(ProcessToken, SecurityAnonymous, &Token);
1696 ok(res, "DuplicateToken failed with error %ld\n", GetLastError());
1697
1698 SetLastError(0xdeadbeef);
1700 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1701 err = GetLastError();
1702 ok(!ret && err == ERROR_BAD_IMPERSONATION_LEVEL, "AccessCheck should have failed "
1703 "with ERROR_BAD_IMPERSONATION_LEVEL, instead of %ld\n", err);
1704
1706
1707 SetLastError(0xdeadbeef);
1709 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1710 err = GetLastError();
1711 ok(!ret && err == ERROR_NO_IMPERSONATION_TOKEN, "AccessCheck should have failed "
1712 "with ERROR_NO_IMPERSONATION_TOKEN, instead of %ld\n", err);
1713
1714 CloseHandle(ProcessToken);
1715
1716 if (EveryoneSid)
1717 FreeSid(EveryoneSid);
1718 if (AdminSid)
1720 if (UsersSid)
1721 FreeSid(UsersSid);
1722 free(Acl);
1724 free(PrivSet);
1725}
1726
1728{
1729 TOKEN_USER *token_user;
1730 DWORD size;
1731 BOOL ret;
1732
1734 ok(!ret, "Expected failure, got %d\n", ret);
1736 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
1737
1738 token_user = malloc( size );
1739 ret = GetTokenInformation( token, TokenUser, token_user, size, &size );
1740 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1741
1742 return token_user;
1743}
1744
1746{
1747 TOKEN_OWNER *token_owner;
1748 DWORD size;
1749 BOOL ret;
1750
1752 ok(!ret, "Expected failure, got %d\n", ret);
1754 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
1755
1756 token_owner = malloc( size );
1757 ret = GetTokenInformation( token, TokenOwner, token_owner, size, &size );
1758 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1759
1760 return token_owner;
1761}
1762
1764{
1765 TOKEN_PRIMARY_GROUP *token_primary_group;
1766 DWORD size;
1767 BOOL ret;
1768
1770 ok(!ret, "Expected failure, got %d\n", ret);
1772 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
1773
1774 token_primary_group = malloc( size );
1775 ret = GetTokenInformation( token, TokenPrimaryGroup, token_primary_group, size, &size );
1776 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1777
1778 return token_primary_group;
1779}
1780
1781/* test GetTokenInformation for the various attributes */
1782static void test_token_attr(void)
1783{
1784 HANDLE Token, ImpersonationToken;
1785 DWORD Size, Size2;
1787 TOKEN_GROUPS *Groups;
1791 BOOL ret;
1792 DWORD i, GLE;
1793 LPSTR SidString;
1795 ACL *acl;
1796
1797 /* cygwin-like use case */
1798 SetLastError(0xdeadbeef);
1801 {
1802 win_skip("OpenProcessToken is not implemented\n");
1803 return;
1804 }
1805 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
1806 if (ret)
1807 {
1808 DWORD buf[256]; /* GetTokenInformation wants a dword-aligned buffer */
1809 Size = sizeof(buf);
1811 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1812 Size = sizeof(ImpersonationLevel);
1814 GLE = GetLastError();
1815 ok(!ret && (GLE == ERROR_INVALID_PARAMETER), "GetTokenInformation(TokenImpersonationLevel) on primary token should have failed with ERROR_INVALID_PARAMETER instead of %ld\n", GLE);
1817 }
1818
1819 SetLastError(0xdeadbeef);
1821 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
1822
1823 /* groups */
1824 /* insufficient buffer length */
1825 SetLastError(0xdeadbeef);
1826 Size2 = 0;
1828 ok(Size2 > 1, "got %ld\n", Size2);
1830 "%d with error %ld\n", ret, GetLastError());
1831 Size2 -= 1;
1832 Groups = malloc(Size2);
1833 memset(Groups, 0xcc, Size2);
1834 Size = 0;
1835 ret = GetTokenInformation(Token, TokenGroups, Groups, Size2, &Size);
1836 ok(Size > 1, "got %ld\n", Size);
1837 ok((!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER) || broken(ret) /* wow64 */,
1838 "%d with error %ld\n", ret, GetLastError());
1839 if(!ret)
1840 ok(*((BYTE*)Groups) == 0xcc, "buffer altered\n");
1841
1842 free(Groups);
1843
1844 SetLastError(0xdeadbeef);
1847 "GetTokenInformation(TokenGroups) %s with error %ld\n",
1848 ret ? "succeeded" : "failed", GetLastError());
1849 Groups = malloc(Size);
1850 SetLastError(0xdeadbeef);
1852 ok(ret, "GetTokenInformation(TokenGroups) failed with error %ld\n", GetLastError());
1853 ok(GetLastError() == 0xdeadbeef,
1854 "GetTokenInformation shouldn't have set last error to %ld\n",
1855 GetLastError());
1856 trace("TokenGroups:\n");
1857 for (i = 0; i < Groups->GroupCount; i++)
1858 {
1859 DWORD NameLength = 255;
1860 CHAR Name[255];
1861 DWORD DomainLength = 255;
1862 CHAR Domain[255];
1863 SID_NAME_USE SidNameUse;
1864 Name[0] = '\0';
1865 Domain[0] = '\0';
1866 ret = LookupAccountSidA(NULL, Groups->Groups[i].Sid, Name, &NameLength, Domain, &DomainLength, &SidNameUse);
1867 if (ret)
1868 {
1869 ConvertSidToStringSidA(Groups->Groups[i].Sid, &SidString);
1870 trace("%s, %s\\%s use: %d attr: 0x%08lx\n", SidString, Domain, Name, SidNameUse, Groups->Groups[i].Attributes);
1871 LocalFree(SidString);
1872 }
1873 else trace("attr: 0x%08lx LookupAccountSid failed with error %ld\n", Groups->Groups[i].Attributes, GetLastError());
1874 }
1875 free(Groups);
1876
1877 /* user */
1880 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
1881 User = malloc(Size);
1883 ok(ret,
1884 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
1885
1886 ConvertSidToStringSidA(User->User.Sid, &SidString);
1887 trace("TokenUser: %s attr: 0x%08lx\n", SidString, User->User.Attributes);
1888 LocalFree(SidString);
1889 free(User);
1890
1891 /* owner */
1894 "GetTokenInformation(TokenOwner) failed with error %ld\n", GetLastError());
1895 Owner = malloc(Size);
1897 ok(ret,
1898 "GetTokenInformation(TokenOwner) failed with error %ld\n", GetLastError());
1899
1900 ConvertSidToStringSidA(Owner->Owner, &SidString);
1901 trace("TokenOwner: %s\n", SidString);
1902 LocalFree(SidString);
1903 free(Owner);
1904
1905 /* logon */
1908 todo_wine win_skip("TokenLogonSid not supported. Skipping tests\n");
1909 else
1910 {
1912 "GetTokenInformation(TokenLogonSid) failed with error %ld\n", GetLastError());
1913 Groups = malloc(Size);
1915 ok(ret,
1916 "GetTokenInformation(TokenLogonSid) failed with error %ld\n", GetLastError());
1917 if (ret)
1918 {
1919 ok(Groups->GroupCount == 1, "got %ld\n", Groups->GroupCount);
1920 if(Groups->GroupCount == 1)
1921 {
1922 ConvertSidToStringSidA(Groups->Groups[0].Sid, &SidString);
1923 trace("TokenLogon: %s\n", SidString);
1924 LocalFree(SidString);
1925
1926 /* S-1-5-5-0-XXXXXX */
1927 ret = IsWellKnownSid(Groups->Groups[0].Sid, WinLogonIdsSid);
1928 ok(ret, "Unknown SID\n");
1929
1931 "got %lx\n", Groups->Groups[0].Attributes);
1932 }
1933 }
1934
1935 free(Groups);
1936 }
1937
1938 /* privileges */
1941 "GetTokenInformation(TokenPrivileges) failed with error %ld\n", GetLastError());
1944 ok(ret,
1945 "GetTokenInformation(TokenPrivileges) failed with error %ld\n", GetLastError());
1946 trace("TokenPrivileges:\n");
1947 for (i = 0; i < Privileges->PrivilegeCount; i++)
1948 {
1949 CHAR Name[256];
1950 DWORD NameLen = ARRAY_SIZE(Name);
1951 LookupPrivilegeNameA(NULL, &Privileges->Privileges[i].Luid, Name, &NameLen);
1952 trace("\t%s, 0x%lx\n", Name, Privileges->Privileges[i].Attributes);
1953 }
1955
1956 ret = DuplicateToken(Token, SecurityAnonymous, &ImpersonationToken);
1957 ok(ret, "DuplicateToken failed with error %ld\n", GetLastError());
1958
1959 Size = sizeof(ImpersonationLevel);
1961 ok(ret, "GetTokenInformation(TokenImpersonationLevel) failed with error %ld\n", GetLastError());
1962 ok(ImpersonationLevel == SecurityAnonymous, "ImpersonationLevel should have been SecurityAnonymous instead of %d\n", ImpersonationLevel);
1963
1964 CloseHandle(ImpersonationToken);
1965
1966 /* default dacl */
1969 "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
1970
1971 Dacl = malloc(Size);
1973 ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
1974
1975 SetLastError(0xdeadbeef);
1977 GLE = GetLastError();
1978 ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
1979 ok(GLE == ERROR_BAD_LENGTH, "expected ERROR_BAD_LENGTH got %lu\n", GLE);
1980
1981 SetLastError(0xdeadbeef);
1983 GLE = GetLastError();
1984 ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
1985 ok(GLE == ERROR_NOACCESS, "expected ERROR_NOACCESS got %lu\n", GLE);
1986
1987 acl = Dacl->DefaultDacl;
1988 Dacl->DefaultDacl = NULL;
1989
1991 ok(ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
1992
1993 Size2 = 0;
1994 Dacl->DefaultDacl = (ACL *)0xdeadbeef;
1996 ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
1997 ok(Dacl->DefaultDacl == NULL, "expected NULL, got %p\n", Dacl->DefaultDacl);
1998 ok(Size2 == sizeof(TOKEN_DEFAULT_DACL) || broken(Size2 == 2*sizeof(TOKEN_DEFAULT_DACL)), /* WoW64 */
1999 "got %lu expected sizeof(TOKEN_DEFAULT_DACL)\n", Size2);
2000
2001 Dacl->DefaultDacl = acl;
2003 ok(ret, "SetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2004
2005 if (Size2 == sizeof(TOKEN_DEFAULT_DACL)) {
2007 ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2008 } else
2009 win_skip("TOKEN_DEFAULT_DACL size too small on WoW64\n");
2010
2011 free(Dacl);
2013}
2014
2016{
2017 DWORD is_app_container, size;
2018 HANDLE token;
2019 BOOL ret;
2020
2022 ok(ret, "OpenProcessToken failed: %lu\n", GetLastError());
2023
2024 size = 0;
2025 is_app_container = 0xdeadbeef;
2026 ret = GetTokenInformation(token, TokenIsAppContainer, &is_app_container,
2027 sizeof(is_app_container), &size);
2029 GetLastError() == ERROR_INVALID_FUNCTION), /* pre-win8 */
2030 "GetTokenInformation failed: %lu\n", GetLastError());
2031 if(ret) {
2032 ok(size == sizeof(is_app_container), "size = %lu\n", size);
2033 ok(!is_app_container, "is_app_container = %lx\n", is_app_container);
2034 }
2035
2037}
2038
2039typedef union _MAX_SID
2040{
2044
2045static void test_sid_str(PSID * sid)
2046{
2047 char *str_sid;
2048 BOOL ret = ConvertSidToStringSidA(sid, &str_sid);
2049 ok(ret, "ConvertSidToStringSidA() failed: %ld\n", GetLastError());
2050 if (ret)
2051 {
2053 SID_NAME_USE use;
2054 DWORD acc_size = MAX_PATH;
2055 DWORD dom_size = MAX_PATH;
2056 ret = LookupAccountSidA (NULL, sid, account, &acc_size, domain, &dom_size, &use);
2058 "LookupAccountSid(%s) failed: %ld\n", str_sid, GetLastError());
2059 if (ret)
2060 trace(" %s %s\\%s %d\n", str_sid, domain, account, use);
2061 else if (GetLastError() == ERROR_NONE_MAPPED)
2062 trace(" %s couldn't be mapped\n", str_sid);
2063 LocalFree(str_sid);
2064 }
2065}
2066
2067static const struct well_known_sid_value
2068{
2070 const char *sid_string;
2072/* 0 */ {TRUE, "S-1-0-0"}, {TRUE, "S-1-1-0"}, {TRUE, "S-1-2-0"}, {TRUE, "S-1-3-0"},
2073/* 4 */ {TRUE, "S-1-3-1"}, {TRUE, "S-1-3-2"}, {TRUE, "S-1-3-3"}, {TRUE, "S-1-5"},
2074/* 8 */ {FALSE, "S-1-5-1"}, {TRUE, "S-1-5-2"}, {TRUE, "S-1-5-3"}, {TRUE, "S-1-5-4"},
2075/* 12 */ {TRUE, "S-1-5-6"}, {TRUE, "S-1-5-7"}, {TRUE, "S-1-5-8"}, {TRUE, "S-1-5-9"},
2076/* 16 */ {TRUE, "S-1-5-10"}, {TRUE, "S-1-5-11"}, {TRUE, "S-1-5-12"}, {TRUE, "S-1-5-13"},
2077/* 20 */ {TRUE, "S-1-5-14"}, {FALSE, NULL}, {TRUE, "S-1-5-18"}, {TRUE, "S-1-5-19"},
2078/* 24 */ {TRUE, "S-1-5-20"}, {TRUE, "S-1-5-32"},
2079/* 26 */ {FALSE, "S-1-5-32-544"}, {TRUE, "S-1-5-32-545"}, {TRUE, "S-1-5-32-546"},
2080/* 29 */ {TRUE, "S-1-5-32-547"}, {TRUE, "S-1-5-32-548"}, {TRUE, "S-1-5-32-549"},
2081/* 32 */ {TRUE, "S-1-5-32-550"}, {TRUE, "S-1-5-32-551"}, {TRUE, "S-1-5-32-552"},
2082/* 35 */ {TRUE, "S-1-5-32-554"}, {TRUE, "S-1-5-32-555"}, {TRUE, "S-1-5-32-556"},
2083/* 38 */ {FALSE, "S-1-5-21-12-23-34-45-56-500"}, {FALSE, "S-1-5-21-12-23-34-45-56-501"},
2084/* 40 */ {FALSE, "S-1-5-21-12-23-34-45-56-502"}, {FALSE, "S-1-5-21-12-23-34-45-56-512"},
2085/* 42 */ {FALSE, "S-1-5-21-12-23-34-45-56-513"}, {FALSE, "S-1-5-21-12-23-34-45-56-514"},
2086/* 44 */ {FALSE, "S-1-5-21-12-23-34-45-56-515"}, {FALSE, "S-1-5-21-12-23-34-45-56-516"},
2087/* 46 */ {FALSE, "S-1-5-21-12-23-34-45-56-517"}, {FALSE, "S-1-5-21-12-23-34-45-56-518"},
2088/* 48 */ {FALSE, "S-1-5-21-12-23-34-45-56-519"}, {FALSE, "S-1-5-21-12-23-34-45-56-520"},
2089/* 50 */ {FALSE, "S-1-5-21-12-23-34-45-56-553"},
2090/* Added in Windows Server 2003 */
2091/* 51 */ {TRUE, "S-1-5-64-10"}, {TRUE, "S-1-5-64-21"}, {TRUE, "S-1-5-64-14"},
2092/* 54 */ {TRUE, "S-1-5-15"}, {TRUE, "S-1-5-1000"}, {FALSE, "S-1-5-32-557"},
2093/* 57 */ {TRUE, "S-1-5-32-558"}, {TRUE, "S-1-5-32-559"}, {TRUE, "S-1-5-32-560"},
2094/* 60 */ {TRUE, "S-1-5-32-561"}, {TRUE, "S-1-5-32-562"},
2095/* Added in Windows Vista: */
2096/* 62 */ {TRUE, "S-1-5-32-568"},
2097/* 63 */ {TRUE, "S-1-5-17"}, {FALSE, "S-1-5-32-569"}, {TRUE, "S-1-16-0"},
2098/* 66 */ {TRUE, "S-1-16-4096"}, {TRUE, "S-1-16-8192"}, {TRUE, "S-1-16-12288"},
2099/* 69 */ {TRUE, "S-1-16-16384"}, {TRUE, "S-1-5-33"}, {TRUE, "S-1-3-4"},
2100/* 72 */ {FALSE, "S-1-5-21-12-23-34-45-56-571"}, {FALSE, "S-1-5-21-12-23-34-45-56-572"},
2101/* 74 */ {TRUE, "S-1-5-22"}, {FALSE, "S-1-5-21-12-23-34-45-56-521"}, {TRUE, "S-1-5-32-573"},
2102/* 77 */ {FALSE, "S-1-5-21-12-23-34-45-56-498"}, {TRUE, "S-1-5-32-574"}, {TRUE, "S-1-16-8448"},
2103/* 80 */ {FALSE, NULL}, {TRUE, "S-1-2-1"}, {TRUE, "S-1-5-65-1"}, {FALSE, NULL},
2104/* 84 */ {TRUE, "S-1-15-2-1"},
2106
2108{
2110 PSID domainsid, sid;
2111 DWORD size, error;
2112 BOOL ret;
2113 unsigned int i;
2114
2115 size = 0;
2116 SetLastError(0xdeadbeef);
2117 ret = CreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
2118 error = GetLastError();
2119 ok(!ret, "CreateWellKnownSid succeeded\n");
2120 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %lu\n", error);
2121 ok(size, "expected size > 0\n");
2122
2123 SetLastError(0xdeadbeef);
2124 ret = CreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
2125 error = GetLastError();
2126 ok(!ret, "CreateWellKnownSid succeeded\n");
2127 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %lu\n", error);
2128
2129 sid = malloc(size);
2130 ret = CreateWellKnownSid(WinInteractiveSid, NULL, sid, &size);
2131 ok(ret, "CreateWellKnownSid failed %lu\n", GetLastError());
2132 free(sid);
2133
2134 /* a domain sid usually have three subauthorities but we test that CreateWellKnownSid doesn't check it */
2135 AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
2136
2137 for (i = 0; i < ARRAY_SIZE(well_known_sid_values); i++)
2138 {
2140 char sid_buffer[SECURITY_MAX_SID_SIZE];
2141 LPSTR str;
2142 DWORD cb;
2143
2144 if (value->sid_string == NULL)
2145 continue;
2146
2147 /* some SIDs aren't implemented by all Windows versions - detect it */
2148 cb = sizeof(sid_buffer);
2149 if (!CreateWellKnownSid(i, NULL, sid_buffer, &cb))
2150 {
2151 skip("Well known SID %u not implemented\n", i);
2152 continue;
2153 }
2154
2155 cb = sizeof(sid_buffer);
2156 ok(CreateWellKnownSid(i, value->without_domain ? NULL : domainsid, sid_buffer, &cb), "Couldn't create well known sid %u\n", i);
2158 ok(IsValidSid(sid_buffer), "The sid is not valid\n");
2159 ok(ConvertSidToStringSidA(sid_buffer, &str), "Couldn't convert SID to string\n");
2160 ok(strcmp(str, value->sid_string) == 0, "%d: SID mismatch - expected %s, got %s\n", i,
2161 value->sid_string, str);
2162 LocalFree(str);
2163
2164 if (value->without_domain)
2165 {
2166 char buf2[SECURITY_MAX_SID_SIZE];
2167 cb = sizeof(buf2);
2168 ok(CreateWellKnownSid(i, domainsid, buf2, &cb), "Couldn't create well known sid %u with optional domain\n", i);
2170 ok(memcmp(buf2, sid_buffer, cb) == 0, "SID create with domain is different than without (%u)\n", i);
2171 }
2172 }
2173
2174 FreeSid(domainsid);
2175}
2176
2177static void test_LookupAccountSid(void)
2178{
2180 CHAR accountA[MAX_PATH], domainA[MAX_PATH], usernameA[MAX_PATH];
2181 DWORD acc_sizeA, dom_sizeA, user_sizeA;
2182 DWORD real_acc_sizeA, real_dom_sizeA;
2183 WCHAR accountW[MAX_PATH], domainW[MAX_PATH];
2184 LSA_OBJECT_ATTRIBUTES object_attributes;
2185 DWORD acc_sizeW, dom_sizeW;
2186 DWORD real_acc_sizeW, real_dom_sizeW;
2187 PSID pUsersSid = NULL;
2188 SID_NAME_USE use;
2189 BOOL ret;
2190 DWORD error, size, cbti = 0;
2191 MAX_SID max_sid;
2192 CHAR *str_sidA;
2193 int i;
2194 HANDLE hToken;
2195 PTOKEN_USER ptiUser = NULL;
2198
2199 /* native windows crashes if account size, domain size, or name use is NULL */
2200
2202 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &pUsersSid);
2204 "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
2205
2206 /* not running on NT so give up */
2208 return;
2209
2210 real_acc_sizeA = MAX_PATH;
2211 real_dom_sizeA = MAX_PATH;
2212 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &real_acc_sizeA, domainA, &real_dom_sizeA, &use);
2213 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2214
2215 /* try NULL account */
2216 acc_sizeA = MAX_PATH;
2217 dom_sizeA = MAX_PATH;
2218 ret = LookupAccountSidA(NULL, pUsersSid, NULL, &acc_sizeA, domainA, &dom_sizeA, &use);
2219 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2220
2221 /* try NULL domain */
2222 acc_sizeA = MAX_PATH;
2223 dom_sizeA = MAX_PATH;
2224 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, NULL, &dom_sizeA, &use);
2225 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2226
2227 /* try a small account buffer */
2228 acc_sizeA = 1;
2229 dom_sizeA = MAX_PATH;
2230 accountA[0] = 0;
2231 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2232 ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
2234 "LookupAccountSidA() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2235
2236 /* try a 0 sized account buffer */
2237 acc_sizeA = 0;
2238 dom_sizeA = MAX_PATH;
2239 accountA[0] = 0;
2240 LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2241 /* this can fail or succeed depending on OS version but the size will always be returned */
2242 ok(acc_sizeA == real_acc_sizeA + 1,
2243 "LookupAccountSidA() Expected acc_size = %lu, got %lu\n",
2244 real_acc_sizeA + 1, acc_sizeA);
2245
2246 /* try a 0 sized account buffer */
2247 acc_sizeA = 0;
2248 dom_sizeA = MAX_PATH;
2249 LookupAccountSidA(NULL, pUsersSid, NULL, &acc_sizeA, domainA, &dom_sizeA, &use);
2250 /* this can fail or succeed depending on OS version but the size will always be returned */
2251 ok(acc_sizeA == real_acc_sizeA + 1,
2252 "LookupAccountSid() Expected acc_size = %lu, got %lu\n",
2253 real_acc_sizeA + 1, acc_sizeA);
2254
2255 /* try a small domain buffer */
2256 dom_sizeA = 1;
2257 acc_sizeA = MAX_PATH;
2258 accountA[0] = 0;
2259 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2260 ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
2262 "LookupAccountSidA() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2263
2264 /* try a 0 sized domain buffer */
2265 dom_sizeA = 0;
2266 acc_sizeA = MAX_PATH;
2267 accountA[0] = 0;
2268 LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2269 /* this can fail or succeed depending on OS version but the size will always be returned */
2270 ok(dom_sizeA == real_dom_sizeA + 1,
2271 "LookupAccountSidA() Expected dom_size = %lu, got %lu\n",
2272 real_dom_sizeA + 1, dom_sizeA);
2273
2274 /* try a 0 sized domain buffer */
2275 dom_sizeA = 0;
2276 acc_sizeA = MAX_PATH;
2277 LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, NULL, &dom_sizeA, &use);
2278 /* this can fail or succeed depending on OS version but the size will always be returned */
2279 ok(dom_sizeA == real_dom_sizeA + 1,
2280 "LookupAccountSidA() Expected dom_size = %lu, got %lu\n",
2281 real_dom_sizeA + 1, dom_sizeA);
2282
2283 real_acc_sizeW = MAX_PATH;
2284 real_dom_sizeW = MAX_PATH;
2285 ret = LookupAccountSidW(NULL, pUsersSid, accountW, &real_acc_sizeW, domainW, &real_dom_sizeW, &use);
2286 ok(ret, "LookupAccountSidW() Expected TRUE, got FALSE\n");
2287
2288 /* try an invalid system name */
2289 real_acc_sizeA = MAX_PATH;
2290 real_dom_sizeA = MAX_PATH;
2291 ret = LookupAccountSidA("deepthought", pUsersSid, accountA, &real_acc_sizeA, domainA, &real_dom_sizeA, &use);
2292 ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
2294 "LookupAccountSidA() Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %lu\n", GetLastError());
2295
2296 /* native windows crashes if domainW or accountW is NULL */
2297
2298 /* try a small account buffer */
2299 acc_sizeW = 1;
2300 dom_sizeW = MAX_PATH;
2301 accountW[0] = 0;
2302 ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2303 ok(!ret, "LookupAccountSidW() Expected FALSE got TRUE\n");
2305 "LookupAccountSidW() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2306
2307 /* try a 0 sized account buffer */
2308 acc_sizeW = 0;
2309 dom_sizeW = MAX_PATH;
2310 accountW[0] = 0;
2311 LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2312 /* this can fail or succeed depending on OS version but the size will always be returned */
2313 ok(acc_sizeW == real_acc_sizeW + 1,
2314 "LookupAccountSidW() Expected acc_size = %lu, got %lu\n",
2315 real_acc_sizeW + 1, acc_sizeW);
2316
2317 /* try a 0 sized account buffer */
2318 acc_sizeW = 0;
2319 dom_sizeW = MAX_PATH;
2320 LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, domainW, &dom_sizeW, &use);
2321 /* this can fail or succeed depending on OS version but the size will always be returned */
2322 ok(acc_sizeW == real_acc_sizeW + 1,
2323 "LookupAccountSidW() Expected acc_size = %lu, got %lu\n",
2324 real_acc_sizeW + 1, acc_sizeW);
2325
2326 /* try a small domain buffer */
2327 dom_sizeW = 1;
2328 acc_sizeW = MAX_PATH;
2329 accountW[0] = 0;
2330 ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2331 ok(!ret, "LookupAccountSidW() Expected FALSE got TRUE\n");
2333 "LookupAccountSidW() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2334
2335 /* try a 0 sized domain buffer */
2336 dom_sizeW = 0;
2337 acc_sizeW = MAX_PATH;
2338 accountW[0] = 0;
2339 LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2340 /* this can fail or succeed depending on OS version but the size will always be returned */
2341 ok(dom_sizeW == real_dom_sizeW + 1,
2342 "LookupAccountSidW() Expected dom_size = %lu, got %lu\n",
2343 real_dom_sizeW + 1, dom_sizeW);
2344
2345 /* try a 0 sized domain buffer */
2346 dom_sizeW = 0;
2347 acc_sizeW = MAX_PATH;
2348 LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, NULL, &dom_sizeW, &use);
2349 /* this can fail or succeed depending on OS version but the size will always be returned */
2350 ok(dom_sizeW == real_dom_sizeW + 1,
2351 "LookupAccountSidW() Expected dom_size = %lu, got %lu\n",
2352 real_dom_sizeW + 1, dom_sizeW);
2353
2354 acc_sizeW = dom_sizeW = use = 0;
2355 SetLastError(0xdeadbeef);
2356 ret = LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, NULL, &dom_sizeW, &use);
2357 error = GetLastError();
2358 ok(!ret, "LookupAccountSidW failed %lu\n", GetLastError());
2359 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %lu\n", error);
2360 ok(acc_sizeW, "expected non-zero account size\n");
2361 ok(dom_sizeW, "expected non-zero domain size\n");
2362 ok(!use, "expected zero use %u\n", use);
2363
2364 FreeSid(pUsersSid);
2365
2366 /* Test LookupAccountSid with Sid retrieved from token information.
2367 This assumes this process is running under the account of the current user.*/
2369 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
2370 ret = GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti);
2371 ok(!ret, "GetTokenInformation failed with error %ld\n", GetLastError());
2372 ptiUser = malloc(cbti);
2373 if (GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
2374 {
2375 acc_sizeA = dom_sizeA = MAX_PATH;
2376 ret = LookupAccountSidA(NULL, ptiUser->User.Sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2377 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2378 user_sizeA = MAX_PATH;
2379 ret = GetUserNameA(usernameA , &user_sizeA);
2380 ok(ret, "GetUserNameA() Expected TRUE, got FALSE\n");
2381 ok(lstrcmpA(usernameA, accountA) == 0, "LookupAccountSidA() Expected account name: %s got: %s\n", usernameA, accountA );
2382 }
2383 free(ptiUser);
2384
2385 trace("Well Known SIDs:\n");
2386 for (i = 0; i <= 60; i++)
2387 {
2389 if (CreateWellKnownSid(i, NULL, &max_sid.sid, &size))
2390 {
2391 if (ConvertSidToStringSidA(&max_sid.sid, &str_sidA))
2392 {
2393 acc_sizeA = MAX_PATH;
2394 dom_sizeA = MAX_PATH;
2395 if (LookupAccountSidA(NULL, &max_sid.sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use))
2396 trace(" %d: %s %s\\%s %d\n", i, str_sidA, domainA, accountA, use);
2397 LocalFree(str_sidA);
2398 }
2399 }
2400 else
2401 {
2403 trace(" CreateWellKnownSid(%d) failed: %ld\n", i, GetLastError());
2404 else
2405 trace(" %d: not supported\n", i);
2406 }
2407 }
2408
2409 ZeroMemory(&object_attributes, sizeof(object_attributes));
2410 object_attributes.Length = sizeof(object_attributes);
2411
2412 status = LsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle);
2414 "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08lx\n", status);
2415
2416 /* try a more restricted access mask if necessary */
2418 trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
2420 ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08lx\n", status);
2421 }
2422
2423 if (status == STATUS_SUCCESS)
2424 {
2427 ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy() failed, returned 0x%08lx\n", status);
2428 if (status == STATUS_SUCCESS)
2429 {
2430 ok(info->DomainSid!=0, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) missing SID\n");
2431 if (info->DomainSid)
2432 {
2433 int count = *GetSidSubAuthorityCount(info->DomainSid);
2434 CopySid(GetSidLengthRequired(count), &max_sid, info->DomainSid);
2435 test_sid_str((PSID)&max_sid.sid);
2437 max_sid.sid.SubAuthorityCount = count + 1;
2438 test_sid_str((PSID)&max_sid.sid);
2440 test_sid_str((PSID)&max_sid.sid);
2442 test_sid_str((PSID)&max_sid.sid);
2444 test_sid_str((PSID)&max_sid.sid);
2446 test_sid_str((PSID)&max_sid.sid);
2448 test_sid_str((PSID)&max_sid.sid);
2450 test_sid_str((PSID)&max_sid.sid);
2452 test_sid_str((PSID)&max_sid.sid);
2454 test_sid_str((PSID)&max_sid.sid);
2456 test_sid_str((PSID)&max_sid.sid);
2458 test_sid_str((PSID)&max_sid.sid);
2460 test_sid_str((PSID)&max_sid.sid);
2461 max_sid.sid.SubAuthority[count] = 1000; /* first user account */
2462 test_sid_str((PSID)&max_sid.sid);
2463 }
2464
2466 }
2467
2469 ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08lx\n", status);
2470 }
2471}
2472
2473static BOOL get_sid_info(PSID psid, LPSTR *user, LPSTR *dom)
2474{
2475 static CHAR account[UNLEN + 1];
2476 static CHAR domain[UNLEN + 1];
2477 DWORD size, dom_size;
2478 SID_NAME_USE use;
2479
2480 *user = account;
2481 *dom = domain;
2482
2483 size = dom_size = UNLEN + 1;
2484 account[0] = '\0';
2485 domain[0] = '\0';
2486 SetLastError(0xdeadbeef);
2487 return LookupAccountSidA(NULL, psid, account, &size, domain, &dom_size, &use);
2488}
2489
2491{
2493 PSID domainsid = NULL;
2494 char wk_sid[SECURITY_MAX_SID_SIZE];
2495 DWORD cb;
2496
2497 DWORD sid_size, domain_size;
2498 SID_NAME_USE sid_use;
2499 LPSTR domain, account, sid_domain, wk_domain, wk_account;
2500 PSID psid;
2501 BOOL ret ,ret2;
2502
2503 sid_size = 0;
2504 domain_size = 0;
2505 ret = LookupAccountNameA(NULL, name, NULL, &sid_size, NULL, &domain_size, &sid_use);
2506 ok(!ret, " %s Should have failed to lookup account name\n", name);
2507 psid = malloc(sid_size);
2508 domain = malloc(domain_size);
2509 ret = LookupAccountNameA(NULL, name, psid, &sid_size, domain, &domain_size, &sid_use);
2510
2511 if (!result)
2512 {
2513 ok(!ret, " %s Should have failed to lookup account name\n",name);
2514 goto cleanup;
2515 }
2516
2517 AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
2518 cb = sizeof(wk_sid);
2519 if (!CreateWellKnownSid(result, domainsid, wk_sid, &cb))
2520 {
2521 win_skip("SID %i is not available on the system\n",result);
2522 goto cleanup;
2523 }
2524
2525 ret2 = get_sid_info(wk_sid, &wk_account, &wk_domain);
2526 if (!ret2 && GetLastError() == ERROR_NONE_MAPPED)
2527 {
2528 win_skip("CreateWellKnownSid() succeeded but the account '%s' is not present (W2K)\n", name);
2529 goto cleanup;
2530 }
2531
2532 get_sid_info(psid, &account, &sid_domain);
2533
2534 ok(ret, "Failed to lookup account name %s\n",name);
2535 ok(sid_size != 0, "sid_size was zero\n");
2536
2537#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, Win8.1, and Win10 1607.
2538 ok(EqualSid(psid,wk_sid),"%s Sid %s fails to match well known sid %s!\n",
2539 name, debugstr_sid(psid), debugstr_sid(wk_sid));
2540#endif
2541
2542 ok(!lstrcmpA(account, wk_account), "Expected %s , got %s\n", account, wk_account);
2543 ok(!lstrcmpA(domain, wk_domain), "Expected %s, got %s\n", wk_domain, domain);
2544 ok(sid_use == SidTypeWellKnownGroup , "Expected Use (5), got %d\n", sid_use);
2545
2546cleanup:
2547 FreeSid(domainsid);
2548 free(psid);
2549 free(domain);
2550}
2551
2552static void test_LookupAccountName(void)
2553{
2554 DWORD sid_size, domain_size, user_size;
2555 DWORD sid_save, domain_save;
2556 CHAR user_name[UNLEN + 1];
2558 SID_NAME_USE sid_use;
2559 LPSTR domain, account, sid_dom;
2560 PSID psid;
2561 BOOL ret;
2562
2563 /* native crashes if (assuming all other parameters correct):
2564 * - peUse is NULL
2565 * - Sid is NULL and cbSid is > 0
2566 * - cbSid or cchReferencedDomainName are NULL
2567 * - ReferencedDomainName is NULL and cchReferencedDomainName is the correct size
2568 */
2569
2570 user_size = UNLEN + 1;
2571 SetLastError(0xdeadbeef);
2572 ret = GetUserNameA(user_name, &user_size);
2573 ok(ret, "Failed to get user name : %ld\n", GetLastError());
2574
2575 /* get sizes */
2576 sid_size = 0;
2577 domain_size = 0;
2578 sid_use = 0xcafebabe;
2579 SetLastError(0xdeadbeef);
2580 ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, NULL, &domain_size, &sid_use);
2582 {
2583 win_skip("LookupAccountNameA is not implemented\n");
2584 return;
2585 }
2586 ok(!ret, "Expected 0, got %d\n", ret);
2588 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2589 ok(sid_size != 0, "Expected non-zero sid size\n");
2590 ok(domain_size != 0, "Expected non-zero domain size\n");
2591 ok(sid_use == (SID_NAME_USE)0xcafebabe, "Expected 0xcafebabe, got %d\n", sid_use);
2592
2593 sid_save = sid_size;
2594 domain_save = domain_size;
2595
2596 psid = malloc(sid_size);
2597 domain = malloc(domain_size);
2598
2599 /* try valid account name */
2600 ret = LookupAccountNameA(NULL, user_name, psid, &sid_size, domain, &domain_size, &sid_use);
2601 get_sid_info(psid, &account, &sid_dom);
2602 ok(ret, "Failed to lookup account name\n");
2603 ok(sid_size == GetLengthSid(psid), "Expected %ld, got %ld\n", GetLengthSid(psid), sid_size);
2604 ok(!lstrcmpA(account, user_name), "Expected %s, got %s\n", user_name, account);
2605 ok(!lstrcmpiA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
2606 ok(domain_size == domain_save - 1, "Expected %ld, got %ld\n", domain_save - 1, domain_size);
2607 ok(strlen(domain) == domain_size, "Expected %d, got %ld\n", lstrlenA(domain), domain_size);
2608 ok(sid_use == SidTypeUser, "Expected SidTypeUser (%d), got %d\n", SidTypeUser, sid_use);
2609 domain_size = domain_save;
2610 sid_size = sid_save;
2611
2613 {
2614 skip("Non-English locale (test with hardcoded 'Everyone')\n");
2615 }
2616 else
2617 {
2618 ret = LookupAccountNameA(NULL, "Everyone", psid, &sid_size, domain, &domain_size, &sid_use);
2619 get_sid_info(psid, &account, &sid_dom);
2620 ok(ret, "Failed to lookup account name\n");
2621 ok(sid_size != 0, "sid_size was zero\n");
2622 ok(!lstrcmpA(account, "Everyone"), "Expected Everyone, got %s\n", account);
2623 ok(!lstrcmpiA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
2624 ok(domain_size == 0, "Expected 0, got %ld\n", domain_size);
2625 ok(strlen(domain) == domain_size, "Expected %d, got %ld\n", lstrlenA(domain), domain_size);
2626 ok(sid_use == SidTypeWellKnownGroup, "Expected SidTypeWellKnownGroup (%d), got %d\n", SidTypeWellKnownGroup, sid_use);
2627 domain_size = domain_save;
2628 }
2629
2630 /* NULL Sid with zero sid size */
2631 SetLastError(0xdeadbeef);
2632 sid_size = 0;
2633 ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, domain, &domain_size, &sid_use);
2634 ok(!ret, "Expected 0, got %d\n", ret);
2636 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2637 ok(sid_size == sid_save, "Expected %ld, got %ld\n", sid_save, sid_size);
2638 ok(domain_size == domain_save, "Expected %ld, got %ld\n", domain_save, domain_size);
2639
2640 /* try cchReferencedDomainName - 1 */
2641 SetLastError(0xdeadbeef);
2642 domain_size--;
2643 ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, domain, &domain_size, &sid_use);
2644 ok(!ret, "Expected 0, got %d\n", ret);
2646 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2647 ok(sid_size == sid_save, "Expected %ld, got %ld\n", sid_save, sid_size);
2648 ok(domain_size == domain_save, "Expected %ld, got %ld\n", domain_save, domain_size);
2649
2650 /* NULL ReferencedDomainName with zero domain name size */
2651 SetLastError(0xdeadbeef);
2652 domain_size = 0;
2653 ret = LookupAccountNameA(NULL, user_name, psid, &sid_size, NULL, &domain_size, &sid_use);
2654 ok(!ret, "Expected 0, got %d\n", ret);
2656 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2657 ok(sid_size == sid_save, "Expected %ld, got %ld\n", sid_save, sid_size);
2658 ok(domain_size == domain_save, "Expected %ld, got %ld\n", domain_save, domain_size);
2659
2660 free(psid);
2661 free(domain);
2662
2663 /* get sizes for NULL account name */
2664 sid_size = 0;
2665 domain_size = 0;
2666 sid_use = 0xcafebabe;
2667 SetLastError(0xdeadbeef);
2668 ret = LookupAccountNameA(NULL, NULL, NULL, &sid_size, NULL, &domain_size, &sid_use);
2669 ok(!ret, "Expected 0, got %d\n", ret);
2671 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2672 ok(sid_size != 0, "Expected non-zero sid size\n");
2673 ok(domain_size != 0, "Expected non-zero domain size\n");
2674 ok(sid_use == (SID_NAME_USE)0xcafebabe, "Expected 0xcafebabe, got %d\n", sid_use);
2675
2676 psid = malloc(sid_size);
2677 domain = malloc(domain_size);
2678
2679 /* try NULL account name */
2680 ret = LookupAccountNameA(NULL, NULL, psid, &sid_size, domain, &domain_size, &sid_use);
2681 get_sid_info(psid, &account, &sid_dom);
2682 ok(ret, "Failed to lookup account name\n");
2683 /* Using a fixed string will not work on different locales */
2685 "Got %s for account and %s for domain, these should be the same\n", account, domain);
2686 ok(sid_use == SidTypeDomain, "Expected SidTypeDomain (%d), got %d\n", SidTypeDomain, sid_use);
2687
2688 free(psid);
2689 free(domain);
2690
2691 /* try an invalid account name */
2692 SetLastError(0xdeadbeef);
2693 sid_size = 0;
2694 domain_size = 0;
2695 ret = LookupAccountNameA(NULL, "oogabooga", NULL, &sid_size, NULL, &domain_size, &sid_use);
2696 ok(!ret, "Expected 0, got %d\n", ret);
2699 "Expected ERROR_NONE_MAPPED, got %ld\n", GetLastError());
2700 ok(sid_size == 0, "Expected 0, got %ld\n", sid_size);
2701 ok(domain_size == 0, "Expected 0, got %ld\n", domain_size);
2702
2703 /* try an invalid system name */
2704 SetLastError(0xdeadbeef);
2705 sid_size = 0;
2706 domain_size = 0;
2707 ret = LookupAccountNameA("deepthought", NULL, NULL, &sid_size, NULL, &domain_size, &sid_use);
2708 ok(!ret, "Expected 0, got %d\n", ret);
2710 "Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %ld\n", GetLastError());
2711 ok(sid_size == 0, "Expected 0, got %ld\n", sid_size);
2712 ok(domain_size == 0, "Expected 0, got %ld\n", domain_size);
2713
2714 /* try with the computer name as the account name */
2715 domain_size = sizeof(computer_name);
2716 GetComputerNameA(computer_name, &domain_size);
2717 sid_size = 0;
2718 domain_size = 0;
2719 ret = LookupAccountNameA(NULL, computer_name, NULL, &sid_size, NULL, &domain_size, &sid_use);
2721 GetLastError() == ERROR_NONE_MAPPED /* in a domain */ ||
2724 "LookupAccountNameA failed: %ld\n", GetLastError());
2726 {
2727 psid = malloc(sid_size);
2728 domain = malloc(domain_size);
2729 ret = LookupAccountNameA(NULL, computer_name, psid, &sid_size, domain, &domain_size, &sid_use);
2730 ok(ret, "LookupAccountNameA failed: %ld\n", GetLastError());
2731 ok(sid_use == SidTypeDomain ||
2732 (sid_use == SidTypeUser && ! strcmp(computer_name, user_name)), "expected SidTypeDomain for %s, got %d\n", computer_name, sid_use);
2733 free(domain);
2734 free(psid);
2735 }
2736
2737 /* Well Known names */
2739 {
2740 skip("Non-English locale (skipping well known name creation tests)\n");
2741 return;
2742 }
2743
2744 check_wellknown_name("LocalService", WinLocalServiceSid);
2745 check_wellknown_name("Local Service", WinLocalServiceSid);
2746 /* 2 spaces */
2747 check_wellknown_name("Local Service", 0);
2748 check_wellknown_name("NetworkService", WinNetworkServiceSid);
2749 check_wellknown_name("Network Service", WinNetworkServiceSid);
2750
2751 /* example of some names where the spaces are not optional */
2752 check_wellknown_name("Terminal Server User", WinTerminalServerSid);
2753 check_wellknown_name("TerminalServer User", 0);
2754 check_wellknown_name("TerminalServerUser", 0);
2755 check_wellknown_name("Terminal ServerUser", 0);
2756
2757 check_wellknown_name("enterprise domain controllers",WinEnterpriseControllersSid);
2758 check_wellknown_name("enterprisedomain controllers", 0);
2759 check_wellknown_name("enterprise domaincontrollers", 0);
2760 check_wellknown_name("enterprisedomaincontrollers", 0);
2761
2762 /* case insensitivity */
2763 check_wellknown_name("lOCAlServICE", WinLocalServiceSid);
2764
2765 /* fully qualified account names */
2766 check_wellknown_name("NT AUTHORITY\\LocalService", WinLocalServiceSid);
2767 check_wellknown_name("nt authority\\Network Service", WinNetworkServiceSid);
2768 check_wellknown_name("nt authority test\\Network Service", 0);
2769 check_wellknown_name("Dummy\\Network Service", 0);
2770 check_wellknown_name("ntauthority\\Network Service", 0);
2771}
2772
2774{
2775 SECURITY_DESCRIPTOR sd, *sd_rel, *sd_rel2, *sd_abs;
2776 char buf[8192];
2777 DWORD size, size_dacl, size_sacl, size_owner, size_group;
2778 BOOL isDefault, isPresent, ret;
2779 PACL pacl, dacl, sacl;
2780 PSID psid, owner, group;
2781
2782 SetLastError(0xdeadbeef);
2785 {
2786 win_skip("InitializeSecurityDescriptor is not implemented\n");
2787 return;
2788 }
2789
2790 ok(GetSecurityDescriptorOwner(&sd, &psid, &isDefault), "GetSecurityDescriptorOwner failed\n");
2791 expect_eq(psid, NULL, PSID, "%p");
2792 expect_eq(isDefault, FALSE, BOOL, "%d");
2793 sd.Control |= SE_DACL_PRESENT | SE_SACL_PRESENT;
2794
2795 SetLastError(0xdeadbeef);
2796 size = 5;
2799 ok(size > 5, "Size not increased\n");
2800 if (size <= 8192)
2801 {
2803 ok(GetSecurityDescriptorOwner(&sd, &psid, &isDefault), "GetSecurityDescriptorOwner failed\n");
2804 expect_eq(psid, NULL, PSID, "%p");
2805 expect_eq(isDefault, FALSE, BOOL, "%d");
2806 ok(GetSecurityDescriptorGroup(&sd, &psid, &isDefault), "GetSecurityDescriptorGroup failed\n");
2807 expect_eq(psid, NULL, PSID, "%p");
2808 expect_eq(isDefault, FALSE, BOOL, "%d");
2809 ok(GetSecurityDescriptorDacl(&sd, &isPresent, &pacl, &isDefault), "GetSecurityDescriptorDacl failed\n");
2810 expect_eq(isPresent, TRUE, BOOL, "%d");
2811 expect_eq(psid, NULL, PSID, "%p");
2812 expect_eq(isDefault, FALSE, BOOL, "%d");
2813 ok(GetSecurityDescriptorSacl(&sd, &isPresent, &pacl, &isDefault), "GetSecurityDescriptorSacl failed\n");
2814 expect_eq(isPresent, TRUE, BOOL, "%d");
2815 expect_eq(psid, NULL, PSID, "%p");
2816 expect_eq(isDefault, FALSE, BOOL, "%d");
2817 }
2818
2820 "O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)"
2821 "(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)"
2822 "(AU;NPSA;0x12019f;;;SU)", SDDL_REVISION_1, (void **)&sd_rel, NULL);
2823 ok(ret, "got %lu\n", GetLastError());
2824
2825 size = 0;
2826 ret = MakeSelfRelativeSD(sd_rel, NULL, &size);
2828
2829 /* convert to absolute form */
2830 size = size_dacl = size_sacl = size_owner = size_group = 0;
2831 ret = MakeAbsoluteSD(sd_rel, NULL, &size, NULL, &size_dacl, NULL, &size_sacl, NULL, &size_owner, NULL,
2832 &size_group);
2833 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError());
2834
2835 sd_abs = malloc(size + size_dacl + size_sacl + size_owner + size_group);
2836 dacl = (PACL)(sd_abs + 1);
2837 sacl = (PACL)((char *)dacl + size_dacl);
2838 owner = (PSID)((char *)sacl + size_sacl);
2839 group = (PSID)((char *)owner + size_owner);
2840 ret = MakeAbsoluteSD(sd_rel, sd_abs, &size, dacl, &size_dacl, sacl, &size_sacl, owner, &size_owner,
2841 group, &size_group);
2842 ok(ret, "got %lu\n", GetLastError());
2843
2844 size = 0;
2845 ret = MakeSelfRelativeSD(sd_abs, NULL, &size);
2846 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError());
2847 ok(size == 184, "got %lu\n", size);
2848
2849 size += 4;
2850 sd_rel2 = malloc(size);
2851 ret = MakeSelfRelativeSD(sd_abs, sd_rel2, &size);
2852 ok(ret, "got %lu\n", GetLastError());
2853 ok(size == 188, "got %lu\n", size);
2854
2855 free(sd_abs);
2856 free(sd_rel2);
2857 LocalFree(sd_rel);
2858}
2859
2860#define TEST_GRANTED_ACCESS(a,b) test_granted_access(a,b,0,__LINE__)
2861#define TEST_GRANTED_ACCESS2(a,b,c) test_granted_access(a,b,c,__LINE__)
2863 ACCESS_MASK alt, int line)
2864{
2865 OBJECT_BASIC_INFORMATION obj_info;
2867
2869 sizeof(obj_info), NULL );
2870 ok_(__FILE__, line)(!status, "NtQueryObject with err: %08lx\n", status);
2871 if (alt)
2872 ok_(__FILE__, line)(obj_info.GrantedAccess == access ||
2873 obj_info.GrantedAccess == alt, "Granted access should be 0x%08lx "
2874 "or 0x%08lx, instead of 0x%08lx\n", access, alt, obj_info.GrantedAccess);
2875 else
2876 ok_(__FILE__, line)(obj_info.GrantedAccess == access, "Granted access should "
2877 "be 0x%08lx, instead of 0x%08lx\n", access, obj_info.GrantedAccess);
2878}
2879
2880#define CHECK_SET_SECURITY(o,i,e) \
2881 do{ \
2882 BOOL res_; \
2883 DWORD err; \
2884 SetLastError( 0xdeadbeef ); \
2885 res_ = SetKernelObjectSecurity( o, i, SecurityDescriptor ); \
2886 err = GetLastError(); \
2887 if (e == ERROR_SUCCESS) \
2888 ok(res_, "SetKernelObjectSecurity failed with %ld\n", err); \
2889 else \
2890 ok(!res_ && err == e, "SetKernelObjectSecurity should have failed " \
2891 "with %s, instead of %ld\n", #e, err); \
2892 }while(0)
2893
2894static void test_process_security(void)
2895{
2896 BOOL res;
2898 PTOKEN_OWNER owner;
2900 PSID AdminSid = NULL, UsersSid = NULL, UserSid = NULL;
2901 PACL Acl = NULL, ThreadAcl = NULL;
2902 SECURITY_DESCRIPTOR *SecurityDescriptor = NULL, *ThreadSecurityDescriptor = NULL;
2908 DWORD size, acc_size, dom_size, ret;
2910 PSID EveryoneSid = NULL;
2911 SID_NAME_USE use;
2912
2913 Acl = malloc(256);
2914 res = InitializeAcl(Acl, 256, ACL_REVISION);
2916 {
2917 win_skip("ACLs not implemented - skipping tests\n");
2918 free(Acl);
2919 return;
2920 }
2921 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
2922
2923 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
2924 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
2925
2926 /* get owner from the token we might be running as a user not admin */
2928 ok(res, "OpenProcessToken failed with error %ld\n", GetLastError());
2929 if (!res)
2930 {
2931 free(Acl);
2932 return;
2933 }
2934
2936 ok(!res, "Expected failure, got %d\n", res);
2938 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2939
2940 owner = malloc(size);
2942 ok(res, "GetTokenInformation failed with error %ld\n", GetLastError());
2943 AdminSid = owner->Owner;
2945
2947 ok(!res, "Expected failure, got %d\n", res);
2949 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2950
2951 group = malloc(size);
2953 ok(res, "GetTokenInformation failed with error %ld\n", GetLastError());
2954 UsersSid = group->PrimaryGroup;
2955 test_sid_str(UsersSid);
2956
2957 acc_size = sizeof(account);
2958 dom_size = sizeof(domain);
2959 ret = LookupAccountSidA( NULL, UsersSid, account, &acc_size, domain, &dom_size, &use );
2960 ok(ret, "LookupAccountSid failed with %ld\n", ret);
2961 ok(use == SidTypeGroup, "expect SidTypeGroup, got %d\n", use);
2963 skip("Non-English locale (test with hardcoded 'None')\n");
2964 else
2965 ok(!strcmp(account, "None"), "expect None, got %s\n", account);
2966
2968 ok(!res, "Expected failure, got %d\n", res);
2970 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2971
2972 user = malloc(size);
2974 ok(res, "GetTokenInformation failed with error %ld\n", GetLastError());
2975 UserSid = user->User.Sid;
2976 test_sid_str(UserSid);
2977 ok(EqualPrefixSid(UsersSid, UserSid), "TokenPrimaryGroup Sid and TokenUser Sid don't match.\n");
2978
2979 CloseHandle( token );
2980 if (!res)
2981 {
2982 free(group);
2983 free(owner);
2984 free(user);
2985 free(Acl);
2986 return;
2987 }
2988
2990 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError());
2992 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
2993
2996 ok(res, "InitializeSecurityDescriptor failed with error %ld\n", GetLastError());
2997
2998 event = CreateEventA( NULL, TRUE, TRUE, "test_event" );
2999 ok(event != NULL, "CreateEvent %ld\n", GetLastError());
3000
3001 SecurityDescriptor->Revision = 0;
3004
3009 /* NULL DACL is valid and means that everyone has access */
3012
3013#ifdef __REACTOS__
3014 /* This crashes on Vista, Win7, and Win8.1. */
3016#endif
3017 /* Set owner and group and dacl */
3019 ok(res, "SetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
3021 test_owner_equal( event, AdminSid, __LINE__ );
3022
3024 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3026 test_group_equal( event, EveryoneSid, __LINE__ );
3027
3029 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
3031 /* setting a dacl should not change the owner or group */
3032 test_owner_equal( event, AdminSid, __LINE__ );
3033 test_group_equal( event, EveryoneSid, __LINE__ );
3034
3035 /* Test again with a different SID in case the previous SID also happens to
3036 * be the one that is incorrectly replacing the group. */
3038 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3040 test_group_equal( event, UsersSid, __LINE__ );
3041
3043 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
3045 test_group_equal( event, UsersSid, __LINE__ );
3046#ifdef __REACTOS__
3047 }
3048#endif
3049
3050 sprintf(buffer, "%s security test", myARGV[0]);
3051 memset(&startup, 0, sizeof(startup));
3052 startup.cb = sizeof(startup);
3053 startup.dwFlags = STARTF_USESHOWWINDOW;
3054 startup.wShowWindow = SW_SHOWNORMAL;
3055
3056 psa.nLength = sizeof(psa);
3057 psa.lpSecurityDescriptor = SecurityDescriptor;
3058 psa.bInheritHandle = TRUE;
3059
3060 ThreadSecurityDescriptor = malloc( SECURITY_DESCRIPTOR_MIN_LENGTH );
3061 res = InitializeSecurityDescriptor( ThreadSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION );
3062 ok(res, "InitializeSecurityDescriptor failed with error %ld\n", GetLastError());
3063
3064 ThreadAcl = malloc( 256 );
3065 res = InitializeAcl( ThreadAcl, 256, ACL_REVISION );
3066 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
3068 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError() );
3070 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3071
3072 res = SetSecurityDescriptorOwner( ThreadSecurityDescriptor, AdminSid, FALSE );
3073 ok(res, "SetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
3074 res = SetSecurityDescriptorGroup( ThreadSecurityDescriptor, UsersSid, FALSE );
3075 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3076 res = SetSecurityDescriptorDacl( ThreadSecurityDescriptor, TRUE, ThreadAcl, FALSE );
3077 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
3078
3079 tsa.nLength = sizeof(tsa);
3080 tsa.lpSecurityDescriptor = ThreadSecurityDescriptor;
3081 tsa.bInheritHandle = TRUE;
3082
3083 /* Doesn't matter what ACL say we should get full access for ourselves */
3084 res = CreateProcessA( NULL, buffer, &psa, &tsa, FALSE, 0, NULL, NULL, &startup, &info );
3085 ok(res, "CreateProcess with err:%ld\n", GetLastError());
3090 wait_child_process( info.hProcess );
3091
3092 FreeSid(EveryoneSid);
3093 CloseHandle( info.hProcess );
3094 CloseHandle( info.hThread );
3095 CloseHandle( event );
3096 free(group);
3097 free(owner);
3098 free(user);
3099 free(Acl);
3101 free(ThreadAcl);
3102 free(ThreadSecurityDescriptor);
3103}
3104
3106{
3107 HANDLE handle, handle1;
3108 BOOL ret;
3109 DWORD err;
3110
3112 ok(handle != NULL, "OpenProcess(PROCESS_TERMINATE) with err:%ld\n", GetLastError());
3114
3116 &handle1, 0, TRUE, DUPLICATE_SAME_ACCESS );
3117 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3119
3120 CloseHandle( handle1 );
3121
3122 SetLastError( 0xdeadbeef );
3124 &handle1, PROCESS_ALL_ACCESS, TRUE, 0 );
3125 err = GetLastError();
3126#ifdef __REACTOS__
3127 ok((!ret && err == ERROR_ACCESS_DENIED) || broken(ret && err == 0xdeadbeef) /* Vista-Win10 1607 */, "duplicating handle should have failed "
3128#else
3129 ok(!ret && err == ERROR_ACCESS_DENIED, "duplicating handle should have failed "
3130#endif
3131 "with STATUS_ACCESS_DENIED, instead of err:%ld\n", err);
3132
3134
3135#ifndef __REACTOS__ // Incorrect for WS03-Win10 1607
3136 /* These two should fail - they are denied by ACL */
3138 ok(handle == NULL, "OpenProcess(PROCESS_VM_READ) should have failed\n");
3140 ok(handle == NULL, "OpenProcess(PROCESS_ALL_ACCESS) should have failed\n");
3141#endif
3142
3143 /* Documented privilege elevation */
3146 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3149
3151
3152 /* Same only explicitly asking for all access rights */
3155 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3159 &handle1, PROCESS_VM_READ, TRUE, 0 );
3160 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3162 CloseHandle( handle1 );
3164
3165 /* Test thread security */
3167 ok(handle != NULL, "OpenThread(THREAD_TERMINATE) with err:%ld\n", GetLastError());
3170
3171#ifndef __REACTOS__ // Incorrect for WS03-Win10 1607
3173 ok(handle == NULL, "OpenThread(THREAD_SET_THREAD_TOKEN) should have failed\n");
3174#endif
3175}
3176
3178{
3179 HANDLE Token, ProcessToken;
3180 HANDLE Token2;
3181 DWORD Size;
3184 PRIVILEGE_SET *PrivilegeSet;
3186 BOOL ret;
3187 HKEY hkey;
3188 DWORD error;
3189
3190 SetLastError(0xdeadbeef);
3193 {
3194 win_skip("ImpersonateSelf is not implemented\n");
3195 return;
3196 }
3197 ok(ret, "ImpersonateSelf(SecurityAnonymous) failed with error %ld\n", GetLastError());
3199 ok(!ret, "OpenThreadToken should have failed\n");
3200 error = GetLastError();
3201 ok(error == ERROR_CANT_OPEN_ANONYMOUS, "OpenThreadToken on anonymous token should have returned ERROR_CANT_OPEN_ANONYMOUS instead of %ld\n", error);
3202 /* can't perform access check when opening object against an anonymous impersonation token */
3203 todo_wine {
3204 error = RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
3206 "RegOpenKeyEx failed with %ld\n", error);
3207 }
3208 RevertToSelf();
3209
3211 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
3212
3213 ret = DuplicateTokenEx(ProcessToken,
3216 ok(ret, "DuplicateTokenEx failed with error %ld\n", GetLastError());
3217 /* can't increase the impersonation level */
3219 error = GetLastError();
3221 "Duplicating a token and increasing the impersonation level should have failed with ERROR_BAD_IMPERSONATION_LEVEL instead of %ld\n", error);
3222 /* we can query anything from an anonymous token, including the user */
3224 error = GetLastError();
3225 ok(!ret && error == ERROR_INSUFFICIENT_BUFFER, "GetTokenInformation(TokenUser) should have failed with ERROR_INSUFFICIENT_BUFFER instead of %ld\n", error);
3226 User = malloc(Size);
3228 ok(ret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3229 free(User);
3230
3231 /* PrivilegeCheck fails with SecurityAnonymous level */
3233 error = GetLastError();
3234 ok(!ret && error == ERROR_INSUFFICIENT_BUFFER, "GetTokenInformation(TokenPrivileges) should have failed with ERROR_INSUFFICIENT_BUFFER instead of %ld\n", error);
3237 ok(ret, "GetTokenInformation(TokenPrivileges) failed with error %ld\n", GetLastError());
3238
3239 PrivilegeSet = malloc(FIELD_OFFSET(PRIVILEGE_SET, Privilege[Privileges->PrivilegeCount]));
3240 PrivilegeSet->PrivilegeCount = Privileges->PrivilegeCount;
3241 memcpy(PrivilegeSet->Privilege, Privileges->Privileges, PrivilegeSet->PrivilegeCount * sizeof(PrivilegeSet->Privilege[0]));
3242 PrivilegeSet->Control = PRIVILEGE_SET_ALL_NECESSARY;
3244
3245 ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
3246 error = GetLastError();
3247 ok(!ret && error == ERROR_BAD_IMPERSONATION_LEVEL, "PrivilegeCheck for SecurityAnonymous token should have failed with ERROR_BAD_IMPERSONATION_LEVEL instead of %ld\n", error);
3248
3250
3252 ok(ret, "ImpersonateSelf(SecurityIdentification) failed with error %ld\n", GetLastError());
3254 ok(ret, "OpenThreadToken failed with error %ld\n", GetLastError());
3255
3256 /* can't perform access check when opening object against an identification impersonation token */
3257 error = RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
3258 todo_wine {
3260 "RegOpenKeyEx should have failed with ERROR_INVALID_HANDLE, ERROR_BAD_IMPERSONATION_LEVEL or ERROR_ACCESS_DENIED instead of %ld\n", error);
3261 }
3262 ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
3263 ok(ret, "PrivilegeCheck for SecurityIdentification failed with error %ld\n", GetLastError());
3265 RevertToSelf();
3266
3268 ok(ret, "ImpersonateSelf(SecurityImpersonation) failed with error %ld\n", GetLastError());
3270 ok(ret, "OpenThreadToken failed with error %ld\n", GetLastError());
3271 error = RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
3272 ok(error == ERROR_SUCCESS, "RegOpenKeyEx should have succeeded instead of failing with %ld\n", error);
3273 RegCloseKey(hkey);
3274 ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
3275 ok(ret, "PrivilegeCheck for SecurityImpersonation failed with error %ld\n", GetLastError());
3276 RevertToSelf();
3277
3279 CloseHandle(ProcessToken);
3280
3281 free(PrivilegeSet);
3282}
3283
3284static void test_SetEntriesInAclW(void)
3285{
3286 DWORD res;
3287 PSID EveryoneSid = NULL, UsersSid = NULL;
3288 PACL OldAcl = NULL, NewAcl;
3291 EXPLICIT_ACCESSW ExplicitAccess;
3292 static const WCHAR wszEveryone[] = {'E','v','e','r','y','o','n','e',0};
3293 static const WCHAR wszCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
3294
3295 NewAcl = (PACL)0xdeadbeef;
3296 res = SetEntriesInAclW(0, NULL, NULL, &NewAcl);
3297 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3298 ok(NewAcl == NULL, "NewAcl=%p, expected NULL\n", NewAcl);
3299 LocalFree(NewAcl);
3300
3301 OldAcl = malloc(256);
3302 res = InitializeAcl(OldAcl, 256, ACL_REVISION);
3304 {
3305 win_skip("ACLs not implemented - skipping tests\n");
3306 free(OldAcl);
3307 return;
3308 }
3309 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
3310
3311 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
3312 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3313
3315 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &UsersSid);
3316 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3317
3318 res = AddAccessAllowedAce(OldAcl, ACL_REVISION, KEY_READ, UsersSid);
3319 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3320
3321 ExplicitAccess.grfAccessPermissions = KEY_WRITE;
3322 ExplicitAccess.grfAccessMode = GRANT_ACCESS;
3323 ExplicitAccess.grfInheritance = NO_INHERITANCE;
3325 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3326 ExplicitAccess.Trustee.ptstrName = EveryoneSid;
3327 ExplicitAccess.Trustee.MultipleTrusteeOperation = 0xDEADBEEF;
3328 ExplicitAccess.Trustee.pMultipleTrustee = (PVOID)0xDEADBEEF;
3329 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3330 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3331 ok(NewAcl != NULL, "returned acl was NULL\n");
3332 LocalFree(NewAcl);
3333
3334 ExplicitAccess.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
3335 ExplicitAccess.Trustee.pMultipleTrustee = NULL;
3337 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3338 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3339 ok(NewAcl != NULL, "returned acl was NULL\n");
3340 LocalFree(NewAcl);
3341
3343 {
3344 skip("Non-English locale (test with hardcoded 'Everyone')\n");
3345 }
3346 else
3347 {
3348 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3349 ExplicitAccess.Trustee.ptstrName = (LPWSTR)wszEveryone;
3350 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3351 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3352 ok(NewAcl != NULL, "returned acl was NULL\n");
3353 LocalFree(NewAcl);
3354
3355 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_BAD_FORM;
3356 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3358 "SetEntriesInAclW failed: %lu\n", res);
3359 ok(NewAcl == NULL,
3360 "returned acl wasn't NULL: %p\n", NewAcl);
3361
3362 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3364 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3366 "SetEntriesInAclW failed: %lu\n", res);
3367 ok(NewAcl == NULL,
3368 "returned acl wasn't NULL: %p\n", NewAcl);
3369
3371 ExplicitAccess.grfAccessMode = SET_ACCESS;
3372 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3373 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3374 ok(NewAcl != NULL, "returned acl was NULL\n");
3375 LocalFree(NewAcl);
3376 }
3377
3378 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3379 ExplicitAccess.Trustee.ptstrName = (LPWSTR)wszCurrentUser;
3380 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3381 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3382 ok(NewAcl != NULL, "returned acl was NULL\n");
3383 LocalFree(NewAcl);
3384
3385 ExplicitAccess.grfAccessMode = REVOKE_ACCESS;
3386 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3387 ExplicitAccess.Trustee.ptstrName = UsersSid;
3388 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3389 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3390 ok(NewAcl != NULL, "returned acl was NULL\n");
3391 LocalFree(NewAcl);
3392
3393 FreeSid(UsersSid);
3394 FreeSid(EveryoneSid);
3395 free(OldAcl);
3396}
3397
3398static void test_SetEntriesInAclA(void)
3399{
3400 DWORD res;
3401 PSID EveryoneSid = NULL, UsersSid = NULL;
3402 PACL OldAcl = NULL, NewAcl;
3405 EXPLICIT_ACCESSA ExplicitAccess;
3406 static const CHAR szEveryone[] = {'E','v','e','r','y','o','n','e',0};
3407 static const CHAR szCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
3408
3409 NewAcl = (PACL)0xdeadbeef;
3410 res = SetEntriesInAclA(0, NULL, NULL, &NewAcl);
3412 {
3413 win_skip("SetEntriesInAclA is not implemented\n");
3414 return;
3415 }
3416 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3417 ok(NewAcl == NULL,
3418 "NewAcl=%p, expected NULL\n", NewAcl);
3419 LocalFree(NewAcl);
3420
3421 OldAcl = malloc(256);
3422 res = InitializeAcl(OldAcl, 256, ACL_REVISION);
3424 {
3425 win_skip("ACLs not implemented - skipping tests\n");
3426 free(OldAcl);
3427 return;
3428 }
3429 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
3430
3431 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
3432 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3433
3435 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &UsersSid);
3436 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3437
3438 res = AddAccessAllowedAce(OldAcl, ACL_REVISION, KEY_READ, UsersSid);
3439 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3440
3441 ExplicitAccess.grfAccessPermissions = KEY_WRITE;
3442 ExplicitAccess.grfAccessMode = GRANT_ACCESS;
3443 ExplicitAccess.grfInheritance = NO_INHERITANCE;
3445 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3446 ExplicitAccess.Trustee.ptstrName = EveryoneSid;
3448 ExplicitAccess.Trustee.pMultipleTrustee = NULL;
3449 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3450 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3451 ok(NewAcl != NULL, "returned acl was NULL\n");
3452 LocalFree(NewAcl);
3453
3454 ExplicitAccess.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
3455 ExplicitAccess.Trustee.pMultipleTrustee = NULL;
3457 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3458 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3459 ok(NewAcl != NULL, "returned acl was NULL\n");
3460 LocalFree(NewAcl);
3461
3463 {
3464 skip("Non-English locale (test with hardcoded 'Everyone')\n");
3465 }
3466 else
3467 {
3468 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3469 ExplicitAccess.Trustee.ptstrName = (LPSTR)szEveryone;
3470 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3471 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3472 ok(NewAcl != NULL, "returned acl was NULL\n");
3473 LocalFree(NewAcl);
3474
3475 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_BAD_FORM;
3476 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3478 "SetEntriesInAclA failed: %lu\n", res);
3479 ok(NewAcl == NULL,
3480 "returned acl wasn't NULL: %p\n", NewAcl);
3481
3482 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3484 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3486 "SetEntriesInAclA failed: %lu\n", res);
3487 ok(NewAcl == NULL,
3488 "returned acl wasn't NULL: %p\n", NewAcl);
3489
3491 ExplicitAccess.grfAccessMode = SET_ACCESS;
3492 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3493 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3494 ok(NewAcl != NULL, "returned acl was NULL\n");
3495 LocalFree(NewAcl);
3496 }
3497
3498 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3499 ExplicitAccess.Trustee.ptstrName = (LPSTR)szCurrentUser;
3500 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3501 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3502 ok(NewAcl != NULL, "returned acl was NULL\n");
3503 LocalFree(NewAcl);
3504
3505 ExplicitAccess.grfAccessMode = REVOKE_ACCESS;
3506 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3507 ExplicitAccess.Trustee.ptstrName = UsersSid;
3508 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3509 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3510 ok(NewAcl != NULL, "returned acl was NULL\n");
3511 LocalFree(NewAcl);
3512
3513 FreeSid(UsersSid);
3514 FreeSid(EveryoneSid);
3515 free(OldAcl);
3516}
3517
3518/* helper function for test_CreateDirectoryA */
3519static void get_nt_pathW(const char *name, UNICODE_STRING *nameW)
3520{
3524 BOOLEAN ret;
3525
3527
3529 ok(!status, "RtlAnsiStringToUnicodeString failed with %08lx\n", status);
3530
3531 ret = pRtlDosPathNameToNtPathName_U(strW.Buffer, nameW, NULL, NULL);
3532 ok(ret, "RtlDosPathNameToNtPathName_U failed\n");
3533
3535}
3536
3537static void test_inherited_dacl(PACL dacl, PSID admin_sid, PSID user_sid, DWORD flags, DWORD mask,
3538 BOOL todo_count, BOOL todo_sid, BOOL todo_flags, int line)
3539{
3540 ACL_SIZE_INFORMATION acl_size;
3541 ACCESS_ALLOWED_ACE *ace;
3542 BOOL bret;
3543
3544 bret = GetAclInformation(dacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3545 ok_(__FILE__, line)(bret, "GetAclInformation failed\n");
3546
3547 todo_wine_if (todo_count)
3548 ok_(__FILE__, line)(acl_size.AceCount == 2,
3549 "GetAclInformation returned unexpected entry count (%ld != 2)\n",
3550 acl_size.AceCount);
3551
3552 if (acl_size.AceCount > 0)
3553 {
3554 bret = GetAce(dacl, 0, (VOID **)&ace);
3555 ok_(__FILE__, line)(bret, "Failed to get Current User ACE\n");
3556
3557 bret = EqualSid(&ace->SidStart, user_sid);
3558 todo_wine_if (todo_sid)
3559 ok_(__FILE__, line)(bret, "Current User ACE (%s) != Current User SID (%s)\n", debugstr_sid(&ace->SidStart), debugstr_sid(user_sid));
3560
3561 todo_wine_if (todo_flags)
3562 ok_(__FILE__, line)(((ACE_HEADER *)ace)->AceFlags == flags,
3563 "Current User ACE has unexpected flags (0x%x != 0x%lx)\n",
3564 ((ACE_HEADER *)ace)->AceFlags, flags);
3565
3566 ok_(__FILE__, line)(ace->Mask == mask,
3567 "Current User ACE has unexpected mask (0x%lx != 0x%lx)\n",
3568 ace->Mask, mask);
3569 }
3570 if (acl_size.AceCount > 1)
3571 {
3572 bret = GetAce(dacl, 1, (VOID **)&ace);
3573 ok_(__FILE__, line)(bret, "Failed to get Administators Group ACE\n");
3574
3575 bret = EqualSid(&ace->SidStart, admin_sid);
3576 todo_wine_if (todo_sid)
3577 ok_(__FILE__, line)(bret, "Administators Group ACE (%s) != Administators Group SID (%s)\n", debugstr_sid(&ace->SidStart), debugstr_sid(admin_sid));
3578
3579 todo_wine_if (todo_flags)
3580 ok_(__FILE__, line)(((ACE_HEADER *)ace)->AceFlags == flags,
3581 "Administators Group ACE has unexpected flags (0x%x != 0x%lx)\n",
3582 ((ACE_HEADER *)ace)->AceFlags, flags);
3583
3584 ok_(__FILE__, line)(ace->Mask == mask,
3585 "Administators Group ACE has unexpected mask (0x%lx != 0x%lx)\n",
3586 ace->Mask, mask);
3587 }
3588}
3589
3590static void test_CreateDirectoryA(void)
3591{
3592 char admin_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES], *user;
3593 DWORD sid_size = sizeof(admin_ptr), user_size;
3594 PSID admin_sid = (PSID) admin_ptr, user_sid;
3596 PSECURITY_DESCRIPTOR pSD = &sd;
3597 ACL_SIZE_INFORMATION acl_size;
3598 UNICODE_STRING tmpfileW;
3601 char tmpfile[MAX_PATH];
3602 char tmpdir[MAX_PATH];
3603 HANDLE token, hTemp;
3605 struct _SID *owner;
3606 BOOL bret = TRUE;
3608 DWORD error;
3609 PACL pDacl;
3610
3612 {
3613 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
3615 }
3616 if (!bret)
3617 {
3618 win_skip("Failed to get current user token\n");
3619 return;
3620 }
3621 bret = GetTokenInformation(token, TokenUser, NULL, 0, &user_size);
3623 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3624 user = malloc(user_size);
3625 bret = GetTokenInformation(token, TokenUser, user, user_size, &user_size);
3626 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3627 CloseHandle( token );
3628 user_sid = ((TOKEN_USER *)user)->User.Sid;
3629
3630 sa.nLength = sizeof(sa);
3631 sa.lpSecurityDescriptor = pSD;
3632 sa.bInheritHandle = TRUE;
3634 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
3635 pDacl = calloc(1, 100);
3636 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
3637 ok(bret, "Failed to initialize ACL.\n");
3639 GENERIC_ALL, user_sid);
3640 ok(bret, "Failed to add Current User to ACL.\n");
3642 GENERIC_ALL, admin_sid);
3643 ok(bret, "Failed to add Administrator Group to ACL.\n");
3644 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3645 ok(bret, "Failed to add ACL to security descriptor.\n");
3646
3648 lstrcatA(tmpdir, "Please Remove Me");
3649 bret = CreateDirectoryA(tmpdir, &sa);
3650 ok(bret == TRUE, "CreateDirectoryA(%s) failed err=%ld\n", tmpdir, GetLastError());
3651 free(pDacl);
3652
3653#ifdef __REACTOS__
3654 /* The rest of this test crashes on WS03, Vista, Win7, and Win8.1. */
3656 goto done;
3657#endif
3658 SetLastError(0xdeadbeef);
3661 NULL, &pDacl, NULL, &pSD);
3663 {
3664 win_skip("GetNamedSecurityInfoA is not implemented\n");
3665 goto done;
3666 }
3667 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3669 0x1f01ff, FALSE, TRUE, FALSE, __LINE__);
3670 LocalFree(pSD);
3671
3672 /* Test inheritance of ACLs in CreateFile without security descriptor */
3674 lstrcatA(tmpfile, "/tmpfile");
3675
3678 ok(hTemp != INVALID_HANDLE_VALUE, "CreateFile error %lu\n", GetLastError());
3679
3682 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3683 ok(error == ERROR_SUCCESS, "Failed to get permissions on file\n");
3684 test_inherited_dacl(pDacl, admin_sid, user_sid, INHERITED_ACE,
3685 0x1f01ff, TRUE, TRUE, TRUE, __LINE__);
3686 LocalFree(pSD);
3687 CloseHandle(hTemp);
3688
3689 /* Test inheritance of ACLs in CreateFile with security descriptor -
3690 * When a security descriptor is set, then inheritance doesn't take effect */
3691 pSD = &sd;
3693 pDacl = malloc(sizeof(ACL));
3694 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
3695 ok(bret, "Failed to initialize ACL\n");
3696 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3697 ok(bret, "Failed to add ACL to security descriptor\n");
3698
3700 lstrcatA(tmpfile, "/tmpfile");
3701
3702 sa.nLength = sizeof(sa);
3703 sa.lpSecurityDescriptor = pSD;
3704 sa.bInheritHandle = TRUE;
3707 ok(hTemp != INVALID_HANDLE_VALUE, "CreateFile error %lu\n", GetLastError());
3708 free(pDacl);
3709
3711 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3712 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3713 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3714 ok(bret, "GetAclInformation failed\n");
3715 todo_wine
3716 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3717 acl_size.AceCount);
3718 LocalFree(pSD);
3719
3722 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3723 todo_wine
3724 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3725 if (error == ERROR_SUCCESS)
3726 {
3727 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3728 ok(bret, "GetAclInformation failed\n");
3729 todo_wine
3730 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3731 acl_size.AceCount);
3732 LocalFree(pSD);
3733 }
3734 CloseHandle(hTemp);
3735
3736 /* Test inheritance of ACLs in NtCreateFile without security descriptor */
3738 lstrcatA(tmpfile, "/tmpfile");
3739 get_nt_pathW(tmpfile, &tmpfileW);
3740
3741 attr.Length = sizeof(attr);
3742 attr.RootDirectory = 0;
3743 attr.ObjectName = &tmpfileW;
3744 attr.Attributes = OBJ_CASE_INSENSITIVE;
3745 attr.SecurityDescriptor = NULL;
3746 attr.SecurityQualityOfService = NULL;
3747
3748 status = NtCreateFile(&hTemp, GENERIC_WRITE | DELETE, &attr, &io, NULL, 0,
3750 ok(!status, "NtCreateFile failed with %08lx\n", status);
3751 RtlFreeUnicodeString(&tmpfileW);
3752
3755 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3756 ok(error == ERROR_SUCCESS, "Failed to get permissions on file\n");
3757 test_inherited_dacl(pDacl, admin_sid, user_sid, INHERITED_ACE,
3758 0x1f01ff, TRUE, TRUE, TRUE, __LINE__);
3759 LocalFree(pSD);
3760 CloseHandle(hTemp);
3761
3762 /* Test inheritance of ACLs in NtCreateFile with security descriptor -
3763 * When a security descriptor is set, then inheritance doesn't take effect */
3764 pSD = &sd;
3766 pDacl = malloc(sizeof(ACL));
3767 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
3768 ok(bret, "Failed to initialize ACL\n");
3769 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3770 ok(bret, "Failed to add ACL to security descriptor\n");
3771
3773 lstrcatA(tmpfile, "/tmpfile");
3774 get_nt_pathW(tmpfile, &tmpfileW);
3775
3776 attr.Length = sizeof(attr);
3777 attr.RootDirectory = 0;
3778 attr.ObjectName = &tmpfileW;
3779 attr.Attributes = OBJ_CASE_INSENSITIVE;
3780 attr.SecurityDescriptor = pSD;
3781 attr.SecurityQualityOfService = NULL;
3782
3783 status = NtCreateFile(&hTemp, GENERIC_WRITE | DELETE, &attr, &io, NULL, 0,
3785 ok(!status, "NtCreateFile failed with %08lx\n", status);
3786 RtlFreeUnicodeString(&tmpfileW);
3787 free(pDacl);
3788
3790 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3791 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3792 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3793 ok(bret, "GetAclInformation failed\n");
3794 todo_wine
3795 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3796 acl_size.AceCount);
3797 LocalFree(pSD);
3798
3801 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3802 todo_wine
3803 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3804 if (error == ERROR_SUCCESS)
3805 {
3806 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3807 ok(bret, "GetAclInformation failed\n");
3808 todo_wine
3809 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3810 acl_size.AceCount);
3811 LocalFree(pSD);
3812 }
3813 CloseHandle(hTemp);
3814
3815done:
3816 free(user);
3817 bret = RemoveDirectoryA(tmpdir);
3818 ok(bret == TRUE, "RemoveDirectoryA should always succeed\n");
3819}
3820
3822{
3823 char admin_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES], *user;
3824 char system_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES];
3825 char users_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES];
3827 PSID admin_sid = (PSID) admin_ptr, users_sid = (PSID) users_ptr;
3828 PSID system_sid = (PSID) system_ptr, user_sid, localsys_sid;
3829 DWORD sid_size = sizeof(admin_ptr), user_size;
3830 char invalid_path[] = "/an invalid file path";
3831 int users_ace_id = -1, admins_ace_id = -1, i;
3832 char software_key[] = "MACHINE\\Software";
3833 char sd[SECURITY_DESCRIPTOR_MIN_LENGTH+sizeof(void*)];
3835 ACL_SIZE_INFORMATION acl_size;
3838 ACCESS_ALLOWED_ACE *ace;
3839 BOOL bret = TRUE;
3840 char tmpfile[MAX_PATH];
3842 BOOL owner_defaulted;
3843 BOOL group_defaulted;
3844 BOOL dacl_defaulted;
3845 HANDLE token, hTemp, h;
3846 PSID owner, group;
3847 BOOL dacl_present;
3848 PACL pDacl;
3849 BYTE flags;
3851
3853 {
3854 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
3856 }
3857 if (!bret)
3858 {
3859 win_skip("Failed to get current user token\n");
3860 return;
3861 }
3862 bret = GetTokenInformation(token, TokenUser, NULL, 0, &user_size);
3864 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3865 user = malloc(user_size);
3866 bret = GetTokenInformation(token, TokenUser, user, user_size, &user_size);
3867 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3868 CloseHandle( token );
3869 user_sid = ((TOKEN_USER *)user)->User.Sid;
3870
3872 ok(bret, "GetWindowsDirectory failed with error %ld\n", GetLastError());
3873
3874#ifdef __REACTOS__
3875 /* The rest of this test crashes on WS03, Vista, Win7, and Win8.1 */
3877 free(user);
3878 return;
3879 }
3880#endif
3881 SetLastError(0xdeadbeef);
3884 NULL, NULL, NULL, NULL, &pSD);
3886 {
3887 win_skip("GetNamedSecurityInfoA is not implemented\n");
3888 free(user);
3889 return;
3890 }
3891 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3892
3894 ok(bret, "GetSecurityDescriptorControl failed with error %ld\n", GetLastError());
3896 "control (0x%x) doesn't have (SE_SELF_RELATIVE|SE_DACL_PRESENT) flags set\n", control);
3897 ok(revision == SECURITY_DESCRIPTOR_REVISION1, "revision was %ld instead of 1\n", revision);
3898
3899 bret = GetSecurityDescriptorOwner(pSD, &owner, &owner_defaulted);
3900 ok(bret, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
3901 ok(owner != NULL, "owner should not be NULL\n");
3902
3903 bret = GetSecurityDescriptorGroup(pSD, &group, &group_defaulted);
3904 ok(bret, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3905 ok(group != NULL, "group should not be NULL\n");
3906 LocalFree(pSD);
3907
3908
3909 /* NULL descriptor tests */
3910
3912 NULL, NULL, NULL, NULL, NULL);
3913 ok(error==ERROR_INVALID_PARAMETER, "GetNamedSecurityInfo failed with error %ld\n", error);
3914
3915 pDacl = NULL;
3917 NULL, NULL, &pDacl, NULL, &pSD);
3918 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3919 ok(pDacl != NULL, "DACL should not be NULL\n");
3920 LocalFree(pSD);
3921
3923 NULL, NULL, &pDacl, NULL, NULL);
3924 ok(error==ERROR_INVALID_PARAMETER, "GetNamedSecurityInfo failed with error %ld\n", error);
3925
3926 /* Test behavior of SetNamedSecurityInfo with an invalid path */
3927 SetLastError(0xdeadbeef);
3929 NULL, NULL, NULL);
3930 ok(error == ERROR_FILE_NOT_FOUND, "Unexpected error returned: 0x%lx\n", error);
3931 ok(GetLastError() == 0xdeadbeef, "Expected last error to remain unchanged.\n");
3932
3933 /* Create security descriptor information and test that it comes back the same */
3934 pSD = &sd;
3935 pDacl = malloc(100);
3937 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
3938 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
3939 ok(bret, "Failed to initialize ACL.\n");
3940 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
3941 ok(bret, "Failed to add Current User to ACL.\n");
3942 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, admin_sid);
3943 ok(bret, "Failed to add Administrator Group to ACL.\n");
3944 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3945 ok(bret, "Failed to add ACL to security descriptor.\n");
3946 GetTempFileNameA(".", "foo", 0, tmpfile);
3949 SetLastError(0xdeadbeef);
3951 NULL, pDacl, NULL);
3952 free(pDacl);
3954 {
3955 win_skip("SetNamedSecurityInfoA is not implemented\n");
3956 free(user);
3957 CloseHandle(hTemp);
3958 return;
3959 }
3960 ok(!error, "SetNamedSecurityInfoA failed with error %ld\n", error);
3961 SetLastError(0xdeadbeef);
3963 NULL, NULL, &pDacl, NULL, &pSD);
3965 {
3966 win_skip("GetNamedSecurityInfoA is not implemented\n");
3967 free(user);
3968 CloseHandle(hTemp);
3969 return;
3970 }
3971 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3972
3973 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3974 ok(bret, "GetAclInformation failed\n");
3975 if (acl_size.AceCount > 0)
3976 {
3977 bret = GetAce(pDacl, 0, (VOID **)&ace);
3978 ok(bret, "Failed to get Current User ACE.\n");
3979 bret = EqualSid(&ace->SidStart, user_sid);
3980 todo_wine ok(bret, "Current User ACE (%s) != Current User SID (%s).\n",
3981 debugstr_sid(&ace->SidStart), debugstr_sid(user_sid));
3982 ok(((ACE_HEADER *)ace)->AceFlags == 0,
3983 "Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
3984 ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%lx != 0x1f01ff)\n",
3985 ace->Mask);
3986 }
3987 if (acl_size.AceCount > 1)
3988 {
3989 bret = GetAce(pDacl, 1, (VOID **)&ace);
3990 ok(bret, "Failed to get Administators Group ACE.\n");
3991 bret = EqualSid(&ace->SidStart, admin_sid);
3992 todo_wine ok(bret || broken(!bret) /* win2k */,
3993 "Administators Group ACE (%s) != Administators Group SID (%s).\n",
3994 debugstr_sid(&ace->SidStart), debugstr_sid(admin_sid));
3995 ok(((ACE_HEADER *)ace)->AceFlags == 0,
3996 "Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
3997 ok(ace->Mask == 0x1f01ff || broken(ace->Mask == GENERIC_ALL) /* win2k */,
3998 "Administators Group ACE has unexpected mask (0x%lx != 0x1f01ff)\n", ace->Mask);
3999 }
4000 LocalFree(pSD);
4001
4002 /* show that setting empty DACL is not removing all file permissions */
4003 pDacl = malloc(sizeof(ACL));
4004 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
4005 ok(bret, "Failed to initialize ACL.\n");
4007 NULL, NULL, pDacl, NULL);
4008 ok(!error, "SetNamedSecurityInfoA failed with error %ld\n", error);
4009 free(pDacl);
4010
4012 NULL, NULL, &pDacl, NULL, &pSD);
4013 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4014
4015 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4016 ok(bret, "GetAclInformation failed\n");
4017 if (acl_size.AceCount > 0)
4018 {
4019 bret = GetAce(pDacl, 0, (VOID **)&ace);
4020 ok(bret, "Failed to get ACE.\n");
4022 "ACE has unexpected flags: 0x%x\n", ((ACE_HEADER *)ace)->AceFlags);
4023 }
4024 LocalFree(pSD);
4025
4027 NULL, OPEN_EXISTING, 0, NULL);
4028 ok(h != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4029 CloseHandle(h);
4030
4031 /* test setting NULL DACL */
4034 ok(!error, "SetNamedSecurityInfoA failed with error %ld\n", error);
4035
4037 NULL, NULL, &pDacl, NULL, &pSD);
4038 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4039 todo_wine ok(!pDacl, "pDacl != NULL\n");
4040 LocalFree(pSD);
4041
4043 NULL, OPEN_EXISTING, 0, NULL);
4044 ok(h != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4045 CloseHandle(h);
4046
4047 /* NtSetSecurityObject doesn't inherit DACL entries */
4048 pSD = sd+sizeof(void*)-((ULONG_PTR)sd)%sizeof(void*);
4050 pDacl = malloc(100);
4051 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
4052 ok(bret, "Failed to initialize ACL.\n");
4053 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4054 ok(bret, "Failed to add ACL to security descriptor.\n");
4056 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4057
4059 NULL, OPEN_EXISTING, 0, NULL);
4060 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4061 CloseHandle(h);
4062
4065 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4066
4068 NULL, OPEN_EXISTING, 0, NULL);
4069 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4070 CloseHandle(h);
4071
4075 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4076
4078 NULL, OPEN_EXISTING, 0, NULL);
4079 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4080 CloseHandle(h);
4081
4082 /* test if DACL is properly mapped to permission */
4083 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
4084 ok(bret, "Failed to initialize ACL.\n");
4085 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4086 ok(bret, "Failed to add Current User to ACL.\n");
4087 bret = AddAccessDeniedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4088 ok(bret, "Failed to add Current User to ACL.\n");
4089 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4090 ok(bret, "Failed to add ACL to security descriptor.\n");
4092 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4093
4095 NULL, OPEN_EXISTING, 0, NULL);
4096 ok(h != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4097 CloseHandle(h);
4098
4099 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
4100 ok(bret, "Failed to initialize ACL.\n");
4101 bret = AddAccessDeniedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4102 ok(bret, "Failed to add Current User to ACL.\n");
4103 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4104 ok(bret, "Failed to add Current User to ACL.\n");
4105 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4106 ok(bret, "Failed to add ACL to security descriptor.\n");
4108 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4109
4111 NULL, OPEN_EXISTING, 0, NULL);
4112 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4113 free(pDacl);
4114 free(user);
4115 CloseHandle(hTemp);
4116
4117 /* Test querying the ownership of a built-in registry key */
4118 sid_size = sizeof(system_ptr);
4119 CreateWellKnownSid(WinLocalSystemSid, NULL, system_sid, &sid_size);
4122 NULL, NULL, NULL, NULL, &pSD);
4123 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4124
4125 bret = AllocateAndInitializeSid(&SIDAuthNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &localsys_sid);
4126 ok(bret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
4127
4128 bret = GetSecurityDescriptorOwner(pSD, &owner, &owner_defaulted);
4129 ok(bret, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
4130 ok(owner != NULL, "owner should not be NULL\n");
4131 ok(EqualSid(owner, admin_sid) || EqualSid(owner, localsys_sid),
4132 "MACHINE\\Software owner SID (%s) != Administrators SID (%s) or Local System Sid (%s).\n",
4133 debugstr_sid(owner), debugstr_sid(admin_sid), debugstr_sid(localsys_sid));
4134
4135 bret = GetSecurityDescriptorGroup(pSD, &group, &group_defaulted);
4136 ok(bret, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
4137 ok(group != NULL, "group should not be NULL\n");
4138 ok(EqualSid(group, admin_sid) || broken(EqualSid(group, system_sid)) /* before Win7 */
4139 || broken(((SID*)group)->SubAuthority[0] == SECURITY_NT_NON_UNIQUE) /* Vista */,
4140 "MACHINE\\Software group SID (%s) != Local System SID (%s or %s)\n",
4141 debugstr_sid(group), debugstr_sid(admin_sid), debugstr_sid(system_sid));
4142 LocalFree(pSD);
4143
4144 /* Test querying the DACL of a built-in registry key */
4145 sid_size = sizeof(users_ptr);
4146 CreateWellKnownSid(WinBuiltinUsersSid, NULL, users_sid, &sid_size);
4148 NULL, NULL, NULL, NULL, &pSD);
4149 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4150
4151 bret = GetSecurityDescriptorDacl(pSD, &dacl_present, &pDacl, &dacl_defaulted);
4152 ok(bret, "GetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
4153 ok(dacl_present, "DACL should be present\n");
4154 ok(pDacl && IsValidAcl(pDacl), "GetSecurityDescriptorDacl returned invalid DACL.\n");
4155 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4156 ok(bret, "GetAclInformation failed\n");
4157 ok(acl_size.AceCount != 0, "GetAclInformation returned no ACLs\n");
4158 for (i=0; i<acl_size.AceCount; i++)
4159 {
4160 bret = GetAce(pDacl, i, (VOID **)&ace);
4161 ok(bret, "Failed to get ACE %d.\n", i);
4162 bret = EqualSid(&ace->SidStart, users_sid);
4163 if (bret) users_ace_id = i;
4164 bret = EqualSid(&ace->SidStart, admin_sid);
4165 if (bret) admins_ace_id = i;
4166 }
4167 ok(users_ace_id != -1 || broken(users_ace_id == -1) /* win2k */,
4168 "Builtin Users ACE not found.\n");
4169 if (users_ace_id != -1)
4170 {
4171 bret = GetAce(pDacl, users_ace_id, (VOID **)&ace);
4172 ok(bret, "Failed to get Builtin Users ACE.\n");
4173 flags = ((ACE_HEADER *)ace)->AceFlags;
4176 || broken(flags == (CONTAINER_INHERIT_ACE|INHERITED_ACE)) /* win 10 wow64 */
4177 || broken(flags == CONTAINER_INHERIT_ACE), /* win 10 */
4178 "Builtin Users ACE has unexpected flags (0x%x != 0x%x)\n", flags,
4180 ok(ace->Mask == GENERIC_READ
4181 || broken(ace->Mask == KEY_READ), /* win 10 */
4182 "Builtin Users ACE has unexpected mask (0x%lx != 0x%x)\n",
4183 ace->Mask, GENERIC_READ);
4184 }
4185 ok(admins_ace_id != -1, "Builtin Admins ACE not found.\n");
4186 if (admins_ace_id != -1)
4187 {
4188 bret = GetAce(pDacl, admins_ace_id, (VOID **)&ace);
4189 ok(bret, "Failed to get Builtin Admins ACE.\n");
4190 flags = ((ACE_HEADER *)ace)->AceFlags;
4191 ok(flags == 0x0
4195 || broken(flags == (CONTAINER_INHERIT_ACE|INHERITED_ACE)) /* win 10 wow64 */
4196 || broken(flags == CONTAINER_INHERIT_ACE), /* win 10 */
4197 "Builtin Admins ACE has unexpected flags (0x%x != 0x0)\n", flags);
4198 ok(ace->Mask == KEY_ALL_ACCESS || broken(ace->Mask == GENERIC_ALL) /* w2k8 */,
4199 "Builtin Admins ACE has unexpected mask (0x%lx != 0x%x)\n", ace->Mask, KEY_ALL_ACCESS);
4200 }
4201
4202 FreeSid(localsys_sid);
4203 LocalFree(pSD);
4204}
4205
4207{
4208 BOOL ret;
4210 static const WCHAR Blank[] = { 0 };
4211 unsigned int i;
4212 ULONG size;
4213 ACL *acl;
4214 static const struct
4215 {
4216 const char *sidstring;
4218 BOOL ret;
4219 DWORD GLE;
4220 DWORD altGLE;
4221 DWORD ace_Mask;
4222 } cssd[] =
4223 {
4224 { "D:(A;;GA;;;WD)", 0xdeadbeef, FALSE, ERROR_UNKNOWN_REVISION },
4225 /* test ACE string type */
4226 { "D:(A;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4227 { "D:(D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4228 { "ERROR:(D;;GA;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_PARAMETER },
4229 /* test ACE string with spaces */
4230 { " D:(D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4231 { "D: (D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4232 { "D:( D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4233 { "D:(D ;;GA;;;WD)", SDDL_REVISION_1, FALSE, RPC_S_INVALID_STRING_UUID, ERROR_INVALID_ACL }, /* Vista+ */
4234 { "D:(D; ;GA;;;WD)", SDDL_REVISION_1, TRUE },
4235 { "D:(D;; GA;;;WD)", SDDL_REVISION_1, TRUE },
4236 { "D:(D;;GA ;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
4237 { "D:(D;;GA; ;;WD)", SDDL_REVISION_1, TRUE },
4238 { "D:(D;;GA;; ;WD)", SDDL_REVISION_1, TRUE },
4239 { "D:(D;;GA;;; WD)", SDDL_REVISION_1, TRUE },
4240 { "D:(D;;GA;;;WD )", SDDL_REVISION_1, TRUE },
4241 /* test ACE string access rights */
4242 { "D:(A;;GA;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_ALL },
4243 { "D:(A;;1;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, 1 },
4244 { "D:(A;;020000000000;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_READ },
4245 { "D:(A;;0X40000000;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_WRITE },
4246 { "D:(A;;GRGWGX;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE },
4247 { "D:(A;;RCSDWDWO;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, READ_CONTROL | DELETE | WRITE_DAC | WRITE_OWNER },
4248 { "D:(A;;RPWPCCDCLCSWLODTCR;;;WD)", SDDL_REVISION_1, TRUE },
4249 { "D:(A;;FAFRFWFX;;;WD)", SDDL_REVISION_1, TRUE },
4250 { "D:(A;;KAKRKWKX;;;WD)", SDDL_REVISION_1, TRUE },
4251 { "D:(A;;0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
4252 { "S:(AU;;0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
4253 { "S:(AU;;0xDeAdBeEf;;;WD)", SDDL_REVISION_1, TRUE },
4254 { "S:(AU;;GR0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
4255 { "S:(AU;;0xFFFFFFFFGR;;;WD)", SDDL_REVISION_1, TRUE },
4256 { "S:(AU;;0xFFFFFGR;;;WD)", SDDL_REVISION_1, TRUE },
4257 /* test ACE string access right error case */
4258 { "D:(A;;ROB;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
4259 /* test behaviour with empty strings */
4260 { "", SDDL_REVISION_1, TRUE },
4261 /* test ACE string SID */
4262 { "D:(D;;GA;;;S-1-0-0)", SDDL_REVISION_1, TRUE },
4263 { "D:(D;;GA;;;WDANDSUCH)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
4264 { "D:(D;;GA;;;Nonexistent account)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL, ERROR_INVALID_SID }, /* W2K */
4265 };
4266
4267 for (i = 0; i < ARRAY_SIZE(cssd); i++)
4268 {
4269 DWORD GLE;
4270
4271 SetLastError(0xdeadbeef);
4273 cssd[i].sidstring, cssd[i].revision, &pSD, NULL);
4274 GLE = GetLastError();
4275 ok(ret == cssd[i].ret, "(%02u) Expected %s (%ld)\n", i, cssd[i].ret ? "success" : "failure", GLE);
4276 if (!cssd[i].ret)
4277 ok(GLE == cssd[i].GLE ||
4278 (cssd[i].altGLE && GLE == cssd[i].altGLE),
4279 "(%02u) Unexpected last error %ld\n", i, GLE);
4280 if (ret)
4281 {
4282 if (cssd[i].ace_Mask)
4283 {
4284 ACCESS_ALLOWED_ACE *ace;
4285
4286 acl = (ACL *)((char *)pSD + sizeof(SECURITY_DESCRIPTOR_RELATIVE));
4287 ok(acl->AclRevision == ACL_REVISION, "(%02u) Got %u\n", i, acl->AclRevision);
4288
4289 ace = (ACCESS_ALLOWED_ACE *)(acl + 1);
4290 ok(ace->Mask == cssd[i].ace_Mask, "(%02u) Expected %08lx, got %08lx\n",
4291 i, cssd[i].ace_Mask, ace->Mask);
4292 }
4293 LocalFree(pSD);
4294 }
4295 }
4296
4297 /* test behaviour with NULL parameters */
4298 SetLastError(0xdeadbeef);
4300 NULL, 0xdeadbeef, &pSD, NULL);
4301 todo_wine
4303 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4304 GetLastError());
4305
4306 SetLastError(0xdeadbeef);
4308 NULL, 0xdeadbeef, &pSD, NULL);
4310 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4311 GetLastError());
4312
4313 SetLastError(0xdeadbeef);
4315 "D:(A;;ROB;;;WD)", 0xdeadbeef, NULL, NULL);
4317 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4318 GetLastError());
4319
4320 SetLastError(0xdeadbeef);
4322 "D:(A;;ROB;;;WD)", SDDL_REVISION_1, NULL, NULL);
4324 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4325 GetLastError());
4326
4327 /* test behaviour with empty strings */
4328 SetLastError(0xdeadbeef);
4330 Blank, SDDL_REVISION_1, &pSD, NULL);
4331 ok(ret, "ConvertStringSecurityDescriptorToSecurityDescriptor failed with error %ld\n", GetLastError());
4332 LocalFree(pSD);
4333
4334 SetLastError(0xdeadbeef);
4336 "D:P(A;;GRGW;;;BA)(A;;GRGW;;;S-1-5-21-0-0-0-1000)S:(ML;;NWNR;;;S-1-16-12288)", SDDL_REVISION_1, &pSD, NULL);
4337 ok(ret || broken(!ret && GetLastError() == ERROR_INVALID_DATATYPE) /* win2k */,
4338 "ConvertStringSecurityDescriptorToSecurityDescriptor failed with error %lu\n", GetLastError());
4339 if (ret) LocalFree(pSD);
4340
4341 /* empty DACL */
4342 size = 0;
4343 SetLastError(0xdeadbeef);
4345 ok(ret, "unexpected error %lu\n", GetLastError());
4346 ok(size == sizeof(SECURITY_DESCRIPTOR_RELATIVE) + sizeof(ACL), "got %lu\n", size);
4347 acl = (ACL *)((char *)pSD + sizeof(SECURITY_DESCRIPTOR_RELATIVE));
4348 ok(acl->AclRevision == ACL_REVISION, "got %u\n", acl->AclRevision);
4349 ok(!acl->Sbz1, "got %u\n", acl->Sbz1);
4350 ok(acl->AclSize == sizeof(*acl), "got %u\n", acl->AclSize);
4351 ok(!acl->AceCount, "got %u\n", acl->AceCount);
4352 ok(!acl->Sbz2, "got %u\n", acl->Sbz2);
4353 LocalFree(pSD);
4354
4355 /* empty SACL */
4356 size = 0;
4357 SetLastError(0xdeadbeef);
4359 ok(ret, "unexpected error %lu\n", GetLastError());
4360 ok(size == sizeof(SECURITY_DESCRIPTOR_RELATIVE) + sizeof(ACL), "got %lu\n", size);
4361 acl = (ACL *)((char *)pSD + sizeof(SECURITY_DESCRIPTOR_RELATIVE));
4362 ok(!acl->Sbz1, "got %u\n", acl->Sbz1);
4363 ok(acl->AclSize == sizeof(*acl), "got %u\n", acl->AclSize);
4364 ok(!acl->AceCount, "got %u\n", acl->AceCount);
4365 ok(!acl->Sbz2, "got %u\n", acl->Sbz2);
4366 LocalFree(pSD);
4367}
4368
4370{
4373 LPSTR string;
4374 DWORD size;
4375 PSID psid, psid2;
4376 PACL pacl;
4377 char sid_buf[256];
4378 char acl_buf[8192];
4379 ULONG len;
4380
4381/* It seems Windows XP adds an extra character to the length of the string for each ACE in an ACL. We
4382 * don't replicate this feature so we only test len >= strlen+1. */
4383#define CHECK_RESULT_AND_FREE(exp_str) \
4384 ok(strcmp(string, (exp_str)) == 0, "String mismatch (expected \"%s\", got \"%s\")\n", (exp_str), string); \
4385 ok(len >= (strlen(exp_str) + 1), "Length mismatch (expected %d, got %ld)\n", lstrlenA(exp_str) + 1, len); \
4386 LocalFree(string);
4387
4388#define CHECK_ONE_OF_AND_FREE(exp_str1, exp_str2) \
4389 ok(strcmp(string, (exp_str1)) == 0 || strcmp(string, (exp_str2)) == 0, "String mismatch (expected\n\"%s\" or\n\"%s\", got\n\"%s\")\n", (exp_str1), (exp_str2), string); \
4390 ok(len >= (strlen(exp_str1) + 1) || len >= (strlen(exp_str2) + 1), "Length mismatch (expected %d or %d, got %ld)\n", lstrlenA(exp_str1) + 1, lstrlenA(exp_str2) + 1, len); \
4391 LocalFree(string);
4392
4394 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4396
4397 size = 4096;
4398 CreateWellKnownSid(WinLocalSid, NULL, sid_buf, &size);
4400 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4401 CHECK_RESULT_AND_FREE("O:S-1-2-0");
4402
4404 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4405 CHECK_RESULT_AND_FREE("O:S-1-2-0");
4406
4407 size = sizeof(sid_buf);
4408 CreateWellKnownSid(WinLocalSystemSid, NULL, sid_buf, &size);
4410 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4411 CHECK_RESULT_AND_FREE("O:SY");
4412
4413 ConvertStringSidToSidA("S-1-5-21-93476-23408-4576", &psid);
4415 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4416 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576");
4417
4419 CHECK_RESULT_AND_FREE("G:S-1-5-21-93476-23408-4576");
4420
4421 pacl = (PACL)acl_buf;
4422 InitializeAcl(pacl, sizeof(acl_buf), ACL_REVISION);
4424 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4425 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:");
4426
4428 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4429 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:");
4430
4431 ConvertStringSidToSidA("S-1-5-6", &psid2);
4433 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4434 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)");
4435
4437 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4438 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)");
4439
4441 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4442 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)");
4443
4444
4445 pacl = (PACL)acl_buf;
4446 InitializeAcl(pacl, sizeof(acl_buf), ACL_REVISION);
4448 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4449 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:S:");
4450
4451 /* fails in win2k */
4454 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4455 CHECK_ONE_OF_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)", /* XP */
4456 "O:SYG:S-1-5-21-93476-23408-4576D:NO_ACCESS_CONTROLS:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)" /* Vista */);
4457
4458 /* fails in win2k */
4460 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4461 CHECK_ONE_OF_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)", /* XP */
4462 "O:SYG:S-1-5-21-93476-23408-4576D:NO_ACCESS_CONTROLS:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)" /* Vista */);
4463
4464 LocalFree(psid2);
4465 LocalFree(psid);
4466}
4467
4469{
4472
4473 SECURITY_DESCRIPTOR_CONTROL const mutable
4477 | 0x00000040 | 0x00000080 /* not defined in winnt.h */
4478 ;
4479 SECURITY_DESCRIPTOR_CONTROL const immutable
4484 ;
4485
4486 int bit;
4487 DWORD dwRevision;
4488 LPCSTR fmt = "Expected error %s, got %u\n";
4489
4490 GetSecurityDescriptorControl (sec, &ref, &dwRevision);
4491
4492 /* The mutable bits are mutable regardless of the truth of
4493 SE_DACL_PRESENT and/or SE_SACL_PRESENT */
4494
4495 /* Check call barfs if any bit-of-interest is immutable */
4496 for (bit = 0; bit < 16; ++bit)
4497 {
4498 SECURITY_DESCRIPTOR_CONTROL const bitOfInterest = 1 << bit;
4499 SECURITY_DESCRIPTOR_CONTROL setOrClear = ref & bitOfInterest;
4500
4502
4503 DWORD dwExpect = (bitOfInterest & immutable)
4504 ? ERROR_INVALID_PARAMETER : 0xbebecaca;
4505 LPCSTR strExpect = (bitOfInterest & immutable)
4506 ? "ERROR_INVALID_PARAMETER" : "0xbebecaca";
4507
4508 ctrl = (bitOfInterest & mutable) ? ref + bitOfInterest : ref;
4509 setOrClear ^= bitOfInterest;
4510 SetLastError (0xbebecaca);
4511 SetSecurityDescriptorControl (sec, bitOfInterest, setOrClear);
4512 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4513 GetSecurityDescriptorControl(sec, &test, &dwRevision);
4514 expect_eq(test, ctrl, int, "%x");
4515
4516 setOrClear ^= bitOfInterest;
4517 SetLastError (0xbebecaca);
4518 SetSecurityDescriptorControl (sec, bitOfInterest, setOrClear);
4519 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4520 GetSecurityDescriptorControl (sec, &test, &dwRevision);
4521 expect_eq(test, ref, int, "%x");
4522 }
4523
4524 /* Check call barfs if any bit-to-set is immutable
4525 even when not a bit-of-interest */
4526 for (bit = 0; bit < 16; ++bit)
4527 {
4528 SECURITY_DESCRIPTOR_CONTROL const bitsOfInterest = mutable;
4529 SECURITY_DESCRIPTOR_CONTROL setOrClear = ref & bitsOfInterest;
4530
4532
4533 DWORD dwExpect = ((1 << bit) & immutable)
4534 ? ERROR_INVALID_PARAMETER : 0xbebecaca;
4535 LPCSTR strExpect = ((1 << bit) & immutable)
4536 ? "ERROR_INVALID_PARAMETER" : "0xbebecaca";
4537
4538 ctrl = ((1 << bit) & immutable) ? test : ref | mutable;
4539 setOrClear ^= bitsOfInterest;
4540 SetLastError (0xbebecaca);
4541 SetSecurityDescriptorControl (sec, bitsOfInterest, setOrClear | (1 << bit));
4542 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4543 GetSecurityDescriptorControl(sec, &test, &dwRevision);
4544 expect_eq(test, ctrl, int, "%x");
4545
4546 ctrl = ((1 << bit) & immutable) ? test : ref | (1 << bit);
4547 setOrClear ^= bitsOfInterest;
4548 SetLastError (0xbebecaca);
4549 SetSecurityDescriptorControl (sec, bitsOfInterest, setOrClear | (1 << bit));
4550 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4551 GetSecurityDescriptorControl(sec, &test, &dwRevision);
4552 expect_eq(test, ctrl, int, "%x");
4553 }
4554}
4555
4557{
4561 DWORD dwDescSize;
4562 DWORD dwRevision;
4563 DWORD retSize;
4564 LPSTR string;
4565 ULONG len;
4567 BOOL ret;
4568
4570 "O:SY"
4571 "G:S-1-5-21-93476-23408-4576"
4572 "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)"
4573 "(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4574 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)",
4575 SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n");
4576
4578
4579 LocalFree(sec);
4580
4582 "O:SY"
4583 "G:S-1-5-21-93476-23408-4576",
4584 SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n");
4585
4587
4588 LocalFree(sec);
4589
4591 "O:SY"
4592 "G:S-1-5-21-93476-23408-4576"
4593 "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4594 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)", SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n");
4595 buf = malloc(dwDescSize);
4597 GetSecurityDescriptorControl(sec, &ctrl, &dwRevision);
4598 expect_eq(ctrl, 0x9014, int, "%x");
4599
4600 ret = GetPrivateObjectSecurity(sec, GROUP_SECURITY_INFORMATION, buf, dwDescSize, &retSize);
4601 ok(ret, "GetPrivateObjectSecurity failed (err=%lu)\n", GetLastError());
4602 ok(retSize <= dwDescSize, "Buffer too small (%ld vs %ld)\n", retSize, dwDescSize);
4603 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4604 CHECK_RESULT_AND_FREE("G:S-1-5-21-93476-23408-4576");
4605 GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
4606 expect_eq(ctrl, 0x8000, int, "%x");
4607
4609 ok(ret, "GetPrivateObjectSecurity failed (err=%lu)\n", GetLastError());
4610 ok(retSize <= dwDescSize, "Buffer too small (%ld vs %ld)\n", retSize, dwDescSize);
4612 ok(ret, "Conversion failed err=%lu\n", GetLastError());
4613 CHECK_ONE_OF_AND_FREE("G:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)",
4614 "G:S-1-5-21-93476-23408-4576D:P(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"); /* Win7 */
4615 GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
4616 expect_eq(ctrl & (~ SE_DACL_PROTECTED), 0x8004, int, "%x");
4617
4618 ret = GetPrivateObjectSecurity(sec, sec_info, buf, dwDescSize, &retSize);
4619 ok(ret, "GetPrivateObjectSecurity failed (err=%lu)\n", GetLastError());
4620 ok(retSize == dwDescSize, "Buffer too small (%ld vs %ld)\n", retSize, dwDescSize);
4621 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4623 "G:S-1-5-21-93476-23408-4576"
4624 "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4625 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)",
4626 "O:SY"
4627 "G:S-1-5-21-93476-23408-4576"
4628 "D:P(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4629 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)"); /* Win7 */
4630 GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
4631 expect_eq(ctrl & (~ SE_DACL_PROTECTED), 0x8014, int, "%x");
4632
4633 SetLastError(0xdeadbeef);
4634 ok(GetPrivateObjectSecurity(sec, sec_info, buf, 5, &retSize) == FALSE, "GetPrivateObjectSecurity should have failed\n");
4635 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected error ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
4636
4637 LocalFree(sec);
4638 free(buf);
4639}
4640#undef CHECK_RESULT_AND_FREE
4641#undef CHECK_ONE_OF_AND_FREE
4642
4643static void test_InitializeAcl(void)
4644{
4645 char buffer[256];
4646 PACL pAcl = (PACL)buffer;
4647 BOOL ret;
4648
4649 SetLastError(0xdeadbeef);
4650 ret = InitializeAcl(pAcl, sizeof(ACL) - 1, ACL_REVISION);
4652 {
4653 win_skip("InitializeAcl is not implemented\n");
4654 return;
4655 }
4656
4657 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "InitializeAcl with too small a buffer should have failed with ERROR_INSUFFICIENT_BUFFER instead of %ld\n", GetLastError());
4658
4659 SetLastError(0xdeadbeef);
4660 ret = InitializeAcl(pAcl, 0xffffffff, ACL_REVISION);
4661 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl with too large a buffer should have failed with ERROR_INVALID_PARAMETER instead of %ld\n", GetLastError());
4662
4663 SetLastError(0xdeadbeef);
4664 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION1);
4665 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl(ACL_REVISION1) should have failed with ERROR_INVALID_PARAMETER instead of %ld\n", GetLastError());
4666
4667 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION2);
4668 ok(ret, "InitializeAcl(ACL_REVISION2) failed with error %ld\n", GetLastError());
4669
4670 ret = IsValidAcl(pAcl);
4671 ok(ret, "IsValidAcl failed with error %ld\n", GetLastError());
4672
4673 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION3);
4674 ok(ret, "InitializeAcl(ACL_REVISION3) failed with error %ld\n", GetLastError());
4675
4676 ret = IsValidAcl(pAcl);
4677 ok(ret, "IsValidAcl failed with error %ld\n", GetLastError());
4678
4679 SetLastError(0xdeadbeef);
4680 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION4);
4681 ok(ret, "InitializeAcl(ACL_REVISION4) failed with error %ld\n", GetLastError());
4682
4683 ret = IsValidAcl(pAcl);
4684 ok(ret, "IsValidAcl failed with error %ld\n", GetLastError());
4685
4686 SetLastError(0xdeadbeef);
4687 ret = InitializeAcl(pAcl, sizeof(buffer), -1);
4688 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl(-1) failed with error %ld\n", GetLastError());
4689}
4690
4691static void test_GetSecurityInfo(void)
4692{
4693 char domain_users_ptr[sizeof(TOKEN_USER) + sizeof(SID) + sizeof(DWORD)*SID_MAX_SUB_AUTHORITIES];
4694 char b[sizeof(TOKEN_USER) + sizeof(SID) + sizeof(DWORD)*SID_MAX_SUB_AUTHORITIES];
4695 char admin_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES], dacl[100];
4696 PSID domain_users_sid = (PSID) domain_users_ptr, domain_sid;
4698 int domain_users_ace_id = -1, admins_ace_id = -1, i;
4699 DWORD sid_size = sizeof(admin_ptr), l = sizeof(b);
4700 SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa)};
4701 PSID admin_sid = (PSID) admin_ptr, user_sid;
4703 BOOL owner_defaulted, group_defaulted;
4704 BOOL dacl_defaulted, dacl_present;
4705 ACL_SIZE_INFORMATION acl_size;
4707 ACCESS_ALLOWED_ACE *ace;
4708 HANDLE token, obj;
4709 PSID owner, group;
4710 BOOL bret = TRUE;
4711 PACL pDacl;
4712 BYTE flags;
4713 DWORD ret;
4714
4715 static const SE_OBJECT_TYPE kernel_types[] =
4716 {
4720 };
4721
4722 static const SE_OBJECT_TYPE invalid_types[] =
4723 {
4730 0xdeadbeef,
4731 };
4732
4734 {
4735 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
4737 }
4738 if (!bret)
4739 {
4740 win_skip("Failed to get current user token\n");
4741 return;
4742 }
4743 bret = GetTokenInformation(token, TokenUser, b, l, &l);
4744 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
4745 CloseHandle( token );
4746 user_sid = ((TOKEN_USER *)b)->User.Sid;
4747
4748 /* Create something. Files have lots of associated security info. */
4752 {
4753 skip("Couldn't create an object for GetSecurityInfo test\n");
4754 return;
4755 }
4756
4759 &owner, &group, &pDacl, NULL, &pSD);
4761 {
4762 win_skip("GetSecurityInfo is not implemented\n");
4764 return;
4765 }
4766 ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %ld\n", ret);
4767 ok(pSD != NULL, "GetSecurityInfo\n");
4768 ok(owner != NULL, "GetSecurityInfo\n");
4769 ok(group != NULL, "GetSecurityInfo\n");
4770 if (pDacl != NULL)
4771 ok(IsValidAcl(pDacl), "GetSecurityInfo\n");
4772 else
4773 win_skip("No ACL information returned\n");
4774
4775 LocalFree(pSD);
4776
4777 /* If we don't ask for the security descriptor, Windows will still give us
4778 the other stuff, leaving us no way to free it. */
4781 &owner, &group, &pDacl, NULL, NULL);
4782 ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %ld\n", ret);
4783 ok(owner != NULL, "GetSecurityInfo\n");
4784 ok(group != NULL, "GetSecurityInfo\n");
4785 if (pDacl != NULL)
4786 ok(IsValidAcl(pDacl), "GetSecurityInfo\n");
4787 else
4788 win_skip("No ACL information returned\n");
4789
4790 /* Create security descriptor information and test that it comes back the same */
4791 pSD = &sd;
4792 pDacl = (PACL)&dacl;
4794 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
4795 bret = InitializeAcl(pDacl, sizeof(dacl), ACL_REVISION);
4796 ok(bret, "Failed to initialize ACL.\n");
4797 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4798 ok(bret, "Failed to add Current User to ACL.\n");
4799 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, admin_sid);
4800 ok(bret, "Failed to add Administrator Group to ACL.\n");
4801 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4802 ok(bret, "Failed to add ACL to security descriptor.\n");
4804 NULL, NULL, pDacl, NULL);
4805 ok(ret == ERROR_SUCCESS, "SetSecurityInfo returned %ld\n", ret);
4807 NULL, NULL, &pDacl, NULL, &pSD);
4808 ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %ld\n", ret);
4809 ok(pDacl && IsValidAcl(pDacl), "GetSecurityInfo returned invalid DACL.\n");
4810 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4811 ok(bret, "GetAclInformation failed\n");
4812 if (acl_size.AceCount > 0)
4813 {
4814 bret = GetAce(pDacl, 0, (VOID **)&ace);
4815 ok(bret, "Failed to get Current User ACE.\n");
4816#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
4817 bret = EqualSid(&ace->SidStart, user_sid);
4818 todo_wine ok(bret, "Current User ACE (%s) != Current User SID (%s).\n",
4819 debugstr_sid(&ace->SidStart), debugstr_sid(user_sid));
4820#endif
4821 ok(((ACE_HEADER *)ace)->AceFlags == 0,
4822 "Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
4823 ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%lx != 0x1f01ff)\n",
4824 ace->Mask);
4825 }
4826 if (acl_size.AceCount > 1)
4827 {
4828 bret = GetAce(pDacl, 1, (VOID **)&ace);
4829 ok(bret, "Failed to get Administators Group ACE.\n");
4830#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
4831 bret = EqualSid(&ace->SidStart, admin_sid);
4832 todo_wine ok(bret, "Administators Group ACE (%s) != Administators Group SID (%s).\n", debugstr_sid(&ace->SidStart), debugstr_sid(admin_sid));
4833#endif
4834 ok(((ACE_HEADER *)ace)->AceFlags == 0,
4835 "Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
4836 ok(ace->Mask == 0x1f01ff, "Administators Group ACE has unexpected mask (0x%lx != 0x1f01ff)\n",
4837 ace->Mask);
4838 }
4839 LocalFree(pSD);
4841
4842 /* Obtain the "domain users" SID from the user SID */
4843 if (!AllocateAndInitializeSid(&sia, 4, *GetSidSubAuthority(user_sid, 0),
4844 *GetSidSubAuthority(user_sid, 1),
4845 *GetSidSubAuthority(user_sid, 2),
4846 *GetSidSubAuthority(user_sid, 3), 0, 0, 0, 0, &domain_sid))
4847 {
4848 win_skip("Failed to get current domain SID\n");
4849 return;
4850 }
4851 sid_size = sizeof(domain_users_ptr);
4852 CreateWellKnownSid(WinAccountDomainUsersSid, domain_sid, domain_users_sid, &sid_size);
4853 FreeSid(domain_sid);
4854
4855 /* Test querying the ownership of a process */
4858 NULL, NULL, NULL, NULL, &pSD);
4859 ok(!ret, "GetNamedSecurityInfo failed with error %ld\n", ret);
4860
4861 bret = GetSecurityDescriptorOwner(pSD, &owner, &owner_defaulted);
4862 ok(bret, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
4863 ok(owner != NULL, "owner should not be NULL\n");
4864 ok(EqualSid(owner, admin_sid) || EqualSid(owner, user_sid),
4865 "Process owner SID != Administrators SID.\n");
4866
4867 bret = GetSecurityDescriptorGroup(pSD, &group, &group_defaulted);
4868 ok(bret, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
4869 ok(group != NULL, "group should not be NULL\n");
4870 ok(EqualSid(group, domain_users_sid), "Process group SID != Domain Users SID.\n");
4871 LocalFree(pSD);
4872
4873 /* Test querying the DACL of a process */
4875 NULL, NULL, NULL, NULL, &pSD);
4876 ok(!ret, "GetSecurityInfo failed with error %ld\n", ret);
4877
4878 bret = GetSecurityDescriptorDacl(pSD, &dacl_present, &pDacl, &dacl_defaulted);
4879 ok(bret, "GetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
4880 ok(dacl_present, "DACL should be present\n");
4881 ok(pDacl && IsValidAcl(pDacl), "GetSecurityDescriptorDacl returned invalid DACL.\n");
4882 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4883 ok(bret, "GetAclInformation failed\n");
4884 ok(acl_size.AceCount != 0, "GetAclInformation returned no ACLs\n");
4885 for (i=0; i<acl_size.AceCount; i++)
4886 {
4887 bret = GetAce(pDacl, i, (VOID **)&ace);
4888 ok(bret, "Failed to get ACE %d.\n", i);
4889 bret = EqualSid(&ace->SidStart, domain_users_sid);
4890 if (bret) domain_users_ace_id = i;
4891 bret = EqualSid(&ace->SidStart, admin_sid);
4892 if (bret) admins_ace_id = i;
4893 }
4894 ok(domain_users_ace_id != -1 || broken(domain_users_ace_id == -1) /* win2k */,
4895 "Domain Users ACE not found.\n");
4896 if (domain_users_ace_id != -1)
4897 {
4898 bret = GetAce(pDacl, domain_users_ace_id, (VOID **)&ace);
4899 ok(bret, "Failed to get Domain Users ACE.\n");
4900 flags = ((ACE_HEADER *)ace)->AceFlags;
4902 "Domain Users ACE has unexpected flags (0x%x != 0x%x)\n", flags,
4904 ok(ace->Mask == GENERIC_READ, "Domain Users ACE has unexpected mask (0x%lx != 0x%x)\n",
4905 ace->Mask, GENERIC_READ);
4906 }
4907 ok(admins_ace_id != -1 || broken(admins_ace_id == -1) /* xp */,
4908 "Builtin Admins ACE not found.\n");
4909 if (admins_ace_id != -1)
4910 {
4911 bret = GetAce(pDacl, admins_ace_id, (VOID **)&ace);
4912 ok(bret, "Failed to get Builtin Admins ACE.\n");
4913 flags = ((ACE_HEADER *)ace)->AceFlags;
4914 ok(flags == 0x0, "Builtin Admins ACE has unexpected flags (0x%x != 0x0)\n", flags);
4915 ok(ace->Mask == PROCESS_ALL_ACCESS || broken(ace->Mask == 0x1f0fff) /* win2k */,
4916 "Builtin Admins ACE has unexpected mask (0x%lx != 0x%x)\n", ace->Mask, PROCESS_ALL_ACCESS);
4917 }
4918 LocalFree(pSD);
4919
4921 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4922
4925 ok(!ret, "got error %lu\n", ret);
4926 LocalFree(pSD);
4927
4928 sa.lpSecurityDescriptor = sd;
4930 pDacl = (PACL)&dacl;
4931
4932 for (size_t i = 0; i < ARRAY_SIZE(kernel_types); ++i)
4933 {
4934 winetest_push_context("Type %#x", kernel_types[i]);
4935
4936 ret = GetSecurityInfo(NULL, kernel_types[i],
4938 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4939
4940 ret = GetSecurityInfo(GetCurrentProcess(), kernel_types[i],
4942 ok(!ret, "got error %lu\n", ret);
4943 LocalFree(pSD);
4944
4945 ret = GetSecurityInfo(obj, kernel_types[i],
4947 ok(!ret, "got error %lu\n", ret);
4948 LocalFree(pSD);
4949
4950 ret = SetSecurityInfo(NULL, kernel_types[i],
4952 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4953
4954 ret = SetSecurityInfo(obj, kernel_types[i],
4956 ok(!ret || ret == ERROR_NO_SECURITY_ON_OBJECT /* win 7 */, "got error %lu\n", ret);
4957
4959 }
4960
4963 todo_wine ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4964
4967 todo_wine ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4968
4970
4971 for (size_t i = 0; i < ARRAY_SIZE(invalid_types); ++i)
4972 {
4973 winetest_push_context("Type %#x", invalid_types[i]);
4974
4975 ret = GetSecurityInfo(NULL, invalid_types[i],
4977 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4978
4979 ret = GetSecurityInfo((HANDLE)0xdeadbeef, invalid_types[i],
4981 todo_wine ok(ret == ERROR_INVALID_PARAMETER, "got error %lu\n", ret);
4982
4983 ret = SetSecurityInfo(NULL, invalid_types[i],
4985 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4986
4987 ret = SetSecurityInfo((HANDLE)0xdeadbeef, invalid_types[i],
4989 todo_wine ok(ret == ERROR_INVALID_PARAMETER, "got error %lu\n", ret);
4990
4992 }
4993}
4994
4996{
4997 PSID psid = NULL;
4998
4999 /* Note: on windows passing in an invalid index like -1, lets GetSidSubAuthority return 0x05000000 but
5000 still GetLastError returns ERROR_SUCCESS then. We don't test these unlikely cornercases here for now */
5001 ok(ConvertStringSidToSidA("S-1-5-21-93476-23408-4576",&psid),"ConvertStringSidToSidA failed\n");
5002 ok(IsValidSid(psid),"Sid is not valid\n");
5003 SetLastError(0xbebecaca);
5004 ok(*GetSidSubAuthorityCount(psid) == 4,"GetSidSubAuthorityCount gave %d expected 4\n", *GetSidSubAuthorityCount(psid));
5005 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5006 SetLastError(0xbebecaca);
5007 ok(*GetSidSubAuthority(psid,0) == 21,"GetSidSubAuthority gave %ld expected 21\n", *GetSidSubAuthority(psid,0));
5008 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5009 SetLastError(0xbebecaca);
5010 ok(*GetSidSubAuthority(psid,1) == 93476,"GetSidSubAuthority gave %ld expected 93476\n", *GetSidSubAuthority(psid,1));
5011 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5012 SetLastError(0xbebecaca);
5013 ok(GetSidSubAuthority(psid,4) != NULL,"Expected out of bounds GetSidSubAuthority to return a non-NULL pointer\n");
5014 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5015 LocalFree(psid);
5016}
5017
5019{
5020 PTOKEN_GROUPS token_groups;
5021 DWORD size;
5022 HANDLE process_token, token;
5023 BOOL is_member;
5024 BOOL ret;
5025 DWORD i;
5026
5028 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
5029
5030 ret = DuplicateToken(process_token, SecurityImpersonation, &token);
5031 ok(ret, "DuplicateToken failed with error %ld\n", GetLastError());
5032
5033 /* groups */
5036 "GetTokenInformation(TokenGroups) %s with error %ld\n",
5037 ret ? "succeeded" : "failed", GetLastError());
5038 token_groups = malloc(size);
5039 ret = GetTokenInformation(token, TokenGroups, token_groups, size, &size);
5040 ok(ret, "GetTokenInformation(TokenGroups) failed with error %ld\n", GetLastError());
5041
5042 for (i = 0; i < token_groups->GroupCount; i++)
5043 {
5044 if (token_groups->Groups[i].Attributes & SE_GROUP_ENABLED)
5045 break;
5046 }
5047
5048 if (i == token_groups->GroupCount)
5049 {
5050 free(token_groups);
5052 skip("user not a member of any group\n");
5053 return;
5054 }
5055
5056 is_member = FALSE;
5057 ret = CheckTokenMembership(token, token_groups->Groups[i].Sid, &is_member);
5058 ok(ret, "CheckTokenMembership failed with error %ld\n", GetLastError());
5059 ok(is_member, "CheckTokenMembership should have detected sid as member\n");
5060
5061 is_member = FALSE;
5062 ret = CheckTokenMembership(NULL, token_groups->Groups[i].Sid, &is_member);
5063 ok(ret, "CheckTokenMembership failed with error %ld\n", GetLastError());
5064 ok(is_member, "CheckTokenMembership should have detected sid as member\n");
5065
5066 is_member = TRUE;
5067 SetLastError(0xdeadbeef);
5068 ret = CheckTokenMembership(process_token, token_groups->Groups[i].Sid, &is_member);
5070 "CheckTokenMembership with process token %s with error %ld\n",
5071 ret ? "succeeded" : "failed", GetLastError());
5072 ok(!is_member, "CheckTokenMembership should have cleared is_member\n");
5073
5074 free(token_groups);
5076 CloseHandle(process_token);
5077}
5078
5079static void test_EqualSid(void)
5080{
5081 PSID sid1, sid2;
5082 BOOL ret;
5085
5086 SetLastError(0xdeadbeef);
5088 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &sid1);
5090 {
5091 win_skip("AllocateAndInitializeSid is not implemented\n");
5092 return;
5093 }
5094 ok(ret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
5095 ok(GetLastError() == 0xdeadbeef,
5096 "AllocateAndInitializeSid shouldn't have set last error to %ld\n",
5097 GetLastError());
5098
5100 0, 0, 0, 0, 0, 0, 0, &sid2);
5101 ok(ret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
5102
5103 SetLastError(0xdeadbeef);
5104 ret = EqualSid(sid1, sid2);
5105 ok(!ret, "World and domain admins sids shouldn't have been equal\n");
5107 "EqualSid should have set last error to ERROR_SUCCESS instead of %ld\n",
5108 GetLastError());
5109
5110 SetLastError(0xdeadbeef);
5111 sid2 = FreeSid(sid2);
5112 ok(!sid2, "FreeSid should have returned NULL instead of %p\n", sid2);
5113 ok(GetLastError() == 0xdeadbeef,
5114 "FreeSid shouldn't have set last error to %ld\n",
5115 GetLastError());
5116
5118 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &sid2);
5119 ok(ret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
5120
5121#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
5122 SetLastError(0xdeadbeef);
5123 ret = EqualSid(sid1, sid2);
5124 ok(ret, "Same sids should have been equal %s != %s\n",
5125 debugstr_sid(sid1), debugstr_sid(sid2));
5127 "EqualSid should have set last error to ERROR_SUCCESS instead of %ld\n",
5128 GetLastError());
5129#endif
5130
5131 ((SID *)sid2)->Revision = 2;
5132 SetLastError(0xdeadbeef);
5133 ret = EqualSid(sid1, sid2);
5134 ok(!ret, "EqualSid with invalid sid should have returned FALSE\n");
5136 "EqualSid should have set last error to ERROR_SUCCESS instead of %ld\n",
5137 GetLastError());
5138 ((SID *)sid2)->Revision = SID_REVISION;
5139
5140 FreeSid(sid1);
5141 FreeSid(sid2);
5142}
5143
5144static void test_GetUserNameA(void)
5145{
5146 char buffer[UNLEN + 1], filler[UNLEN + 1];
5147 DWORD required_len, buffer_len;
5148 BOOL ret;
5149
5150 /* Test crashes on Windows. */
5151 if (0)
5152 {
5153 SetLastError(0xdeadbeef);
5155 }
5156
5157 SetLastError(0xdeadbeef);
5158 required_len = 0;
5159 ret = GetUserNameA(NULL, &required_len);
5160 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5161 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5162 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5163
5164 SetLastError(0xdeadbeef);
5165 required_len = 1;
5166 ret = GetUserNameA(NULL, &required_len);
5167 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5168 ok(required_len != 0 && required_len != 1, "Outputted buffer length was %lu\n", required_len);
5169 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5170
5171 /* Tests crashes on Windows. */
5172 if (0)
5173 {
5174 SetLastError(0xdeadbeef);
5175 required_len = UNLEN + 1;
5176 GetUserNameA(NULL, &required_len);
5177
5178 SetLastError(0xdeadbeef);
5180 }
5181
5182 memset(filler, 'x', sizeof(filler));
5183
5184 /* Note that GetUserNameA on XP and newer outputs the number of bytes
5185 * required for a Unicode string, which affects a test in the next block. */
5186 SetLastError(0xdeadbeef);
5187 memcpy(buffer, filler, sizeof(filler));
5188 required_len = 0;
5189 ret = GetUserNameA(buffer, &required_len);
5190 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5191 ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
5192 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5193 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5194
5195 SetLastError(0xdeadbeef);
5196 memcpy(buffer, filler, sizeof(filler));
5197 buffer_len = required_len;
5198 ret = GetUserNameA(buffer, &buffer_len);
5199 ok(ret == TRUE, "GetUserNameA returned %d, last error %lu\n", ret, GetLastError());
5200 ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
5201 ok(buffer_len == required_len ||
5202 broken(buffer_len == required_len / sizeof(WCHAR)), /* XP+ */
5203 "Outputted buffer length was %lu\n", buffer_len);
5204 ok(GetLastError() == 0xdeadbeef, "Last error was %lu\n", GetLastError());
5205
5206 /* Use the reported buffer size from the last GetUserNameA call and pass
5207 * a length that is one less than the required value. */
5208 SetLastError(0xdeadbeef);
5209 memcpy(buffer, filler, sizeof(filler));
5210 buffer_len--;
5211 ret = GetUserNameA(buffer, &buffer_len);
5212 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5213 ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was untouched\n");
5214 ok(buffer_len == required_len, "Outputted buffer length was %lu\n", buffer_len);
5215 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5216}
5217
5218static void test_GetUserNameW(void)
5219{
5220 WCHAR buffer[UNLEN + 1], filler[UNLEN + 1];
5221 DWORD required_len, buffer_len;
5222 BOOL ret;
5223
5224 /* Test crashes on Windows. */
5225 if (0)
5226 {
5227 SetLastError(0xdeadbeef);
5229 }
5230
5231 SetLastError(0xdeadbeef);
5232 required_len = 0;
5233 ret = GetUserNameW(NULL, &required_len);
5234 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5235 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5236 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5237
5238 SetLastError(0xdeadbeef);
5239 required_len = 1;
5240 ret = GetUserNameW(NULL, &required_len);
5241 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5242 ok(required_len != 0 && required_len != 1, "Outputted buffer length was %lu\n", required_len);
5243 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5244
5245 /* Tests crash on Windows. */
5246 if (0)
5247 {
5248 SetLastError(0xdeadbeef);
5249 required_len = UNLEN + 1;
5250 GetUserNameW(NULL, &required_len);
5251
5252 SetLastError(0xdeadbeef);
5254 }
5255
5256 memset(filler, 'x', sizeof(filler));
5257
5258 SetLastError(0xdeadbeef);
5259 memcpy(buffer, filler, sizeof(filler));
5260 required_len = 0;
5261 ret = GetUserNameW(buffer, &required_len);
5262 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5263 ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
5264 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5265 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5266
5267 SetLastError(0xdeadbeef);
5268 memcpy(buffer, filler, sizeof(filler));
5269 buffer_len = required_len;
5270 ret = GetUserNameW(buffer, &buffer_len);
5271 ok(ret == TRUE, "GetUserNameW returned %d, last error %lu\n", ret, GetLastError());
5272 ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
5273 ok(buffer_len == required_len, "Outputted buffer length was %lu\n", buffer_len);
5274 ok(GetLastError() == 0xdeadbeef, "Last error was %lu\n", GetLastError());
5275
5276 /* GetUserNameW on XP and newer writes a truncated portion of the username string to the buffer. */
5277 SetLastError(0xdeadbeef);
5278 memcpy(buffer, filler, sizeof(filler));
5279 buffer_len--;
5280 ret = GetUserNameW(buffer, &buffer_len);
5281 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5282 ok(!memcmp(buffer, filler, sizeof(filler)) ||
5283 broken(memcmp(buffer, filler, sizeof(filler)) != 0), /* XP+ */
5284 "Output buffer was altered\n");
5285 ok(buffer_len == required_len, "Outputted buffer length was %lu\n", buffer_len);
5286 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5287}
5288
5290{
5291 HANDLE process_token, token, r_token;
5292 PTOKEN_GROUPS token_groups, groups2;
5293 LUID_AND_ATTRIBUTES lattr;
5294 SID_AND_ATTRIBUTES sattr;
5296 SID *removed_sid = NULL;
5297 char privs_buffer[1000];
5298 TOKEN_PRIVILEGES *privs = (TOKEN_PRIVILEGES *)privs_buffer;
5299 PRIVILEGE_SET priv_set;
5301 BOOL is_member;
5302 DWORD size;
5303 LUID luid = { 0, 0 };
5304 BOOL ret;
5305 DWORD i;
5306
5308 ok(ret, "got error %ld\n", GetLastError());
5309
5312 ok(ret, "got error %ld\n", GetLastError());
5313
5316 "got %d with error %ld\n", ret, GetLastError());
5317 token_groups = malloc(size);
5318 ret = GetTokenInformation(token, TokenGroups, token_groups, size, &size);
5319 ok(ret, "got error %ld\n", GetLastError());
5320
5321 for (i = 0; i < token_groups->GroupCount; i++)
5322 {
5323 if (token_groups->Groups[i].Attributes & SE_GROUP_ENABLED)
5324 {
5325 removed_sid = token_groups->Groups[i].Sid;
5326 break;
5327 }
5328 }
5329 ok(!!removed_sid, "user is not a member of any group\n");
5330
5331 is_member = FALSE;
5332 ret = CheckTokenMembership(token, removed_sid, &is_member);
5333 ok(ret, "got error %ld\n", GetLastError());
5334 ok(is_member, "not a member\n");
5335
5336 sattr.Sid = removed_sid;
5337 sattr.Attributes = 0;
5338 r_token = NULL;
5339 ret = CreateRestrictedToken(token, 0, 1, &sattr, 0, NULL, 0, NULL, &r_token);
5340 ok(ret, "got error %ld\n", GetLastError());
5341
5342 is_member = TRUE;
5343 ret = CheckTokenMembership(r_token, removed_sid, &is_member);
5344 ok(ret, "got error %ld\n", GetLastError());
5345 ok(!is_member, "not a member\n");
5346
5347 ret = GetTokenInformation(r_token, TokenGroups, NULL, 0, &size);
5348 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %d with error %ld\n",
5349 ret, GetLastError());
5350 groups2 = malloc(size);
5351 ret = GetTokenInformation(r_token, TokenGroups, groups2, size, &size);
5352 ok(ret, "got error %ld\n", GetLastError());
5353
5354 for (i = 0; i < groups2->GroupCount; i++)
5355 {
5356 if (EqualSid(groups2->Groups[i].Sid, removed_sid))
5357 {
5358 DWORD attr = groups2->Groups[i].Attributes;
5359 ok(attr & SE_GROUP_USE_FOR_DENY_ONLY, "got wrong attributes %#lx\n", attr);
5360 ok(!(attr & SE_GROUP_ENABLED), "got wrong attributes %#lx\n", attr);
5361 break;
5362 }
5363 }
5364
5365 free(groups2);
5366
5367 size = sizeof(type);
5368 ret = GetTokenInformation(r_token, TokenType, &type, size, &size);
5369 ok(ret, "got error %ld\n", GetLastError());
5370 ok(type == TokenImpersonation, "got type %u\n", type);
5371
5372 size = sizeof(level);
5374 ok(ret, "got error %ld\n", GetLastError());
5375 ok(level == SecurityImpersonation, "got level %u\n", type);
5376
5377 CloseHandle(r_token);
5378
5379 r_token = NULL;
5380 ret = CreateRestrictedToken(process_token, 0, 1, &sattr, 0, NULL, 0, NULL, &r_token);
5381 ok(ret, "got error %lu\n", GetLastError());
5382
5383 size = sizeof(type);
5384 ret = GetTokenInformation(r_token, TokenType, &type, size, &size);
5385 ok(ret, "got error %lu\n", GetLastError());
5386 ok(type == TokenPrimary, "got type %u\n", type);
5387
5388 CloseHandle(r_token);
5389
5390 ret = GetTokenInformation(token, TokenPrivileges, privs, sizeof(privs_buffer), &size);
5391 ok(ret, "got error %lu\n", GetLastError());
5392
5393 for (i = 0; i < privs->PrivilegeCount; i++)
5394 {
5396 {
5397 luid = privs->Privileges[i].Luid;
5398 break;
5399 }
5400 }
5401 ok(i < privs->PrivilegeCount, "user has no privileges\n");
5402
5403 lattr.Luid = luid;
5404 lattr.Attributes = 0;
5405 r_token = NULL;
5406 ret = CreateRestrictedToken(token, 0, 0, NULL, 1, &lattr, 0, NULL, &r_token);
5407 ok(ret, "got error %lu\n", GetLastError());
5408
5409 priv_set.PrivilegeCount = 1;
5410 priv_set.Control = 0;
5411 priv_set.Privilege[0].Luid = luid;
5412 priv_set.Privilege[0].Attributes = 0;
5413 ret = PrivilegeCheck(r_token, &priv_set, &is_member);
5414 ok(ret, "got error %lu\n", GetLastError());
5415 ok(!is_member, "privilege should not be enabled\n");
5416
5417 ret = GetTokenInformation(r_token, TokenPrivileges, privs, sizeof(privs_buffer), &size);
5418 ok(ret, "got error %lu\n", GetLastError());
5419
5420 is_member = FALSE;
5421 for (i = 0; i < privs->PrivilegeCount; i++)
5422 {
5423 if (!memcmp(&privs->Privileges[i].Luid, &luid, sizeof(luid)))
5424 is_member = TRUE;
5425 }
5426 ok(!is_member, "disabled privilege should not be present\n");
5427
5428 CloseHandle(r_token);
5429
5430 removed_sid->SubAuthority[0] = 0xdeadbeef;
5431 lattr.Luid.LowPart = 0xdeadbeef;
5432 r_token = NULL;
5433 ret = CreateRestrictedToken(token, 0, 1, &sattr, 1, &lattr, 0, NULL, &r_token);
5434 ok(ret, "got error %lu\n", GetLastError());
5435 CloseHandle(r_token);
5436
5437 free(token_groups);
5439 CloseHandle(process_token);
5440}
5441
5443{
5444 BOOL ret, present, defaulted;
5445 ACL *acl;
5446 void *sid;
5447
5449 ok(ret, "security descriptor is not valid\n");
5450
5451 present = -1;
5452 defaulted = -1;
5453 acl = (void *)0xdeadbeef;
5454 SetLastError(0xdeadbeef);
5455 ret = GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted);
5456 ok(ret, "GetSecurityDescriptorDacl error %ld\n", GetLastError());
5457 todo_wine
5458 ok(present == 1, "acl is not present\n");
5459 todo_wine
5460 ok(acl != (void *)0xdeadbeef && acl != NULL, "acl pointer is not set\n");
5461 ok(defaulted == 0, "defaulted is set to TRUE\n");
5462
5463 defaulted = -1;
5464 sid = (void *)0xdeadbeef;
5465 SetLastError(0xdeadbeef);
5466 ret = GetSecurityDescriptorOwner(sd, &sid, &defaulted);
5467 ok(ret, "GetSecurityDescriptorOwner error %ld\n", GetLastError());
5468 todo_wine
5469 ok(sid != (void *)0xdeadbeef && sid != NULL, "sid pointer is not set\n");
5470 ok(defaulted == 0, "defaulted is set to TRUE\n");
5471
5472 defaulted = -1;
5473 sid = (void *)0xdeadbeef;
5474 SetLastError(0xdeadbeef);
5475 ret = GetSecurityDescriptorGroup(sd, &sid, &defaulted);
5476 ok(ret, "GetSecurityDescriptorGroup error %ld\n", GetLastError());
5477 todo_wine
5478 ok(sid != (void *)0xdeadbeef && sid != NULL, "sid pointer is not set\n");
5479 ok(defaulted == 0, "defaulted is set to TRUE\n");
5480}
5481
5483{
5484 DWORD ret, granted, priv_set_len;
5485 BOOL status;
5486 PRIVILEGE_SET priv_set;
5488
5491
5492 priv_set_len = sizeof(priv_set);
5493 granted = 0xdeadbeef;
5494 status = 0xdeadbeef;
5495 SetLastError(0xdeadbeef);
5496 ret = AccessCheck(sd, token, MAXIMUM_ALLOWED, mapping, &priv_set, &priv_set_len, &granted, &status);
5497todo_wine {
5498 ok(ret, "AccessCheck error %ld\n", GetLastError());
5499 ok(status == 1, "expected 1, got %d\n", status);
5500 ok(granted == mapping->GenericAll, "expected all access %#lx, got %#lx\n", mapping->GenericAll, granted);
5501}
5502 priv_set_len = sizeof(priv_set);
5503 granted = 0xdeadbeef;
5504 status = 0xdeadbeef;
5505 SetLastError(0xdeadbeef);
5506 ret = AccessCheck(sd, token, 0, mapping, &priv_set, &priv_set_len, &granted, &status);
5507todo_wine {
5508 ok(ret, "AccessCheck error %ld\n", GetLastError());
5509 ok(status == 0, "expected 0, got %d\n", status);
5510 ok(granted == 0, "expected 0, got %#lx\n", granted);
5511}
5512 priv_set_len = sizeof(priv_set);
5513 granted = 0xdeadbeef;
5514 status = 0xdeadbeef;
5515 SetLastError(0xdeadbeef);
5516 ret = AccessCheck(sd, token, ACCESS_SYSTEM_SECURITY, mapping, &priv_set, &priv_set_len, &granted, &status);
5517todo_wine {
5518 ok(ret, "AccessCheck error %ld\n", GetLastError());
5519 ok(status == 0, "expected 0, got %d\n", status);
5520 ok(granted == 0, "expected 0, got %#lx\n", granted);
5521}
5522 priv_set_len = sizeof(priv_set);
5523 granted = 0xdeadbeef;
5524 status = 0xdeadbeef;
5525 SetLastError(0xdeadbeef);
5526 ret = AccessCheck(sd, token, mapping->GenericRead, mapping, &priv_set, &priv_set_len, &granted, &status);
5527todo_wine {
5528 ok(ret, "AccessCheck error %ld\n", GetLastError());
5529 ok(status == 1, "expected 1, got %d\n", status);
5530 ok(granted == mapping->GenericRead, "expected read access %#lx, got %#lx\n", mapping->GenericRead, granted);
5531}
5532 priv_set_len = sizeof(priv_set);
5533 granted = 0xdeadbeef;
5534 status = 0xdeadbeef;
5535 SetLastError(0xdeadbeef);
5536 ret = AccessCheck(sd, token, mapping->GenericWrite, mapping, &priv_set, &priv_set_len, &granted, &status);
5537todo_wine {
5538 ok(ret, "AccessCheck error %ld\n", GetLastError());
5539 ok(status == 1, "expected 1, got %d\n", status);
5540 ok(granted == mapping->GenericWrite, "expected write access %#lx, got %#lx\n", mapping->GenericWrite, granted);
5541}
5542 priv_set_len = sizeof(priv_set);
5543 granted = 0xdeadbeef;
5544 status = 0xdeadbeef;
5545 SetLastError(0xdeadbeef);
5546 ret = AccessCheck(sd, token, mapping->GenericExecute, mapping, &priv_set, &priv_set_len, &granted, &status);
5547todo_wine {
5548 ok(ret, "AccessCheck error %ld\n", GetLastError());
5549 ok(status == 1, "expected 1, got %d\n", status);
5550 ok(granted == mapping->GenericExecute, "expected execute access %#lx, got %#lx\n", mapping->GenericExecute, granted);
5551}
5552 free(sd);
5553}
5554
5556{
5559
5561 ok(!status, "NtQueryObject error %#lx\n", status);
5562
5563 return info.GrantedAccess;
5564}
5565
5567{
5568 DWORD ret, i, access;
5569 HANDLE mutex, dup;
5574 static const struct
5575 {
5576 int generic, mapped;
5577 } map[] =
5578 {
5579 { 0, 0 },
5584 };
5585
5586 SetLastError(0xdeadbeef);
5587 mutex = OpenMutexA(0, FALSE, "WineTestMutex");
5588 ok(!mutex, "mutex should not exist\n");
5589 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
5590
5591 SetLastError(0xdeadbeef);
5592 mutex = CreateMutexA(NULL, FALSE, "WineTestMutex");
5593 ok(mutex != 0, "CreateMutex error %ld\n", GetLastError());
5594
5596 ok(access == MUTANT_ALL_ACCESS, "expected MUTANT_ALL_ACCESS, got %#lx\n", access);
5597
5598 for (i = 0; i < ARRAY_SIZE(map); i++)
5599 {
5600 SetLastError( 0xdeadbeef );
5602 map[i].generic, FALSE, 0);
5603 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5604
5606 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5607
5609
5610 SetLastError(0xdeadbeef);
5611 dup = OpenMutexA(0, FALSE, "WineTestMutex");
5612 todo_wine
5613 ok(!dup, "OpenMutex should fail\n");
5614 todo_wine
5615 ok(GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError());
5616 }
5617
5619
5621}
5622
5624{
5625 DWORD ret, i, access;
5626 HANDLE event, dup;
5631 static const struct
5632 {
5633 int generic, mapped;
5634 } map[] =
5635 {
5636 { 0, 0 },
5641 };
5642
5643 SetLastError(0xdeadbeef);
5644 event = OpenEventA(0, FALSE, "WineTestEvent");
5645 ok(!event, "event should not exist\n");
5646 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
5647
5648 SetLastError(0xdeadbeef);
5649 event = CreateEventA(NULL, FALSE, FALSE, "WineTestEvent");
5650 ok(event != 0, "CreateEvent error %ld\n", GetLastError());
5651
5653 ok(access == EVENT_ALL_ACCESS, "expected EVENT_ALL_ACCESS, got %#lx\n", access);
5654
5655 for (i = 0; i < ARRAY_SIZE(map); i++)
5656 {
5657 SetLastError( 0xdeadbeef );
5659 map[i].generic, FALSE, 0);
5660 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5661
5663 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5664
5666
5667 SetLastError(0xdeadbeef);
5668 dup = OpenEventA(0, FALSE, "WineTestEvent");
5669 todo_wine
5670 ok(!dup, "OpenEvent should fail\n");
5671 todo_wine
5672 ok(GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError());
5673 }
5674
5676
5678}
5679
5681{
5682 DWORD ret, i, access;
5683 HANDLE sem, dup;
5688 static const struct
5689 {
5690 int generic, mapped;
5691 } map[] =
5692 {
5693 { 0, 0 },
5698 };
5699
5700 SetLastError(0xdeadbeef);
5701 sem = OpenSemaphoreA(0, FALSE, "WineTestSemaphore");
5702 ok(!sem, "semaphore should not exist\n");
5703 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
5704
5705 SetLastError(0xdeadbeef);
5706 sem = CreateSemaphoreA(NULL, 0, 10, "WineTestSemaphore");
5707 ok(sem != 0, "CreateSemaphore error %ld\n", GetLastError());
5708
5710 ok(access == SEMAPHORE_ALL_ACCESS, "expected SEMAPHORE_ALL_ACCESS, got %#lx\n", access);
5711
5712 for (i = 0; i < ARRAY_SIZE(map); i++)
5713 {
5714 SetLastError( 0xdeadbeef );
5716 map[i].generic, FALSE, 0);
5717 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5718
5720 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5721
5723 }
5724
5726
5728}
5729
5730#define WINE_TEST_PIPE "\\\\.\\pipe\\WineTestPipe"
5732{
5733 DWORD ret, i, access;
5734 HANDLE pipe, file, dup;
5739 static const struct
5740 {
5741 int generic, mapped;
5742 } map[] =
5743 {
5744 { 0, 0 },
5749 };
5750 static const struct
5751 {
5752 DWORD open_mode;
5753 DWORD access;
5754 } creation_access[] =
5755 {
5761 /* ACCESS_SYSTEM_SECURITY is also valid, but will fail with ERROR_PRIVILEGE_NOT_HELD */
5762 };
5763
5764 /* Test the different security access options for pipes */
5765 for (i = 0; i < ARRAY_SIZE(creation_access); i++)
5766 {
5767 SetLastError(0xdeadbeef);
5768 pipe = CreateNamedPipeA(WINE_TEST_PIPE, creation_access[i].open_mode,
5771 ok(pipe != INVALID_HANDLE_VALUE, "CreateNamedPipe(0x%lx) error %ld\n",
5772 creation_access[i].open_mode, GetLastError());
5773 access = get_obj_access(pipe);
5774 ok(access == creation_access[i].access,
5775 "CreateNamedPipeA(0x%lx) pipe expected access 0x%lx (got 0x%lx)\n",
5776 creation_access[i].open_mode, creation_access[i].access, access);
5777 CloseHandle(pipe);
5778 }
5779
5780 SetLastError(0xdeadbeef);
5784 ok(pipe != INVALID_HANDLE_VALUE, "CreateNamedPipe error %ld\n", GetLastError());
5785
5787
5788 SetLastError(0xdeadbeef);
5790 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5791
5793 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5794
5795 for (i = 0; i < ARRAY_SIZE(map); i++)
5796 {
5797 SetLastError( 0xdeadbeef );
5799 map[i].generic, FALSE, 0);
5800 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5801
5803 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5804
5806 }
5807
5809 CloseHandle(pipe);
5810
5811 SetLastError(0xdeadbeef);
5813 ok(file != INVALID_HANDLE_VALUE || broken(file == INVALID_HANDLE_VALUE) /* before Vista */, "CreateFile error %ld\n", GetLastError());
5814
5816 {
5818 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5819
5820 for (i = 0; i < ARRAY_SIZE(map); i++)
5821 {
5822 SetLastError( 0xdeadbeef );
5824 map[i].generic, FALSE, 0);
5825 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5826
5828 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5830 }
5831 }
5832
5834}
5835
5837{
5838 DWORD ret, i, access, bytes;
5839 HANDLE file, dup;
5840 static const struct
5841 {
5842 int generic, mapped;
5843 } map[] =
5844 {
5845 { 0, 0 },
5850 };
5851 char temp_path[MAX_PATH];
5852 char file_name[MAX_PATH];
5853 char buf[16];
5854
5857
5858 /* file */
5859 SetLastError(0xdeadbeef);
5861 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5862
5864 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5865
5866 for (i = 0; i < ARRAY_SIZE(map); i++)
5867 {
5868 SetLastError( 0xdeadbeef );
5870 map[i].generic, FALSE, 0);
5871 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5872
5874 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5875
5877 }
5878
5880
5881 SetLastError(0xdeadbeef);
5883 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5884
5886 ok(access == (FILE_READ_ATTRIBUTES | SYNCHRONIZE), "expected FILE_READ_ATTRIBUTES | SYNCHRONIZE, got %#lx\n", access);
5887
5888 bytes = 0xdeadbeef;
5889 SetLastError(0xdeadbeef);
5890 ret = ReadFile(file, buf, sizeof(buf), &bytes, NULL);
5891 ok(!ret, "ReadFile should fail\n");
5892 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
5893 ok(bytes == 0, "expected 0, got %lu\n", bytes);
5894
5896
5897 SetLastError(0xdeadbeef);
5899 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5900
5902 ok(access == (FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES), "expected FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES, got %#lx\n", access);
5903
5904 bytes = 0xdeadbeef;
5905 SetLastError(0xdeadbeef);
5906 ret = ReadFile(file, buf, sizeof(buf), &bytes, NULL);
5907 ok(!ret, "ReadFile should fail\n");
5908 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
5909 ok(bytes == 0, "expected 0, got %lu\n", bytes);
5910
5913
5914 /* directory */
5915 SetLastError(0xdeadbeef);
5917 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5918
5920 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5921
5922 for (i = 0; i < ARRAY_SIZE(map); i++)
5923 {
5924 SetLastError( 0xdeadbeef );
5926 map[i].generic, FALSE, 0);
5927 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5928
5930 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5931
5933 }
5934
5936
5937 SetLastError(0xdeadbeef);
5939 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5940
5942 ok(access == (FILE_READ_ATTRIBUTES | SYNCHRONIZE), "expected FILE_READ_ATTRIBUTES | SYNCHRONIZE, got %#lx\n", access);
5943
5945
5946 SetLastError(0xdeadbeef);
5948 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5949
5951 ok(access == (FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES), "expected FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES, got %#lx\n", access);
5952
5954}
5955
5956static void test_filemap_security(void)
5957{
5958 char temp_path[MAX_PATH];
5959 char file_name[MAX_PATH];
5960 DWORD ret, i, access;
5961 HANDLE file, mapping, dup, created_mapping;
5962 static const struct
5963 {
5964 int generic, mapped;
5965 BOOL open_only;
5966 } map[] =
5967 {
5968 { 0, 0 },
5978 };
5979 static const struct
5980 {
5981 int prot, mapped;
5982 } prot_map[] =
5983 {
5984 { 0, 0 },
5985 { PAGE_NOACCESS, 0 },
5989 { PAGE_EXECUTE, 0 },
5993 };
5994
5997
5998 SetLastError(0xdeadbeef);
6000 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
6003
6004 for (i = 0; i < ARRAY_SIZE(prot_map); i++)
6005 {
6006 if (map[i].open_only) continue;
6007
6008 SetLastError(0xdeadbeef);
6009 mapping = CreateFileMappingW(file, NULL, prot_map[i].prot, 0, 4096, NULL);
6010 if (prot_map[i].mapped)
6011 {
6012 ok(mapping != 0, "CreateFileMapping(%04x) error %ld\n", prot_map[i].prot, GetLastError());
6013 }
6014 else
6015 {
6016 ok(!mapping, "CreateFileMapping(%04x) should fail\n", prot_map[i].prot);
6017 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
6018 continue;
6019 }
6020
6022 ok(access == prot_map[i].mapped, "%ld: expected %#x, got %#lx\n", i, prot_map[i].mapped, access);
6023
6025 }
6026
6027 SetLastError(0xdeadbeef);
6029 ok(mapping != 0, "CreateFileMapping error %ld\n", GetLastError());
6030
6033 "expected STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE, got %#lx\n", access);
6034
6035 for (i = 0; i < ARRAY_SIZE(map); i++)
6036 {
6037 if (map[i].open_only) continue;
6038
6039 SetLastError( 0xdeadbeef );
6041 map[i].generic, FALSE, 0);
6042 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6043
6045 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6046
6048 }
6049
6053
6054 created_mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000,
6055 "Wine Test Open Mapping");
6056 ok(created_mapping != NULL, "CreateFileMapping failed with error %lu\n", GetLastError());
6057
6058 for (i = 0; i < ARRAY_SIZE(map); i++)
6059 {
6060 if (!map[i].generic) continue;
6061
6062 mapping = OpenFileMappingA(map[i].generic, FALSE, "Wine Test Open Mapping");
6063 ok(mapping != NULL, "OpenFileMapping failed with error %ld\n", GetLastError());
6065 ok(access == map[i].mapped, "%ld: unexpected access flags %#lx, expected %#x\n",
6066 i, access, map[i].mapped);
6068 }
6069
6070 CloseHandle(created_mapping);
6071}
6072
6073static void test_thread_security(void)
6074{
6075 DWORD ret, i, access;
6076 HANDLE thread, dup;
6077 static const struct
6078 {
6079 int generic, mapped;
6080 } map[] =
6081 {
6082 { 0, 0 },
6087 };
6088
6089 SetLastError(0xdeadbeef);
6090 thread = CreateThread(NULL, 0, (void *)0xdeadbeef, NULL, CREATE_SUSPENDED, &ret);
6091 ok(thread != 0, "CreateThread error %ld\n", GetLastError());
6092
6094 ok(access == THREAD_ALL_ACCESS_NT4 || access == THREAD_ALL_ACCESS_VISTA, "expected THREAD_ALL_ACCESS, got %#lx\n", access);
6095
6096 for (i = 0; i < ARRAY_SIZE(map); i++)
6097 {
6098 SetLastError( 0xdeadbeef );
6100 map[i].generic, FALSE, 0);
6101 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6102
6104 switch (map[i].generic)
6105 {
6106 case GENERIC_READ:
6107 case GENERIC_EXECUTE:
6108 ok(access == map[i].mapped ||
6109 access == (map[i].mapped | THREAD_QUERY_LIMITED_INFORMATION) /* Vista+ */ ||
6110 access == (map[i].mapped | THREAD_QUERY_LIMITED_INFORMATION | THREAD_RESUME) /* win8 */,
6111 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6112 break;
6113 case GENERIC_WRITE:
6114 ok(access == map[i].mapped ||
6115 access == (map[i].mapped | THREAD_SET_LIMITED_INFORMATION) /* Vista+ */ ||
6116 access == (map[i].mapped | THREAD_SET_LIMITED_INFORMATION | THREAD_RESUME) /* win8 */,
6117 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6118 break;
6119 case GENERIC_ALL:
6120 ok(access == map[i].mapped || access == THREAD_ALL_ACCESS_VISTA,
6121 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6122 break;
6123 default:
6124 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6125 break;
6126 }
6127
6129 }
6130
6131 SetLastError( 0xdeadbeef );
6134 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6137 access == THREAD_QUERY_INFORMATION /* before Vista */,
6138 "expected THREAD_QUERY_INFORMATION|THREAD_QUERY_LIMITED_INFORMATION, got %#lx\n", access);
6140
6143}
6144
6145static void test_process_access(void)
6146{
6147 DWORD ret, i, access;
6149 STARTUPINFOA sti;
6151 char cmdline[] = "winver.exe";
6152 static const struct
6153 {
6154 int generic, mapped;
6155 } map[] =
6156 {
6157 { 0, 0 },
6163 };
6164
6165 memset(&sti, 0, sizeof(sti));
6166 sti.cb = sizeof(sti);
6167 SetLastError(0xdeadbeef);
6169 ok(ret, "CreateProcess() error %ld\n", GetLastError());
6170
6173
6175 ok(access == PROCESS_ALL_ACCESS_NT4 || access == PROCESS_ALL_ACCESS_VISTA, "expected PROCESS_ALL_ACCESS, got %#lx\n", access);
6176
6177 for (i = 0; i < ARRAY_SIZE(map); i++)
6178 {
6179 SetLastError( 0xdeadbeef );
6181 map[i].generic, FALSE, 0);
6182 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6183
6185 switch (map[i].generic)
6186 {
6187 case GENERIC_READ:
6188 ok(access == map[i].mapped || access == (map[i].mapped | PROCESS_QUERY_LIMITED_INFORMATION) /* Vista+ */,
6189 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6190 break;
6191 case GENERIC_WRITE:
6192 ok(access == map[i].mapped ||
6193 access == (map[i].mapped | PROCESS_TERMINATE) /* before Vista */ ||
6194 access == (map[i].mapped | PROCESS_SET_LIMITED_INFORMATION) /* win8 */ ||
6195 access == (map[i].mapped | PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_SET_LIMITED_INFORMATION) /* Win10 Anniversary Update */,
6196 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6197 break;
6198 case GENERIC_EXECUTE:
6199 ok(access == map[i].mapped || access == (map[i].mapped | PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_TERMINATE) /* Vista+ */,
6200 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6201 break;
6202 case GENERIC_ALL:
6203 ok(access == map[i].mapped || access == PROCESS_ALL_ACCESS_VISTA,
6204 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6205 break;
6206 default:
6207 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6208 break;
6209 }
6210
6212 }
6213
6214 SetLastError( 0xdeadbeef );
6217 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6220 access == PROCESS_QUERY_INFORMATION /* before Vista */,
6221 "expected PROCESS_QUERY_INFORMATION|PROCESS_QUERY_LIMITED_INFORMATION, got %#lx\n", access);
6223
6224 SetLastError( 0xdeadbeef );
6227 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6229 ok(access == PROCESS_VM_OPERATION, "unexpected access right %lx\n", access);
6231
6232 SetLastError( 0xdeadbeef );
6235 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6237 ok(access == PROCESS_VM_WRITE, "unexpected access right %lx\n", access);
6239
6240 SetLastError( 0xdeadbeef );
6243 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6246 broken(access == (PROCESS_VM_OPERATION | PROCESS_VM_WRITE)) /* Win8 and before */,
6247 "expected PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_QUERY_LIMITED_INFORMATION, got %#lx\n", access);
6249
6250 SetLastError( 0xdeadbeef );
6253 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6255 ok(access == (PROCESS_VM_OPERATION | PROCESS_VM_READ), "unexpected access right %lx\n", access);
6257
6260}
6261
6263{
6264 DWORD ret, needed;
6267
6268 type = 0xdeadbeef;
6269 needed = 0;
6270 SetLastError(0xdeadbeef);
6271 ret = GetTokenInformation(token, TokenType, &type, sizeof(type), &needed);
6272 ok(ret, "GetTokenInformation error %ld\n", GetLastError());
6273 ok(needed == sizeof(type), "GetTokenInformation should return required buffer length\n");
6274 ok(type == TokenPrimary || type == TokenImpersonation, "expected TokenPrimary or TokenImpersonation, got %d\n", type);
6275
6276 *token_type = type;
6277 if (type != TokenImpersonation) return FALSE;
6278
6279 needed = 0;
6280 SetLastError(0xdeadbeef);
6281 ret = GetTokenInformation(token, TokenImpersonationLevel, &sil, sizeof(sil), &needed);
6282 ok(ret, "GetTokenInformation error %ld\n", GetLastError());
6283 ok(needed == sizeof(sil), "GetTokenInformation should return required buffer length\n");
6284 ok(sil == SecurityImpersonation, "expected SecurityImpersonation, got %d\n", sil);
6285
6286 needed = 0xdeadbeef;
6287 SetLastError(0xdeadbeef);
6289 ok(!ret, "GetTokenInformation should fail\n");
6290 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6291 ok(needed != 0xdeadbeef, "GetTokenInformation should return required buffer length\n");
6292 ok(needed > sizeof(TOKEN_DEFAULT_DACL), "GetTokenInformation returned empty default DACL\n");
6293
6294 needed = 0xdeadbeef;
6295 SetLastError(0xdeadbeef);
6296 ret = GetTokenInformation(token, TokenOwner, NULL, 0, &needed);
6297 ok(!ret, "GetTokenInformation should fail\n");
6298 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6299 ok(needed != 0xdeadbeef, "GetTokenInformation should return required buffer length\n");
6300 ok(needed > sizeof(TOKEN_OWNER), "GetTokenInformation returned empty token owner\n");
6301
6302 needed = 0xdeadbeef;
6303 SetLastError(0xdeadbeef);
6305 ok(!ret, "GetTokenInformation should fail\n");
6306 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6307 ok(needed != 0xdeadbeef, "GetTokenInformation should return required buffer length\n");
6308 ok(needed > sizeof(TOKEN_PRIMARY_GROUP), "GetTokenInformation returned empty token primary group\n");
6309
6310 return TRUE;
6311}
6312
6314{
6315 HANDLE token, process_token;
6316 DWORD ret, token_type;
6317
6319 ok(ret, "OpenProcessToken error %ld\n", GetLastError());
6320
6321 ret = validate_impersonation_token(process_token, &token_type);
6322 ok(token_type == TokenPrimary, "expected TokenPrimary, got %ld\n", token_type);
6323 ok(!ret, "access token should not be an impersonation token\n");
6324
6325 ret = DuplicateToken(process_token, SecurityImpersonation, &token);
6326 ok(ret, "DuplicateToken error %ld\n", GetLastError());
6327
6328 ret = validate_impersonation_token(token, &token_type);
6329 ok(ret, "access token should be a valid impersonation token\n");
6330 ok(token_type == TokenImpersonation, "expected TokenImpersonation, got %ld\n", token_type);
6331
6340 /* FIXME: test other kernel object types */
6341
6342 CloseHandle(process_token);
6344}
6345
6347{
6349 BYTE buffer[64]; /* using max. 28 byte in win7 x64 */
6350 HANDLE token;
6351 DWORD size;
6352 DWORD res;
6353 static SID medium_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6355 static SID high_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6357
6358 SetLastError(0xdeadbeef);
6360 ok(res, "got %ld with %ld (expected TRUE)\n", res, GetLastError());
6361
6362 SetLastError(0xdeadbeef);
6364
6365 /* not supported before Vista */
6367 {
6368 win_skip("TokenIntegrityLevel not supported\n");
6370 return;
6371 }
6372
6373 ok(res, "got %lu with %lu (expected TRUE)\n", res, GetLastError());
6374 if (!res)
6375 {
6377 return;
6378 }
6379
6382 "got 0x%lx (expected 0x%x)\n", tml->Label.Attributes, (SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED));
6383
6384#ifdef __REACTOS__ // This crashes on Vista, Win7, and Win8.1.
6386#endif
6387 ok(EqualSid(tml->Label.Sid, &medium_level) || EqualSid(tml->Label.Sid, &high_level),
6388 "got %s (expected %s or %s)\n", debugstr_sid(tml->Label.Sid),
6389 debugstr_sid(&medium_level), debugstr_sid(&high_level));
6390
6392}
6393
6395{
6396 TOKEN_USER *token_user;
6397 TOKEN_OWNER *token_owner;
6398 TOKEN_PRIMARY_GROUP *token_primary_group;
6400 BOOL ret, defaulted, present, found;
6401 DWORD size, index;
6404 PSID owner, group;
6405 ACL *dacl;
6406 ACCESS_ALLOWED_ACE *ace;
6407
6409 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
6410
6411 token_user = get_alloc_token_user( token );
6412 token_owner = get_alloc_token_owner( token );
6413 token_primary_group = get_alloc_token_primary_group( token );
6414
6415 CloseHandle( token );
6416
6419 ok( ret, "error %lu\n", GetLastError() );
6420
6421 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
6422 sa.lpSecurityDescriptor = sd;
6423 sa.bInheritHandle = FALSE;
6424 handle = CreateEventA( &sa, TRUE, TRUE, "test_event" );
6425 ok( handle != NULL, "error %lu\n", GetLastError() );
6426
6427 size = 0;
6429 ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "error %lu\n", GetLastError() );
6430
6431 sd = malloc( size );
6433 ok( ret, "error %lu\n", GetLastError() );
6434
6435 owner = (void *)0xdeadbeef;
6436 defaulted = TRUE;
6437 ret = GetSecurityDescriptorOwner( sd, &owner, &defaulted );
6438 ok( ret, "error %lu\n", GetLastError() );
6439 ok( owner != (void *)0xdeadbeef, "owner not set\n" );
6440 ok( !defaulted, "owner defaulted\n" );
6441 ok( EqualSid( owner, token_owner->Owner ), "owner shall equal token owner\n" );
6442
6443 group = (void *)0xdeadbeef;
6444 defaulted = TRUE;
6445 ret = GetSecurityDescriptorGroup( sd, &group, &defaulted );
6446 ok( ret, "error %lu\n", GetLastError() );
6447 ok( group != (void *)0xdeadbeef, "group not set\n" );
6448 ok( !defaulted, "group defaulted\n" );
6449 ok( EqualSid( group, token_primary_group->PrimaryGroup ), "group shall equal token primary group\n" );
6450
6451 dacl = (void *)0xdeadbeef;
6452 present = FALSE;
6453 defaulted = TRUE;
6454 ret = GetSecurityDescriptorDacl( sd, &present, &dacl, &defaulted );
6455 ok( ret, "error %lu\n", GetLastError() );
6456 ok( present, "dacl not present\n" );
6457 ok( dacl != (void *)0xdeadbeef, "dacl not set\n" );
6458 ok( !defaulted, "dacl defaulted\n" );
6459
6460 index = 0;
6461 found = FALSE;
6462 while (GetAce( dacl, index++, (void **)&ace ))
6463 {
6465 "expected ACCESS_ALLOWED_ACE_TYPE, got %d\n", ace->Header.AceType );
6466 if (EqualSid( &ace->SidStart, owner )) found = TRUE;
6467 }
6468 ok( found, "owner sid not found in dacl\n" );
6469
6470 if (!EqualSid( token_user->User.Sid, token_owner->Owner ))
6471 {
6472 index = 0;
6473 found = FALSE;
6474 while (GetAce( dacl, index++, (void **)&ace ))
6475 {
6476 ok( ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE,
6477 "expected ACCESS_ALLOWED_ACE_TYPE, got %d\n", ace->Header.AceType );
6478 if (EqualSid( &ace->SidStart, token_user->User.Sid )) found = TRUE;
6479 }
6480 ok( !found, "DACL shall not reference token user if it is different from token owner\n" );
6481 }
6482
6483 free( sa.lpSecurityDescriptor );
6484 free( sd );
6486
6487 free( token_primary_group );
6488 free( token_owner );
6489 free( token_user );
6490}
6491
6493{
6495 HANDLE token;
6496 DWORD len;
6497 LUID luid;
6498 BOOL ret;
6499
6501 return;
6502
6504 {
6506 return;
6507 }
6508
6509 tp.PrivilegeCount = 1;
6510 tp.Privileges[0].Luid = luid;
6511 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
6512
6513 len = 0xdeadbeef;
6515 ok(ret, "got %d\n", ret);
6516 ok(len == 0xdeadbeef, "got length %ld\n", len);
6517
6518 /* revert */
6519 tp.PrivilegeCount = 1;
6520 tp.Privileges[0].Luid = luid;
6521 tp.Privileges[0].Attributes = 0;
6523 ok(ret, "got %d\n", ret);
6524
6526}
6527
6528static void test_AddAce(void)
6529{
6531
6532 char acl_buf[1024], ace_buf[256];
6533 ACCESS_ALLOWED_ACE *ace = (ACCESS_ALLOWED_ACE*)ace_buf;
6534 PACL acl = (PACL)acl_buf;
6535 BOOL ret;
6536
6537 memset(ace, 0, sizeof(ace_buf));
6539 ace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD)+sizeof(SID);
6540 memcpy(&ace->SidStart, &sidWorld, sizeof(sidWorld));
6541
6542 ret = InitializeAcl(acl, sizeof(acl_buf), ACL_REVISION2);
6543 ok(ret, "InitializeAcl failed: %ld\n", GetLastError());
6544
6545 ret = AddAce(acl, ACL_REVISION1, MAXDWORD, ace, ace->Header.AceSize);
6546 ok(ret, "AddAce failed: %ld\n", GetLastError());
6547 ret = AddAce(acl, ACL_REVISION2, MAXDWORD, ace, ace->Header.AceSize);
6548 ok(ret, "AddAce failed: %ld\n", GetLastError());
6549 ret = AddAce(acl, ACL_REVISION3, MAXDWORD, ace, ace->Header.AceSize);
6550 ok(ret, "AddAce failed: %ld\n", GetLastError());
6551 ok(acl->AclRevision == ACL_REVISION3, "acl->AclRevision = %d\n", acl->AclRevision);
6552 ret = AddAce(acl, ACL_REVISION4, MAXDWORD, ace, ace->Header.AceSize);
6553 ok(ret, "AddAce failed: %ld\n", GetLastError());
6554 ok(acl->AclRevision == ACL_REVISION4, "acl->AclRevision = %d\n", acl->AclRevision);
6555 ret = AddAce(acl, ACL_REVISION1, MAXDWORD, ace, ace->Header.AceSize);
6556 ok(ret, "AddAce failed: %ld\n", GetLastError());
6557 ok(acl->AclRevision == ACL_REVISION4, "acl->AclRevision = %d\n", acl->AclRevision);
6558 ret = AddAce(acl, ACL_REVISION2, MAXDWORD, ace, ace->Header.AceSize);
6559 ok(ret, "AddAce failed: %ld\n", GetLastError());
6560
6561 ret = AddAce(acl, MIN_ACL_REVISION-1, MAXDWORD, ace, ace->Header.AceSize);
6562 ok(ret, "AddAce failed: %ld\n", GetLastError());
6563 /* next test succeededs but corrupts ACL */
6564 ret = AddAce(acl, MAX_ACL_REVISION+1, MAXDWORD, ace, ace->Header.AceSize);
6565 ok(ret, "AddAce failed: %ld\n", GetLastError());
6566 ok(acl->AclRevision == MAX_ACL_REVISION+1, "acl->AclRevision = %d\n", acl->AclRevision);
6567 SetLastError(0xdeadbeef);
6568 ret = AddAce(acl, ACL_REVISION1, MAXDWORD, ace, ace->Header.AceSize);
6569 ok(!ret, "AddAce succeeded\n");
6570 ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %ld\n", GetLastError());
6571}
6572
6573static void test_AddMandatoryAce(void)
6574{
6575 static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6577 static SID medium_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6580 char buffer_sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
6581 SECURITY_DESCRIPTOR *sd2, *sd = (SECURITY_DESCRIPTOR *)&buffer_sd;
6582 BOOL defaulted, present, ret;
6583 ACL_SIZE_INFORMATION acl_size_info;
6585 char buffer_acl[256];
6586 ACL *acl = (ACL *)&buffer_acl;
6588 DWORD size;
6589 HANDLE handle;
6590 SID *everyone;
6591 ACL *sacl;
6592
6593 if (!pAddMandatoryAce)
6594 {
6595 win_skip("AddMandatoryAce not supported, skipping test\n");
6596 return;
6597 }
6598
6600 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
6601
6602 sa.nLength = sizeof(sa);
6603 sa.lpSecurityDescriptor = sd;
6604 sa.bInheritHandle = FALSE;
6605
6606 handle = CreateEventA(&sa, TRUE, TRUE, "test_event");
6607 ok(handle != NULL, "CreateEventA failed with error %lu\n", GetLastError());
6608
6611 "Unexpected GetKernelObjectSecurity return value %u, error %lu\n", ret, GetLastError());
6612
6613 sd2 = malloc(size);
6615 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6616
6617 sacl = (void *)0xdeadbeef;
6618 present = TRUE;
6619 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6620 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6621 ok(!present, "SACL is present\n");
6622 ok(sacl == (void *)0xdeadbeef, "SACL is set\n");
6623
6624 free(sd2);
6626
6627 memset(buffer_acl, 0, sizeof(buffer_acl));
6628 ret = InitializeAcl(acl, 256, ACL_REVISION);
6629 ok(ret, "InitializeAcl failed with %lu\n", GetLastError());
6630
6631 SetLastError(0xdeadbeef);
6632 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, 0x1234, &low_level);
6633 ok(!ret, "AddMandatoryAce succeeded\n");
6635 "Expected ERROR_INVALID_PARAMETER got %lu\n", GetLastError());
6636
6637 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, &low_level);
6638 ok(ret, "AddMandatoryAce failed with %lu\n", GetLastError());
6639
6640 ret = GetAce(acl, 0, (void **)&ace);
6641 ok(ret, "got error %lu\n", GetLastError());
6642 ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "got type %#x\n", ace->Header.AceType);
6643 ok(!ace->Header.AceFlags, "got flags %#x\n", ace->Header.AceFlags);
6644 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "got mask %#lx\n", ace->Mask);
6645 ok(EqualSid(&ace->SidStart, &low_level), "wrong sid\n");
6646
6647 SetLastError(0xdeadbeef);
6648 ret = GetAce(acl, 1, (void **)&ace);
6649 ok(!ret, "expected failure\n");
6650 ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
6651
6653 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6654
6655 handle = CreateEventA(&sa, TRUE, TRUE, "test_event");
6656 ok(handle != NULL, "CreateEventA failed with error %lu\n", GetLastError());
6657
6660 "Unexpected GetKernelObjectSecurity return value %u, error %lu\n", ret, GetLastError());
6661
6662 sd2 = malloc(size);
6664 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6665
6666 sacl = (void *)0xdeadbeef;
6667 present = FALSE;
6668 defaulted = TRUE;
6669 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6670 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6671 ok(present, "SACL not present\n");
6672 ok(sacl != (void *)0xdeadbeef, "SACL not set\n");
6673 ok(!defaulted, "SACL defaulted\n");
6674 ret = GetAclInformation(sacl, &acl_size_info, sizeof(acl_size_info), AclSizeInformation);
6675 ok(ret, "GetAclInformation failed with error %lu\n", GetLastError());
6676 ok(acl_size_info.AceCount == 1, "SACL contains an unexpected ACE count %lu\n", acl_size_info.AceCount);
6677
6678 ret = GetAce(sacl, 0, (void **)&ace);
6679 ok(ret, "GetAce failed with error %lu\n", GetLastError());
6680 ok (ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "Unexpected ACE type %#x\n", ace->Header.AceType);
6681 ok(!ace->Header.AceFlags, "Unexpected ACE flags %#x\n", ace->Header.AceFlags);
6682 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "Unexpected ACE mask %#lx\n", ace->Mask);
6683 ok(EqualSid(&ace->SidStart, &low_level), "Expected low integrity level\n");
6684
6685 free(sd2);
6686
6687 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP, &medium_level);
6688 ok(ret, "AddMandatoryAce failed with error %lu\n", GetLastError());
6689
6691 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6692
6695 "Unexpected GetKernelObjectSecurity return value %u, error %lu\n", ret, GetLastError());
6696
6697 sd2 = malloc(size);
6699 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6700
6701 sacl = (void *)0xdeadbeef;
6702 present = FALSE;
6703 defaulted = TRUE;
6704 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6705 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6706 ok(present, "SACL not present\n");
6707 ok(sacl != (void *)0xdeadbeef, "SACL not set\n");
6708 ok(sacl->AceCount == 2, "Expected 2 ACEs, got %d\n", sacl->AceCount);
6709 ok(!defaulted, "SACL defaulted\n");
6710
6711 ret = GetAce(acl, 0, (void **)&ace);
6712 ok(ret, "got error %lu\n", GetLastError());
6713 ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "got type %#x\n", ace->Header.AceType);
6714 ok(!ace->Header.AceFlags, "got flags %#x\n", ace->Header.AceFlags);
6715 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "got mask %#lx\n", ace->Mask);
6716 ok(EqualSid(&ace->SidStart, &low_level), "wrong sid\n");
6717
6718 ret = GetAce(acl, 1, (void **)&ace);
6719 ok(ret, "got error %lu\n", GetLastError());
6720 ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "got type %#x\n", ace->Header.AceType);
6721 ok(!ace->Header.AceFlags, "got flags %#x\n", ace->Header.AceFlags);
6722 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP, "got mask %#lx\n", ace->Mask);
6723 ok(EqualSid(&ace->SidStart, &medium_level), "wrong sid\n");
6724
6725 SetLastError(0xdeadbeef);
6726 ret = GetAce(acl, 2, (void **)&ace);
6727 ok(!ret, "expected failure\n");
6728 ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
6729
6730 free(sd2);
6731
6733 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6734
6736 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6737
6740 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
6741
6742 sd2 = malloc(size);
6744 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6745
6746 sacl = (void *)0xdeadbeef;
6747 present = FALSE;
6748 defaulted = TRUE;
6749 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6750 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6751 ok(present, "SACL not present\n");
6752 ok(sacl && sacl != (void *)0xdeadbeef, "SACL not set\n");
6753 ok(!defaulted, "SACL defaulted\n");
6754 ok(!sacl->AceCount, "SACL contains an unexpected ACE count %u\n", sacl->AceCount);
6755
6756 free(sd2);
6757
6758 ret = InitializeAcl(acl, 256, ACL_REVISION);
6759 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
6760
6761 ret = pAddMandatoryAce(acl, ACL_REVISION3, 0, SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP, &medium_level);
6762 ok(ret, "AddMandatoryAce failed with error %lu\n", GetLastError());
6763
6765 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6766
6768 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6769
6772 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
6773
6774 sd2 = malloc(size);
6776 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6777
6778 sacl = (void *)0xdeadbeef;
6779 present = FALSE;
6780 defaulted = TRUE;
6781 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6782 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6783 ok(present, "SACL not present\n");
6784 ok(sacl != (void *)0xdeadbeef, "SACL not set\n");
6785 ok(sacl->AclRevision == ACL_REVISION3, "Expected revision 3, got %d\n", sacl->AclRevision);
6786 ok(!defaulted, "SACL defaulted\n");
6787
6788 free(sd2);
6789
6790 ret = InitializeAcl(acl, 256, ACL_REVISION);
6791 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
6792
6793 ret = AllocateAndInitializeSid(&sia_world, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, (void **)&everyone);
6794 ok(ret, "AllocateAndInitializeSid failed with error %lu\n", GetLastError());
6795
6796 ret = AddAccessAllowedAce(acl, ACL_REVISION, KEY_READ, everyone);
6797 ok(ret, "AddAccessAllowedAce failed with error %lu\n", GetLastError());
6798
6800 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6801
6803 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6804
6807 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
6808
6809 sd2 = malloc(size);
6811 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6812
6813 sacl = (void *)0xdeadbeef;
6814 present = FALSE;
6815 defaulted = TRUE;
6816 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6817 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6818 ok(present, "SACL not present\n");
6819 ok(sacl && sacl != (void *)0xdeadbeef, "SACL not set\n");
6820 ok(!defaulted, "SACL defaulted\n");
6821 ok(!sacl->AceCount, "SACL contains an unexpected ACE count %u\n", sacl->AceCount);
6822
6823 FreeSid(everyone);
6824 free(sd2);
6826}
6827
6829{
6830 static const WCHAR testkeyW[] =
6831 {'S','O','F','T','W','A','R','E','\\','W','i','n','e','\\','S','A','C','L','t','e','s','t',0};
6832 LONG res;
6833 HKEY hkey;
6835 ACL *sacl;
6836 DWORD err, len = 128;
6837 TOKEN_PRIVILEGES priv, *priv_prev;
6838 HANDLE token;
6839 LUID luid;
6840 BOOL ret;
6841
6844 {
6845 CloseHandle( token );
6846 return;
6847 }
6848
6849 /* ACCESS_SYSTEM_SECURITY requires special privilege */
6851 if (res == ERROR_ACCESS_DENIED)
6852 {
6853 skip( "unprivileged user\n" );
6854 CloseHandle( token );
6855 return;
6856 }
6857 todo_wine ok( res == ERROR_PRIVILEGE_NOT_HELD, "got %ld\n", res );
6858
6859 priv.PrivilegeCount = 1;
6860 priv.Privileges[0].Luid = luid;
6862
6863 priv_prev = malloc( len );
6864 ret = AdjustTokenPrivileges( token, FALSE, &priv, len, priv_prev, &len );
6865 ok( ret, "got %lu\n", GetLastError());
6866
6869 {
6870 win_skip( "privilege not held\n" );
6871 free( priv_prev );
6872 CloseHandle( token );
6873 return;
6874 }
6875 ok( !res, "got %ld\n", res );
6876
6877 /* restore privileges */
6878 ret = AdjustTokenPrivileges( token, FALSE, priv_prev, 0, NULL, NULL );
6879 ok( ret, "got %lu\n", GetLastError() );
6880 free( priv_prev );
6881
6882 /* privilege is checked on access */
6885 if (err == ERROR_SUCCESS)
6886 LocalFree( sd );
6887
6888 priv.PrivilegeCount = 1;
6889 priv.Privileges[0].Luid = luid;
6891
6892 priv_prev = malloc( len );
6893 ret = AdjustTokenPrivileges( token, FALSE, &priv, len, priv_prev, &len );
6894 ok( ret, "got %lu\n", GetLastError());
6895
6897 ok( err == ERROR_SUCCESS, "got %lu\n", err );
6898 RegCloseKey( hkey );
6899 LocalFree( sd );
6900
6901 /* handle created without ACCESS_SYSTEM_SECURITY, privilege held */
6902 res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ, NULL, &hkey, NULL );
6903 ok( res == ERROR_SUCCESS, "got %ld\n", res );
6904
6905 sd = NULL;
6907 todo_wine ok( err == ERROR_SUCCESS, "got %lu\n", err );
6908 RegCloseKey( hkey );
6909 LocalFree( sd );
6910
6911 /* restore privileges */
6912 ret = AdjustTokenPrivileges( token, FALSE, priv_prev, 0, NULL, NULL );
6913 ok( ret, "got %lu\n", GetLastError() );
6914 free( priv_prev );
6915
6916 /* handle created without ACCESS_SYSTEM_SECURITY, privilege not held */
6917 res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ, NULL, &hkey, NULL );
6918 ok( res == ERROR_SUCCESS, "got %ld\n", res );
6919
6921 ok( err == ERROR_PRIVILEGE_NOT_HELD || err == ERROR_ACCESS_DENIED, "got %lu\n", err );
6922 RegCloseKey( hkey );
6923
6924 res = RegDeleteKeyW( HKEY_LOCAL_MACHINE, testkeyW );
6925 ok( !res, "got %ld\n", res );
6926 CloseHandle( token );
6927}
6928
6930{
6931#ifdef __REACTOS__
6932 char *user, buffer1[SECURITY_MAX_SID_SIZE];
6933 PSID domain_sid = (PSID *)&buffer1;
6934#else
6935 char *user, buffer1[SECURITY_MAX_SID_SIZE], buffer2[SECURITY_MAX_SID_SIZE];
6937 PSID domain_sid = (PSID *)&buffer1;
6938 PSID domain_sid2 = (PSID *)&buffer2;
6939#endif
6940 DWORD sid_size;
6941 PSID user_sid;
6942 HANDLE token;
6943 BOOL bret = TRUE;
6944#ifndef __REACTOS__
6945 int i;
6946#endif
6947
6949 {
6950 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
6952 }
6953 if (!bret)
6954 {
6955 win_skip("Failed to get current user token\n");
6956 return;
6957 }
6958
6959 bret = GetTokenInformation(token, TokenUser, NULL, 0, &sid_size);
6961 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
6962 user = malloc(sid_size);
6963 bret = GetTokenInformation(token, TokenUser, user, sid_size, &sid_size);
6964 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
6966 user_sid = ((TOKEN_USER *)user)->User.Sid;
6967
6968 SetLastError(0xdeadbeef);
6969 bret = GetWindowsAccountDomainSid(0, 0, 0);
6970 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
6971 ok(GetLastError() == ERROR_INVALID_SID, "expected ERROR_INVALID_SID, got %ld\n", GetLastError());
6972
6973 SetLastError(0xdeadbeef);
6974 bret = GetWindowsAccountDomainSid(user_sid, 0, 0);
6975 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
6976 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
6977
6978 sid_size = SECURITY_MAX_SID_SIZE;
6979 SetLastError(0xdeadbeef);
6980 bret = GetWindowsAccountDomainSid(user_sid, 0, &sid_size);
6981 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
6982 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
6983 ok(sid_size == GetSidLengthRequired(4), "expected size %ld, got %ld\n", GetSidLengthRequired(4), sid_size);
6984
6985 SetLastError(0xdeadbeef);
6986 bret = GetWindowsAccountDomainSid(user_sid, domain_sid, 0);
6987 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
6988 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
6989
6990 sid_size = 1;
6991 SetLastError(0xdeadbeef);
6992 bret = GetWindowsAccountDomainSid(user_sid, domain_sid, &sid_size);
6993 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
6994 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6995 ok(sid_size == GetSidLengthRequired(4), "expected size %ld, got %ld\n", GetSidLengthRequired(4), sid_size);
6996
6997 sid_size = SECURITY_MAX_SID_SIZE;
6998 bret = GetWindowsAccountDomainSid(user_sid, domain_sid, &sid_size);
6999 ok(bret, "GetWindowsAccountDomainSid failed with error %ld\n", GetLastError());
7000 ok(sid_size == GetSidLengthRequired(4), "expected size %ld, got %ld\n", GetSidLengthRequired(4), sid_size);
7001#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
7002 InitializeSid(domain_sid2, &domain_ident, 4);
7003 for (i = 0; i < 4; i++)
7004 *GetSidSubAuthority(domain_sid2, i) = *GetSidSubAuthority(user_sid, i);
7005 ok(EqualSid(domain_sid, domain_sid2), "unexpected domain sid %s != %s\n",
7006 debugstr_sid(domain_sid), debugstr_sid(domain_sid2));
7007#endif
7008
7009 free(user);
7010}
7011
7013{
7015 PSID authority_sid = (PSID *)buffer;
7017 BOOL ret;
7018
7019 memset(buffer, 0xcc, sizeof(buffer));
7020 ret = IsValidSid(authority_sid);
7021 ok(!ret, "expected FALSE, got %u\n", ret);
7022
7023 SetLastError(0xdeadbeef);
7024 id = GetSidIdentifierAuthority(authority_sid);
7025 ok(id != NULL, "got NULL pointer as identifier authority\n");
7026 ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %lu\n", GetLastError());
7027
7028 SetLastError(0xdeadbeef);
7030 ok(id != NULL, "got NULL pointer as identifier authority\n");
7031 ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %lu\n", GetLastError());
7032}
7033
7034static void test_pseudo_tokens(void)
7035{
7036 TOKEN_STATISTICS statistics1, statistics2;
7037 HANDLE token;
7038 DWORD retlen;
7039 BOOL ret;
7040
7042 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7043 memset(&statistics1, 0x11, sizeof(statistics1));
7044 ret = GetTokenInformation(token, TokenStatistics, &statistics1, sizeof(statistics1), &retlen);
7045 ok(ret, "GetTokenInformation failed with %lu\n", GetLastError());
7047
7048 /* test GetCurrentProcessToken() */
7049 SetLastError(0xdeadbeef);
7050 memset(&statistics2, 0x22, sizeof(statistics2));
7051 ret = GetTokenInformation(GetCurrentProcessToken(), TokenStatistics,
7052 &statistics2, sizeof(statistics2), &retlen);
7054 "GetTokenInformation failed with %lu\n", GetLastError());
7055 if (ret)
7056 ok(!memcmp(&statistics1, &statistics2, sizeof(statistics1)), "Token statistics do not match\n");
7057 else
7058 win_skip("CurrentProcessToken not supported, skipping test\n");
7059
7060 /* test GetCurrentThreadEffectiveToken() */
7061 SetLastError(0xdeadbeef);
7062 memset(&statistics2, 0x22, sizeof(statistics2));
7063 ret = GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenStatistics,
7064 &statistics2, sizeof(statistics2), &retlen);
7066 "GetTokenInformation failed with %lu\n", GetLastError());
7067 if (ret)
7068 ok(!memcmp(&statistics1, &statistics2, sizeof(statistics1)), "Token statistics do not match\n");
7069 else
7070 win_skip("CurrentThreadEffectiveToken not supported, skipping test\n");
7071
7072 SetLastError(0xdeadbeef);
7074 ok(!ret, "OpenThreadToken should have failed\n");
7075 ok(GetLastError() == ERROR_NO_TOKEN, "Expected ERROR_NO_TOKEN, got %lu\n", GetLastError());
7076
7077 /* test GetCurrentThreadToken() */
7078 SetLastError(0xdeadbeef);
7079 ret = GetTokenInformation(GetCurrentThreadToken(), TokenStatistics,
7080 &statistics2, sizeof(statistics2), &retlen);
7082 "Expected ERROR_NO_TOKEN, got %lu\n", GetLastError());
7083}
7084
7085static void test_maximum_allowed(void)
7086{
7087 HANDLE (WINAPI *pCreateEventExA)(SECURITY_ATTRIBUTES *, LPCSTR, DWORD, DWORD);
7088 char buffer_sd[SECURITY_DESCRIPTOR_MIN_LENGTH], buffer_acl[256];
7091 ACL *acl = (ACL *)&buffer_acl;
7092 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
7094 HANDLE handle;
7095 BOOL ret;
7096
7097 pCreateEventExA = (void *)GetProcAddress(hkernel32, "CreateEventExA");
7098 if (!pCreateEventExA)
7099 {
7100 win_skip("CreateEventExA is not available\n");
7101 return;
7102 }
7103
7105 ok(ret, "InitializeSecurityDescriptor failed with %lu\n", GetLastError());
7106 memset(buffer_acl, 0, sizeof(buffer_acl));
7107 ret = InitializeAcl(acl, 256, ACL_REVISION);
7108 ok(ret, "InitializeAcl failed with %lu\n", GetLastError());
7110 ok(ret, "SetSecurityDescriptorDacl failed with %lu\n", GetLastError());
7111
7112 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
7113 sa.lpSecurityDescriptor = sd;
7114 sa.bInheritHandle = FALSE;
7115
7116 handle = pCreateEventExA(&sa, NULL, 0, MAXIMUM_ALLOWED | 0x4);
7117 ok(handle != NULL, "CreateEventExA failed with error %lu\n", GetLastError());
7119 ok(mask == EVENT_ALL_ACCESS, "Expected %x, got %lx\n", EVENT_ALL_ACCESS, mask);
7121}
7122
7123static void check_token_label(HANDLE token, DWORD *level, BOOL sacl_inherited)
7124{
7125 static SID medium_sid = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7127 static SID high_sid = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7131 BOOL ret, present, defaulted;
7133 ACL *sacl = NULL, *dacl;
7135 char *str;
7136 SID *sid;
7137
7140 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7141
7142 sd = malloc(size);
7144 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7145
7147 ok(ret, "GetSecurityDescriptorControl failed with error %lu\n", GetLastError());
7148 if (sacl_inherited)
7150 "Unexpected security descriptor control %#x\n", control);
7151 else
7153 "Unexpected security descriptor control %#x\n", control);
7154 ok(revision == 1, "Unexpected security descriptor revision %lu\n", revision);
7155
7156 sid = (void *)0xdeadbeef;
7157 defaulted = TRUE;
7158 ret = GetSecurityDescriptorOwner(sd, (void **)&sid, &defaulted);
7159 ok(ret, "GetSecurityDescriptorOwner failed with error %lu\n", GetLastError());
7160 ok(!sid, "Owner present\n");
7161 ok(!defaulted, "Owner defaulted\n");
7162
7163 sid = (void *)0xdeadbeef;
7164 defaulted = TRUE;
7165 ret = GetSecurityDescriptorGroup(sd, (void **)&sid, &defaulted);
7166 ok(ret, "GetSecurityDescriptorGroup failed with error %lu\n", GetLastError());
7167 ok(!sid, "Group present\n");
7168 ok(!defaulted, "Group defaulted\n");
7169
7170 ret = GetSecurityDescriptorSacl(sd, &present, &sacl, &defaulted);
7171 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
7172 ok(present, "No SACL in the security descriptor\n");
7173 ok(!!sacl, "NULL SACL in the security descriptor\n");
7174 ok(!defaulted, "SACL defaulted\n");
7175 ok(sacl->AceCount == 1, "SACL contains an unexpected ACE count %u\n", sacl->AceCount);
7176
7177 ret = GetAce(sacl, 0, (void **)&ace);
7178 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7179
7181 "Unexpected ACE type %#x\n", ace->Header.AceType);
7182 ok(!ace->Header.AceFlags, "Unexpected ACE flags %#x\n", ace->Header.AceFlags);
7183 ok(ace->Header.AceSize, "Unexpected ACE size %u\n", ace->Header.AceSize);
7184 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "Unexpected ACE mask %#lx\n", ace->Mask);
7185
7186 sid = (SID *)&ace->SidStart;
7188 ok(EqualSid(sid, &medium_sid) || EqualSid(sid, &high_sid), "Got unexpected SID %s\n", str);
7189 *level = sid->SubAuthority[0];
7190 LocalFree(str);
7191
7192 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
7193 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7194 todo_wine ok(!present, "DACL present\n");
7195
7196 free(sd);
7197}
7198
7199static void test_token_label(void)
7200{
7203 char sacl_buffer[50];
7204 SECURITY_ATTRIBUTES attr = {.nLength = sizeof(SECURITY_ATTRIBUTES)};
7205 ACL *sacl = (ACL *)sacl_buffer;
7206 TOKEN_LINKED_TOKEN linked;
7207 DWORD level, level2, size;
7209 HANDLE token, token2;
7210 BOOL ret;
7211
7212 if (!pAddMandatoryAce)
7213 {
7214 win_skip("Mandatory integrity control is not supported.\n");
7215 return;
7216 }
7217
7219 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7220
7222
7224 ok(ret, "Failed to duplicate token, error %lu\n", GetLastError());
7225
7226 check_token_label(token2, &level2, TRUE);
7227 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7228
7229 CloseHandle(token2);
7230
7232 ok(ret, "Failed to duplicate token, error %lu\n", GetLastError());
7233
7234 check_token_label(token2, &level2, TRUE);
7235 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7236
7237 CloseHandle(token2);
7238
7239 /* Any label set in the SD when calling DuplicateTokenEx() is ignored. */
7240
7242 ok(!ret, "expected failure\n");
7243 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
7244
7245 sd = malloc(size);
7247 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7248
7249 InitializeAcl(sacl, sizeof(sacl_buffer), ACL_REVISION);
7250#ifdef __REACTOS__
7251 pAddMandatoryAce(sacl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, &low_sid);
7252#else
7254#endif
7256
7257 attr.lpSecurityDescriptor = sd;
7259 ok(ret, "Failed to duplicate token, error %lu\n", GetLastError());
7260
7261 check_token_label(token2, &level2, TRUE);
7262 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7263
7264 /* Trying to set a SD on the token also claims success but has no effect. */
7265
7267 ok(ret, "Failed to set SD, error %lu\n", GetLastError());
7268
7269 check_token_label(token2, &level2, FALSE);
7270 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7271
7272 free(sd);
7273
7274 /* Test the linked token. */
7275
7276#ifdef __REACTOS__
7277 /* This test crashes on Vista and Win7 */
7279 skip("Linked token tests crash on Vista and Win7.\n");
7280 }
7281 else {
7282#endif
7283 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
7284 ok(ret, "Failed to get linked token, error %lu\n", GetLastError());
7285
7286 check_token_label(linked.LinkedToken, &level2, TRUE);
7287 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7288
7289 CloseHandle(linked.LinkedToken);
7290#ifdef __REACTOS__
7291 }
7292#endif
7293
7295}
7296
7298{
7299 static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7301 char buffer_sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
7302 SECURITY_DESCRIPTOR *sd = (SECURITY_DESCRIPTOR *)&buffer_sd, *sd2;
7303 char buffer_acl[256], buffer[MAX_PATH];
7304 ACL *acl = (ACL *)&buffer_acl, *acl2, *acl_child;
7305 BOOL defaulted, present, ret, found;
7306 HANDLE token, token2, token3;
7307 EXPLICIT_ACCESSW exp_access;
7309 DWORD size, index, retd;
7310 ACCESS_ALLOWED_ACE *ace;
7313 PSID psid;
7314
7315 /* Test whether we can create tokens with security descriptors */
7317 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7318
7320 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
7321
7322 memset(buffer_acl, 0, sizeof(buffer_acl));
7323 ret = InitializeAcl(acl, 256, ACL_REVISION);
7324 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
7325
7326 ret = ConvertStringSidToSidA("S-1-5-6", &psid);
7327 ok(ret, "ConvertStringSidToSidA failed with error %lu\n", GetLastError());
7328
7330 ok(ret, "AddAccessAllowedAceEx failed with error %lu\n", GetLastError());
7331
7333 ok(ret, "SetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7334
7335 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
7336 sa.lpSecurityDescriptor = sd;
7337 sa.bInheritHandle = FALSE;
7338
7340 ok(ret, "DuplicateTokenEx failed with error %lu\n", GetLastError());
7341
7344 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7345
7346 sd2 = malloc(size);
7348 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7349
7350 acl2 = (void *)0xdeadbeef;
7351 present = FALSE;
7352 defaulted = TRUE;
7353 ret = GetSecurityDescriptorDacl(sd2, &present, &acl2, &defaulted);
7354 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7355 ok(present, "acl2 not present\n");
7356 ok(acl2 != (void *)0xdeadbeef, "acl2 not set\n");
7357 ok(acl2->AceCount == 1, "Expected 1 ACE, got %d\n", acl2->AceCount);
7358 ok(!defaulted, "acl2 defaulted\n");
7359
7360 ret = GetAce(acl2, 0, (void **)&ace);
7361 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7362 ok(ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE, "Unexpected ACE type %#x\n", ace->Header.AceType);
7363 ok(EqualSid(&ace->SidStart, psid), "Expected access allowed ACE\n");
7365 "Expected NO_PROPAGATE_INHERIT_ACE as flags, got %x\n", ace->Header.AceFlags);
7366
7367 free(sd2);
7368
7369 /* Duplicate token without security attributes.
7370 * Tokens do not inherit the security descriptor in DuplicateToken. */
7372 ok(ret, "DuplicateTokenEx failed with error %lu\n", GetLastError());
7373
7376 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7377
7378 sd2 = malloc(size);
7380 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7381
7382 acl2 = (void *)0xdeadbeef;
7383 present = FALSE;
7384 defaulted = TRUE;
7385 ret = GetSecurityDescriptorDacl(sd2, &present, &acl2, &defaulted);
7386 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7387 ok(present, "DACL not present\n");
7388
7389 ok(acl2 != (void *)0xdeadbeef, "DACL not set\n");
7390 ok(!defaulted, "DACL defaulted\n");
7391
7392 index = 0;
7393 found = FALSE;
7394 while (GetAce(acl2, index++, (void **)&ace))
7395 {
7396 if (ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE && EqualSid(&ace->SidStart, psid))
7397 found = TRUE;
7398 }
7399 ok(!found, "Access allowed ACE was inherited\n");
7400
7401 free(sd2);
7402
7403 /* When creating a child process, the process does inherit the token of
7404 * the parent but not the DACL of the token */
7407 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7408
7409 sd2 = malloc(size);
7411 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7412
7413 acl2 = (void *)0xdeadbeef;
7414 present = FALSE;
7415 defaulted = TRUE;
7416 ret = GetSecurityDescriptorDacl(sd2, &present, &acl2, &defaulted);
7417 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7418 ok(present, "DACL not present\n");
7419 ok(acl2 != (void *)0xdeadbeef, "DACL not set\n");
7420 ok(!defaulted, "DACL defaulted\n");
7421
7422 exp_access.grfAccessPermissions = GENERIC_ALL;
7423 exp_access.grfAccessMode = GRANT_ACCESS;
7425 exp_access.Trustee.pMultipleTrustee = NULL;
7426 exp_access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
7429 exp_access.Trustee.ptstrName = (void*)psid;
7430
7431 retd = SetEntriesInAclW(1, &exp_access, acl2, &acl_child);
7432 ok(retd == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", retd);
7433
7434 memset(sd, 0, sizeof(buffer_sd));
7436 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
7437
7438 ret = SetSecurityDescriptorDacl(sd, TRUE, acl_child, FALSE);
7439 ok(ret, "SetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7440
7442 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
7443
7444 /* The security label is also not inherited */
7445 if (pAddMandatoryAce)
7446 {
7447 ret = InitializeAcl(acl, 256, ACL_REVISION);
7448 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
7449
7450 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, &low_level);
7451 ok(ret, "AddMandatoryAce failed with error %lu\n", GetLastError());
7452
7453 memset(sd, 0, sizeof(buffer_sd));
7455 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
7456
7458 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
7459
7461 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
7462 }
7463 else
7464 win_skip("SYSTEM_MANDATORY_LABEL not supported\n");
7465
7466 /* Start child process with our modified token */
7467 memset(&startup, 0, sizeof(startup));
7468 startup.cb = sizeof(startup);
7469 startup.dwFlags = STARTF_USESHOWWINDOW;
7470 startup.wShowWindow = SW_SHOWNORMAL;
7471
7472 sprintf(buffer, "%s security test_token_sd", myARGV[0]);
7474 ok(ret, "CreateProcess failed with error %lu\n", GetLastError());
7475 wait_child_process(info.hProcess);
7476 CloseHandle(info.hProcess);
7477 CloseHandle(info.hThread);
7478
7479 LocalFree(acl_child);
7480 free(sd2);
7481 LocalFree(psid);
7482
7483 CloseHandle(token3);
7484 CloseHandle(token2);
7486}
7487
7488static void test_child_token_sd(void)
7489{
7490 static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7492 SYSTEM_MANDATORY_LABEL_ACE *ace_label;
7493 BOOL ret, present, defaulted;
7494 ACCESS_ALLOWED_ACE *acc_ace;
7496 DWORD size, i;
7497 HANDLE token;
7498 PSID psid;
7499 ACL *acl;
7500
7501 ret = ConvertStringSidToSidA("S-1-5-6", &psid);
7502 ok(ret, "ConvertStringSidToSidA failed with error %lu\n", GetLastError());
7503
7505 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7506
7509 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7510
7511 sd = malloc(size);
7513 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7514
7515 acl = NULL;
7516 present = FALSE;
7517 defaulted = TRUE;
7518 ret = GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted);
7519 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7520 ok(present, "DACL not present\n");
7521 ok(acl && acl != (void *)0xdeadbeef, "Got invalid DACL\n");
7522 ok(!defaulted, "DACL defaulted\n");
7523
7524 ok(acl->AceCount, "Expected at least one ACE\n");
7525 for (i = 0; i < acl->AceCount; i++)
7526 {
7527 ret = GetAce(acl, i, (void **)&acc_ace);
7528 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7529 ok(acc_ace->Header.AceType != ACCESS_ALLOWED_ACE_TYPE || !EqualSid(&acc_ace->SidStart, psid),
7530 "ACE inherited from the parent\n");
7531 }
7532
7533 LocalFree(psid);
7534 free(sd);
7535
7536 if (!pAddMandatoryAce)
7537 {
7538 win_skip("SYSTEM_MANDATORY_LABEL not supported\n");
7539 return;
7540 }
7541
7544 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7545
7546 sd = malloc(size);
7548 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7549
7550 acl = NULL;
7551 present = FALSE;
7552 defaulted = TRUE;
7553 ret = GetSecurityDescriptorSacl(sd, &present, &acl, &defaulted);
7554 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
7555 ok(present, "SACL not present\n");
7556 ok(acl && acl != (void *)0xdeadbeef, "Got invalid SACL\n");
7557 ok(!defaulted, "SACL defaulted\n");
7558 ok(acl->AceCount == 1, "Expected exactly one ACE\n");
7559 ret = GetAce(acl, 0, (void **)&ace_label);
7560 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7562 "Unexpected ACE type %#x\n", ace_label->Header.AceType);
7563 ok(!EqualSid(&ace_label->SidStart, &low_level),
7564 "Low integrity level should not have been inherited\n");
7565
7566 free(sd);
7567}
7568
7570{
7571 static const WCHAR wszCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
7574 PSID everyone_sid = NULL, users_sid = NULL;
7576 EXPLICIT_ACCESSW *access2;
7577 PACL new_acl, old_acl = NULL;
7578 ULONG count;
7579 DWORD res;
7580
7581 old_acl = malloc(256);
7582 res = InitializeAcl(old_acl, 256, ACL_REVISION);
7583 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
7584
7585 res = AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &everyone_sid);
7586 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
7587
7589 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &users_sid);
7590 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
7591
7592 res = AddAccessAllowedAce(old_acl, ACL_REVISION, KEY_READ, users_sid);
7593 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
7594
7595 access2 = NULL;
7596 res = GetExplicitEntriesFromAclW(old_acl, &count, &access2);
7597 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7598 ok(count == 1, "Expected count == 1, got %ld\n", count);
7599 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7600 ok(access2[0].grfAccessPermissions == KEY_READ, "Expected KEY_READ, got %ld\n", access2[0].grfAccessPermissions);
7601 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7602 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7603 ok(EqualSid(access2[0].Trustee.ptstrName, users_sid), "Expected equal SIDs\n");
7604 LocalFree(access2);
7605
7606 access.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
7607 access.Trustee.pMultipleTrustee = NULL;
7608
7609 access.grfAccessPermissions = KEY_WRITE;
7610 access.grfAccessMode = GRANT_ACCESS;
7611 access.grfInheritance = NO_INHERITANCE;
7612 access.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
7613 access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
7614 access.Trustee.ptstrName = everyone_sid;
7615 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7616 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7617 ok(new_acl != NULL, "returned acl was NULL\n");
7618
7619 access2 = NULL;
7620 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7621 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7622 ok(count == 2, "Expected count == 2, got %ld\n", count);
7623 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7624 ok(access2[0].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[0].grfAccessPermissions);
7625 ok(access2[0].Trustee.TrusteeType == TRUSTEE_IS_UNKNOWN,
7626 "Expected TRUSTEE_IS_UNKNOWN trustee type, got %d\n", access2[0].Trustee.TrusteeType);
7627 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7628 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7629 ok(EqualSid(access2[0].Trustee.ptstrName, everyone_sid), "Expected equal SIDs\n");
7630 LocalFree(access2);
7631 LocalFree(new_acl);
7632
7633 access.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
7634 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7635 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7636 ok(new_acl != NULL, "returned acl was NULL\n");
7637
7638 access2 = NULL;
7639 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7640 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7641 ok(count == 2, "Expected count == 2, got %ld\n", count);
7642 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7643 ok(access2[0].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[0].grfAccessPermissions);
7644 ok(access2[0].Trustee.TrusteeType == TRUSTEE_IS_UNKNOWN,
7645 "Expected TRUSTEE_IS_UNKNOWN trustee type, got %d\n", access2[0].Trustee.TrusteeType);
7646 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7647 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7648 ok(EqualSid(access2[0].Trustee.ptstrName, everyone_sid), "Expected equal SIDs\n");
7649 LocalFree(access2);
7650 LocalFree(new_acl);
7651
7652 access.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
7653 access.Trustee.ptstrName = (LPWSTR)wszCurrentUser;
7654 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7655 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7656 ok(new_acl != NULL, "returned acl was NULL\n");
7657
7658 access2 = NULL;
7659 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7660 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7661 ok(count == 2, "Expected count == 2, got %ld\n", count);
7662 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7663 ok(access2[0].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[0].grfAccessPermissions);
7664 ok(access2[0].Trustee.TrusteeType == TRUSTEE_IS_UNKNOWN,
7665 "Expected TRUSTEE_IS_UNKNOWN trustee type, got %d\n", access2[0].Trustee.TrusteeType);
7666 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7667 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7668 LocalFree(access2);
7669 LocalFree(new_acl);
7670
7671 access.grfAccessMode = REVOKE_ACCESS;
7672 access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
7673 access.Trustee.ptstrName = users_sid;
7674 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7675 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7676 ok(new_acl != NULL, "returned acl was NULL\n");
7677
7678 access2 = (void *)0xdeadbeef;
7679 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7680 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7681 ok(count == 0, "Expected count == 0, got %ld\n", count);
7682 ok(access2 == NULL, "access2 was not NULL\n");
7683 LocalFree(new_acl);
7684
7685 /* Make the ACL both Allow and Deny Everyone. */
7686 res = AddAccessAllowedAce(old_acl, ACL_REVISION, KEY_READ, everyone_sid);
7687 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
7688 res = AddAccessDeniedAce(old_acl, ACL_REVISION, KEY_WRITE, everyone_sid);
7689 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError());
7690 /* Revoke Everyone. */
7691 access.Trustee.ptstrName = everyone_sid;
7692 access.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
7693 access.grfAccessPermissions = 0;
7694 new_acl = NULL;
7695 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7696 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7697 ok(new_acl != NULL, "returned acl was NULL\n");
7698 /* Deny Everyone should remain (along with Grant Users from earlier). */
7699 access2 = NULL;
7700 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7701 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7702 ok(count == 2, "Expected count == 2, got %ld\n", count);
7703#ifdef __REACTOS__
7704 if (!access2) {
7705 ok(FALSE, "FIXME: access2 should not be null!\n"); // Happens on ReactOS currently
7706 } else {
7707#endif
7708 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7709 ok(access2[0].grfAccessPermissions == KEY_READ , "Expected KEY_READ, got %ld\n", access2[0].grfAccessPermissions);
7710 ok(EqualSid(access2[0].Trustee.ptstrName, users_sid), "Expected equal SIDs\n");
7711 ok(access2[1].grfAccessMode == DENY_ACCESS, "Expected DENY_ACCESS, got %d\n", access2[1].grfAccessMode);
7712 ok(access2[1].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[1].grfAccessPermissions);
7713 ok(EqualSid(access2[1].Trustee.ptstrName, everyone_sid), "Expected equal SIDs\n");
7714 LocalFree(access2);
7715#ifdef __REACTOS__
7716 }
7717#endif
7718
7719 FreeSid(users_sid);
7720 FreeSid(everyone_sid);
7721 free(old_acl);
7722}
7723
7725{
7726 SECURITY_DESCRIPTOR old_sd, *new_sd, *rel_sd;
7727 ULONG new_sd_size;
7728 DWORD buf_size;
7729 char buf[1024];
7730 BOOL success;
7731 DWORD ret;
7732
7734
7735 buf_size = sizeof(buf);
7736 rel_sd = (SECURITY_DESCRIPTOR *)buf;
7737 success = MakeSelfRelativeSD(&old_sd, rel_sd, &buf_size);
7738 ok(success, "MakeSelfRelativeSD failed with %lu\n", GetLastError());
7739
7740 new_sd = NULL;
7741 new_sd_size = 0;
7742 ret = BuildSecurityDescriptorW(NULL, NULL, 0, NULL, 0, NULL, NULL, &new_sd_size, (void **)&new_sd);
7743 ok(ret == ERROR_SUCCESS, "BuildSecurityDescriptor failed with %lu\n", ret);
7744 ok(new_sd != NULL, "expected new_sd != NULL\n");
7745 LocalFree(new_sd);
7746
7747 new_sd = (void *)0xdeadbeef;
7748 ret = BuildSecurityDescriptorW(NULL, NULL, 0, NULL, 0, NULL, &old_sd, &new_sd_size, (void **)&new_sd);
7749 ok(ret == ERROR_INVALID_SECURITY_DESCR, "expected ERROR_INVALID_SECURITY_DESCR, got %lu\n", ret);
7750 ok(new_sd == (void *)0xdeadbeef, "expected new_sd == 0xdeadbeef, got %p\n", new_sd);
7751
7752 new_sd = NULL;
7753 new_sd_size = 0;
7754 ret = BuildSecurityDescriptorW(NULL, NULL, 0, NULL, 0, NULL, rel_sd, &new_sd_size, (void **)&new_sd);
7755 ok(ret == ERROR_SUCCESS, "BuildSecurityDescriptor failed with %lu\n", ret);
7756 ok(new_sd != NULL, "expected new_sd != NULL\n");
7757 LocalFree(new_sd);
7758}
7759
7760static void test_EqualDomainSid(void)
7761{
7763 char sid_buffer[SECURITY_MAX_SID_SIZE], sid_buffer2[SECURITY_MAX_SID_SIZE];
7764 PSID domainsid, sid = sid_buffer, sid2 = sid_buffer2;
7765 DWORD size;
7766 BOOL ret, equal;
7767 unsigned int i;
7768
7769 ret = AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
7770 ok(ret, "AllocateAndInitializeSid error %lu\n", GetLastError());
7771
7772 SetLastError(0xdeadbeef);
7774 ok(!ret, "got %d\n", ret);
7775 ok(GetLastError() == ERROR_INVALID_SID, "got %lu\n", GetLastError());
7776
7777 SetLastError(0xdeadbeef);
7778 ret = EqualDomainSid(domainsid, domainsid, NULL);
7779 ok(!ret, "got %d\n", ret);
7781
7782 for (i = 0; i < ARRAY_SIZE(well_known_sid_values); i++)
7783 {
7784 SID *pisid = sid;
7785
7786 size = sizeof(sid_buffer);
7787 if (!CreateWellKnownSid(i, NULL, sid, &size))
7788 {
7789 trace("Well known SID %u not supported\n", i);
7790 continue;
7791 }
7792
7793 equal = 0xdeadbeef;
7794 SetLastError(0xdeadbeef);
7795 ret = EqualDomainSid(sid, domainsid, &equal);
7797 {
7798 ok(!ret, "%u: got %d\n", i, ret);
7799 ok(GetLastError() == ERROR_NON_DOMAIN_SID, "%u: got %lu\n", i, GetLastError());
7800 ok(equal == 0xdeadbeef, "%u: got %d\n", i, equal);
7801 continue;
7802 }
7803
7804 ok(ret, "%u: got %d\n", i, ret);
7805 ok(GetLastError() == 0, "%u: got %lu\n", i, GetLastError());
7806 ok(equal == 0, "%u: got %d\n", i, equal);
7807
7808 size = sizeof(sid_buffer2);
7809 ret = CreateWellKnownSid(i, well_known_sid_values[i].without_domain ? NULL : domainsid, sid2, &size);
7810 ok(ret, "%u: CreateWellKnownSid error %lu\n", i, GetLastError());
7811
7812 equal = 0xdeadbeef;
7813 SetLastError(0xdeadbeef);
7814 ret = EqualDomainSid(sid, sid2, &equal);
7815 ok(ret, "%u: got %d\n", i, ret);
7816 ok(GetLastError() == 0, "%u: got %lu\n", i, GetLastError());
7817 ok(equal == 1, "%u: got %d\n", i, equal);
7818 }
7819
7820 FreeSid(domainsid);
7821}
7822
7824{
7825 HANDLE event = arg, event2;
7826 BOOL ret;
7827
7828 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7829 ok(!!event2, "got error %lu\n", GetLastError());
7830 CloseHandle(event2);
7831
7832 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7833 ok(!!event2, "got error %lu\n", GetLastError());
7834 CloseHandle(event2);
7835
7837 &event2, EVENT_MODIFY_STATE, FALSE, 0);
7838 ok(ret, "got error %lu\n", GetLastError());
7839 CloseHandle(event2);
7840
7841 return 0;
7842}
7843
7845{
7846 char acl_buffer[200], everyone_sid_buffer[100], local_sid_buffer[100], cmdline[300];
7847 HANDLE token, restricted, impersonation, all_event, sync_event, event2, thread;
7848 SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa)};
7849 SID *everyone_sid = (SID *)everyone_sid_buffer;
7850 SID *local_sid = (SID *)local_sid_buffer;
7851 ACL *acl = (ACL *)acl_buffer;
7852 SID_AND_ATTRIBUTES sid_attr;
7855 STARTUPINFOA si = {0};
7856 DWORD size;
7857 BOOL ret;
7858
7859 /* DuplicateHandle() validates access against the calling thread's token and
7860 * the target process's token. It does *not* validate access against the
7861 * calling process's token, even if the calling thread is not impersonating.
7862 */
7863
7865 ok(ret, "got error %lu\n", GetLastError());
7866
7867 size = sizeof(everyone_sid_buffer);
7868 ret = CreateWellKnownSid(WinWorldSid, NULL, everyone_sid, &size);
7869 ok(ret, "got error %lu\n", GetLastError());
7870 size = sizeof(local_sid_buffer);
7871 ret = CreateWellKnownSid(WinLocalSid, NULL, local_sid, &size);
7872 ok(ret, "got error %lu\n", GetLastError());
7873
7874 InitializeAcl(acl, sizeof(acl_buffer), ACL_REVISION);
7875 ret = AddAccessAllowedAce(acl, ACL_REVISION, SYNCHRONIZE, everyone_sid);
7876 ok(ret, "got error %lu\n", GetLastError());
7879 ok(ret, "got error %lu\n", GetLastError());
7882 ok(ret, "got error %lu\n", GetLastError());
7883 sa.lpSecurityDescriptor = &sd;
7884
7885 sid_attr.Sid = local_sid;
7886 sid_attr.Attributes = 0;
7887 ret = CreateRestrictedToken(token, 0, 1, &sid_attr, 0, NULL, 0, NULL, &restricted);
7888 ok(ret, "got error %lu\n", GetLastError());
7890 SecurityImpersonation, TokenImpersonation, &impersonation);
7891 ok(ret, "got error %lu\n", GetLastError());
7892
7893 all_event = CreateEventA(&sa, TRUE, TRUE, "test_dup");
7894 ok(!!all_event, "got error %lu\n", GetLastError());
7895 sync_event = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7896 ok(!!sync_event, "got error %lu\n", GetLastError());
7897
7898 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7899 ok(!!event2, "got error %lu\n", GetLastError());
7900 CloseHandle(event2);
7901
7902 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7903 ok(!!event2, "got error %lu\n", GetLastError());
7904 CloseHandle(event2);
7905
7907 ok(ret, "got error %lu\n", GetLastError());
7908 CloseHandle(event2);
7909
7911 ok(ret, "got error %lu\n", GetLastError());
7912 CloseHandle(event2);
7913
7914 ret = SetThreadToken(NULL, impersonation);
7915 ok(ret, "got error %lu\n", GetLastError());
7916
7919 ok(!ret, "wait failed\n");
7920
7921 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7922 ok(!!event2, "got error %lu\n", GetLastError());
7923 CloseHandle(event2);
7924
7925 SetLastError(0xdeadbeef);
7926 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7927 ok(!event2, "expected failure\n");
7928 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7929
7931 ok(ret, "got error %lu\n", GetLastError());
7932 CloseHandle(event2);
7933
7934 SetLastError(0xdeadbeef);
7936 ok(!ret, "expected failure\n");
7937 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7938
7939 ret = RevertToSelf();
7940 ok(ret, "got error %lu\n", GetLastError());
7941
7942 sprintf(cmdline, "%s security duplicate %Iu %lu %Iu", myARGV[0],
7943 (ULONG_PTR)sync_event, GetCurrentProcessId(), (ULONG_PTR)impersonation );
7944 ret = CreateProcessAsUserA(restricted, NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
7945 ok(ret, "got error %lu\n", GetLastError());
7946
7948 ok(ret, "got error %lu\n", GetLastError());
7949
7950 SetLastError(0xdeadbeef);
7952 ok(!ret, "expected failure\n");
7953 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7954
7956 ok(!ret, "wait failed\n");
7957
7958 CloseHandle(impersonation);
7959 CloseHandle(restricted);
7961 CloseHandle(sync_event);
7962 CloseHandle(all_event);
7963}
7964
7966{
7967 HANDLE event, event2, process, token;
7968 BOOL ret;
7969
7972 ok(!!process, "failed to open process, error %lu\n", GetLastError());
7973
7974 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7975 ok(!!event2, "got error %lu\n", GetLastError());
7976 CloseHandle(event2);
7977
7978 SetLastError(0xdeadbeef);
7979 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7980 ok(!event2, "expected failure\n");
7981 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7982
7984 ok(ret, "got error %lu\n", GetLastError());
7985
7986 SetLastError(0xdeadbeef);
7988 ok(!ret, "expected failure\n");
7989 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7990
7993 ok(ret, "failed to retrieve token, error %lu\n", GetLastError());
7995 ok(ret, "failed to set thread token, error %lu\n", GetLastError());
7996
7997 SetLastError(0xdeadbeef);
7999 ok(!ret, "expected failure\n");
8000 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8001
8002 SetLastError(0xdeadbeef);
8004 ok(!ret, "expected failure\n");
8005 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8006
8007 ret = RevertToSelf();
8008 ok(ret, "failed to revert, error %lu\n", GetLastError());
8011}
8012
8013#define join_process(a) join_process_(__LINE__, a)
8015{
8017 ok_(__FILE__, line)(!ret, "wait failed\n");
8020}
8021
8023{
8024 char cmdline[300], acl_buffer[200], sid_buffer[100];
8025 SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa)};
8026 ACL *acl = (ACL *)acl_buffer;
8027 SID *sid = (SID *)sid_buffer;
8028 SID_AND_ATTRIBUTES sid_attr;
8029 HANDLE event, token, token2;
8032 STARTUPINFOA si = {0};
8033 DWORD size;
8034 BOOL ret;
8035
8036 size = sizeof(sid_buffer);
8037 ret = CreateWellKnownSid(WinLocalSid, NULL, sid, &size);
8038 ok(ret, "got error %lu\n", GetLastError());
8039 ret = InitializeAcl(acl, sizeof(acl_buffer), ACL_REVISION);
8040 ok(ret, "got error %lu\n", GetLastError());
8042 ok(ret, "got error %lu\n", GetLastError());
8045 ok(ret, "got error %lu\n", GetLastError());
8046 sa.lpSecurityDescriptor = &sd;
8047 event = CreateEventA(&sa, TRUE, TRUE, "test_event");
8048 ok(!!event, "got error %lu\n", GetLastError());
8049
8050 sprintf(cmdline, "%s security restricted 0", myARGV[0]);
8051
8052#ifdef __REACTOS__
8053 /* This block creates test failures on WS03 */
8055#endif
8057 ok(ret, "got error %lu\n", GetLastError());
8058 join_process(&pi);
8059#ifdef __REACTOS__
8060 }
8061#endif
8062
8063 ret = CreateProcessAsUserA(GetCurrentProcessToken(), NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
8064 todo_wine ok(!ret, "expected failure\n");
8065 todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError());
8066 if (ret) join_process(&pi);
8067
8069 ok(ret, "got error %lu\n", GetLastError());
8071 ok(ret || broken(GetLastError() == ERROR_ACCESS_DENIED) /* < 7 */, "got error %lu\n", GetLastError());
8072 if (ret) join_process(&pi);
8074
8076 ok(ret, "got error %lu\n", GetLastError());
8078 ok(!ret, "expected failure\n");
8079 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8081
8083 ok(ret, "got error %lu\n", GetLastError());
8085 ok(!ret, "expected failure\n");
8086 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8088
8090 ok(ret, "got error %lu\n", GetLastError());
8091
8094 ok(ret, "got error %lu\n", GetLastError());
8095 ret = CreateProcessAsUserA(token2, NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
8096 ok(ret || broken(GetLastError() == ERROR_BAD_TOKEN_TYPE) /* < 7 */, "got error %lu\n", GetLastError());
8097 if (ret) join_process(&pi);
8098 CloseHandle(token2);
8099
8100 sprintf(cmdline, "%s security restricted 1", myARGV[0]);
8101 sid_attr.Sid = sid;
8102 sid_attr.Attributes = 0;
8103 ret = CreateRestrictedToken(token, 0, 1, &sid_attr, 0, NULL, 0, NULL, &token2);
8104 ok(ret, "got error %lu\n", GetLastError());
8105 ret = CreateProcessAsUserA(token2, NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
8106 ok(ret, "got error %lu\n", GetLastError());
8107 join_process(&pi);
8108 CloseHandle(token2);
8109
8111
8113}
8114
8116{
8117 HANDLE event;
8118
8119 SetLastError(0xdeadbeef);
8120 event = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_event");
8121 if (!atoi(myARGV[3]))
8122 {
8123 ok(!!event, "got error %lu\n", GetLastError());
8125 }
8126 else
8127 {
8128 ok(!event, "expected failure\n");
8129 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8130 }
8131}
8132
8134{
8135 char buffer[200];
8136 PSECURITY_DESCRIPTOR sd = buffer, sd_ptr;
8137 unsigned int i;
8138 DWORD size;
8139 BOOL ret;
8140
8141 static const HKEY keys[] =
8142 {
8146 HKEY_USERS,
8150 };
8151
8152#ifdef __REACTOS__
8154#else
8156#endif
8157 ok(ret, "got error %lu\n", GetLastError());
8158
8159#ifdef __REACTOS__
8161#else
8163#endif
8164 ok(ret, "got error %lu\n", GetLastError());
8165
8166 for (i = 0; i < ARRAY_SIZE(keys); ++i)
8167 {
8168 SetLastError(0xdeadbeef);
8169#ifdef __REACTOS__
8171#else
8173#endif
8174 ok(!ret, "key %p: expected failure\n", keys[i]);
8175 ok(GetLastError() == ERROR_INVALID_HANDLE, "key %p: got error %lu\n", keys[i], GetLastError());
8176
8180 ok(ret == ERROR_INVALID_HANDLE, "key %p: got error %u\n", keys[i], ret);
8181 else if (keys[i] == HKEY_DYN_DATA)
8183 "key %p: got error %u\n", keys[i], ret);
8184 else
8185 ok(!ret, "key %p: got error %u\n", keys[i], ret);
8186 if (!ret) LocalFree(sd_ptr);
8187
8190 ok(ret == ERROR_INVALID_HANDLE, "key %p: got error %u\n", keys[i], ret);
8191 }
8192}
8193
8194static const LUID_AND_ATTRIBUTES *find_privilege(const TOKEN_PRIVILEGES *privs, const LUID *luid)
8195{
8196 DWORD i;
8197
8198 for (i = 0; i < privs->PrivilegeCount; ++i)
8199 {
8200 if (!memcmp(luid, &privs->Privileges[i].Luid, sizeof(LUID)))
8201 return &privs->Privileges[i];
8202 }
8203
8204 return NULL;
8205}
8206
8207static void test_duplicate_token(void)
8208{
8210 char prev_privs_buffer[128], ret_privs_buffer[1024];
8211 TOKEN_PRIVILEGES *prev_privs = (void *)prev_privs_buffer;
8212 TOKEN_PRIVILEGES *ret_privs = (void *)ret_privs_buffer;
8213 const LUID_AND_ATTRIBUTES *priv;
8214 TOKEN_PRIVILEGES privs;
8215 SECURITY_QUALITY_OF_SERVICE qos = {.Length = sizeof(qos)};
8216 OBJECT_ATTRIBUTES attr = {.Length = sizeof(attr)};
8218 HANDLE token, token2;
8219 DWORD size;
8220 BOOL ret;
8221
8222 ret = OpenProcessToken(GetCurrentProcess(), orig_access, &token);
8223 ok(ret, "got error %lu\n", GetLastError());
8224
8225 /* Disable a privilege, to see if that privilege modification is preserved
8226 * in the duplicated tokens. */
8227 privs.PrivilegeCount = 1;
8228 ret = LookupPrivilegeValueA(NULL, "SeChangeNotifyPrivilege", &privs.Privileges[0].Luid);
8229 ok(ret, "got error %lu\n", GetLastError());
8230 privs.Privileges[0].Attributes = 0;
8231 ret = AdjustTokenPrivileges(token, FALSE, &privs, sizeof(prev_privs_buffer), prev_privs, &size);
8232 ok(ret, "got error %lu\n", GetLastError());
8233
8235 ok(ret, "got error %lu\n", GetLastError());
8238 ok(ret, "got error %lu\n", GetLastError());
8239 ok(level == SecurityAnonymous, "got impersonation level %#x\n", level);
8240 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8241 ok(ret, "got error %lu\n", GetLastError());
8242 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8243 ok(!!priv, "Privilege should exist\n");
8244 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8245 CloseHandle(token2);
8246
8248 ok(ret, "got error %lu\n", GetLastError());
8249 TEST_GRANTED_ACCESS(token2, orig_access);
8251 ok(!ret, "expected failure\n");
8252 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got error %lu.\n", GetLastError());
8253 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8254 ok(ret, "got error %lu\n", GetLastError());
8255 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8256 ok(!!priv, "Privilege should exist\n");
8257 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8258 CloseHandle(token2);
8259
8261 ok(ret, "got error %lu\n", GetLastError());
8263 CloseHandle(token2);
8264
8266 ok(ret, "got error %lu\n", GetLastError());
8268 CloseHandle(token2);
8269
8271 ok(ret, "got error %lu\n", GetLastError());
8272 TEST_GRANTED_ACCESS(token2, orig_access);
8274 ok(ret, "got error %lu\n", GetLastError());
8275 ok(level == SecurityIdentification, "got impersonation level %#x\n", level);
8276 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8277 ok(ret, "got error %lu\n", GetLastError());
8278 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8279 ok(!!priv, "Privilege should exist\n");
8280 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8281 CloseHandle(token2);
8282
8284 ok(ret == STATUS_SUCCESS, "Got status %#x.\n", ret);
8285 TEST_GRANTED_ACCESS(token2, orig_access);
8287 ok(ret, "got error %lu\n", GetLastError());
8288 ok(level == SecurityAnonymous, "got impersonation level %#x\n", level);
8289 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8290 ok(ret, "got error %lu\n", GetLastError());
8291 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8292 ok(!!priv, "Privilege should exist\n");
8293 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8294 CloseHandle(token2);
8295
8297 ok(ret == STATUS_SUCCESS, "Got status %#x.\n", ret);
8298 TEST_GRANTED_ACCESS(token2, orig_access);
8299 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8300 ok(ret, "got error %lu\n", GetLastError());
8301 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8302 todo_wine ok(!priv, "Privilege shouldn't exist\n");
8303 CloseHandle(token2);
8304
8307 qos.EffectiveOnly = FALSE;
8308 attr.SecurityQualityOfService = &qos;
8310 ok(ret == STATUS_SUCCESS, "Got status %#x.\n", ret);
8311 TEST_GRANTED_ACCESS(token2, orig_access);
8313 ok(ret, "got error %lu\n", GetLastError());
8314 ok(level == SecurityIdentification, "got impersonation level %#x\n", level);
8315 CloseHandle(token2);
8316
8318 ret = AdjustTokenPrivileges(token, FALSE, &privs, sizeof(prev_privs_buffer), prev_privs, &size);
8319 ok(ret, "got error %lu\n", GetLastError());
8320
8322}
8323
8325{
8326 /* Basic tests for parameter validation. */
8327
8330 BOOL ret, present, defaulted;
8332 PSID sid;
8333 ACL *acl;
8334
8335 SetLastError(0xdeadbeef);
8336 size = 0xdeadbeef;
8338 ok(!ret, "expected failure\n");
8339 ok(GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError());
8340 ok(size == 0xdeadbeef, "got size %lu\n", size);
8341
8342 SetLastError(0xdeadbeef);
8344 ok(!ret, "expected failure\n");
8345 ok(GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError());
8346
8347 SetLastError(0xdeadbeef);
8348 size = 0xdeadbeef;
8350 ok(!ret, "expected failure\n");
8351 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
8352 ok(size > 0 && size != 0xdeadbeef, "got size 0\n");
8353
8354 sd = malloc(size + 1);
8355
8356 SetLastError(0xdeadbeef);
8358 ok(!ret, "expected failure\n");
8359 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
8360 ok(ret_size == size, "expected size %lu, got %lu\n", size, ret_size);
8361
8362 SetLastError(0xdeadbeef);
8364 ok(ret, "expected success\n");
8365 ok(GetLastError() == 0xdeadbeef, "got error %lu\n", GetLastError());
8366 ok(ret_size == size, "expected size %lu, got %lu\n", size, ret_size);
8367
8368 free(sd);
8369
8370 /* Calling the function with flags not defined succeeds and yields an empty
8371 * descriptor. */
8372
8373 SetLastError(0xdeadbeef);
8375 ok(!ret, "expected failure\n");
8376 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
8377
8378 sd = malloc(size);
8379 SetLastError(0xdeadbeef);
8381 ok(ret, "expected success\n");
8382 ok(GetLastError() == 0xdeadbeef, "got error %lu\n", GetLastError());
8383 ok(ret_size == size, "expected size %lu, got %lu\n", size, ret_size);
8384
8386 ok(ret, "got error %lu\n", GetLastError());
8387 todo_wine ok(control == SE_SELF_RELATIVE, "got control %#x\n", control);
8388 ok(revision == SECURITY_DESCRIPTOR_REVISION1, "got revision %lu\n", revision);
8389
8390 ret = GetSecurityDescriptorOwner(sd, &sid, &defaulted);
8391 ok(ret, "got error %lu\n", GetLastError());
8392 ok(!sid, "expected no owner SID\n");
8393 ok(!defaulted, "expected owner not defaulted\n");
8394
8395 ret = GetSecurityDescriptorGroup(sd, &sid, &defaulted);
8396 ok(ret, "got error %lu\n", GetLastError());
8397 ok(!sid, "expected no group SID\n");
8398 ok(!defaulted, "expected group not defaulted\n");
8399
8400 ret = GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted);
8401 ok(ret, "got error %lu\n", GetLastError());
8402 todo_wine ok(!present, "expected no DACL present\n");
8403 /* the descriptor is defaulted only on Windows >= 7 */
8404
8405 ret = GetSecurityDescriptorSacl(sd, &present, &acl, &defaulted);
8406 ok(ret, "got error %lu\n", GetLastError());
8407 ok(!present, "expected no SACL present\n");
8408 /* the descriptor is defaulted only on Windows >= 7 */
8409
8410 free(sd);
8411}
8412
8413static void check_different_token(HANDLE token1, HANDLE token2)
8414{
8415 TOKEN_STATISTICS stats1, stats2;
8416 DWORD size;
8417 BOOL ret;
8418
8419 ret = GetTokenInformation(token1, TokenStatistics, &stats1, sizeof(stats1), &size);
8420 ok(ret, "got error %lu\n", GetLastError());
8421 ret = GetTokenInformation(token2, TokenStatistics, &stats2, sizeof(stats2), &size);
8422 ok(ret, "got error %lu\n", GetLastError());
8423
8424 ok(memcmp(&stats1.TokenId, &stats2.TokenId, sizeof(LUID)), "expected different IDs\n");
8425}
8426
8427static void test_elevation(void)
8428{
8429 TOKEN_LINKED_TOKEN linked, linked2;
8430 DWORD orig_type, type, size;
8431 TOKEN_ELEVATION elevation;
8432 HANDLE token, token2;
8433 BOOL ret;
8434
8435#ifdef __REACTOS__
8437 skip("test_elevation() is invalid for WS03\n");
8438 return;
8439 }
8440#endif
8443 ok(ret, "got error %lu\n", GetLastError());
8444
8446 ok(ret, "got error %lu\n", GetLastError());
8447 orig_type = type;
8448 ret = GetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation), &size);
8449 ok(ret, "got error %lu\n", GetLastError());
8450 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
8451 if (!ret && GetLastError() == ERROR_NO_SUCH_LOGON_SESSION) /* fails on w2008s64 */
8452 {
8453 win_skip("Failed to get linked token.\n");
8455 return;
8456 }
8457 ok(ret, "got error %lu\n", GetLastError());
8458
8460 {
8461 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8462 ok(!linked.LinkedToken, "expected no linked token\n");
8463 }
8464 else if (type == TokenElevationTypeLimited)
8465 {
8466 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8467 ok(!!linked.LinkedToken, "expected a linked token\n");
8468
8471 ok(ret, "got error %lu\n", GetLastError());
8472 ok(type == TokenElevationTypeFull, "got type %#lx\n", type);
8473 ret = GetTokenInformation(linked.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8474 ok(ret, "got error %lu\n", GetLastError());
8475 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8476 ret = GetTokenInformation(linked.LinkedToken, TokenType, &type, sizeof(type), &size);
8477 ok(ret, "got error %lu\n", GetLastError());
8478 ok(type == TokenImpersonation, "got type %#lx\n", type);
8480 ok(ret, "got error %lu\n", GetLastError());
8481 ok(type == SecurityIdentification, "got impersonation level %#lx\n", type);
8482
8483 /* Asking for the linked token again gives us a different token. */
8484 ret = GetTokenInformation(token, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8485 ok(ret, "got error %lu\n", GetLastError());
8486
8488 ok(ret, "got error %lu\n", GetLastError());
8489 ok(type == TokenElevationTypeFull, "got type %#lx\n", type);
8490 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8491 ok(ret, "got error %lu\n", GetLastError());
8492 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8493
8495
8496 CloseHandle(linked2.LinkedToken);
8497
8498 /* Asking for the linked token's linked token gives us a new limited token. */
8499 ret = GetTokenInformation(linked.LinkedToken, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8500 ok(ret, "got error %lu\n", GetLastError());
8501
8503 ok(ret, "got error %lu\n", GetLastError());
8504 ok(type == TokenElevationTypeLimited, "got type %#lx\n", type);
8505 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8506 ok(ret, "got error %lu\n", GetLastError());
8507 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8508
8510
8511 CloseHandle(linked2.LinkedToken);
8512
8513 CloseHandle(linked.LinkedToken);
8514
8517 ok(!ret, "expected failure\n");
8518 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8519
8520 elevation.TokenIsElevated = FALSE;
8521 ret = SetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation));
8522 ok(!ret, "expected failure\n");
8523 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8524 }
8525 else
8526 {
8527 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8528 ok(!!linked.LinkedToken, "expected a linked token\n");
8529
8532 ok(ret, "got error %lu\n", GetLastError());
8533 ok(type == TokenElevationTypeLimited, "got type %#lx\n", type);
8534 ret = GetTokenInformation(linked.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8535 ok(ret, "got error %lu\n", GetLastError());
8536 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8537 ret = GetTokenInformation(linked.LinkedToken, TokenType, &type, sizeof(type), &size);
8538 ok(ret, "got error %lu\n", GetLastError());
8539 ok(type == TokenImpersonation, "got type %#lx\n", type);
8541 ok(ret, "got error %lu\n", GetLastError());
8542 ok(type == SecurityIdentification, "got impersonation level %#lx\n", type);
8543
8544 /* Asking for the linked token again gives us a different token. */
8545 ret = GetTokenInformation(token, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8546 ok(ret, "got error %lu\n", GetLastError());
8547
8549 ok(ret, "got error %lu\n", GetLastError());
8550 ok(type == TokenElevationTypeLimited, "got type %#lx\n", type);
8551 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8552 ok(ret, "got error %lu\n", GetLastError());
8553 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8554
8556
8557 CloseHandle(linked2.LinkedToken);
8558
8559 /* Asking for the linked token's linked token gives us a new elevated token. */
8560 ret = GetTokenInformation(linked.LinkedToken, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8561 ok(ret, "got error %lu\n", GetLastError());
8562
8564 ok(ret, "got error %lu\n", GetLastError());
8565 ok(type == TokenElevationTypeFull, "got type %#lx\n", type);
8566 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8567 ok(ret, "got error %lu\n", GetLastError());
8568 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8569
8571
8572 CloseHandle(linked2.LinkedToken);
8573
8574 CloseHandle(linked.LinkedToken);
8575
8578 ok(!ret, "expected failure\n");
8579 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8580
8581 elevation.TokenIsElevated = FALSE;
8582 ret = SetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation));
8583 ok(!ret, "expected failure\n");
8584 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8585 }
8586
8588 ok(ret, "got error %lu\n", GetLastError());
8589 ret = GetTokenInformation(token2, TokenElevationType, &type, sizeof(type), &size);
8590 ok(ret, "got error %lu\n", GetLastError());
8591 ok(type == orig_type, "expected same type\n");
8592 ret = GetTokenInformation(token2, TokenElevation, &elevation, sizeof(elevation), &size);
8593 ok(ret, "got error %lu\n", GetLastError());
8594 ok(elevation.TokenIsElevated == (type == TokenElevationTypeFull), "got elevation %#lx\n", elevation.TokenIsElevated);
8595 ret = GetTokenInformation(token2, TokenLinkedToken, &linked, sizeof(linked), &size);
8596 ok(ret, "got error %lu\n", GetLastError());
8598 {
8599 ok(!linked.LinkedToken, "expected no linked token\n");
8600 ret = GetTokenInformation(linked.LinkedToken, TokenType, &type, sizeof(type), &size);
8601 ok(ret, "got error %lu\n", GetLastError());
8602 ok(type == TokenImpersonation, "got type %#lx\n", type);
8604 ok(ret, "got error %lu\n", GetLastError());
8605 ok(type == SecurityIdentification, "got impersonation level %#lx\n", type);
8606 CloseHandle(linked.LinkedToken);
8607 }
8608 else
8609 ok(!!linked.LinkedToken, "expected a linked token\n");
8610 CloseHandle(token2);
8611
8612 ret = CreateRestrictedToken(token, 0, 0, NULL, 0, NULL, 0, NULL, &token2);
8613 ok(ret, "got error %lu\n", GetLastError());
8614 ret = GetTokenInformation(token2, TokenElevationType, &type, sizeof(type), &size);
8615 ok(ret, "got error %lu\n", GetLastError());
8616 ok(type == orig_type, "expected same type\n");
8617 ret = GetTokenInformation(token2, TokenElevation, &elevation, sizeof(elevation), &size);
8618 ok(ret, "got error %lu\n", GetLastError());
8619 ok(elevation.TokenIsElevated == (type == TokenElevationTypeFull), "got elevation %#lx\n", elevation.TokenIsElevated);
8620 ret = GetTokenInformation(token2, TokenLinkedToken, &linked, sizeof(linked), &size);
8621 ok(ret, "got error %lu\n", GetLastError());
8623 ok(!linked.LinkedToken, "expected no linked token\n");
8624 else
8625 ok(!!linked.LinkedToken, "expected a linked token\n");
8626 CloseHandle(linked.LinkedToken);
8627 CloseHandle(token2);
8628
8630 {
8631 char prev_privs_buffer[128], acl_buffer[256], prev_acl_buffer[256];
8632 TOKEN_PRIVILEGES privs, *prev_privs = (TOKEN_PRIVILEGES *)prev_privs_buffer;
8633 TOKEN_DEFAULT_DACL *prev_acl = (TOKEN_DEFAULT_DACL *)prev_acl_buffer;
8634 TOKEN_DEFAULT_DACL *ret_acl = (TOKEN_DEFAULT_DACL *)acl_buffer;
8635 TOKEN_DEFAULT_DACL default_acl;
8636 PRIVILEGE_SET priv_set;
8637 BOOL ret, is_member;
8638 DWORD size;
8639 ACL acl;
8640
8641 /* Linked tokens do not preserve privilege modifications. */
8642
8643 privs.PrivilegeCount = 1;
8644 ret = LookupPrivilegeValueA(NULL, "SeChangeNotifyPrivilege", &privs.Privileges[0].Luid);
8645 ok(ret, "got error %lu\n", GetLastError());
8647 ret = AdjustTokenPrivileges(token, FALSE, &privs, sizeof(prev_privs_buffer), prev_privs, &size);
8648 ok(ret, "got error %lu\n", GetLastError());
8649
8650 priv_set.PrivilegeCount = 1;
8651 priv_set.Control = 0;
8652 priv_set.Privilege[0] = privs.Privileges[0];
8653 ret = PrivilegeCheck(token, &priv_set, &is_member);
8654 ok(ret, "got error %lu\n", GetLastError());
8655 ok(!is_member, "not a member\n");
8656
8657 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
8658 ok(ret, "got error %lu\n", GetLastError());
8659
8660 ret = PrivilegeCheck(linked.LinkedToken, &priv_set, &is_member);
8661 ok(ret, "got error %lu\n", GetLastError());
8662 ok(is_member, "not a member\n");
8663
8664 CloseHandle(linked.LinkedToken);
8665
8666 ret = AdjustTokenPrivileges(token, FALSE, prev_privs, 0, NULL, NULL);
8667 ok(ret, "got error %lu\n", GetLastError());
8668
8669 /* Linked tokens do not preserve default DACL modifications. */
8670
8671 ret = GetTokenInformation(token, TokenDefaultDacl, prev_acl, sizeof(prev_acl_buffer), &size);
8672 ok(ret, "got error %lu\n", GetLastError());
8673 ok(prev_acl->DefaultDacl->AceCount, "expected non-empty default DACL\n");
8674
8675 InitializeAcl(&acl, sizeof(acl), ACL_REVISION);
8676 default_acl.DefaultDacl = &acl;
8677 ret = SetTokenInformation(token, TokenDefaultDacl, &default_acl, sizeof(default_acl));
8678 ok(ret, "got error %lu\n", GetLastError());
8679
8680 ret = GetTokenInformation(token, TokenDefaultDacl, ret_acl, sizeof(acl_buffer), &size);
8681 ok(ret, "got error %lu\n", GetLastError());
8682 ok(!ret_acl->DefaultDacl->AceCount, "expected empty default DACL\n");
8683
8684 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
8685 ok(ret, "got error %lu\n", GetLastError());
8686
8687 ret = GetTokenInformation(linked.LinkedToken, TokenDefaultDacl, ret_acl, sizeof(acl_buffer), &size);
8688 ok(ret, "got error %lu\n", GetLastError());
8689 ok(ret_acl->DefaultDacl->AceCount, "expected non-empty default DACL\n");
8690
8691 CloseHandle(linked.LinkedToken);
8692
8693 ret = SetTokenInformation(token, TokenDefaultDacl, prev_acl, sizeof(*prev_acl));
8694 ok(ret, "got error %lu\n", GetLastError());
8695 }
8696
8698}
8699
8701{
8702 char sd_buffer[200], sid_buffer[100];
8705 SID *admin_sid = (SID *)sid_buffer;
8706 BOOL ret, present, defaulted;
8707 SECURITY_DESCRIPTOR new_sd;
8708 HANDLE file;
8709 DWORD size;
8710 ACL *dacl;
8711
8712 /* The EA Origin client sets the SD owner of a directory to Administrators,
8713 * while using the default DACL, and subsequently tries to create
8714 * subdirectories. */
8715
8716 size = sizeof(sid_buffer);
8717 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &size);
8718
8719 ret = CheckTokenMembership(NULL, admin_sid, &present);
8720 ok(ret, "got error %lu\n", GetLastError());
8721 if (!present)
8722 {
8723 skip("user is not an administrator\n");
8724 return;
8725 }
8726
8728 sprintf(path, "%s\\testdir", temp_path);
8729
8731 ok(ret, "got error %lu\n", GetLastError());
8732
8734 ok(file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError());
8735
8736 ret = GetKernelObjectSecurity(file, DACL_SECURITY_INFORMATION, sd_buffer, sizeof(sd_buffer), &size);
8737 ok(ret, "got error %lu\n", GetLastError());
8738 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
8739 ok(ret, "got error %lu\n", GetLastError());
8740
8742
8743 ret = SetSecurityDescriptorOwner(&new_sd, admin_sid, FALSE);
8744 ok(ret, "got error %lu\n", GetLastError());
8745
8746 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
8747 ok(ret, "got error %lu\n", GetLastError());
8748
8749 ret = SetSecurityDescriptorDacl(&new_sd, present, dacl, defaulted);
8750 ok(ret, "got error %lu\n", GetLastError());
8751
8753 ok(ret, "got error %lu\n", GetLastError());
8754
8756
8757 sprintf(path, "%s\\testdir\\subdir", temp_path);
8759 ok(ret, "got error %lu\n", GetLastError());
8760
8762 ok(ret, "got error %lu\n", GetLastError());
8763 sprintf(path, "%s\\testdir", temp_path);
8765 ok(ret, "got error %lu\n", GetLastError());
8766}
8767
8769{
8771 BOOL ret;
8772
8773 SetLastError(0xdeadbeef);
8775 ok(!ret, "Unexpected return value %d.\n", ret);
8776 ok(GetLastError() == ERROR_INVALID_SECURITY_DESCR, "Unexpected error %ld.\n", GetLastError());
8777
8779
8780 SetLastError(0xdeadbeef);
8782 ok(!ret, "Unexpected return value %d.\n", ret);
8783 ok(GetLastError() == ERROR_INVALID_SECURITY_DESCR, "Unexpected error %ld.\n", GetLastError());
8784
8786 ok(ret, "Unexpected return value %d, error %ld.\n", ret, GetLastError());
8787
8788 SetLastError(0xdeadbeef);
8790 ok(ret, "Unexpected return value %d.\n", ret);
8791 ok(GetLastError() == 0xdeadbeef, "Unexpected error %ld.\n", GetLastError());
8792
8793 free(sd);
8794}
8795
8796static void test_window_security(void)
8797{
8799 BOOL present, defaulted;
8800 HDESK desktop;
8801 DWORD ret;
8802 ACL *dacl;
8803
8805
8808 ok(!ret, "got error %lu\n", ret);
8809
8810 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
8811 ok(ret == TRUE, "got error %lu\n", GetLastError());
8812 todo_wine ok(present == TRUE, "got present %d\n", present);
8813 ok(defaulted == FALSE, "got defaulted %d\n", defaulted);
8814
8815 LocalFree(sd);
8816}
8817
8819{
8820 init();
8821 if (!hmod) return;
8822
8823 if (myARGC >= 3)
8824 {
8825 if (!strcmp(myARGV[2], "test_token_sd"))
8827 else if (!strcmp(myARGV[2], "test"))
8829 else if (!strcmp(myARGV[2], "duplicate"))
8831 else if (!strcmp(myARGV[2], "restricted"))
8833 return;
8834 }
8837 test_trustee();
8864 test_EqualSid();
8871 test_AddAce();
8889
8890 /* Must be the last test, modifies process token */
8892}
@ ObjectBasicInformation
Definition: DriverTester.h:54
#define SE_BACKUP_NAME
@ optional
Definition: SystemMenu.c:34
DWORD WINAPI SetEntriesInAclA(ULONG cCountOfExplicitEntries, PEXPLICIT_ACCESS_A pListOfExplicitEntries, PACL OldAcl, PACL *NewAcl)
Definition: ac.c:615
DWORD WINAPI SetEntriesInAclW(ULONG cCountOfExplicitEntries, PEXPLICIT_ACCESS_W pListOfExplicitEntries, PACL OldAcl, PACL *NewAcl)
Definition: ac.c:199
DWORD WINAPI GetExplicitEntriesFromAclW(PACL pacl, PULONG pcCountOfExplicitEntries, PEXPLICIT_ACCESS_W *pListOfExplicitEntries)
Definition: ac.c:648
@ SE_DS_OBJECT
Definition: accctrl.h:167
@ SE_PROVIDER_DEFINED_OBJECT
Definition: accctrl.h:169
@ SE_DS_OBJECT_ALL
Definition: accctrl.h:168
@ SE_KERNEL_OBJECT
Definition: accctrl.h:165
@ SE_REGISTRY_WOW64_64KEY
Definition: accctrl.h:172
@ SE_WINDOW_OBJECT
Definition: accctrl.h:166
@ SE_UNKNOWN_OBJECT_TYPE
Definition: accctrl.h:159
@ SE_REGISTRY_WOW64_32KEY
Definition: accctrl.h:171
@ SE_FILE_OBJECT
Definition: accctrl.h:160
@ SE_WMIGUID_OBJECT
Definition: accctrl.h:170
@ SE_REGISTRY_KEY
Definition: accctrl.h:163
enum _SE_OBJECT_TYPE SE_OBJECT_TYPE
@ TRUSTEE_IS_SID
Definition: accctrl.h:190
@ TRUSTEE_IS_OBJECTS_AND_SID
Definition: accctrl.h:193
@ TRUSTEE_BAD_FORM
Definition: accctrl.h:192
@ TRUSTEE_IS_NAME
Definition: accctrl.h:191
@ TRUSTEE_IS_OBJECTS_AND_NAME
Definition: accctrl.h:194
@ TRUSTEE_IS_UNKNOWN
Definition: accctrl.h:177
@ TRUSTEE_IS_WELL_KNOWN_GROUP
Definition: accctrl.h:182
#define NO_INHERITANCE
Definition: accctrl.h:103
@ TRUSTEE_IS_IMPERSONATE
Definition: accctrl.h:200
@ NO_MULTIPLE_TRUSTEE
Definition: accctrl.h:199
@ REVOKE_ACCESS
Definition: accctrl.h:152
@ GRANT_ACCESS
Definition: accctrl.h:149
@ DENY_ACCESS
Definition: accctrl.h:151
@ SET_ACCESS
Definition: accctrl.h:150
#define VOID
Definition: acefi.h:82
unsigned char BOOLEAN
Definition: actypes.h:127
#define vsnprintf
Definition: acwin.h:108
static void startup(void)
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define GetNTVersion()
Definition: apitest.h:17
TOKEN_TYPE
Definition: asmpp.cpp:29
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
LONG NTSTATUS
Definition: precomp.h:26
static const WCHAR nameW[]
Definition: main.c:49
#define FILE_DELETE_ON_CLOSE
Definition: constants.h:494
#define index(s, c)
Definition: various.h:29
void account(int argc, const char *argv[])
Definition: cmds.c:1690
void user(int argc, const char *argv[])
Definition: cmds.c:1350
EXTERN_C NTSTATUS WINAPI NtQueryObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG)
#define ARRAY_SIZE(A)
Definition: main.h:20
static HANDLE thread
Definition: service.c:33
#define RegCloseKey(hKey)
Definition: registry.h:49
r l[0]
Definition: byte_order.h:168
FT_UInt sid
Definition: cffcmap.c:138
Definition: _map.h:48
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
LPWSTR Name
Definition: desk.c:124
struct _LUID * PLUID
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NTSTATUS
Definition: precomp.h:19
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessAsUserA(_In_opt_ HANDLE hToken, _In_opt_ LPCSTR lpApplicationName, _Inout_opt_ LPSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCSTR lpCurrentDirectory, _In_ LPSTARTUPINFOA lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation)
Definition: logon.c:939
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
Definition: lsa.c:1183
NTSTATUS WINAPI LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer)
Definition: lsa.c:1473
NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
Definition: lsa.c:701
NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
Definition: lsa.c:194
BOOL WINAPI LookupPrivilegeValueA(LPCSTR lpSystemName, LPCSTR lpName, PLUID lpLuid)
Definition: misc.c:732
BOOL WINAPI LookupAccountSidA(LPCSTR lpSystemName, PSID lpSid, LPSTR lpName, LPDWORD cchName, LPSTR lpReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse)
Definition: misc.c:405
DWORD WINAPI SetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID psidOwner, PSID psidGroup, PACL pDacl, PACL pSacl)
Definition: misc.c:1295
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
DWORD WINAPI GetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID *ppsidOwner, PSID *ppsidGroup, PACL *ppDacl, PACL *ppSacl, PSECURITY_DESCRIPTOR *ppSecurityDescriptor)
Definition: misc.c:1244
BOOL WINAPI GetUserNameA(LPSTR lpszName, LPDWORD lpSize)
Definition: misc.c:246
BOOL WINAPI LookupAccountSidW(LPCWSTR pSystemName, PSID pSid, LPWSTR pAccountName, LPDWORD pdwAccountName, LPWSTR pDomainName, LPDWORD pdwDomainName, PSID_NAME_USE peUse)
Definition: misc.c:537
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:374
BOOL WINAPI GetAclInformation(PACL pAcl, LPVOID pAclInformation, DWORD nAclInformationLength, ACL_INFORMATION_CLASS dwAclInformationClass)
Definition: security.c:1194
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
Definition: security.c:411
BOOL WINAPI LookupAccountNameA(LPCSTR SystemName, LPCSTR AccountName, PSID Sid, LPDWORD SidLength, LPSTR ReferencedDomainName, LPDWORD hReferencedDomainNameLength, PSID_NAME_USE SidNameUse)
Definition: security.c:2012
BOOL WINAPI PrivilegeCheck(HANDLE ClientToken, PPRIVILEGE_SET RequiredPrivileges, LPBOOL pfResult)
Definition: security.c:2066
static const ACEFLAG AceFlags[]
Definition: security.c:2624
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI ConvertSecurityDescriptorToStringSecurityDescriptorA(PSECURITY_DESCRIPTOR SecurityDescriptor, DWORD SDRevision, SECURITY_INFORMATION Information, LPSTR *OutputString, PULONG OutputLen)
Definition: security.c:3499
BOOL WINAPI CreateRestrictedToken(_In_ HANDLE ExistingTokenHandle, _In_ DWORD Flags, _In_ DWORD DisableSidCount, _In_reads_opt_(DisableSidCount) PSID_AND_ATTRIBUTES SidsToDisable, _In_ DWORD DeletePrivilegeCount, _In_reads_opt_(DeletePrivilegeCount) PLUID_AND_ATTRIBUTES PrivilegesToDelete, _In_ DWORD RestrictedSidCount, _In_reads_opt_(RestrictedSidCount) PSID_AND_ATTRIBUTES SidsToRestrict, _Outptr_ PHANDLE NewTokenHandle)
Creates a filtered token that is a restricted one of the regular access token. A restricted token can...
Definition: security.c:533
BOOL WINAPI DuplicateToken(IN HANDLE ExistingTokenHandle, IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, OUT PHANDLE DuplicateTokenHandle)
Definition: security.c:3919
BOOL WINAPI SetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength)
Definition: security.c:437
BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptorA(LPCSTR StringSecurityDescriptor, DWORD StringSDRevision, PSECURITY_DESCRIPTOR *SecurityDescriptor, PULONG SecurityDescriptorSize)
Definition: security.c:3032
BOOL WINAPI InitializeSid(PSID Sid, PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount)
Definition: security.c:862
BOOL WINAPI ConvertStringSidToSidA(LPCSTR StringSid, PSID *Sid)
Definition: security.c:3560
BOOL WINAPI EqualPrefixSid(PSID pSid1, PSID pSid2)
Definition: security.c:841
BOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel)
Definition: security.c:1631
BOOL WINAPI AddAccessDeniedAceEx(PACL pAcl, DWORD dwAceRevision, DWORD AceFlags, DWORD AccessMask, PSID pSid)
Definition: security.c:1114
BOOL WINAPI AddAce(PACL pAcl, DWORD dwAceRevision, DWORD dwStartingAceIndex, LPVOID pAceList, DWORD nAceListLength)
Definition: security.c:1141
BOOL WINAPI MakeAbsoluteSD(PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, LPDWORD lpdwAbsoluteSecurityDescriptorSize, PACL pDacl, LPDWORD lpdwDaclSize, PACL pSacl, LPDWORD lpdwSaclSize, PSID pOwner, LPDWORD lpdwOwnerSize, PSID pPrimaryGroup, LPDWORD lpdwPrimaryGroupSize)
Definition: security.c:950
PDWORD WINAPI GetSidSubAuthority(PSID pSid, DWORD nSubAuthority)
Definition: security.c:896
BOOL WINAPI SetThreadToken(IN PHANDLE ThreadHandle OPTIONAL, IN HANDLE TokenHandle)
Definition: security.c:461
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:674
DWORD WINAPI GetSidLengthRequired(UCHAR nSubAuthorityCount)
Definition: security.c:852
BOOL WINAPI IsValidSid(PSID pSid)
Definition: security.c:819
BOOL WINAPI IsWellKnownSid(IN PSID pSid, IN WELL_KNOWN_SID_TYPE WellKnownSidType)
Definition: security.c:796
BOOL WINAPI CopySid(DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid)
Definition: security.c:712
PUCHAR WINAPI GetSidSubAuthorityCount(PSID pSid)
Definition: security.c:908
BOOL WINAPI GetKernelObjectSecurity(HANDLE Handle, SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded)
Definition: security.c:987
BOOL WINAPI InitializeAcl(PACL pAcl, DWORD nAclLength, DWORD dwAclRevision)
Definition: security.c:1006
BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision)
Definition: security.c:929
BOOL WINAPI AddAccessAllowedAce(PACL pAcl, DWORD dwAceRevision, DWORD AccessMask, PSID pSid)
Definition: security.c:1039
static const SID sidWorld
Definition: security.c:126
BOOL WINAPI AddAccessAllowedAceEx(PACL pAcl, DWORD dwAceRevision, DWORD AceFlags, DWORD AccessMask, PSID pSid)
Definition: security.c:1063
DWORD WINAPI GetLengthSid(PSID pSid)
Definition: security.c:919
BOOL WINAPI OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, HANDLE *TokenHandle)
Definition: security.c:336
PVOID WINAPI FreeSid(PSID pSid)
Definition: security.c:698
BOOL WINAPI ConvertSidToStringSidA(PSID Sid, LPSTR *StringSid)
Definition: security.c:3637
BOOL WINAPI SetFileSecurityA(LPCSTR lpFileName, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor)
Definition: security.c:1479
BOOL WINAPI GetWindowsAccountDomainSid(PSID sid, PSID domain_sid, DWORD *size)
Definition: security.c:4136
BOOL WINAPI EqualSid(PSID pSid1, PSID pSid2)
Definition: security.c:829
BOOL WINAPI AccessCheck(IN PSECURITY_DESCRIPTOR pSecurityDescriptor, IN HANDLE ClientToken, IN DWORD DesiredAccess, IN PGENERIC_MAPPING GenericMapping, OUT PPRIVILEGE_SET PrivilegeSet OPTIONAL, IN OUT LPDWORD PrivilegeSetLength, OUT LPDWORD GrantedAccess, OUT LPBOOL AccessStatus)
Definition: security.c:1650
BOOL WINAPI DuplicateTokenEx(IN HANDLE ExistingTokenHandle, IN DWORD dwDesiredAccess, IN LPSECURITY_ATTRIBUTES lpTokenAttributes OPTIONAL, IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, IN TOKEN_TYPE TokenType, OUT PHANDLE DuplicateTokenHandle)
Definition: security.c:3859
static const char * debugstr_sid(PSID sid)
Definition: security.c:174
DWORD WINAPI GetNamedSecurityInfoA(LPSTR pObjectName, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID *ppsidOwner, PSID *ppsidGroup, PACL *ppDacl, PACL *ppSacl, PSECURITY_DESCRIPTOR *ppSecurityDescriptor)
Definition: security.c:4102
BOOL WINAPI GetFileSecurityA(LPCSTR lpFileName, SECURITY_INFORMATION RequestedInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength, LPDWORD lpnLengthNeeded)
Definition: security.c:1373
DWORD WINAPI SetNamedSecurityInfoA(LPSTR pObjectName, SE_OBJECT_TYPE ObjectType, SECURITY_INFORMATION SecurityInfo, PSID psidOwner, PSID psidGroup, PACL pDacl, PACL pSacl)
Definition: security.c:2498
PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID pSid)
Definition: security.c:885
BOOL WINAPI EqualDomainSid(IN PSID pSid1, IN PSID pSid2, OUT BOOL *pfEqual)
Definition: security.c:4184
BOOL WINAPI GetAce(PACL pAcl, DWORD dwAceIndex, LPVOID *pAce)
Definition: security.c:1186
BOOL WINAPI AddAccessDeniedAce(PACL pAcl, DWORD dwAceRevision, DWORD AccessMask, PSID pSid)
Definition: security.c:1090
BOOL WINAPI AddAuditAccessAceEx(PACL pAcl, DWORD dwAceRevision, DWORD AceFlags, DWORD dwAccessMask, PSID pSid, BOOL bAuditSuccess, BOOL bAuditFailure)
Definition: security.c:1979
BOOL WINAPI SetKernelObjectSecurity(HANDLE Handle, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor)
Definition: security.c:1928
BOOL WINAPI CreateWellKnownSid(IN WELL_KNOWN_SID_TYPE WellKnownSidType, IN PSID DomainSid OPTIONAL, OUT PSID pSid, IN OUT DWORD *cbSid)
Definition: security.c:722
BOOL WINAPI LookupPrivilegeNameA(LPCSTR lpSystemName, PLUID lpLuid, LPSTR lpName, LPDWORD cchName)
Definition: security.c:1299
struct _MAX_SID MAX_SID
BOOL WINAPI IsValidAcl(PACL pAcl)
Definition: security.c:1209
BOOL WINAPI ConvertStringSecurityDescriptorToSecurityDescriptorW(LPCWSTR StringSecurityDescriptor, DWORD StringSDRevision, PSECURITY_DESCRIPTOR *SecurityDescriptor, PULONG SecurityDescriptorSize)
Definition: security.c:3062
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
#define CloseHandle
Definition: compat.h:739
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define PAGE_READONLY
Definition: compat.h:138
#define FILE_BEGIN
Definition: compat.h:761
#define SECTION_MAP_READ
Definition: compat.h:139
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetFilePointer
Definition: compat.h:743
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GetCurrentProcess()
Definition: compat.h:759
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
#define FILE_SHARE_READ
Definition: compat.h:136
static void cleanup(void)
Definition: main.c:1335
BOOL WINAPI DeleteFileA(IN LPCSTR lpFileName)
Definition: delete.c:24
BOOL WINAPI RemoveDirectoryA(IN LPCSTR lpPathName)
Definition: dir.c:682
BOOL WINAPI CreateDirectoryA(IN LPCSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:37
BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD dwFileAttributes)
Definition: fileinfo.c:760
BOOL WINAPI SetEndOfFile(HANDLE hFile)
Definition: fileinfo.c:988
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName)
Definition: fileinfo.c:620
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
Definition: rw.c:25
BOOL WINAPI DuplicateHandle(IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions)
Definition: handle.c:149
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
UINT WINAPI GetWindowsDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2256
DWORD WINAPI GetTempPathA(IN DWORD nBufferLength, OUT LPSTR lpBuffer)
Definition: path.c:1973
BOOL WINAPI TerminateProcess(IN HANDLE hProcess, IN UINT uExitCode)
Definition: proc.c:1375
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1224
HANDLE WINAPI OpenThread(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwThreadId)
Definition: thread.c:403
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
LANGID WINAPI GetSystemDefaultLangID(void)
Definition: locale.c:1199
int WINAPI lstrcmpA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4104
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4133
const WCHAR windows_dir[]
Definition: file.c:67
const UINT * keys
Definition: locale.c:416
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(const char *app_name, char *cmd_line, SECURITY_ATTRIBUTES *process_attr, SECURITY_ATTRIBUTES *thread_attr, BOOL inherit, DWORD flags, void *env, const char *cur_dir, STARTUPINFOA *startup_info, PROCESS_INFORMATION *info)
Definition: process.c:686
BOOL WINAPI SetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR descr, PSID group, BOOL defaulted)
Definition: security.c:1218
BOOL WINAPI SetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR descr, PSID owner, BOOL defaulted)
Definition: security.c:1226
BOOL WINAPI SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR descr, SECURITY_DESCRIPTOR_CONTROL mask, SECURITY_DESCRIPTOR_CONTROL set)
Definition: security.c:1201
BOOL WINAPI CheckTokenMembership(HANDLE token, PSID sid_to_check, PBOOL is_member)
Definition: security.c:550
BOOL WINAPI GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR obj_descr, SECURITY_INFORMATION info, PSECURITY_DESCRIPTOR ret_descr, DWORD len, PDWORD ret_len)
Definition: security.c:1003
BOOL WINAPI ImpersonateLoggedOnUser(HANDLE token)
Definition: security.c:745
BOOL WINAPI IsValidSecurityDescriptor(PSECURITY_DESCRIPTOR descr)
Definition: security.c:1116
BOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR descr, BOOL present, PACL sacl, BOOL defaulted)
Definition: security.c:1234
BOOL WINAPI RevertToSelf(void)
Definition: security.c:855
BOOL WINAPI AddMandatoryAce(PACL acl, DWORD rev, DWORD flags, DWORD policy, PSID sid)
Definition: security.c:1372
WORD WORD WORD * revision
Definition: metahost.c:91
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
FILE *CDECL tmpfile(void)
Definition: file.c:5199
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP int __cdecl atoi(const char *)
Definition: string.c:1715
_ACRTIMP __int64 __cdecl _atoi64(const char *)
Definition: string.c:1757
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1592
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
char * va_list
Definition: vadefs.h:50
return ret
Definition: mutex.c:146
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2996
static PVOID Mapping[EMS_PHYSICAL_PAGES]
Definition: emsdrv.c:41
HANDLE NTAPI CreateFileMappingA(IN HANDLE hFile, IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes, IN DWORD flProtect, IN DWORD dwMaximumSizeHigh, IN DWORD dwMaximumSizeLow, IN LPCSTR lpName)
Definition: filemap.c:23
HANDLE NTAPI OpenFileMappingA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: filemap.c:284
UINT WINAPI GetTempFileNameA(IN LPCSTR lpPathName, IN LPCSTR lpPrefixString, IN UINT uUnique, OUT LPSTR lpTempFileName)
Definition: filename.c:26
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define STATUS_ACCESS_VIOLATION
#define FILE_CREATE
Definition: from_kernel.h:55
ULONG Handle
Definition: gdb_input.c:15
GLint level
Definition: gl.h:1546
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
struct _cl_event * event
Definition: glext.h:7739
GLuint res
Definition: glext.h:9613
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLboolean GLuint group
Definition: glext.h:11120
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
GLenum GLsizei len
Definition: glext.h:6722
GLuint id
Definition: glext.h:5910
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat token
Definition: glfuncs.h:210
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define PROCESS_SUSPEND_RESUME
Definition: pstypes.h:163
#define PROCESS_TERMINATE
Definition: pstypes.h:153
#define PROCESS_VM_READ
Definition: pstypes.h:157
#define PROCESS_QUERY_INFORMATION
Definition: pstypes.h:162
#define THREAD_SET_THREAD_TOKEN
Definition: pstypes.h:146
#define PROCESS_VM_WRITE
Definition: pstypes.h:158
#define PROCESS_CREATE_THREAD
Definition: pstypes.h:154
#define THREAD_QUERY_INFORMATION
Definition: pstypes.h:145
#define PROCESS_VM_OPERATION
Definition: pstypes.h:156
#define PROCESS_SET_INFORMATION
Definition: pstypes.h:161
#define PROCESS_CREATE_PROCESS
Definition: pstypes.h:159
#define PROCESS_SET_QUOTA
Definition: pstypes.h:160
#define THREAD_SET_CONTEXT
#define PROCESS_DUP_HANDLE
#define THREAD_SUSPEND_RESUME
#define THREAD_GET_CONTEXT
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
#define dup
Definition: syshdrs.h:51
enum _SID_NAME_USE SID_NAME_USE
enum _SECURITY_IMPERSONATION_LEVEL SECURITY_IMPERSONATION_LEVEL
@ SecurityImpersonation
Definition: lsa.idl:57
@ SecurityAnonymous
Definition: lsa.idl:55
@ SecurityIdentification
Definition: lsa.idl:56
WORD SECURITY_DESCRIPTOR_CONTROL
Definition: lsa.idl:37
@ SidTypeDomain
Definition: lsa.idl:120
@ SidTypeGroup
Definition: lsa.idl:119
@ SidTypeUser
Definition: lsa.idl:118
@ SidTypeWellKnownGroup
Definition: lsa.idl:122
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define win_skip
Definition: minitest.h:67
#define todo_wine_if(is_todo)
Definition: minitest.h:81
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
Definition: test.h:537
#define todo_wine
Definition: minitest.h:80
#define ZeroMemory
Definition: minwinbase.h:31
#define error(str)
Definition: mkdosfs.c:1605
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
char string[160]
Definition: util.h:11
#define CREATE_ALWAYS
Definition: disk.h:72
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define FILE_FLAG_BACKUP_SEMANTICS
Definition: disk.h:41
#define FILE_FLAG_DELETE_ON_CLOSE
Definition: disk.h:42
#define CREATE_NEW
Definition: disk.h:69
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
@ TokenImpersonation
Definition: imports.h:274
@ TokenPrimary
Definition: imports.h:273
#define sprintf
Definition: sprintf.c:45
static DWORD GLE
Definition: registry.c:54
static ACCESS_MASK
Definition: security.c:100
static void test_CreateWellKnownSid(void)
Definition: security.c:2107
static void test_pseudo_handle_security(void)
Definition: security.c:8133
static PGENERIC_MAPPING
Definition: security.c:100
static POBJECTS_AND_NAME_A SE_OBJECT_TYPE LPSTR ObjectTypeName
Definition: security.c:90
static void test_GetSidIdentifierAuthority(void)
Definition: security.c:7012
static void test_EqualDomainSid(void)
Definition: security.c:7760
static NTSTATUS *static PUNICODE_STRING
Definition: security.c:102
static void test_AddMandatoryAce(void)
Definition: security.c:6573
#define TEST_GRANTED_ACCESS(a, b)
Definition: security.c:2860
static void test_token_attr(void)
Definition: security.c:1782
static void test_duplicate_handle_access_child(void)
Definition: security.c:7965
#define SE_TAKE_OWNERSHIP_PRIVILEGE
Definition: security.c:563
static void test_duplicate_token(void)
Definition: security.c:8207
#define PROCESS_ALL_ACCESS_VISTA
Definition: security.c:64
static void test_GetExplicitEntriesFromAclW(void)
Definition: security.c:7569
#define THREAD_QUERY_LIMITED_INFORMATION
Definition: security.c:76
static void init(void)
Definition: security.c:132
static POBJECTS_AND_SID pObjSid
Definition: security.c:94
#define SE_MIN_WELL_KNOWN_PRIVILEGE
Definition: security.c:555
#define EVENT_QUERY_STATE
Definition: security.c:67
static BOOL get_sid_info(PSID psid, LPSTR *user, LPSTR *dom)
Definition: security.c:2473
#define SE_SYSTEM_PROFILE_PRIVILEGE
Definition: security.c:565
#define SE_SYNC_AGENT_PRIVILEGE
Definition: security.c:580
#define THREAD_SET_LIMITED_INFORMATION
Definition: security.c:75
static void test_elevation(void)
Definition: security.c:8427
#define SE_REMOTE_SHUTDOWN_PRIVILEGE
Definition: security.c:578
#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
Definition: security.c:557
static void test_window_security(void)
Definition: security.c:8796
static void test_kernel_objects_security(void)
Definition: security.c:6313
static void test_GetTokenInformation(void)
Definition: security.c:2015
static void test_CheckTokenMembership(void)
Definition: security.c:5018
static DWORD WINAPI duplicate_handle_access_thread(void *arg)
Definition: security.c:7823
static void test_AdjustTokenPrivileges(void)
Definition: security.c:6492
static PSID pSid
Definition: security.c:85
static void test_AccessCheck(void)
Definition: security.c:1124
#define join_process(a)
Definition: security.c:8013
static void test_AddAce(void)
Definition: security.c:6528
static void test_create_process_token_child(void)
Definition: security.c:8115
static void test_system_security_access(void)
Definition: security.c:6828
#define PROCESS_ALL_ACCESS_NT4
Definition: security.c:63
static HANDLE
Definition: security.c:100
static void test_file_security(HANDLE token)
Definition: security.c:5836
static void test_process_security_child(void)
Definition: security.c:3105
static void test_lookupPrivilegeName(void)
Definition: security.c:616
static void test_owner_equal(HANDLE Handle, PSID expected, int line)
Definition: security.c:172
static POBJECTS_AND_NAME_A pObjName
Definition: security.c:88
static void test_duplicate_handle_access(void)
Definition: security.c:7844
static void test_EqualSid(void)
Definition: security.c:5079
#define SE_IMPERSONATE_PRIVILEGE
Definition: security.c:583
#define SE_DEBUG_PRIVILEGE
Definition: security.c:574
#define SE_CREATE_TOKEN_PRIVILEGE
Definition: security.c:556
static POBJECTS_AND_SID GUID * pObjectGuid
Definition: security.c:95
static void test_InitializeAcl(void)
Definition: security.c:4643
#define CHECK_SET_SECURITY(o, i, e)
Definition: security.c:2880
static int myARGC
Definition: security.c:105
static void test_default_dacl_owner_group_sid(void)
Definition: security.c:6394
static void test_LookupAccountName(void)
Definition: security.c:2552
static void test_process_security(void)
Definition: security.c:2894
#define SE_SYSTEMTIME_PRIVILEGE
Definition: security.c:566
static void test_group_as_file_owner(void)
Definition: security.c:8700
#define WINE_TEST_PIPE
Definition: security.c:5730
#define SE_CREATE_PERMANENT_PRIVILEGE
Definition: security.c:570
#define SE_MACHINE_ACCOUNT_PRIVILEGE
Definition: security.c:560
static void test_SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR sec)
Definition: security.c:4468
#define THREAD_ALL_ACCESS_NT4
Definition: security.c:79
static void test_IsValidSecurityDescriptor(void)
Definition: security.c:8768
#define SE_SECURITY_PRIVILEGE
Definition: security.c:562
static TOKEN_USER * get_alloc_token_user(HANDLE token)
Definition: security.c:1727
static void test_LookupAccountSid(void)
Definition: security.c:2177
static void test_GetWindowsAccountDomainSid(void)
Definition: security.c:6929
static PPRIVILEGE_SET
Definition: security.c:101
static void test_child_token_sd(void)
Definition: security.c:7488
#define expect_eq(expr, value, type, format)
Definition: security.c:82
static ACCESS_MASK get_obj_access(HANDLE obj)
Definition: security.c:5555
static SECURITY_DESCRIPTOR * test_get_security_descriptor(HANDLE handle, int line)
Definition: security.c:146
static void test_semaphore_security(HANDLE token)
Definition: security.c:5680
#define CHECK_ONE_OF_AND_FREE(exp_str1, exp_str2)
static void test_FileSecurity(void)
Definition: security.c:763
static void test_inherited_dacl(PACL dacl, PSID admin_sid, PSID user_sid, DWORD flags, DWORD mask, BOOL todo_count, BOOL todo_sid, BOOL todo_flags, int line)
Definition: security.c:3537
#define SE_AUDIT_PRIVILEGE
Definition: security.c:575
static void test_ConvertStringSecurityDescriptor(void)
Definition: security.c:4206
#define SEMAPHORE_QUERY_STATE
Definition: security.c:71
#define TEST_GRANTED_ACCESS2(a, b, c)
Definition: security.c:2861
#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE
Definition: security.c:576
static void join_process_(int line, const PROCESS_INFORMATION *pi)
Definition: security.c:8014
static char ** myARGV
Definition: security.c:106
static void test_CreateDirectoryA(void)
Definition: security.c:3590
static void test_maximum_allowed(void)
Definition: security.c:7085
#define SE_MANAGE_VOLUME_PRIVILEGE
Definition: security.c:582
static TOKEN_OWNER * get_alloc_token_owner(HANDLE token)
Definition: security.c:1745
#define SE_INC_BASE_PRIORITY_PRIVILEGE
Definition: security.c:568
static const struct well_known_sid_value well_known_sid_values[]
static void test_GetNamedSecurityInfoA(void)
Definition: security.c:3821
static void test_GetUserNameW(void)
Definition: security.c:5218
static void test_GetSecurityInfo(void)
Definition: security.c:4691
static void test_lookupPrivilegeValue(void)
Definition: security.c:683
static void test_GetUserNameA(void)
Definition: security.c:5144
static void test_impersonation_level(void)
Definition: security.c:3177
static void test_event_security(HANDLE token)
Definition: security.c:5623
static void check_token_label(HANDLE token, DWORD *level, BOOL sacl_inherited)
Definition: security.c:7123
static void test_PrivateObjectSecurity(void)
Definition: security.c:4556
static void test_GetSidSubAuthority(void)
Definition: security.c:4995
static void test_create_process_token(void)
Definition: security.c:8022
#define SE_UNDOCK_PRIVILEGE
Definition: security.c:579
static void test_TokenIntegrityLevel(void)
Definition: security.c:6346
static void test_mutex_security(HANDLE token)
Definition: security.c:5566
static TOKEN_PRIMARY_GROUP * get_alloc_token_primary_group(HANDLE token)
Definition: security.c:1763
static void test_SetEntriesInAclW(void)
Definition: security.c:3284
static void test_token_security_descriptor(void)
Definition: security.c:7297
#define SE_SHUTDOWN_PRIVILEGE
Definition: security.c:573
#define SE_LOCK_MEMORY_PRIVILEGE
Definition: security.c:558
static void test_token_label(void)
Definition: security.c:7199
#define SE_BACKUP_PRIVILEGE
Definition: security.c:571
#define SE_RESTORE_PRIVILEGE
Definition: security.c:572
static void test_pseudo_tokens(void)
Definition: security.c:7034
#define PROCESS_QUERY_LIMITED_INFORMATION
Definition: security.c:59
static void test_default_handle_security(HANDLE token, HANDLE handle, GENERIC_MAPPING *mapping)
Definition: security.c:5482
static void test_sid_str(PSID *sid)
Definition: security.c:2045
static PBOOLEAN
Definition: security.c:99
static void get_nt_pathW(const char *name, UNICODE_STRING *nameW)
Definition: security.c:3519
static POBJECTS_AND_SID GUID GUID * pInheritedObjectGuid
Definition: security.c:96
#define SE_TCB_PRIVILEGE
Definition: security.c:561
static void test_CreateRestrictedToken(void)
Definition: security.c:5289
static LPSTR pName
Definition: security.c:86
static void test_allocateLuid(void)
Definition: security.c:588
#define SE_PROF_SINGLE_PROCESS_PRIVILEGE
Definition: security.c:567
static void test_named_pipe_security(HANDLE token)
Definition: security.c:5731
static void test_SetEntriesInAclA(void)
Definition: security.c:3398
static void test_trustee(void)
Definition: security.c:405
static void test_ConvertSecurityDescriptorToString(void)
Definition: security.c:4369
static void test_security_descriptor(void)
Definition: security.c:2773
static void test_thread_security(void)
Definition: security.c:6073
static void check_different_token(HANDLE token1, HANDLE token2)
Definition: security.c:8413
static void test_filemap_security(void)
Definition: security.c:5956
#define SE_CHANGE_NOTIFY_PRIVILEGE
Definition: security.c:577
#define SE_ENABLE_DELEGATION_PRIVILEGE
Definition: security.c:581
static void check_wellknown_name(const char *name, WELL_KNOWN_SID_TYPE result)
Definition: security.c:2490
#define CHECK_RESULT_AND_FREE(exp_str)
static BOOL validate_impersonation_token(HANDLE token, DWORD *token_type)
Definition: security.c:6262
static BOOLEAN
Definition: security.c:99
#define SE_INCREASE_QUOTA_PRIVILEGE
Definition: security.c:559
static void test_BuildSecurityDescriptorW(void)
Definition: security.c:7724
#define SE_LOAD_DRIVER_PRIVILEGE
Definition: security.c:564
static const LUID_AND_ATTRIBUTES * find_privilege(const TOKEN_PRIVILEGES *privs, const LUID *luid)
Definition: security.c:8194
static void validate_default_security_descriptor(SECURITY_DESCRIPTOR *sd)
Definition: security.c:5442
static void test_granted_access(HANDLE handle, ACCESS_MASK access, ACCESS_MASK alt, int line)
Definition: security.c:2862
#define SE_MAX_WELL_KNOWN_PRIVILEGE
Definition: security.c:585
static PULONG
Definition: security.c:101
#define SE_CREATE_GLOBAL_PRIVILEGE
Definition: security.c:584
static void test_ConvertStringSidToSid(void)
Definition: security.c:218
static void test_GetKernelObjectSecurity(void)
Definition: security.c:8324
static NTSTATUS *static PWSTR CURDIR *static HMODULE hmod
Definition: security.c:104
#define THREAD_ALL_ACCESS_VISTA
Definition: security.c:80
static POBJECTS_AND_NAME_A SE_OBJECT_TYPE LPSTR LPSTR InheritedObjectTypeName
Definition: security.c:91
static void test_process_access(void)
Definition: security.c:6145
#define SE_CREATE_PAGEFILE_PRIVILEGE
Definition: security.c:569
static void test_group_equal(HANDLE Handle, PSID expected, int line)
Definition: security.c:195
BOOL expected
Definition: store.c:2000
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
ObjectType
Definition: metafile.c:88
static PROCESS_INFORMATION pi
Definition: debugger.c:2303
static const char filler[0x1000]
Definition: loader.c:179
static HINSTANCE hkernel32
Definition: process.c:68
static HINSTANCE hntdll
Definition: process.c:68
static HANDLE sem
Definition: sync.c:799
static SYSTEM_INFO si
Definition: virtual.c:39
static const WCHAR sd[]
Definition: suminfo.c:286
static WCHAR computer_name[MAX_COMPUTERNAME_LENGTH+1]
Definition: access.c:33
static WCHAR user_name[UNLEN+1]
Definition: access.c:32
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK io
Definition: file.c:72
static void ULONG ULONG * ret_size
Definition: time.c:40
static LPCWSTR file_name
Definition: protocol.c:147
WCHAR strW[12]
Definition: clipboard.c:2216
#define ctrl
Definition: input.c:3281
static SCRIPT_CACHE SCRIPT_ANALYSIS * psa
Definition: usp10.c:64
@ Enabled
Definition: mountmgr.h:179
struct _SID * PSID
Definition: eventlog.c:37
struct _SID SID
struct _SECURITY_DESCRIPTOR * PSECURITY_DESCRIPTOR
struct _ACL * PACL
struct _ACCESS_ALLOWED_ACE ACCESS_ALLOWED_ACE
DWORD SECURITY_INFORMATION
Definition: ms-dtyp.idl:311
static PSID AdminSid
Definition: msgina.c:39
char temp_path[MAX_PATH]
Definition: mspatcha.c:123
#define MUTANT_ALL_ACCESS
Definition: extypes.h:110
#define MUTANT_QUERY_STATE
Definition: extypes.h:109
_In_ ULONG Domain
Definition: haltypes.h:1814
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL Dacl
Definition: rtlfuncs.h:1625
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
Definition: rtlfuncs.h:1629
_In_ ULONG dwAceRevision
Definition: rtlfuncs.h:1173
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ BOOLEAN _In_ TOKEN_TYPE TokenType
Definition: sefuncs.h:411
#define SE_GROUP_USE_FOR_DENY_ONLY
Definition: setypes.h:94
#define SE_GROUP_INTEGRITY_ENABLED
Definition: setypes.h:96
#define SE_GROUP_INTEGRITY
Definition: setypes.h:95
#define SE_GROUP_LOGON_ID
Definition: setypes.h:98
#define SE_GROUP_MANDATORY
Definition: setypes.h:90
#define SE_GROUP_ENABLED_BY_DEFAULT
Definition: setypes.h:91
#define SE_GROUP_ENABLED
Definition: setypes.h:92
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
HANDLE WINAPI CreateNamedPipeA(LPCSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: npipe.c:220
#define SPECIFIC_RIGHTS_ALL
Definition: nt_native.h:71
#define SECTION_MAP_EXECUTE
Definition: nt_native.h:1293
#define THREAD_ALL_ACCESS
Definition: nt_native.h:1342
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define SYNCHRONIZE
Definition: nt_native.h:61
#define PAGE_WRITECOPY
Definition: nt_native.h:1308
#define SECTION_MAP_WRITE
Definition: nt_native.h:1291
#define THREAD_TERMINATE
Definition: nt_native.h:1339
#define FILE_WRITE_DATA
Definition: nt_native.h:631
#define WRITE_DAC
Definition: nt_native.h:59
#define FILE_READ_DATA
Definition: nt_native.h:628
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_GENERIC_EXECUTE
Definition: nt_native.h:668
#define FILE_ATTRIBUTE_COMPRESSED
Definition: nt_native.h:711
#define ACCESS_SYSTEM_SECURITY
Definition: nt_native.h:77
#define PAGE_READWRITE
Definition: nt_native.h:1307
#define PAGE_EXECUTE_READ
Definition: nt_native.h:1310
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define SECTION_ALL_ACCESS
Definition: nt_native.h:1296
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
#define KEY_READ
Definition: nt_native.h:1026
#define SECTION_QUERY
Definition: nt_native.h:1290
#define PROCESS_ALL_ACCESS
Definition: nt_native.h:1327
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
#define PAGE_EXECUTE
Definition: nt_native.h:1309
#define LPDWORD
Definition: nt_native.h:46
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define FILE_DELETE_CHILD
Definition: nt_native.h:645
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define FILE_EXECUTE
Definition: nt_native.h:642
#define STANDARD_RIGHTS_READ
Definition: nt_native.h:65
#define KEY_EXECUTE
Definition: nt_native.h:1040
#define STANDARD_RIGHTS_ALL
Definition: nt_native.h:69
#define STANDARD_RIGHTS_WRITE
Definition: nt_native.h:66
#define GENERIC_ALL
Definition: nt_native.h:92
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
#define PAGE_EXECUTE_WRITECOPY
Definition: nt_native.h:1312
#define DELETE
Definition: nt_native.h:57
#define BOOL
Definition: nt_native.h:43
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define KEY_WRITE
Definition: nt_native.h:1034
#define READ_CONTROL
Definition: nt_native.h:58
#define FILE_ALL_ACCESS
Definition: nt_native.h:651
#define WRITE_OWNER
Definition: nt_native.h:60
#define DWORD
Definition: nt_native.h:44
#define STANDARD_RIGHTS_EXECUTE
Definition: nt_native.h:67
NTSTATUS NTAPI NtCreateFile(OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength)
#define GENERIC_WRITE
Definition: nt_native.h:90
#define THREAD_SET_INFORMATION
Definition: nt_native.h:1340
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define FILE_GENERIC_READ
Definition: nt_native.h:653
#define GENERIC_EXECUTE
Definition: nt_native.h:91
#define PAGE_NOACCESS
Definition: nt_native.h:1305
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define KEY_SET_VALUE
Definition: nt_native.h:1020
#define PAGE_EXECUTE_READWRITE
Definition: nt_native.h:1311
#define FILE_GENERIC_WRITE
Definition: nt_native.h:660
#define STANDARD_RIGHTS_REQUIRED
Definition: nt_native.h:63
#define MAXDWORD
#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
Definition: ntifs_ex.h:384
#define STATUS_GENERIC_NOT_MAPPED
Definition: ntstatus.h:560
@ generic
Definition: optimize.h:97
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
#define FILE_FLAG_FIRST_PIPE_INSTANCE
Definition: piperead.cpp:20
@ PolicyAccountDomainInformation
Definition: ntsecapi.h:247
#define POLICY_VIEW_LOCAL_INFORMATION
Definition: ntsecapi.h:61
#define POLICY_ALL_ACCESS
Definition: ntsecapi.h:77
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define err(...)
#define equal(x, y)
Definition: reader.cc:56
#define calloc
Definition: rosglue.h:14
#define test
Definition: rosglue.h:37
const WCHAR * str
#define SDDL_REVISION_1
Definition: sddl.h:30
#define LANG_ENGLISH
Definition: nls.h:52
#define PRIMARYLANGID(l)
Definition: nls.h:16
strcat
Definition: string.h:92
strcpy
Definition: string.h:131
int winetest_get_mainargs(char ***pargv)
#define wait_child_process
Definition: test.h:159
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
#define _WIN32_WINNT_WIN10
Definition: sdkddkver.h:32
#define _WIN32_WINNT_WS03
Definition: sdkddkver.h:23
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
DWORD WINAPI BuildSecurityDescriptorW(IN PTRUSTEE_W pOwner OPTIONAL, IN PTRUSTEE_W pGroup OPTIONAL, IN ULONG cCountOfAccessEntries, IN PEXPLICIT_ACCESS_W pListOfAccessEntries OPTIONAL, IN ULONG cCountOfAuditEntries, IN PEXPLICIT_ACCESS_W pListOfAuditEntries OPTIONAL, IN PSECURITY_DESCRIPTOR pOldSD OPTIONAL, OUT PULONG pSizeNewSD, OUT PSECURITY_DESCRIPTOR *pNewSD)
Definition: sec.c:436
BOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSECURITY_DESCRIPTOR_CONTROL pControl, LPDWORD lpdwRevision)
Definition: sec.c:21
BOOL WINAPI GetSecurityDescriptorGroup(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pGroup, LPBOOL lpbGroupDefaulted)
Definition: sec.c:76
BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted)
Definition: sec.c:262
BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbSaclPresent, PACL *pSacl, LPBOOL lpbSaclDefaulted)
Definition: sec.c:146
BOOL WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, LPDWORD lpdwBufferLength)
Definition: sec.c:214
BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent, PACL *pDacl, LPBOOL lpbDaclDefaulted)
Definition: sec.c:45
BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pOwner, LPBOOL lpbOwnerDefaulted)
Definition: sec.c:103
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
NTSTATUS WINAPI NtSetSecurityObject(HANDLE Handle, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR SecurityDescriptor)
BOOL WINAPI SHIM_OBJ_NAME() GetComputerNameA(LPSTR lpBuffer, LPDWORD lpnSize)
Definition: shimtest.c:21
static char tmpdir[MAX_PATH]
Definition: shlexec.c:52
#define UNLEN
Definition: sspi.c:28
TCHAR * cmdline
Definition: stretchblt.cpp:32
const char * name
Definition: security.c:679
DWORD lowPart
Definition: security.c:680
ACE_HEADER Header
Definition: ms-dtyp.idl:216
ACCESS_MASK Mask
Definition: ms-dtyp.idl:217
USHORT AceSize
Definition: ms-dtyp.idl:212
UCHAR AceFlags
Definition: ms-dtyp.idl:211
UCHAR AceType
Definition: ms-dtyp.idl:210
USHORT Sbz2
Definition: ms-dtyp.idl:298
UCHAR Sbz1
Definition: ms-dtyp.idl:295
USHORT AceCount
Definition: ms-dtyp.idl:297
USHORT AclSize
Definition: ms-dtyp.idl:296
UCHAR AclRevision
Definition: ms-dtyp.idl:294
DWORD grfAccessPermissions
Definition: accctrl.h:333
TRUSTEE_A Trustee
Definition: accctrl.h:336
DWORD grfInheritance
Definition: accctrl.h:335
ACCESS_MODE grfAccessMode
Definition: accctrl.h:334
DWORD grfAccessPermissions
Definition: accctrl.h:341
DWORD grfInheritance
Definition: accctrl.h:343
TRUSTEE_W Trustee
Definition: accctrl.h:344
ACCESS_MODE grfAccessMode
Definition: accctrl.h:342
LONG HighPart
DWORD LowPart
char max[SECURITY_MAX_SID_SIZE]
Definition: security.c:2042
SID sid
Definition: security.c:2041
DWORD ObjectsPresent
Definition: accctrl.h:357
LPSTR InheritedObjectTypeName
Definition: accctrl.h:360
SE_OBJECT_TYPE ObjectType
Definition: accctrl.h:358
GUID InheritedObjectTypeGuid
Definition: accctrl.h:351
GUID ObjectTypeGuid
Definition: accctrl.h:350
DWORD ObjectsPresent
Definition: accctrl.h:349
ACCESS_MASK GrantedAccess
Definition: winternl.h:2680
LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY]
Definition: setypes.h:88
$ULONG Control
Definition: setypes.h:87
$ULONG PrivilegeCount
Definition: setypes.h:86
LPVOID lpSecurityDescriptor
Definition: compat.h:193
SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode
Definition: lsa.idl:66
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
Definition: lsa.idl:65
DWORD SubAuthority[*]
Definition: ms-dtyp.idl:202
BYTE SubAuthorityCount
Definition: ms-dtyp.idl:200
SID_IDENTIFIER_AUTHORITY IdentifierAuthority
Definition: ms-dtyp.idl:201
$ULONG TokenIsElevated
Definition: setypes.h:1069
SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]
Definition: setypes.h:1030
$ULONG GroupCount
Definition: setypes.h:1026
SID_AND_ATTRIBUTES Label
Definition: setypes.h:1073
PSID Owner
Definition: setypes.h:1040
$ULONG PrivilegeCount
Definition: setypes.h:1035
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]
Definition: setypes.h:1036
SID_AND_ATTRIBUTES User
Definition: setypes.h:1022
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation
Definition: accctrl.h:206
TRUSTEE_TYPE TrusteeType
Definition: accctrl.h:208
TRUSTEE_FORM TrusteeForm
Definition: accctrl.h:207
struct _TRUSTEE_A * pMultipleTrustee
Definition: accctrl.h:205
LPSTR ptstrName
Definition: accctrl.h:209
LPWSTR ptstrName
Definition: accctrl.h:218
struct _TRUSTEE_W * pMultipleTrustee
Definition: accctrl.h:214
TRUSTEE_TYPE TrusteeType
Definition: accctrl.h:217
TRUSTEE_FORM TrusteeForm
Definition: accctrl.h:216
MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation
Definition: accctrl.h:215
Definition: match.c:390
Definition: cookie.c:202
Definition: dialog.c:52
Definition: security.c:35
Definition: cookie.c:42
Definition: fci.c:127
Definition: dsound.c:943
Definition: format.c:58
Definition: parser.c:49
Definition: module.h:456
Definition: name.c:39
Definition: send.c:48
Definition: tftpd.h:86
SID_IDENTIFIER_AUTHORITY auth
Definition: security.c:128
const char * refStr
Definition: security.c:129
Definition: ps.c:97
const char * sid_string
Definition: security.c:2070
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:573
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexA(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:512
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synch.c:605
HANDLE WINAPI DECLSPEC_HOTPATCH CreateSemaphoreA(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCSTR lpName OPTIONAL)
Definition: synchansi.c:44
HANDLE WINAPI DECLSPEC_HOTPATCH OpenMutexA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synchansi.c:71
HANDLE WINAPI DECLSPEC_HOTPATCH OpenSemaphoreA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synchansi.c:58
#define INHERITED_ACE
Definition: ph.h:47
_Must_inspect_result_ __kernel_entry NTSTATUS NTAPI NtDuplicateToken(_In_ HANDLE ExistingTokenHandle, _In_ ACCESS_MASK DesiredAccess, _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, _In_ BOOLEAN EffectiveOnly, _In_ TOKEN_TYPE TokenType, _Out_ PHANDLE NewTokenHandle)
Duplicates a token.
Definition: tokenlif.c:1871
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define MAKEWORD(a, b)
Definition: typedefs.h:248
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint16_t * LPWSTR
Definition: typedefs.h:56
void * PVOID
Definition: typedefs.h:50
char * LPSTR
Definition: typedefs.h:51
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
Definition: pdh_main.c:96
BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable)
Definition: user_lib.cpp:531
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
#define success(from, fromstr, to, tostr)
#define SEMAPHORE_MODIFY_STATE
Definition: winbase.h:163
#define PIPE_ACCESS_INBOUND
Definition: winbase.h:167
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define STARTF_USESHOWWINDOW
Definition: winbase.h:468
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1145
#define NMPWAIT_USE_DEFAULT_WAIT
Definition: winbase.h:136
#define PIPE_ACCESS_DUPLEX
Definition: winbase.h:166
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
#define MUTEX_ALL_ACCESS
Definition: winbase.h:160
#define EVENT_MODIFY_STATE
Definition: winbase.h:165
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1155
#define CREATE_SUSPENDED
Definition: winbase.h:182
#define SEMAPHORE_ALL_ACCESS
Definition: winbase.h:162
#define PIPE_ACCESS_OUTBOUND
Definition: winbase.h:168
#define PIPE_TYPE_BYTE
Definition: winbase.h:169
#define PIPE_NOWAIT
Definition: winbase.h:174
#define PIPE_UNLIMITED_INSTANCES
Definition: winbase.h:177
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2521
#define MUTEX_MODIFY_STATE
Definition: winbase.h:161
_In_ ULONG _In_ ULONG_PTR ident
Definition: winddi.h:3994
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6
#define ERROR_INVALID_SECURITY_DESCR
Definition: winerror.h:1165
#define ERROR_INVALID_DATATYPE
Definition: winerror.h:1468
#define ERROR_TRUSTED_DOMAIN_FAILURE
Definition: winerror.h:1452
#define ERROR_BAD_TOKEN_TYPE
Definition: winerror.h:1175
#define ERROR_NON_DOMAIN_SID
Definition: winerror.h:1090
#define ERROR_BAD_LENGTH
Definition: winerror.h:249
#define ERROR_UNKNOWN_REVISION
Definition: winerror.h:1132
#define RPC_S_INVALID_STRING_UUID
Definition: winerror.h:1372
#define ERROR_NO_SUCH_PRIVILEGE
Definition: winerror.h:1140
#define ERROR_INVALID_ACL
Definition: winerror.h:1163
#define ERROR_CANT_OPEN_ANONYMOUS
Definition: winerror.h:1173
#define ERROR_BAD_DESCRIPTOR_FORMAT
Definition: winerror.h:1187
#define ERROR_NO_SECURITY_ON_OBJECT
Definition: winerror.h:1176
#define ERROR_NO_IMPERSONATION_TOKEN
Definition: winerror.h:1136
#define ERROR_BAD_IMPERSONATION_LEVEL
Definition: winerror.h:1172
#define ERROR_INVALID_SID
Definition: winerror.h:1164
#define ERROR_GENERIC_NOT_MAPPED
Definition: winerror.h:1186
#define ERROR_NO_SUCH_LOGON_SESSION
Definition: winerror.h:1139
#define RPC_S_SERVER_UNAVAILABLE
Definition: winerror.h:1389
#define ERROR_TRUSTED_RELATIONSHIP_FAILURE
Definition: winerror.h:1453
#define RPC_S_INVALID_NET_ADDR
Definition: winerror.h:1374
#define ERROR_NO_TOKEN
Definition: winerror.h:911
#define ERROR_NOACCESS
Definition: winerror.h:902
#define ERROR_PRIVILEGE_NOT_HELD
Definition: winerror.h:1141
#define ERROR_NONE_MAPPED
Definition: winerror.h:1159
#define PROCESS_SET_LIMITED_INFORMATION
Definition: winnt_old.h:406
@ AclSizeInformation
Definition: winnt_old.h:1184
#define SE_SECURITY_NAME
Definition: winnt_old.h:416
#define THREAD_RESUME
Definition: winnt_old.h:407
@ TokenElevationTypeLimited
Definition: winnt_old.h:2719
@ TokenElevationTypeDefault
Definition: winnt_old.h:2717
@ TokenElevationTypeFull
Definition: winnt_old.h:2718
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_CONFIG
Definition: winreg.h:15
#define HKEY_DYN_DATA
Definition: winreg.h:16
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define HKEY_PERFORMANCE_DATA
Definition: winreg.h:14
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define HKEY_USERS
Definition: winreg.h:13
#define SW_SHOWNORMAL
Definition: winuser.h:781
HDESK WINAPI GetThreadDesktop(_In_ DWORD)
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:191
#define DUPLICATE_SAME_ACCESS
_Out_ PBOOLEAN _Out_ PBOOLEAN _Out_ PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel
Definition: psfuncs.h:157
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET * Privileges
Definition: sefuncs.h:17
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE _In_ BOOLEAN _In_ BOOLEAN AccessGranted
Definition: sefuncs.h:419
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK _Out_ PNTSTATUS AccessStatus
Definition: sefuncs.h:21
#define VALID_INHERIT_FLAGS
Definition: setypes.h:751
#define LABEL_SECURITY_INFORMATION
Definition: setypes.h:127
#define CONTAINER_INHERIT_ACE
Definition: setypes.h:747
#define DOMAIN_ALIAS_RID_USERS
Definition: setypes.h:653
#define TOKEN_QUERY_SOURCE
Definition: setypes.h:941
#define INHERIT_ONLY_ACE
Definition: setypes.h:749
#define SE_OWNER_DEFAULTED
Definition: setypes.h:831
#define DOMAIN_GROUP_RID_SCHEMA_ADMINS
Definition: setypes.h:645
#define SECURITY_BUILTIN_DOMAIN_RID
Definition: setypes.h:581
#define DOMAIN_USER_RID_ADMIN
Definition: setypes.h:631
#define DACL_SECURITY_INFORMATION
Definition: setypes.h:125
#define SE_SACL_PROTECTED
Definition: setypes.h:844
#define SE_DACL_DEFAULTED
Definition: setypes.h:834
struct _TOKEN_USER TOKEN_USER
#define TOKEN_DUPLICATE
Definition: setypes.h:938
#define ACE_INHERITED_OBJECT_TYPE_PRESENT
Definition: setypes.h:818
#define SE_DACL_PROTECTED
Definition: setypes.h:843
#define SE_DACL_AUTO_INHERITED
Definition: setypes.h:841
#define SECURITY_WORLD_SID_AUTHORITY
Definition: setypes.h:527
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:942
#define DOMAIN_GROUP_RID_CONTROLLERS
Definition: setypes.h:643
#define DOMAIN_GROUP_RID_COMPUTERS
Definition: setypes.h:642
#define SECURITY_WORLD_RID
Definition: setypes.h:541
#define ACL_REVISION4
Definition: setypes.h:45
#define DOMAIN_GROUP_RID_POLICY_ADMINS
Definition: setypes.h:647
#define SECURITY_STATIC_TRACKING
Definition: setypes.h:104
#define ACCESS_ALLOWED_ACE_TYPE
Definition: setypes.h:717
#define SECURITY_MANDATORY_LABEL_AUTHORITY
Definition: setypes.h:682
#define TOKEN_QUERY
Definition: setypes.h:940
#define SECURITY_LOCAL_SYSTEM_RID
Definition: setypes.h:574
#define ACL_REVISION1
Definition: setypes.h:42
#define SE_DACL_AUTO_INHERIT_REQ
Definition: setypes.h:839
#define DOMAIN_GROUP_RID_GUESTS
Definition: setypes.h:641
#define ACL_REVISION3
Definition: setypes.h:44
#define ACL_REVISION2
Definition: setypes.h:43
#define OWNER_SECURITY_INFORMATION
Definition: setypes.h:123
#define SE_SELF_RELATIVE
Definition: setypes.h:846
#define DOMAIN_USER_RID_GUEST
Definition: setypes.h:632
#define SE_SACL_DEFAULTED
Definition: setypes.h:836
struct _SECURITY_DESCRIPTOR_RELATIVE SECURITY_DESCRIPTOR_RELATIVE
#define SE_SACL_AUTO_INHERITED
Definition: setypes.h:842
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
#define DOMAIN_ALIAS_RID_RAS_SERVERS
Definition: setypes.h:663
#define DOMAIN_GROUP_RID_CERT_ADMINS
Definition: setypes.h:644
#define OBJECT_INHERIT_ACE
Definition: setypes.h:746
@ TokenDefaultDacl
Definition: setypes.h:983
@ TokenLogonSid
Definition: setypes.h:1005
@ TokenStatistics
Definition: setypes.h:987
@ TokenImpersonationLevel
Definition: setypes.h:986
@ TokenIntegrityLevel
Definition: setypes.h:1002
@ TokenGroups
Definition: setypes.h:979
@ TokenPrivileges
Definition: setypes.h:980
@ TokenUser
Definition: setypes.h:978
@ TokenIsAppContainer
Definition: setypes.h:1006
@ TokenPrimaryGroup
Definition: setypes.h:982
@ TokenElevation
Definition: setypes.h:997
@ TokenElevationType
Definition: setypes.h:995
@ TokenOwner
Definition: setypes.h:981
@ TokenLinkedToken
Definition: setypes.h:996
#define TOKEN_ASSIGN_PRIMARY
Definition: setypes.h:937
#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP
Definition: setypes.h:822
#define NO_PROPAGATE_INHERIT_ACE
Definition: setypes.h:748
#define SECURITY_MANDATORY_HIGH_RID
Definition: setypes.h:686
#define SE_SACL_PRESENT
Definition: setypes.h:835
#define TOKEN_ADJUST_DEFAULT
Definition: setypes.h:944
#define MIN_ACL_REVISION
Definition: setypes.h:46
#define SYSTEM_MANDATORY_LABEL_ACE_TYPE
Definition: setypes.h:741
#define SECURITY_DESCRIPTOR_REVISION
Definition: setypes.h:58
* PSID_IDENTIFIER_AUTHORITY
Definition: setypes.h:464
#define TOKEN_ADJUST_GROUPS
Definition: setypes.h:943
#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
Definition: setypes.h:820
#define TOKEN_READ
Definition: setypes.h:963
#define SE_SACL_AUTO_INHERIT_REQ
Definition: setypes.h:840
#define GROUP_SECURITY_INFORMATION
Definition: setypes.h:124
#define ACE_OBJECT_TYPE_PRESENT
Definition: setypes.h:817
#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS
Definition: setypes.h:646
#define TOKEN_IMPERSONATE
Definition: setypes.h:939
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
#define SECURITY_DESCRIPTOR_MIN_LENGTH
Definition: setypes.h:827
#define ACL_REVISION
Definition: setypes.h:39
#define SE_GROUP_DEFAULTED
Definition: setypes.h:832
#define PRIVILEGE_SET_ALL_NECESSARY
Definition: setypes.h:83
#define SID_MAX_SUB_AUTHORITIES
Definition: setypes.h:482
WELL_KNOWN_SID_TYPE
Definition: setypes.h:455
#define MAX_ACL_REVISION
Definition: setypes.h:47
#define SACL_SECURITY_INFORMATION
Definition: setypes.h:126
#define SE_RM_CONTROL_VALID
Definition: setypes.h:845
#define DOMAIN_ALIAS_RID_ADMINS
Definition: setypes.h:652
#define DOMAIN_GROUP_RID_ADMINS
Definition: setypes.h:639
#define SE_PRIVILEGE_REMOVED
Definition: setypes.h:64
#define SID_REVISION
Definition: setypes.h:481
#define SECURITY_DESCRIPTOR_REVISION1
Definition: setypes.h:59
#define SECURITY_MANDATORY_MEDIUM_RID
Definition: setypes.h:685
#define SECURITY_MANDATORY_LOW_RID
Definition: setypes.h:684
struct _PRIVILEGE_SET PRIVILEGE_SET
#define SECURITY_MAX_SID_SIZE
Definition: setypes.h:486
#define TOKEN_ALL_ACCESS
Definition: setypes.h:958
#define SE_DACL_PRESENT
Definition: setypes.h:833
#define SECURITY_NT_NON_UNIQUE
Definition: setypes.h:577
#define DOMAIN_GROUP_RID_USERS
Definition: setypes.h:640
unsigned char BYTE
Definition: xxhash.c:193