ReactOS 0.4.16-dev-2332-g4cba65d
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
53struct debug_info
54{
55 unsigned int str_pos; /* current position in strings buffer */
56 unsigned int out_pos; /* current position in output buffer */
57 char strings[1020]; /* buffer for temporary strings */
58 char output[1020]; /* current output line */
59};
60
61C_ASSERT( sizeof(struct debug_info) == 0x800 );
62
63static inline struct debug_info *get_info(void)
64{
65#ifdef _WIN64
66 return (struct debug_info *)((TEB32 *)((char *)NtCurrentTeb() + 0x2000) + 1);
67#else
68 return (struct debug_info *)(NtCurrentTeb() + 1);
69#endif
70}
71
72const char * __cdecl __wine_dbg_strdup( const char *str )
73{
74 struct debug_info *info = get_info();
75 unsigned int pos = info->str_pos;
76 size_t n = strlen( str ) + 1;
77
78 if (pos + n > sizeof(info->strings)) pos = 0;
79 info->str_pos = pos + n;
80 return memcpy( info->strings + pos, str, n );
81}
82
85BOOL WINAPI EqualDomainSid(_In_ PSID pSid1, _In_ PSID pSid2, _Out_ BOOL* pfEqual);
86#endif
87
88#ifndef PROCESS_QUERY_LIMITED_INFORMATION
89#define PROCESS_QUERY_LIMITED_INFORMATION 0x1000
90#endif
91
92/* PROCESS_ALL_ACCESS in Vista+ PSDKs is incompatible with older Windows versions */
93#define PROCESS_ALL_ACCESS_NT4 (PROCESS_ALL_ACCESS & ~0xf000)
94#define PROCESS_ALL_ACCESS_VISTA (PROCESS_ALL_ACCESS | 0xf000)
95
96#ifndef EVENT_QUERY_STATE
97#define EVENT_QUERY_STATE 0x0001
98#endif
99
100#ifndef SEMAPHORE_QUERY_STATE
101#define SEMAPHORE_QUERY_STATE 0x0001
102#endif
103
104#ifndef THREAD_SET_LIMITED_INFORMATION
105#define THREAD_SET_LIMITED_INFORMATION 0x0400
106#define THREAD_QUERY_LIMITED_INFORMATION 0x0800
107#endif
108
109#define THREAD_ALL_ACCESS_NT4 (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3ff)
110#define THREAD_ALL_ACCESS_VISTA (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff)
111
112#define expect_eq(expr, value, type, format) { type ret_ = expr; ok((value) == ret_, #expr " expected " format " got " format "\n", (value), (ret_)); }
113
114static BOOL (WINAPI *pAddMandatoryAce)(PACL,DWORD,DWORD,DWORD,PSID);
115static VOID (WINAPI *pBuildTrusteeWithSidA)( PTRUSTEEA pTrustee, PSID pSid );
116static VOID (WINAPI *pBuildTrusteeWithNameA)( PTRUSTEEA pTrustee, LPSTR pName );
117static VOID (WINAPI *pBuildTrusteeWithObjectsAndNameA)( PTRUSTEEA pTrustee,
123static VOID (WINAPI *pBuildTrusteeWithObjectsAndSidA)( PTRUSTEEA pTrustee,
127 PSID pSid );
128static LPSTR (WINAPI *pGetTrusteeNameA)( PTRUSTEEA pTrustee );
129static DWORD (WINAPI *pRtlAdjustPrivilege)(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
132static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)(LPCWSTR,PUNICODE_STRING,PWSTR*,CURDIR*);
133
135static int myARGC;
136static char** myARGV;
137
138static const char* debugstr_sid(PSID sid)
139{
140 LPSTR sidstr;
141 DWORD le = GetLastError();
142 const char *res;
143
144 if (!ConvertSidToStringSidA(sid, &sidstr))
145 res = wine_dbg_sprintf("ConvertSidToStringSidA failed le=%lu", GetLastError());
146 else
147 {
148 res = __wine_dbg_strdup(sidstr);
149 LocalFree(sidstr);
150 }
151 /* Restore the last error in case ConvertSidToStringSidA() modified it */
152 SetLastError(le);
153 return res;
154}
155
156struct sidRef
157{
159 const char *refStr;
160};
161
162static void init(void)
163{
165
166 hntdll = GetModuleHandleA("ntdll.dll");
167 pNtAccessCheck = (void *)GetProcAddress( hntdll, "NtAccessCheck" );
168 pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(hntdll, "RtlDosPathNameToNtPathName_U");
169
170 hmod = GetModuleHandleA("advapi32.dll");
171 pAddMandatoryAce = (void *)GetProcAddress(hmod, "AddMandatoryAce");
172
174}
175
177{
178 /* use free(sd); when done */
179 DWORD ret, length, needed;
181
182 needed = 0xdeadbeef;
183 SetLastError(0xdeadbeef);
185 NULL, 0, &needed);
186 ok_(__FILE__, line)(!ret, "GetKernelObjectSecurity should fail\n");
187 ok_(__FILE__, line)(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
188 ok_(__FILE__, line)(needed != 0xdeadbeef, "GetKernelObjectSecurity should return required buffer length\n");
189
190 length = needed;
191 sd = malloc(length);
192
193 needed = 0xdeadbeef;
194 SetLastError(0xdeadbeef);
196 sd, length, &needed);
197 ok_(__FILE__, line)(ret, "GetKernelObjectSecurity error %ld\n", GetLastError());
198 ok_(__FILE__, line)(needed == length || needed == 0 /* file, pipe */, "GetKernelObjectSecurity should return %lu instead of %lu\n", length, needed);
199 return sd;
200}
201
203{
204 BOOL res;
205 SECURITY_DESCRIPTOR *queriedSD = NULL;
206 PSID owner;
207 BOOL owner_defaulted;
208
210
211 res = GetSecurityDescriptorOwner(queriedSD, &owner, &owner_defaulted);
212 ok_(__FILE__, line)(res, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
213
214#ifdef __REACTOS__
215 /* The call to EqualSid below crashes on WS03. */
217#endif
218 ok_(__FILE__, line)(EqualSid(owner, expected), "Owner SIDs are not equal %s != %s\n",
220 ok_(__FILE__, line)(!owner_defaulted, "Defaulted is true\n");
221
222 free(queriedSD);
223}
224
226{
227 BOOL res;
228 SECURITY_DESCRIPTOR *queriedSD = NULL;
229 PSID group;
230 BOOL group_defaulted;
231
233
234 res = GetSecurityDescriptorGroup(queriedSD, &group, &group_defaulted);
235 ok_(__FILE__, line)(res, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
236
237#ifdef __REACTOS__
238 /* The call to EqualSid below crashes on WS03. */
240#endif
241 ok_(__FILE__, line)(EqualSid(group, expected), "Group SIDs are not equal %s != %s\n",
243 ok_(__FILE__, line)(!group_defaulted, "Defaulted is true\n");
244
245 free(queriedSD);
246}
247
249{
250 struct sidRef refs[] = {
251 { { {0x00,0x00,0x33,0x44,0x55,0x66} }, "S-1-860116326-1" },
252 { { {0x00,0x00,0x01,0x02,0x03,0x04} }, "S-1-16909060-1" },
253 { { {0x00,0x00,0x00,0x01,0x02,0x03} }, "S-1-66051-1" },
254 { { {0x00,0x00,0x00,0x00,0x01,0x02} }, "S-1-258-1" },
255 { { {0x00,0x00,0x00,0x00,0x00,0x02} }, "S-1-2-1" },
256 { { {0x00,0x00,0x00,0x00,0x00,0x0c} }, "S-1-12-1" },
257 };
258 static const struct
259 {
260 const char *name;
261 const char *sid;
262 unsigned int optional;
263 }
264 str_to_sid_tests[] =
265 {
266 { "WD", "S-1-1-0" },
267 { "wD", "S-1-1-0" },
268 { "CO", "S-1-3-0" },
269 { "CG", "S-1-3-1" },
270 { "OW", "S-1-3-4", 1 }, /* Vista+ */
271 { "NU", "S-1-5-2" },
272 { "IU", "S-1-5-4" },
273 { "SU", "S-1-5-6" },
274 { "AN", "S-1-5-7" },
275 { "ED", "S-1-5-9" },
276 { "PS", "S-1-5-10" },
277 { "AU", "S-1-5-11" },
278 { "RC", "S-1-5-12" },
279 { "SY", "S-1-5-18" },
280 { "LS", "S-1-5-19" },
281 { "NS", "S-1-5-20" },
282 { "LA", "S-1-5-21-*-*-*-500" },
283 { "LG", "S-1-5-21-*-*-*-501" },
284 { "BO", "S-1-5-32-551" },
285 { "BA", "S-1-5-32-544" },
286 { "BU", "S-1-5-32-545" },
287 { "BG", "S-1-5-32-546" },
288 { "PU", "S-1-5-32-547" },
289 { "AO", "S-1-5-32-548" },
290 { "SO", "S-1-5-32-549" },
291 { "PO", "S-1-5-32-550" },
292 { "RE", "S-1-5-32-552" },
293 { "RU", "S-1-5-32-554" },
294 { "RD", "S-1-5-32-555" },
295 { "NO", "S-1-5-32-556" },
296 { "AC", "S-1-15-2-1", 1 }, /* Win8+ */
297 { "CA", "", 1 },
298 { "DA", "", 1 },
299 { "DC", "", 1 },
300 { "DD", "", 1 },
301 { "DG", "", 1 },
302 { "DU", "", 1 },
303 { "EA", "", 1 },
304 { "PA", "", 1 },
305 { "RS", "", 1 },
306 { "SA", "", 1 },
307#ifdef __REACTOS__
308 { "s-1-12-1", "S-1-12-1", 1 }, /* Crashes on ReactOS if not optional. ROSTESTS-418 */
309 { "S-0x1-0XC-0x1a", "S-1-12-26", 1 }, /* Crashes on ReactOS if not optional. ROSTESTS-418 */
310#else
311 { "s-1-12-1", "S-1-12-1" },
312 { "S-0x1-0XC-0x1a", "S-1-12-26" },
313#endif
314 };
315
316 const char noSubAuthStr[] = "S-1-5";
317 unsigned int i;
318 PSID psid = NULL;
319 SID *pisid;
320 BOOL r, ret;
321 LPSTR str = NULL;
322
324 ok( !r, "expected failure with NULL parameters\n" );
326 return;
328 "expected GetLastError() is ERROR_INVALID_PARAMETER, got %ld\n",
329 GetLastError() );
330
331 r = ConvertStringSidToSidA( refs[0].refStr, NULL );
333 "expected GetLastError() is ERROR_INVALID_PARAMETER, got %ld\n",
334 GetLastError() );
335
336 r = ConvertStringSidToSidA( NULL, &psid );
338 "expected GetLastError() is ERROR_INVALID_PARAMETER, got %ld\n",
339 GetLastError() );
340
341 r = ConvertStringSidToSidA( noSubAuthStr, &psid );
342 ok( !r,
343 "expected failure with no sub authorities\n" );
345 "expected GetLastError() is ERROR_INVALID_SID, got %ld\n",
346 GetLastError() );
347
348 r = ConvertStringSidToSidA( "WDandmorecharacters", &psid );
349 ok( !r,
350 "expected failure with too many characters\n" );
352 "expected GetLastError() is ERROR_INVALID_SID, got %ld\n",
353 GetLastError() );
354
355 r = ConvertStringSidToSidA( "WD)", &psid );
356 ok( !r,
357 "expected failure with too many characters\n" );
359 "expected GetLastError() is ERROR_INVALID_SID, got %ld\n",
360 GetLastError() );
361
362 ok(ConvertStringSidToSidA("S-1-5-21-93476-23408-4576", &psid), "ConvertStringSidToSidA failed\n");
363 pisid = psid;
364 ok(pisid->SubAuthorityCount == 4, "Invalid sub authority count - expected 4, got %d\n", pisid->SubAuthorityCount);
365 ok(pisid->SubAuthority[0] == 21, "Invalid subauthority 0 - expected 21, got %ld\n", pisid->SubAuthority[0]);
366 ok(pisid->SubAuthority[3] == 4576, "Invalid subauthority 0 - expected 4576, got %ld\n", pisid->SubAuthority[3]);
367 LocalFree(str);
368 LocalFree(psid);
369
370 for( i = 0; i < ARRAY_SIZE(refs); i++ )
371 {
372 r = AllocateAndInitializeSid( &refs[i].auth, 1,1,0,0,0,0,0,0,0,
373 &psid );
374 ok( r, "failed to allocate sid\n" );
375 r = ConvertSidToStringSidA( psid, &str );
376 ok( r, "failed to convert sid\n" );
377 if (r)
378 {
379 ok( !strcmp( str, refs[i].refStr ),
380 "incorrect sid, expected %s, got %s\n", refs[i].refStr, str );
381 LocalFree( str );
382 }
383 if( psid )
384 FreeSid( psid );
385
386 r = ConvertStringSidToSidA( refs[i].refStr, &psid );
387 ok( r, "failed to parse sid string\n" );
388 pisid = psid;
389 ok( pisid &&
390 !memcmp( pisid->IdentifierAuthority.Value, refs[i].auth.Value,
391 sizeof(refs[i].auth) ),
392 "string sid %s didn't parse to expected value\n"
393 "(got 0x%04x%08lx, expected 0x%04x%08lx)\n",
394 refs[i].refStr,
396 pisid->IdentifierAuthority.Value[0] ),
398 pisid->IdentifierAuthority.Value[4] ),
400 pisid->IdentifierAuthority.Value[2] ) ),
401 MAKEWORD( refs[i].auth.Value[1], refs[i].auth.Value[0] ),
402 MAKELONG( MAKEWORD( refs[i].auth.Value[5], refs[i].auth.Value[4] ),
403 MAKEWORD( refs[i].auth.Value[3], refs[i].auth.Value[2] ) ) );
404 if( psid )
405 LocalFree( psid );
406 }
407
408 for (i = 0; i < ARRAY_SIZE(str_to_sid_tests); i++)
409 {
410 char *str;
411
412 ret = ConvertStringSidToSidA(str_to_sid_tests[i].name, &psid);
413 if (!ret && str_to_sid_tests[i].optional)
414 {
415 skip("%u: failed to convert %s.\n", i, str_to_sid_tests[i].name);
416 continue;
417 }
418 ok(ret, "%u: failed to convert string to sid.\n", i);
419
420 if (str_to_sid_tests[i].optional || !strcmp(str_to_sid_tests[i].name, "LA") ||
421 !strcmp(str_to_sid_tests[i].name, "LG"))
422 {
423 LocalFree(psid);
424 continue;
425 }
426
428 ok(ret, "%u: failed to convert SID to string.\n", i);
429 ok(!strcmp(str, str_to_sid_tests[i].sid), "%u: unexpected sid %s.\n", i, str);
430 LocalFree(psid);
431 LocalFree(str);
432 }
433}
434
435static void test_trustee(void)
436{
437 GUID ObjectType = {0x12345678, 0x1234, 0x5678, {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}};
438 GUID InheritedObjectType = {0x23456789, 0x2345, 0x6786, {0x2, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99}};
439 GUID ZeroGuid;
441 OBJECTS_AND_SID oas;
442 TRUSTEEA trustee;
443 PSID psid;
444 char szObjectTypeName[] = "ObjectTypeName";
445 char szInheritedObjectTypeName[] = "InheritedObjectTypeName";
446 char szTrusteeName[] = "szTrusteeName";
447 SID_IDENTIFIER_AUTHORITY auth = { {0x11,0x22,0,0,0, 0} };
448
449 memset( &ZeroGuid, 0x00, sizeof (ZeroGuid) );
450
451 pBuildTrusteeWithSidA = (void *)GetProcAddress( hmod, "BuildTrusteeWithSidA" );
452 pBuildTrusteeWithNameA = (void *)GetProcAddress( hmod, "BuildTrusteeWithNameA" );
453 pBuildTrusteeWithObjectsAndNameA = (void *)GetProcAddress (hmod, "BuildTrusteeWithObjectsAndNameA" );
454 pBuildTrusteeWithObjectsAndSidA = (void *)GetProcAddress (hmod, "BuildTrusteeWithObjectsAndSidA" );
455 pGetTrusteeNameA = (void *)GetProcAddress (hmod, "GetTrusteeNameA" );
456 if( !pBuildTrusteeWithSidA || !pBuildTrusteeWithNameA ||
457 !pBuildTrusteeWithObjectsAndNameA || !pBuildTrusteeWithObjectsAndSidA ||
458 !pGetTrusteeNameA )
459 return;
460
461 if ( ! AllocateAndInitializeSid( &auth, 1, 42, 0,0,0,0,0,0,0,&psid ) )
462 {
463 trace( "failed to init SID\n" );
464 return;
465 }
466
467 /* test BuildTrusteeWithSidA */
468 memset( &trustee, 0xff, sizeof trustee );
469 pBuildTrusteeWithSidA( &trustee, psid );
470
471 ok( trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
473 "MultipleTrusteeOperation wrong\n");
474 ok( trustee.TrusteeForm == TRUSTEE_IS_SID, "TrusteeForm wrong\n");
475 ok( trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
476 ok( trustee.ptstrName == psid, "ptstrName wrong\n" );
477
478 /* test BuildTrusteeWithObjectsAndSidA (test 1) */
479 memset( &trustee, 0xff, sizeof trustee );
480 memset( &oas, 0xff, sizeof(oas) );
481 pBuildTrusteeWithObjectsAndSidA(&trustee, &oas, &ObjectType,
482 &InheritedObjectType, psid);
483
484 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
485 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
486 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_SID, "TrusteeForm wrong\n");
487 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
488 ok(trustee.ptstrName == (LPSTR)&oas, "ptstrName wrong\n");
489
491 ok(!memcmp(&oas.ObjectTypeGuid, &ObjectType, sizeof(GUID)), "ObjectTypeGuid wrong\n");
492 ok(!memcmp(&oas.InheritedObjectTypeGuid, &InheritedObjectType, sizeof(GUID)), "InheritedObjectTypeGuid wrong\n");
493 ok(oas.pSid == psid, "pSid wrong\n");
494
495 /* test GetTrusteeNameA */
496 ok(pGetTrusteeNameA(&trustee) == (LPSTR)&oas, "GetTrusteeName returned wrong value\n");
497
498 /* test BuildTrusteeWithObjectsAndSidA (test 2) */
499 memset( &trustee, 0xff, sizeof trustee );
500 memset( &oas, 0xff, sizeof(oas) );
501 pBuildTrusteeWithObjectsAndSidA(&trustee, &oas, NULL,
502 &InheritedObjectType, psid);
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_SID, "TrusteeForm wrong\n");
507 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
508 ok(trustee.ptstrName == (LPSTR)&oas, "ptstrName wrong\n");
509
510 ok(oas.ObjectsPresent == ACE_INHERITED_OBJECT_TYPE_PRESENT, "ObjectsPresent wrong\n");
511 ok(!memcmp(&oas.ObjectTypeGuid, &ZeroGuid, sizeof(GUID)), "ObjectTypeGuid wrong\n");
512 ok(!memcmp(&oas.InheritedObjectTypeGuid, &InheritedObjectType, sizeof(GUID)), "InheritedObjectTypeGuid wrong\n");
513 ok(oas.pSid == psid, "pSid wrong\n");
514
515 FreeSid( psid );
516
517 /* test BuildTrusteeWithNameA */
518 memset( &trustee, 0xff, sizeof trustee );
519 pBuildTrusteeWithNameA( &trustee, szTrusteeName );
520
521 ok( trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
523 "MultipleTrusteeOperation wrong\n");
524 ok( trustee.TrusteeForm == TRUSTEE_IS_NAME, "TrusteeForm wrong\n");
525 ok( trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
526 ok( trustee.ptstrName == szTrusteeName, "ptstrName wrong\n" );
527
528 /* test BuildTrusteeWithObjectsAndNameA (test 1) */
529 memset( &trustee, 0xff, sizeof trustee );
530 memset( &oan, 0xff, sizeof(oan) );
531 pBuildTrusteeWithObjectsAndNameA(&trustee, &oan, SE_KERNEL_OBJECT, szObjectTypeName,
532 szInheritedObjectTypeName, szTrusteeName);
533
534 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
535 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
536 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_NAME, "TrusteeForm wrong\n");
537 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
538 ok(trustee.ptstrName == (LPSTR)&oan, "ptstrName wrong\n");
539
541 ok(oan.ObjectType == SE_KERNEL_OBJECT, "ObjectType wrong\n");
542 ok(oan.InheritedObjectTypeName == szInheritedObjectTypeName, "InheritedObjectTypeName wrong\n");
543 ok(oan.ptstrName == szTrusteeName, "szTrusteeName wrong\n");
544
545 /* test GetTrusteeNameA */
546 ok(pGetTrusteeNameA(&trustee) == (LPSTR)&oan, "GetTrusteeName returned wrong value\n");
547
548 /* test BuildTrusteeWithObjectsAndNameA (test 2) */
549 memset( &trustee, 0xff, sizeof trustee );
550 memset( &oan, 0xff, sizeof(oan) );
551 pBuildTrusteeWithObjectsAndNameA(&trustee, &oan, SE_KERNEL_OBJECT, NULL,
552 szInheritedObjectTypeName, szTrusteeName);
553
554 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
555 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
556 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_NAME, "TrusteeForm wrong\n");
557 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
558 ok(trustee.ptstrName == (LPSTR)&oan, "ptstrName wrong\n");
559
560 ok(oan.ObjectsPresent == ACE_INHERITED_OBJECT_TYPE_PRESENT, "ObjectsPresent wrong\n");
561 ok(oan.ObjectType == SE_KERNEL_OBJECT, "ObjectType wrong\n");
562 ok(oan.InheritedObjectTypeName == szInheritedObjectTypeName, "InheritedObjectTypeName wrong\n");
563 ok(oan.ptstrName == szTrusteeName, "szTrusteeName wrong\n");
564
565 /* test BuildTrusteeWithObjectsAndNameA (test 3) */
566 memset( &trustee, 0xff, sizeof trustee );
567 memset( &oan, 0xff, sizeof(oan) );
568 pBuildTrusteeWithObjectsAndNameA(&trustee, &oan, SE_KERNEL_OBJECT, szObjectTypeName,
569 NULL, szTrusteeName);
570
571 ok(trustee.pMultipleTrustee == NULL, "pMultipleTrustee wrong\n");
572 ok(trustee.MultipleTrusteeOperation == NO_MULTIPLE_TRUSTEE, "MultipleTrusteeOperation wrong\n");
573 ok(trustee.TrusteeForm == TRUSTEE_IS_OBJECTS_AND_NAME, "TrusteeForm wrong\n");
574 ok(trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n");
575 ok(trustee.ptstrName == (LPSTR)&oan, "ptstrName wrong\n");
576
577 ok(oan.ObjectsPresent == ACE_OBJECT_TYPE_PRESENT, "ObjectsPresent wrong\n");
578 ok(oan.ObjectType == SE_KERNEL_OBJECT, "ObjectType wrong\n");
579 ok(oan.InheritedObjectTypeName == NULL, "InheritedObjectTypeName wrong\n");
580 ok(oan.ptstrName == szTrusteeName, "szTrusteeName wrong\n");
581}
582
583/* If the first isn't defined, assume none is */
584#ifndef SE_MIN_WELL_KNOWN_PRIVILEGE
585#define SE_MIN_WELL_KNOWN_PRIVILEGE 2L
586#define SE_CREATE_TOKEN_PRIVILEGE 2L
587#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3L
588#define SE_LOCK_MEMORY_PRIVILEGE 4L
589#define SE_INCREASE_QUOTA_PRIVILEGE 5L
590#define SE_MACHINE_ACCOUNT_PRIVILEGE 6L
591#define SE_TCB_PRIVILEGE 7L
592#define SE_SECURITY_PRIVILEGE 8L
593#define SE_TAKE_OWNERSHIP_PRIVILEGE 9L
594#define SE_LOAD_DRIVER_PRIVILEGE 10L
595#define SE_SYSTEM_PROFILE_PRIVILEGE 11L
596#define SE_SYSTEMTIME_PRIVILEGE 12L
597#define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13L
598#define SE_INC_BASE_PRIORITY_PRIVILEGE 14L
599#define SE_CREATE_PAGEFILE_PRIVILEGE 15L
600#define SE_CREATE_PERMANENT_PRIVILEGE 16L
601#define SE_BACKUP_PRIVILEGE 17L
602#define SE_RESTORE_PRIVILEGE 18L
603#define SE_SHUTDOWN_PRIVILEGE 19L
604#define SE_DEBUG_PRIVILEGE 20L
605#define SE_AUDIT_PRIVILEGE 21L
606#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22L
607#define SE_CHANGE_NOTIFY_PRIVILEGE 23L
608#define SE_REMOTE_SHUTDOWN_PRIVILEGE 24L
609#define SE_UNDOCK_PRIVILEGE 25L
610#define SE_SYNC_AGENT_PRIVILEGE 26L
611#define SE_ENABLE_DELEGATION_PRIVILEGE 27L
612#define SE_MANAGE_VOLUME_PRIVILEGE 28L
613#define SE_IMPERSONATE_PRIVILEGE 29L
614#define SE_CREATE_GLOBAL_PRIVILEGE 30L
615#define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE
616#endif /* ndef SE_MIN_WELL_KNOWN_PRIVILEGE */
617
618static void test_allocateLuid(void)
619{
620 BOOL (WINAPI *pAllocateLocallyUniqueId)(PLUID);
621 LUID luid1, luid2;
622 BOOL ret;
623
624 pAllocateLocallyUniqueId = (void*)GetProcAddress(hmod, "AllocateLocallyUniqueId");
625 if (!pAllocateLocallyUniqueId) return;
626
627 ret = pAllocateLocallyUniqueId(&luid1);
629 return;
630
631 ok(ret,
632 "AllocateLocallyUniqueId failed: %ld\n", GetLastError());
633 ret = pAllocateLocallyUniqueId(&luid2);
634 ok( ret,
635 "AllocateLocallyUniqueId failed: %ld\n", GetLastError());
636 ok(luid1.LowPart > SE_MAX_WELL_KNOWN_PRIVILEGE || luid1.HighPart != 0,
637 "AllocateLocallyUniqueId returned a well-known LUID\n");
638 ok(luid1.LowPart != luid2.LowPart || luid1.HighPart != luid2.HighPart,
639 "AllocateLocallyUniqueId returned non-unique LUIDs\n");
640 ret = pAllocateLocallyUniqueId(NULL);
642 "AllocateLocallyUniqueId(NULL) didn't return ERROR_NOACCESS: %ld\n",
643 GetLastError());
644}
645
647{
648 BOOL (WINAPI *pLookupPrivilegeNameA)(LPCSTR, PLUID, LPSTR, LPDWORD);
649 char buf[MAX_PATH]; /* arbitrary, seems long enough */
650 DWORD cchName = sizeof(buf);
651 LUID luid = { 0, 0 };
652 LONG i;
653 BOOL ret;
654
655 /* check whether it's available first */
656 pLookupPrivilegeNameA = (void*)GetProcAddress(hmod, "LookupPrivilegeNameA");
657 if (!pLookupPrivilegeNameA) return;
659 ret = pLookupPrivilegeNameA(NULL, &luid, buf, &cchName);
661 return;
662
663 /* check with a short buffer */
664 cchName = 0;
666 ret = pLookupPrivilegeNameA(NULL, &luid, NULL, &cchName);
668 "LookupPrivilegeNameA didn't fail with ERROR_INSUFFICIENT_BUFFER: %ld\n",
669 GetLastError());
670 ok(cchName == strlen("SeCreateTokenPrivilege") + 1,
671 "LookupPrivilegeNameA returned an incorrect required length for\n"
672 "SeCreateTokenPrivilege (got %ld, expected %d)\n", cchName,
673 lstrlenA("SeCreateTokenPrivilege") + 1);
674 /* check a known value and its returned length on success */
675 cchName = sizeof(buf);
676 ok(pLookupPrivilegeNameA(NULL, &luid, buf, &cchName) &&
677 cchName == strlen("SeCreateTokenPrivilege"),
678 "LookupPrivilegeNameA returned an incorrect output length for\n"
679 "SeCreateTokenPrivilege (got %ld, expected %d)\n", cchName,
680 (int)strlen("SeCreateTokenPrivilege"));
681 /* check known values */
683 {
684 luid.LowPart = i;
685 cchName = sizeof(buf);
686 ret = pLookupPrivilegeNameA(NULL, &luid, buf, &cchName);
688 "LookupPrivilegeNameA(0.%ld) failed: %ld\n", i, GetLastError());
689 }
690 /* check a bogus LUID */
691 luid.LowPart = 0xdeadbeef;
692 cchName = sizeof(buf);
693 ret = pLookupPrivilegeNameA(NULL, &luid, buf, &cchName);
695 "LookupPrivilegeNameA didn't fail with ERROR_NO_SUCH_PRIVILEGE: %ld\n",
696 GetLastError());
697 /* check on a bogus system */
699 cchName = sizeof(buf);
700 ret = pLookupPrivilegeNameA("b0gu5.Nam3", &luid, buf, &cchName);
702 GetLastError() == RPC_S_INVALID_NET_ADDR) /* w2k8 */,
703 "LookupPrivilegeNameA didn't fail with RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR: %ld\n",
704 GetLastError());
705}
706
708{
709 const char *name;
711};
712
714{
715 static const struct NameToLUID privs[] = {
716 { "SeCreateTokenPrivilege", SE_CREATE_TOKEN_PRIVILEGE },
717 { "SeAssignPrimaryTokenPrivilege", SE_ASSIGNPRIMARYTOKEN_PRIVILEGE },
718 { "SeLockMemoryPrivilege", SE_LOCK_MEMORY_PRIVILEGE },
719 { "SeIncreaseQuotaPrivilege", SE_INCREASE_QUOTA_PRIVILEGE },
720 { "SeMachineAccountPrivilege", SE_MACHINE_ACCOUNT_PRIVILEGE },
721 { "SeTcbPrivilege", SE_TCB_PRIVILEGE },
722 { "SeSecurityPrivilege", SE_SECURITY_PRIVILEGE },
723 { "SeTakeOwnershipPrivilege", SE_TAKE_OWNERSHIP_PRIVILEGE },
724 { "SeLoadDriverPrivilege", SE_LOAD_DRIVER_PRIVILEGE },
725 { "SeSystemProfilePrivilege", SE_SYSTEM_PROFILE_PRIVILEGE },
726 { "SeSystemtimePrivilege", SE_SYSTEMTIME_PRIVILEGE },
727 { "SeProfileSingleProcessPrivilege", SE_PROF_SINGLE_PROCESS_PRIVILEGE },
728 { "SeIncreaseBasePriorityPrivilege", SE_INC_BASE_PRIORITY_PRIVILEGE },
729 { "SeCreatePagefilePrivilege", SE_CREATE_PAGEFILE_PRIVILEGE },
730 { "SeCreatePermanentPrivilege", SE_CREATE_PERMANENT_PRIVILEGE },
731 { "SeBackupPrivilege", SE_BACKUP_PRIVILEGE },
732 { "SeRestorePrivilege", SE_RESTORE_PRIVILEGE },
733 { "SeShutdownPrivilege", SE_SHUTDOWN_PRIVILEGE },
734 { "SeDebugPrivilege", SE_DEBUG_PRIVILEGE },
735 { "SeAuditPrivilege", SE_AUDIT_PRIVILEGE },
736 { "SeSystemEnvironmentPrivilege", SE_SYSTEM_ENVIRONMENT_PRIVILEGE },
737 { "SeChangeNotifyPrivilege", SE_CHANGE_NOTIFY_PRIVILEGE },
738 { "SeRemoteShutdownPrivilege", SE_REMOTE_SHUTDOWN_PRIVILEGE },
739 { "SeUndockPrivilege", SE_UNDOCK_PRIVILEGE },
740 { "SeSyncAgentPrivilege", SE_SYNC_AGENT_PRIVILEGE },
741 { "SeEnableDelegationPrivilege", SE_ENABLE_DELEGATION_PRIVILEGE },
742 { "SeManageVolumePrivilege", SE_MANAGE_VOLUME_PRIVILEGE },
743 { "SeImpersonatePrivilege", SE_IMPERSONATE_PRIVILEGE },
744 { "SeCreateGlobalPrivilege", SE_CREATE_GLOBAL_PRIVILEGE },
745 };
746 BOOL (WINAPI *pLookupPrivilegeValueA)(LPCSTR, LPCSTR, PLUID);
747 unsigned int i;
748 LUID luid;
749 BOOL ret;
750
751 /* check whether it's available first */
752 pLookupPrivilegeValueA = (void*)GetProcAddress(hmod, "LookupPrivilegeValueA");
753 if (!pLookupPrivilegeValueA) return;
754 ret = pLookupPrivilegeValueA(NULL, "SeCreateTokenPrivilege", &luid);
756 return;
757
758 /* check a bogus system name */
759 ret = pLookupPrivilegeValueA("b0gu5.Nam3", "SeCreateTokenPrivilege", &luid);
761 GetLastError() == RPC_S_INVALID_NET_ADDR) /* w2k8 */,
762 "LookupPrivilegeValueA didn't fail with RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR: %ld\n",
763 GetLastError());
764 /* check a NULL string */
765 ret = pLookupPrivilegeValueA(NULL, 0, &luid);
767 "LookupPrivilegeValueA didn't fail with ERROR_NO_SUCH_PRIVILEGE: %ld\n",
768 GetLastError());
769 /* check a bogus privilege name */
770 ret = pLookupPrivilegeValueA(NULL, "SeBogusPrivilege", &luid);
772 "LookupPrivilegeValueA didn't fail with ERROR_NO_SUCH_PRIVILEGE: %ld\n",
773 GetLastError());
774 /* check case insensitive */
775 ret = pLookupPrivilegeValueA(NULL, "sEcREATEtOKENpRIVILEGE", &luid);
776 ok( ret,
777 "LookupPrivilegeValueA(NULL, sEcREATEtOKENpRIVILEGE, &luid) failed: %ld\n",
778 GetLastError());
779 for (i = 0; i < ARRAY_SIZE(privs); i++)
780 {
781 /* Not all privileges are implemented on all Windows versions, so
782 * don't worry if the call fails
783 */
784 if (pLookupPrivilegeValueA(NULL, privs[i].name, &luid))
785 {
786 ok(luid.LowPart == privs[i].lowPart,
787 "LookupPrivilegeValueA returned an invalid LUID for %s\n",
788 privs[i].name);
789 }
790 }
791}
792
793static void test_FileSecurity(void)
794{
795 char wintmpdir [MAX_PATH];
796 char path [MAX_PATH];
797 char file [MAX_PATH];
798 HANDLE fh, token;
799 DWORD sdSize, retSize, rc, granted, priv_set_len;
800 PRIVILEGE_SET priv_set;
801 BOOL status;
802 BYTE *sd;
807
808 if (!GetTempPathA (sizeof (wintmpdir), wintmpdir)) {
809 win_skip ("GetTempPathA failed\n");
810 return;
811 }
812
813 /* Create a temporary directory and in it a temporary file */
814 strcat (strcpy (path, wintmpdir), "rary");
815 SetLastError(0xdeadbeef);
816 rc = CreateDirectoryA (path, NULL);
817 ok (rc || GetLastError() == ERROR_ALREADY_EXISTS, "CreateDirectoryA "
818 "failed for '%s' with %ld\n", path, GetLastError());
819
820 strcat (strcpy (file, path), "\\ess");
821 SetLastError(0xdeadbeef);
823 ok (fh != INVALID_HANDLE_VALUE, "CreateFileA "
824 "failed for '%s' with %ld\n", file, GetLastError());
825 CloseHandle (fh);
826
827 /* For the temporary file ... */
828
829 /* Get size needed */
830 retSize = 0;
831 SetLastError(0xdeadbeef);
832 rc = GetFileSecurityA (file, request, NULL, 0, &retSize);
833 if (!rc && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) {
834 win_skip("GetFileSecurityA is not implemented\n");
835 goto cleanup;
836 }
837 ok (!rc, "GetFileSecurityA "
838 "was expected to fail for '%s'\n", file);
839 ok (GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetFileSecurityA "
840 "returned %ld; expected ERROR_INSUFFICIENT_BUFFER\n", GetLastError());
841 ok (retSize > sizeof (SECURITY_DESCRIPTOR), "GetFileSecurityA returned size %ld\n", retSize);
842
843 sdSize = retSize;
844 sd = malloc(sdSize);
845
846 /* Get security descriptor for real */
847 retSize = -1;
848 SetLastError(0xdeadbeef);
849 rc = GetFileSecurityA (file, request, sd, sdSize, &retSize);
850 ok (rc, "GetFileSecurityA "
851 "was not expected to fail '%s': %ld\n", file, GetLastError());
852 ok (retSize == sdSize,
853 "GetFileSecurityA returned size %ld; expected %ld\n", retSize, sdSize);
854
855 /* Use it to set security descriptor */
856 SetLastError(0xdeadbeef);
858 ok (rc, "SetFileSecurityA "
859 "was not expected to fail '%s': %ld\n", file, GetLastError());
860
861 free(sd);
862
863 /* Repeat for the temporary directory ... */
864
865 /* Get size needed */
866 retSize = 0;
867 SetLastError(0xdeadbeef);
868 rc = GetFileSecurityA (path, request, NULL, 0, &retSize);
869 ok (!rc, "GetFileSecurityA "
870 "was expected to fail for '%s'\n", path);
871 ok (GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetFileSecurityA "
872 "returned %ld; expected ERROR_INSUFFICIENT_BUFFER\n", GetLastError());
873 ok (retSize > sizeof (SECURITY_DESCRIPTOR), "GetFileSecurityA returned size %ld\n", retSize);
874
875 sdSize = retSize;
876 sd = malloc(sdSize);
877
878 /* Get security descriptor for real */
879 retSize = -1;
880 SetLastError(0xdeadbeef);
881 rc = GetFileSecurityA (path, request, sd, sdSize, &retSize);
882 ok (rc, "GetFileSecurityA "
883 "was not expected to fail '%s': %ld\n", path, GetLastError());
884 ok (retSize == sdSize,
885 "GetFileSecurityA returned size %ld; expected %ld\n", retSize, sdSize);
886
887 /* Use it to set security descriptor */
888 SetLastError(0xdeadbeef);
890 ok (rc, "SetFileSecurityA "
891 "was not expected to fail '%s': %ld\n", path, GetLastError());
892 free(sd);
893
894 /* Old test */
895 strcpy (wintmpdir, "\\Should not exist");
896 SetLastError(0xdeadbeef);
897 rc = GetFileSecurityA (wintmpdir, OWNER_SECURITY_INFORMATION, NULL, 0, &sdSize);
898 ok (!rc, "GetFileSecurityA should fail for not existing directories/files\n");
900 "last error ERROR_FILE_NOT_FOUND expected, got %ld\n", GetLastError());
901
902cleanup:
903 /* Remove temporary file and directory */
906
907 /* Test file access permissions for a file with FILE_ATTRIBUTE_ARCHIVE */
908 SetLastError(0xdeadbeef);
909 rc = GetTempPathA(sizeof(wintmpdir), wintmpdir);
910 ok(rc, "GetTempPath error %ld\n", GetLastError());
911
912 SetLastError(0xdeadbeef);
913 rc = GetTempFileNameA(wintmpdir, "tmp", 0, file);
914 ok(rc, "GetTempFileName error %ld\n", GetLastError());
915
918 ok(rc == FILE_ATTRIBUTE_ARCHIVE, "expected FILE_ATTRIBUTE_ARCHIVE got %#lx\n", rc);
919
921 NULL, 0, &sdSize);
922 ok(!rc, "GetFileSecurity should fail\n");
924 "expected ERROR_INSUFFICIENT_BUFFER got %ld\n", GetLastError());
925 ok(sdSize > sizeof(SECURITY_DESCRIPTOR), "got sd size %ld\n", sdSize);
926
927 sd = malloc(sdSize);
928 retSize = 0xdeadbeef;
929 SetLastError(0xdeadbeef);
931 sd, sdSize, &retSize);
932 ok(rc, "GetFileSecurity error %ld\n", GetLastError());
933 ok(retSize == sdSize, "expected %ld, got %ld\n", sdSize, retSize);
934
935 SetLastError(0xdeadbeef);
937 ok(!rc, "OpenThreadToken should fail\n");
938 ok(GetLastError() == ERROR_NO_TOKEN, "expected ERROR_NO_TOKEN, got %ld\n", GetLastError());
939
940 SetLastError(0xdeadbeef);
942 ok(rc, "ImpersonateSelf error %ld\n", GetLastError());
943
944 SetLastError(0xdeadbeef);
946 ok(rc, "OpenThreadToken error %ld\n", GetLastError());
947
948 SetLastError(0xdeadbeef);
949 rc = RevertToSelf();
950 ok(rc, "RevertToSelf error %ld\n", GetLastError());
951
952 priv_set_len = sizeof(priv_set);
953 granted = 0xdeadbeef;
954 status = 0xdeadbeef;
955 SetLastError(0xdeadbeef);
956 rc = AccessCheck(sd, token, FILE_READ_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
957 ok(rc, "AccessCheck error %ld\n", GetLastError());
958 ok(status == 1, "expected 1, got %d\n", status);
959 ok(granted == FILE_READ_DATA, "expected FILE_READ_DATA, got %#lx\n", granted);
960
961 granted = 0xdeadbeef;
962 status = 0xdeadbeef;
963 SetLastError(0xdeadbeef);
964 rc = AccessCheck(sd, token, FILE_WRITE_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
965 ok(rc, "AccessCheck error %ld\n", GetLastError());
966 ok(status == 1, "expected 1, got %d\n", status);
967 ok(granted == FILE_WRITE_DATA, "expected FILE_WRITE_DATA, got %#lx\n", granted);
968
969 granted = 0xdeadbeef;
970 status = 0xdeadbeef;
971 SetLastError(0xdeadbeef);
972 rc = AccessCheck(sd, token, FILE_EXECUTE, &mapping, &priv_set, &priv_set_len, &granted, &status);
973 ok(rc, "AccessCheck error %ld\n", GetLastError());
974 ok(status == 1, "expected 1, got %d\n", status);
975 ok(granted == FILE_EXECUTE, "expected FILE_EXECUTE, got %#lx\n", granted);
976
977 granted = 0xdeadbeef;
978 status = 0xdeadbeef;
979 SetLastError(0xdeadbeef);
980 rc = AccessCheck(sd, token, DELETE, &mapping, &priv_set, &priv_set_len, &granted, &status);
981 ok(rc, "AccessCheck error %ld\n", GetLastError());
982 ok(status == 1, "expected 1, got %d\n", status);
983 ok(granted == DELETE, "expected DELETE, got %#lx\n", granted);
984
985 granted = 0xdeadbeef;
986 status = 0xdeadbeef;
987 SetLastError(0xdeadbeef);
988 rc = AccessCheck(sd, token, FILE_DELETE_CHILD, &mapping, &priv_set, &priv_set_len, &granted, &status);
989 ok(rc, "AccessCheck error %ld\n", GetLastError());
990 ok(status == 1, "expected 1, got %d\n", status);
991 ok(granted == FILE_DELETE_CHILD, "expected FILE_DELETE_CHILD, got %#lx\n", granted);
992
993 granted = 0xdeadbeef;
994 status = 0xdeadbeef;
995 SetLastError(0xdeadbeef);
996 rc = AccessCheck(sd, token, 0x1ff, &mapping, &priv_set, &priv_set_len, &granted, &status);
997 ok(rc, "AccessCheck error %ld\n", GetLastError());
998 ok(status == 1, "expected 1, got %d\n", status);
999 ok(granted == 0x1ff, "expected 0x1ff, got %#lx\n", granted);
1000
1001 granted = 0xdeadbeef;
1002 status = 0xdeadbeef;
1003 SetLastError(0xdeadbeef);
1004 rc = AccessCheck(sd, token, FILE_ALL_ACCESS, &mapping, &priv_set, &priv_set_len, &granted, &status);
1005 ok(rc, "AccessCheck error %ld\n", GetLastError());
1006 ok(status == 1, "expected 1, got %d\n", status);
1007 ok(granted == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", granted);
1008
1009 SetLastError(0xdeadbeef);
1010 rc = AccessCheck(sd, token, 0xffffffff, &mapping, &priv_set, &priv_set_len, &granted, &status);
1011 ok(!rc, "AccessCheck should fail\n");
1012 ok(GetLastError() == ERROR_GENERIC_NOT_MAPPED, "expected ERROR_GENERIC_NOT_MAPPED, got %ld\n", GetLastError());
1013
1014 /* Test file access permissions for a file with FILE_ATTRIBUTE_READONLY */
1015 SetLastError(0xdeadbeef);
1017 ok(fh != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
1018 retSize = 0xdeadbeef;
1019 SetLastError(0xdeadbeef);
1020 rc = WriteFile(fh, "1", 1, &retSize, NULL);
1021 ok(!rc, "WriteFile should fail\n");
1022 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
1023 ok(retSize == 0, "expected 0, got %ld\n", retSize);
1024 CloseHandle(fh);
1025
1028 todo_wine
1030 "expected FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY got %#lx\n", rc);
1031
1032 SetLastError(0xdeadbeef);
1034 ok(rc, "SetFileAttributes error %ld\n", GetLastError());
1035 SetLastError(0xdeadbeef);
1036 rc = DeleteFileA(file);
1037 ok(rc, "DeleteFile error %ld\n", GetLastError());
1038
1039 SetLastError(0xdeadbeef);
1041 ok(fh != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
1042 retSize = 0xdeadbeef;
1043 SetLastError(0xdeadbeef);
1044 rc = WriteFile(fh, "1", 1, &retSize, NULL);
1045 ok(!rc, "WriteFile should fail\n");
1046 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
1047 ok(retSize == 0, "expected 0, got %ld\n", retSize);
1048 CloseHandle(fh);
1049
1053 "expected FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_READONLY got %#lx\n", rc);
1054
1055 retSize = 0xdeadbeef;
1056 SetLastError(0xdeadbeef);
1058 sd, sdSize, &retSize);
1059 ok(rc, "GetFileSecurity error %ld\n", GetLastError());
1060 ok(retSize == sdSize, "expected %ld, got %ld\n", sdSize, retSize);
1061
1062 priv_set_len = sizeof(priv_set);
1063 granted = 0xdeadbeef;
1064 status = 0xdeadbeef;
1065 SetLastError(0xdeadbeef);
1066 rc = AccessCheck(sd, token, FILE_READ_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
1067 ok(rc, "AccessCheck error %ld\n", GetLastError());
1068 ok(status == 1, "expected 1, got %d\n", status);
1069 ok(granted == FILE_READ_DATA, "expected FILE_READ_DATA, got %#lx\n", granted);
1070
1071 granted = 0xdeadbeef;
1072 status = 0xdeadbeef;
1073 SetLastError(0xdeadbeef);
1074 rc = AccessCheck(sd, token, FILE_WRITE_DATA, &mapping, &priv_set, &priv_set_len, &granted, &status);
1075 ok(rc, "AccessCheck error %ld\n", GetLastError());
1076todo_wine {
1077 ok(status == 1, "expected 1, got %d\n", status);
1078 ok(granted == FILE_WRITE_DATA, "expected FILE_WRITE_DATA, got %#lx\n", granted);
1079}
1080 granted = 0xdeadbeef;
1081 status = 0xdeadbeef;
1082 SetLastError(0xdeadbeef);
1083 rc = AccessCheck(sd, token, FILE_EXECUTE, &mapping, &priv_set, &priv_set_len, &granted, &status);
1084 ok(rc, "AccessCheck error %ld\n", GetLastError());
1085 ok(status == 1, "expected 1, got %d\n", status);
1086 ok(granted == FILE_EXECUTE, "expected FILE_EXECUTE, got %#lx\n", granted);
1087
1088 granted = 0xdeadbeef;
1089 status = 0xdeadbeef;
1090 SetLastError(0xdeadbeef);
1091 rc = AccessCheck(sd, token, DELETE, &mapping, &priv_set, &priv_set_len, &granted, &status);
1092 ok(rc, "AccessCheck error %ld\n", GetLastError());
1093 ok(status == 1, "expected 1, got %d\n", status);
1094 ok(granted == DELETE, "expected DELETE, got %#lx\n", granted);
1095
1096 granted = 0xdeadbeef;
1097 status = 0xdeadbeef;
1098 SetLastError(0xdeadbeef);
1099 rc = AccessCheck(sd, token, WRITE_OWNER, &mapping, &priv_set, &priv_set_len, &granted, &status);
1100 ok(rc, "AccessCheck error %ld\n", GetLastError());
1101 ok(status == 1, "expected 1, got %d\n", status);
1102 ok(granted == WRITE_OWNER, "expected WRITE_OWNER, got %#lx\n", granted);
1103
1104 granted = 0xdeadbeef;
1105 status = 0xdeadbeef;
1106 SetLastError(0xdeadbeef);
1107 rc = AccessCheck(sd, token, SYNCHRONIZE, &mapping, &priv_set, &priv_set_len, &granted, &status);
1108 ok(rc, "AccessCheck error %ld\n", GetLastError());
1109 ok(status == 1, "expected 1, got %d\n", status);
1110 ok(granted == SYNCHRONIZE, "expected SYNCHRONIZE, got %#lx\n", granted);
1111
1112 granted = 0xdeadbeef;
1113 status = 0xdeadbeef;
1114 SetLastError(0xdeadbeef);
1115 rc = AccessCheck(sd, token, FILE_DELETE_CHILD, &mapping, &priv_set, &priv_set_len, &granted, &status);
1116 ok(rc, "AccessCheck error %ld\n", GetLastError());
1117todo_wine {
1118 ok(status == 1, "expected 1, got %d\n", status);
1119 ok(granted == FILE_DELETE_CHILD, "expected FILE_DELETE_CHILD, got %#lx\n", granted);
1120}
1121 granted = 0xdeadbeef;
1122 status = 0xdeadbeef;
1123 SetLastError(0xdeadbeef);
1124 rc = AccessCheck(sd, token, 0x1ff, &mapping, &priv_set, &priv_set_len, &granted, &status);
1125 ok(rc, "AccessCheck error %ld\n", GetLastError());
1126todo_wine {
1127 ok(status == 1, "expected 1, got %d\n", status);
1128 ok(granted == 0x1ff, "expected 0x1ff, got %#lx\n", granted);
1129}
1130 granted = 0xdeadbeef;
1131 status = 0xdeadbeef;
1132 SetLastError(0xdeadbeef);
1133 rc = AccessCheck(sd, token, FILE_ALL_ACCESS, &mapping, &priv_set, &priv_set_len, &granted, &status);
1134 ok(rc, "AccessCheck error %ld\n", GetLastError());
1135todo_wine {
1136 ok(status == 1, "expected 1, got %d\n", status);
1137 ok(granted == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", granted);
1138}
1139 SetLastError(0xdeadbeef);
1140 rc = DeleteFileA(file);
1141 ok(!rc, "DeleteFile should fail\n");
1142 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
1143 SetLastError(0xdeadbeef);
1145 ok(rc, "SetFileAttributes error %ld\n", GetLastError());
1146 SetLastError(0xdeadbeef);
1147 rc = DeleteFileA(file);
1148 ok(rc, "DeleteFile error %ld\n", GetLastError());
1149
1151 free(sd);
1152}
1153
1154static void test_AccessCheck(void)
1155{
1156 PSID EveryoneSid = NULL, AdminSid = NULL, UsersSid = NULL;
1157 PACL Acl = NULL;
1162 ACCESS_MASK Access;
1164 HANDLE Token;
1165 HANDLE ProcessToken;
1166 BOOL ret;
1167 DWORD PrivSetLen;
1168 PRIVILEGE_SET *PrivSet;
1169 BOOL res;
1170 HMODULE NtDllModule;
1172 DWORD err;
1173 NTSTATUS ntret, ntAccessStatus;
1174
1175 NtDllModule = GetModuleHandleA("ntdll.dll");
1176 if (!NtDllModule)
1177 {
1178 skip("not running on NT, skipping test\n");
1179 return;
1180 }
1181 pRtlAdjustPrivilege = (void *)GetProcAddress(NtDllModule, "RtlAdjustPrivilege");
1182 if (!pRtlAdjustPrivilege)
1183 {
1184 win_skip("missing RtlAdjustPrivilege, skipping test\n");
1185 return;
1186 }
1187
1188 Acl = malloc(256);
1189 res = InitializeAcl(Acl, 256, ACL_REVISION);
1191 {
1192 skip("ACLs not implemented - skipping tests\n");
1193 free(Acl);
1194 return;
1195 }
1196 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
1197
1198 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
1199 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
1200
1202 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdminSid);
1203 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
1204
1206 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &UsersSid);
1207 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
1208
1210
1212 ok(res, "InitializeSecurityDescriptor failed with error %ld\n", GetLastError());
1213
1215 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1216
1217 PrivSetLen = FIELD_OFFSET(PRIVILEGE_SET, Privilege[16]);
1218 PrivSet = calloc(1, PrivSetLen);
1219 PrivSet->PrivilegeCount = 16;
1220
1222 ok(res, "OpenProcessToken failed with error %ld\n", GetLastError());
1223
1224 pRtlAdjustPrivilege(SE_SECURITY_PRIVILEGE, FALSE, TRUE, &Enabled);
1225
1226 res = DuplicateToken(ProcessToken, SecurityImpersonation, &Token);
1227 ok(res, "DuplicateToken failed with error %ld\n", GetLastError());
1228
1229 /* SD without owner/group */
1230 SetLastError(0xdeadbeef);
1231 Access = AccessStatus = 0x1abe11ed;
1233 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1234 err = GetLastError();
1235 ok(!ret && err == ERROR_INVALID_SECURITY_DESCR, "AccessCheck should have "
1236 "failed with ERROR_INVALID_SECURITY_DESCR, instead of %ld\n", err);
1237 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1238 "Access and/or AccessStatus were changed!\n");
1239
1240 /* Set owner and group */
1242 ok(res, "SetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
1244 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
1245
1246 /* Generic access mask */
1247 SetLastError(0xdeadbeef);
1248 Access = AccessStatus = 0x1abe11ed;
1250 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1251 err = GetLastError();
1252 ok(!ret && err == ERROR_GENERIC_NOT_MAPPED, "AccessCheck should have failed "
1253 "with ERROR_GENERIC_NOT_MAPPED, instead of %ld\n", err);
1254 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1255 "Access and/or AccessStatus were changed!\n");
1256
1257 /* Generic access mask - no privilegeset buffer */
1258 SetLastError(0xdeadbeef);
1259 Access = AccessStatus = 0x1abe11ed;
1261 NULL, &PrivSetLen, &Access, &AccessStatus);
1262 err = GetLastError();
1263 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1264 "with ERROR_NOACCESS, instead of %ld\n", err);
1265 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1266 "Access and/or AccessStatus were changed!\n");
1267
1268 /* Generic access mask - no returnlength */
1269 SetLastError(0xdeadbeef);
1270 Access = AccessStatus = 0x1abe11ed;
1272 PrivSet, NULL, &Access, &AccessStatus);
1273 err = GetLastError();
1274 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1275 "with ERROR_NOACCESS, instead of %ld\n", err);
1276 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1277 "Access and/or AccessStatus were changed!\n");
1278
1279 /* Generic access mask - no privilegeset buffer, no returnlength */
1280 SetLastError(0xdeadbeef);
1281 Access = AccessStatus = 0x1abe11ed;
1283 NULL, NULL, &Access, &AccessStatus);
1284 err = GetLastError();
1285 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1286 "with ERROR_NOACCESS, instead of %ld\n", err);
1287 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1288 "Access and/or AccessStatus were changed!\n");
1289
1290 /* sd with no dacl present */
1291 Access = AccessStatus = 0x1abe11ed;
1293 ok(ret, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1295 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1296 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1297 ok(AccessStatus && (Access == KEY_READ),
1298 "AccessCheck failed to grant access with error %ld\n",
1299 GetLastError());
1300
1301 /* sd with no dacl present - no privilegeset buffer */
1302 SetLastError(0xdeadbeef);
1303 Access = AccessStatus = 0x1abe11ed;
1305 NULL, &PrivSetLen, &Access, &AccessStatus);
1306 err = GetLastError();
1307 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed "
1308 "with ERROR_NOACCESS, instead of %ld\n", err);
1309 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1310 "Access and/or AccessStatus were changed!\n");
1311
1312 if(pNtAccessCheck)
1313 {
1314 DWORD ntPrivSetLen = sizeof(PRIVILEGE_SET);
1315
1316 /* Generic access mask - no privilegeset buffer */
1317 SetLastError(0xdeadbeef);
1318 Access = ntAccessStatus = 0x1abe11ed;
1319 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1320 NULL, &ntPrivSetLen, &Access, &ntAccessStatus);
1321 err = GetLastError();
1322 ok(ntret == STATUS_ACCESS_VIOLATION,
1323 "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %lx\n", ntret);
1324 ok(err == 0xdeadbeef,
1325 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1326 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1327 "Access and/or AccessStatus were changed!\n");
1328 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", ntPrivSetLen);
1329
1330 /* Generic access mask - no returnlength */
1331 SetLastError(0xdeadbeef);
1332 Access = ntAccessStatus = 0x1abe11ed;
1333 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1334 PrivSet, NULL, &Access, &ntAccessStatus);
1335 err = GetLastError();
1336 ok(ntret == STATUS_ACCESS_VIOLATION,
1337 "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %lx\n", ntret);
1338 ok(err == 0xdeadbeef,
1339 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1340 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1341 "Access and/or AccessStatus were changed!\n");
1342
1343 /* Generic access mask - no privilegeset buffer, no returnlength */
1344 SetLastError(0xdeadbeef);
1345 Access = ntAccessStatus = 0x1abe11ed;
1346 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1347 NULL, NULL, &Access, &ntAccessStatus);
1348 err = GetLastError();
1349 ok(ntret == STATUS_ACCESS_VIOLATION,
1350 "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %lx\n", ntret);
1351 ok(err == 0xdeadbeef,
1352 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1353 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1354 "Access and/or AccessStatus were changed!\n");
1355
1356 /* Generic access mask - zero returnlength */
1357 SetLastError(0xdeadbeef);
1358 Access = ntAccessStatus = 0x1abe11ed;
1359 ntPrivSetLen = 0;
1360 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1361 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1362 err = GetLastError();
1364 "NtAccessCheck should have failed with STATUS_GENERIC_NOT_MAPPED, 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 == 0, "PrivSetLen returns %ld\n", ntPrivSetLen);
1370
1371 /* Generic access mask - insufficient returnlength */
1372 SetLastError(0xdeadbeef);
1373 Access = ntAccessStatus = 0x1abe11ed;
1374 ntPrivSetLen = sizeof(PRIVILEGE_SET)-1;
1375 ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping,
1376 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1377 err = GetLastError();
1379 "NtAccessCheck should have failed with STATUS_GENERIC_NOT_MAPPED, 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)-1, "PrivSetLen returns %ld\n", ntPrivSetLen);
1385
1386 /* Key access mask - zero returnlength */
1387 SetLastError(0xdeadbeef);
1388 Access = ntAccessStatus = 0x1abe11ed;
1389 ntPrivSetLen = 0;
1390 ntret = pNtAccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
1391 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1392 err = GetLastError();
1393 ok(ntret == STATUS_BUFFER_TOO_SMALL,
1394 "NtAccessCheck should have failed with STATUS_BUFFER_TOO_SMALL, got %lx\n", ntret);
1395 ok(err == 0xdeadbeef,
1396 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1397 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1398 "Access and/or AccessStatus were changed!\n");
1399 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", ntPrivSetLen);
1400
1401 /* Key access mask - insufficient returnlength */
1402 SetLastError(0xdeadbeef);
1403 Access = ntAccessStatus = 0x1abe11ed;
1404 ntPrivSetLen = sizeof(PRIVILEGE_SET)-1;
1405 ntret = pNtAccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
1406 PrivSet, &ntPrivSetLen, &Access, &ntAccessStatus);
1407 err = GetLastError();
1408 ok(ntret == STATUS_BUFFER_TOO_SMALL,
1409 "NtAccessCheck should have failed with STATUS_BUFFER_TOO_SMALL, got %lx\n", ntret);
1410 ok(err == 0xdeadbeef,
1411 "NtAccessCheck shouldn't set last error, got %ld\n", err);
1412 ok(Access == 0x1abe11ed && ntAccessStatus == 0x1abe11ed,
1413 "Access and/or AccessStatus were changed!\n");
1414 ok(ntPrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", ntPrivSetLen);
1415 }
1416 else
1417 win_skip("NtAccessCheck unavailable. Skipping.\n");
1418
1419 /* sd with NULL dacl */
1420 Access = AccessStatus = 0x1abe11ed;
1422 ok(ret, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1424 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1425 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1426 ok(AccessStatus && (Access == KEY_READ),
1427 "AccessCheck failed to grant access with error %ld\n",
1428 GetLastError());
1430 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1431 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1432 ok(AccessStatus && (Access == KEY_ALL_ACCESS),
1433 "AccessCheck failed to grant access with error %ld\n",
1434 GetLastError());
1435
1436 /* sd with blank dacl */
1438 ok(ret, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
1440 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1441 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1442 err = GetLastError();
1443 ok(!AccessStatus && err == ERROR_ACCESS_DENIED, "AccessCheck should have failed "
1444 "with ERROR_ACCESS_DENIED, instead of %ld\n", err);
1445 ok(!Access, "Should have failed to grant any access, got 0x%08lx\n", Access);
1446
1447 res = AddAccessAllowedAce(Acl, ACL_REVISION, KEY_READ, EveryoneSid);
1448 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
1449
1451 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError());
1452
1453 /* sd with dacl */
1454 Access = AccessStatus = 0x1abe11ed;
1456 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1457 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1458 ok(AccessStatus && (Access == KEY_READ),
1459 "AccessCheck failed to grant access with error %ld\n",
1460 GetLastError());
1461
1463 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1464 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1466 "AccessCheck failed to grant any access with error %ld\n",
1467 GetLastError());
1468 trace("AccessCheck with MAXIMUM_ALLOWED got Access 0x%08lx\n", Access);
1469
1470 /* Null PrivSet with null PrivSetLen pointer */
1471 SetLastError(0xdeadbeef);
1472 Access = AccessStatus = 0x1abe11ed;
1474 NULL, NULL, &Access, &AccessStatus);
1475 err = GetLastError();
1476 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1477 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1478 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1479 "Access and/or AccessStatus were changed!\n");
1480
1481 /* Null PrivSet with zero PrivSetLen */
1482 SetLastError(0xdeadbeef);
1483 Access = AccessStatus = 0x1abe11ed;
1484 PrivSetLen = 0;
1486 0, &PrivSetLen, &Access, &AccessStatus);
1487 err = GetLastError();
1488 todo_wine
1489 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1490 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1491 todo_wine
1492 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1493 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1494 "Access and/or AccessStatus were changed!\n");
1495
1496 /* Null PrivSet with insufficient PrivSetLen */
1497 SetLastError(0xdeadbeef);
1498 Access = AccessStatus = 0x1abe11ed;
1499 PrivSetLen = 1;
1501 0, &PrivSetLen, &Access, &AccessStatus);
1502 err = GetLastError();
1503 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1504 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1505 ok(PrivSetLen == 1, "PrivSetLen returns %ld\n", PrivSetLen);
1506 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1507 "Access and/or AccessStatus were changed!\n");
1508
1509 /* Null PrivSet with insufficient PrivSetLen */
1510 SetLastError(0xdeadbeef);
1511 Access = AccessStatus = 0x1abe11ed;
1512 PrivSetLen = sizeof(PRIVILEGE_SET) - 1;
1514 0, &PrivSetLen, &Access, &AccessStatus);
1515 err = GetLastError();
1516 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1517 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1518 ok(PrivSetLen == sizeof(PRIVILEGE_SET) - 1, "PrivSetLen returns %ld\n", PrivSetLen);
1519 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1520 "Access and/or AccessStatus were changed!\n");
1521
1522 /* Null PrivSet with minimal sufficient PrivSetLen */
1523 SetLastError(0xdeadbeef);
1524 Access = AccessStatus = 0x1abe11ed;
1525 PrivSetLen = sizeof(PRIVILEGE_SET);
1527 0, &PrivSetLen, &Access, &AccessStatus);
1528 err = GetLastError();
1529 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1530 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1531 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1532 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1533 "Access and/or AccessStatus were changed!\n");
1534
1535 /* Valid PrivSet with zero PrivSetLen */
1536 SetLastError(0xdeadbeef);
1537 Access = AccessStatus = 0x1abe11ed;
1538 PrivSetLen = 0;
1540 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1541 err = GetLastError();
1542 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1543 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1544 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1545 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1546 "Access and/or AccessStatus were changed!\n");
1547
1548 /* Valid PrivSet with insufficient PrivSetLen */
1549 SetLastError(0xdeadbeef);
1550 Access = AccessStatus = 0x1abe11ed;
1551 PrivSetLen = 1;
1553 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1554 err = GetLastError();
1555 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1556 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1557 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1558 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1559 "Access and/or AccessStatus were changed!\n");
1560
1561 /* Valid PrivSet with insufficient PrivSetLen */
1562 SetLastError(0xdeadbeef);
1563 Access = AccessStatus = 0x1abe11ed;
1564 PrivSetLen = sizeof(PRIVILEGE_SET) - 1;
1565 PrivSet->PrivilegeCount = 0xdeadbeef;
1567 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1568 err = GetLastError();
1569 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1570 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1571 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1572 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1573 "Access and/or AccessStatus were changed!\n");
1574 ok(PrivSet->PrivilegeCount == 0xdeadbeef, "buffer contents should not be changed\n");
1575
1576 /* Valid PrivSet with minimal sufficient PrivSetLen */
1577 SetLastError(0xdeadbeef);
1578 Access = AccessStatus = 0x1abe11ed;
1579 PrivSetLen = sizeof(PRIVILEGE_SET);
1580 memset(PrivSet, 0xcc, PrivSetLen);
1582 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1583 err = GetLastError();
1584 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1585 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1586 ok(AccessStatus && (Access == KEY_READ),
1587 "AccessCheck failed to grant access with error %ld\n", GetLastError());
1588 ok(PrivSet->PrivilegeCount == 0, "PrivilegeCount returns %ld, expects 0\n",
1589 PrivSet->PrivilegeCount);
1590
1591 /* Valid PrivSet with sufficient PrivSetLen */
1592 SetLastError(0xdeadbeef);
1593 Access = AccessStatus = 0x1abe11ed;
1594 PrivSetLen = sizeof(PRIVILEGE_SET) + 1;
1595 memset(PrivSet, 0xcc, PrivSetLen);
1597 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1598 err = GetLastError();
1599 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1600 todo_wine
1601 ok(PrivSetLen == sizeof(PRIVILEGE_SET) + 1, "PrivSetLen returns %ld\n", PrivSetLen);
1602 ok(AccessStatus && (Access == KEY_READ),
1603 "AccessCheck failed to grant access with error %ld\n", GetLastError());
1604 ok(PrivSet->PrivilegeCount == 0, "PrivilegeCount returns %ld, expects 0\n",
1605 PrivSet->PrivilegeCount);
1606
1607 PrivSetLen = FIELD_OFFSET(PRIVILEGE_SET, Privilege[16]);
1608
1609 /* Null PrivSet with valid PrivSetLen */
1610 SetLastError(0xdeadbeef);
1611 Access = AccessStatus = 0x1abe11ed;
1613 0, &PrivSetLen, &Access, &AccessStatus);
1614 err = GetLastError();
1615 ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have "
1616 "failed with ERROR_NOACCESS, instead of %ld\n", err);
1617 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1618 "Access and/or AccessStatus were changed!\n");
1619
1620 /* Access denied by SD */
1621 SetLastError(0xdeadbeef);
1622 Access = AccessStatus = 0x1abe11ed;
1624 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1625 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1626 err = GetLastError();
1627 ok(!AccessStatus && err == ERROR_ACCESS_DENIED, "AccessCheck should have failed "
1628 "with ERROR_ACCESS_DENIED, instead of %ld\n", err);
1629 ok(!Access, "Should have failed to grant any access, got 0x%08lx\n", Access);
1630
1631 SetLastError(0xdeadbeef);
1632 PrivSet->PrivilegeCount = 16;
1634 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1636 "AccessCheck should have failed with ERROR_PRIVILEGE_NOT_HELD, instead of %ld\n",
1637 GetLastError());
1638
1640 ok(ret, "ImpersonateLoggedOnUser failed with error %ld\n", GetLastError());
1641 ret = pRtlAdjustPrivilege(SE_SECURITY_PRIVILEGE, TRUE, TRUE, &Enabled);
1642 if (!ret)
1643 {
1644 /* Valid PrivSet with zero PrivSetLen */
1645 SetLastError(0xdeadbeef);
1646 Access = AccessStatus = 0x1abe11ed;
1647 PrivSetLen = 0;
1649 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1650 err = GetLastError();
1651 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1652 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1653 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1654 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1655 "Access and/or AccessStatus were changed!\n");
1656
1657 /* Valid PrivSet with insufficient PrivSetLen */
1658 SetLastError(0xdeadbeef);
1659 Access = AccessStatus = 0x1abe11ed;
1660 PrivSetLen = sizeof(PRIVILEGE_SET) - 1;
1662 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1663 err = GetLastError();
1664 ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
1665 "failed with ERROR_INSUFFICIENT_BUFFER, instead of %ld\n", err);
1666 ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %ld\n", PrivSetLen);
1667 ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
1668 "Access and/or AccessStatus were changed!\n");
1669
1670 /* Valid PrivSet with minimal sufficient PrivSetLen */
1671 SetLastError(0xdeadbeef);
1672 Access = AccessStatus = 0x1abe11ed;
1673 PrivSetLen = sizeof(PRIVILEGE_SET);
1674 memset(PrivSet, 0xcc, PrivSetLen);
1676 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1677 ok(ret && AccessStatus && GetLastError() == 0xdeadbeef,
1678 "AccessCheck should have succeeded, error %ld\n",
1679 GetLastError());
1680 ok(Access == ACCESS_SYSTEM_SECURITY,
1681 "Access should be equal to ACCESS_SYSTEM_SECURITY instead of 0x%08lx\n",
1682 Access);
1683 ok(PrivSet->PrivilegeCount == 1, "PrivilegeCount returns %ld, expects 1\n",
1684 PrivSet->PrivilegeCount);
1685
1686 /* Valid PrivSet with large PrivSetLen */
1687 SetLastError(0xdeadbeef);
1688 Access = AccessStatus = 0x1abe11ed;
1689 PrivSetLen = FIELD_OFFSET(PRIVILEGE_SET, Privilege[16]);
1690 memset(PrivSet, 0xcc, PrivSetLen);
1692 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1693 ok(ret && AccessStatus && GetLastError() == 0xdeadbeef,
1694 "AccessCheck should have succeeded, error %ld\n",
1695 GetLastError());
1696 ok(Access == ACCESS_SYSTEM_SECURITY,
1697 "Access should be equal to ACCESS_SYSTEM_SECURITY instead of 0x%08lx\n",
1698 Access);
1699 ok(PrivSet->PrivilegeCount == 1, "PrivilegeCount returns %ld, expects 1\n",
1700 PrivSet->PrivilegeCount);
1701 }
1702 else
1703 trace("Couldn't get SE_SECURITY_PRIVILEGE (0x%08x), skipping ACCESS_SYSTEM_SECURITY test\n",
1704 ret);
1705 ret = RevertToSelf();
1706 ok(ret, "RevertToSelf failed with error %ld\n", GetLastError());
1707
1708 /* test INHERIT_ONLY_ACE */
1709 ret = InitializeAcl(Acl, 256, ACL_REVISION);
1710 ok(ret, "InitializeAcl failed with error %ld\n", GetLastError());
1711
1713 ok(ret, "AddAccessAllowedAceEx failed with error %ld\n", GetLastError());
1714
1716 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1717 ok(ret, "AccessCheck failed with error %ld\n", GetLastError());
1718 err = GetLastError();
1719 ok(!AccessStatus && err == ERROR_ACCESS_DENIED, "AccessCheck should have failed "
1720 "with ERROR_ACCESS_DENIED, instead of %ld\n", err);
1721 ok(!Access, "Should have failed to grant any access, got 0x%08lx\n", Access);
1722
1724
1725 res = DuplicateToken(ProcessToken, SecurityAnonymous, &Token);
1726 ok(res, "DuplicateToken failed with error %ld\n", GetLastError());
1727
1728 SetLastError(0xdeadbeef);
1730 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1731 err = GetLastError();
1732 ok(!ret && err == ERROR_BAD_IMPERSONATION_LEVEL, "AccessCheck should have failed "
1733 "with ERROR_BAD_IMPERSONATION_LEVEL, instead of %ld\n", err);
1734
1736
1737 SetLastError(0xdeadbeef);
1739 PrivSet, &PrivSetLen, &Access, &AccessStatus);
1740 err = GetLastError();
1741 ok(!ret && err == ERROR_NO_IMPERSONATION_TOKEN, "AccessCheck should have failed "
1742 "with ERROR_NO_IMPERSONATION_TOKEN, instead of %ld\n", err);
1743
1744 CloseHandle(ProcessToken);
1745
1746 if (EveryoneSid)
1747 FreeSid(EveryoneSid);
1748 if (AdminSid)
1750 if (UsersSid)
1751 FreeSid(UsersSid);
1752 free(Acl);
1754 free(PrivSet);
1755}
1756
1758{
1759 TOKEN_USER *token_user;
1760 DWORD size;
1761 BOOL ret;
1762
1764 ok(!ret, "Expected failure, got %d\n", ret);
1766 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
1767
1768 token_user = malloc( size );
1769 ret = GetTokenInformation( token, TokenUser, token_user, size, &size );
1770 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1771
1772 return token_user;
1773}
1774
1776{
1777 TOKEN_OWNER *token_owner;
1778 DWORD size;
1779 BOOL ret;
1780
1782 ok(!ret, "Expected failure, got %d\n", ret);
1784 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
1785
1786 token_owner = malloc( size );
1787 ret = GetTokenInformation( token, TokenOwner, token_owner, size, &size );
1788 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1789
1790 return token_owner;
1791}
1792
1794{
1795 TOKEN_PRIMARY_GROUP *token_primary_group;
1796 DWORD size;
1797 BOOL ret;
1798
1800 ok(!ret, "Expected failure, got %d\n", ret);
1802 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
1803
1804 token_primary_group = malloc( size );
1805 ret = GetTokenInformation( token, TokenPrimaryGroup, token_primary_group, size, &size );
1806 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1807
1808 return token_primary_group;
1809}
1810
1811/* test GetTokenInformation for the various attributes */
1812static void test_token_attr(void)
1813{
1814 HANDLE Token, ImpersonationToken;
1815 DWORD Size, Size2;
1817 TOKEN_GROUPS *Groups;
1821 BOOL ret;
1822 DWORD i, GLE;
1823 LPSTR SidString;
1825 ACL *acl;
1826
1827 /* cygwin-like use case */
1828 SetLastError(0xdeadbeef);
1831 {
1832 win_skip("OpenProcessToken is not implemented\n");
1833 return;
1834 }
1835 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
1836 if (ret)
1837 {
1838 DWORD buf[256]; /* GetTokenInformation wants a dword-aligned buffer */
1839 Size = sizeof(buf);
1841 ok(ret, "GetTokenInformation failed with error %ld\n", GetLastError());
1842 Size = sizeof(ImpersonationLevel);
1844 GLE = GetLastError();
1845 ok(!ret && (GLE == ERROR_INVALID_PARAMETER), "GetTokenInformation(TokenImpersonationLevel) on primary token should have failed with ERROR_INVALID_PARAMETER instead of %ld\n", GLE);
1847 }
1848
1849 SetLastError(0xdeadbeef);
1851 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
1852
1853 /* groups */
1854 /* insufficient buffer length */
1855 SetLastError(0xdeadbeef);
1856 Size2 = 0;
1858 ok(Size2 > 1, "got %ld\n", Size2);
1860 "%d with error %ld\n", ret, GetLastError());
1861 Size2 -= 1;
1862 Groups = malloc(Size2);
1863 memset(Groups, 0xcc, Size2);
1864 Size = 0;
1865 ret = GetTokenInformation(Token, TokenGroups, Groups, Size2, &Size);
1866 ok(Size > 1, "got %ld\n", Size);
1867 ok((!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER) || broken(ret) /* wow64 */,
1868 "%d with error %ld\n", ret, GetLastError());
1869 if(!ret)
1870 ok(*((BYTE*)Groups) == 0xcc, "buffer altered\n");
1871
1872 free(Groups);
1873
1874 SetLastError(0xdeadbeef);
1877 "GetTokenInformation(TokenGroups) %s with error %ld\n",
1878 ret ? "succeeded" : "failed", GetLastError());
1879 Groups = malloc(Size);
1880 SetLastError(0xdeadbeef);
1882 ok(ret, "GetTokenInformation(TokenGroups) failed with error %ld\n", GetLastError());
1883 ok(GetLastError() == 0xdeadbeef,
1884 "GetTokenInformation shouldn't have set last error to %ld\n",
1885 GetLastError());
1886 trace("TokenGroups:\n");
1887 for (i = 0; i < Groups->GroupCount; i++)
1888 {
1889 DWORD NameLength = 255;
1890 CHAR Name[255];
1891 DWORD DomainLength = 255;
1892 CHAR Domain[255];
1893 SID_NAME_USE SidNameUse;
1894 Name[0] = '\0';
1895 Domain[0] = '\0';
1896 ret = LookupAccountSidA(NULL, Groups->Groups[i].Sid, Name, &NameLength, Domain, &DomainLength, &SidNameUse);
1897 if (ret)
1898 {
1899 ConvertSidToStringSidA(Groups->Groups[i].Sid, &SidString);
1900 trace("%s, %s\\%s use: %d attr: 0x%08lx\n", SidString, Domain, Name, SidNameUse, Groups->Groups[i].Attributes);
1901 LocalFree(SidString);
1902 }
1903 else trace("attr: 0x%08lx LookupAccountSid failed with error %ld\n", Groups->Groups[i].Attributes, GetLastError());
1904 }
1905 free(Groups);
1906
1907 /* user */
1910 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
1911 User = malloc(Size);
1913 ok(ret,
1914 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
1915
1916 ConvertSidToStringSidA(User->User.Sid, &SidString);
1917 trace("TokenUser: %s attr: 0x%08lx\n", SidString, User->User.Attributes);
1918 LocalFree(SidString);
1919 free(User);
1920
1921 /* owner */
1924 "GetTokenInformation(TokenOwner) failed with error %ld\n", GetLastError());
1925 Owner = malloc(Size);
1927 ok(ret,
1928 "GetTokenInformation(TokenOwner) failed with error %ld\n", GetLastError());
1929
1930 ConvertSidToStringSidA(Owner->Owner, &SidString);
1931 trace("TokenOwner: %s\n", SidString);
1932 LocalFree(SidString);
1933 free(Owner);
1934
1935 /* logon */
1938 todo_wine win_skip("TokenLogonSid not supported. Skipping tests\n");
1939 else
1940 {
1942 "GetTokenInformation(TokenLogonSid) failed with error %ld\n", GetLastError());
1943 Groups = malloc(Size);
1945 ok(ret,
1946 "GetTokenInformation(TokenLogonSid) failed with error %ld\n", GetLastError());
1947 if (ret)
1948 {
1949 ok(Groups->GroupCount == 1, "got %ld\n", Groups->GroupCount);
1950 if(Groups->GroupCount == 1)
1951 {
1952 ConvertSidToStringSidA(Groups->Groups[0].Sid, &SidString);
1953 trace("TokenLogon: %s\n", SidString);
1954 LocalFree(SidString);
1955
1956 /* S-1-5-5-0-XXXXXX */
1957 ret = IsWellKnownSid(Groups->Groups[0].Sid, WinLogonIdsSid);
1958 ok(ret, "Unknown SID\n");
1959
1961 "got %lx\n", Groups->Groups[0].Attributes);
1962 }
1963 }
1964
1965 free(Groups);
1966 }
1967
1968 /* privileges */
1971 "GetTokenInformation(TokenPrivileges) failed with error %ld\n", GetLastError());
1974 ok(ret,
1975 "GetTokenInformation(TokenPrivileges) failed with error %ld\n", GetLastError());
1976 trace("TokenPrivileges:\n");
1977 for (i = 0; i < Privileges->PrivilegeCount; i++)
1978 {
1979 CHAR Name[256];
1980 DWORD NameLen = ARRAY_SIZE(Name);
1981 LookupPrivilegeNameA(NULL, &Privileges->Privileges[i].Luid, Name, &NameLen);
1982 trace("\t%s, 0x%lx\n", Name, Privileges->Privileges[i].Attributes);
1983 }
1985
1986 ret = DuplicateToken(Token, SecurityAnonymous, &ImpersonationToken);
1987 ok(ret, "DuplicateToken failed with error %ld\n", GetLastError());
1988
1989 Size = sizeof(ImpersonationLevel);
1991 ok(ret, "GetTokenInformation(TokenImpersonationLevel) failed with error %ld\n", GetLastError());
1992 ok(ImpersonationLevel == SecurityAnonymous, "ImpersonationLevel should have been SecurityAnonymous instead of %d\n", ImpersonationLevel);
1993
1994 CloseHandle(ImpersonationToken);
1995
1996 /* default dacl */
1999 "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2000
2001 Dacl = malloc(Size);
2003 ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2004
2005 SetLastError(0xdeadbeef);
2007 GLE = GetLastError();
2008 ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
2009 ok(GLE == ERROR_BAD_LENGTH, "expected ERROR_BAD_LENGTH got %lu\n", GLE);
2010
2011 SetLastError(0xdeadbeef);
2013 GLE = GetLastError();
2014 ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
2015 ok(GLE == ERROR_NOACCESS, "expected ERROR_NOACCESS got %lu\n", GLE);
2016
2017 acl = Dacl->DefaultDacl;
2018 Dacl->DefaultDacl = NULL;
2019
2021 ok(ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
2022
2023 Size2 = 0;
2024 Dacl->DefaultDacl = (ACL *)0xdeadbeef;
2026 ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2027 ok(Dacl->DefaultDacl == NULL, "expected NULL, got %p\n", Dacl->DefaultDacl);
2028 ok(Size2 == sizeof(TOKEN_DEFAULT_DACL) || broken(Size2 == 2*sizeof(TOKEN_DEFAULT_DACL)), /* WoW64 */
2029 "got %lu expected sizeof(TOKEN_DEFAULT_DACL)\n", Size2);
2030
2031 Dacl->DefaultDacl = acl;
2033 ok(ret, "SetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2034
2035 if (Size2 == sizeof(TOKEN_DEFAULT_DACL)) {
2037 ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %lu\n", GetLastError());
2038 } else
2039 win_skip("TOKEN_DEFAULT_DACL size too small on WoW64\n");
2040
2041 free(Dacl);
2043}
2044
2046{
2047 DWORD is_app_container, size;
2048 HANDLE token;
2049 BOOL ret;
2050
2052 ok(ret, "OpenProcessToken failed: %lu\n", GetLastError());
2053
2054 size = 0;
2055 is_app_container = 0xdeadbeef;
2056 ret = GetTokenInformation(token, TokenIsAppContainer, &is_app_container,
2057 sizeof(is_app_container), &size);
2059 GetLastError() == ERROR_INVALID_FUNCTION), /* pre-win8 */
2060 "GetTokenInformation failed: %lu\n", GetLastError());
2061 if(ret) {
2062 ok(size == sizeof(is_app_container), "size = %lu\n", size);
2063 ok(!is_app_container, "is_app_container = %lx\n", is_app_container);
2064 }
2065
2067}
2068
2069typedef union _MAX_SID
2070{
2074
2075static void test_sid_str(PSID * sid)
2076{
2077 char *str_sid;
2078 BOOL ret = ConvertSidToStringSidA(sid, &str_sid);
2079 ok(ret, "ConvertSidToStringSidA() failed: %ld\n", GetLastError());
2080 if (ret)
2081 {
2083 SID_NAME_USE use;
2084 DWORD acc_size = MAX_PATH;
2085 DWORD dom_size = MAX_PATH;
2086 ret = LookupAccountSidA (NULL, sid, account, &acc_size, domain, &dom_size, &use);
2088 "LookupAccountSid(%s) failed: %ld\n", str_sid, GetLastError());
2089 if (ret)
2090 trace(" %s %s\\%s %d\n", str_sid, domain, account, use);
2091 else if (GetLastError() == ERROR_NONE_MAPPED)
2092 trace(" %s couldn't be mapped\n", str_sid);
2093 LocalFree(str_sid);
2094 }
2095}
2096
2097static const struct well_known_sid_value
2098{
2100 const char *sid_string;
2102/* 0 */ {TRUE, "S-1-0-0"}, {TRUE, "S-1-1-0"}, {TRUE, "S-1-2-0"}, {TRUE, "S-1-3-0"},
2103/* 4 */ {TRUE, "S-1-3-1"}, {TRUE, "S-1-3-2"}, {TRUE, "S-1-3-3"}, {TRUE, "S-1-5"},
2104/* 8 */ {FALSE, "S-1-5-1"}, {TRUE, "S-1-5-2"}, {TRUE, "S-1-5-3"}, {TRUE, "S-1-5-4"},
2105/* 12 */ {TRUE, "S-1-5-6"}, {TRUE, "S-1-5-7"}, {TRUE, "S-1-5-8"}, {TRUE, "S-1-5-9"},
2106/* 16 */ {TRUE, "S-1-5-10"}, {TRUE, "S-1-5-11"}, {TRUE, "S-1-5-12"}, {TRUE, "S-1-5-13"},
2107/* 20 */ {TRUE, "S-1-5-14"}, {FALSE, NULL}, {TRUE, "S-1-5-18"}, {TRUE, "S-1-5-19"},
2108/* 24 */ {TRUE, "S-1-5-20"}, {TRUE, "S-1-5-32"},
2109/* 26 */ {FALSE, "S-1-5-32-544"}, {TRUE, "S-1-5-32-545"}, {TRUE, "S-1-5-32-546"},
2110/* 29 */ {TRUE, "S-1-5-32-547"}, {TRUE, "S-1-5-32-548"}, {TRUE, "S-1-5-32-549"},
2111/* 32 */ {TRUE, "S-1-5-32-550"}, {TRUE, "S-1-5-32-551"}, {TRUE, "S-1-5-32-552"},
2112/* 35 */ {TRUE, "S-1-5-32-554"}, {TRUE, "S-1-5-32-555"}, {TRUE, "S-1-5-32-556"},
2113/* 38 */ {FALSE, "S-1-5-21-12-23-34-45-56-500"}, {FALSE, "S-1-5-21-12-23-34-45-56-501"},
2114/* 40 */ {FALSE, "S-1-5-21-12-23-34-45-56-502"}, {FALSE, "S-1-5-21-12-23-34-45-56-512"},
2115/* 42 */ {FALSE, "S-1-5-21-12-23-34-45-56-513"}, {FALSE, "S-1-5-21-12-23-34-45-56-514"},
2116/* 44 */ {FALSE, "S-1-5-21-12-23-34-45-56-515"}, {FALSE, "S-1-5-21-12-23-34-45-56-516"},
2117/* 46 */ {FALSE, "S-1-5-21-12-23-34-45-56-517"}, {FALSE, "S-1-5-21-12-23-34-45-56-518"},
2118/* 48 */ {FALSE, "S-1-5-21-12-23-34-45-56-519"}, {FALSE, "S-1-5-21-12-23-34-45-56-520"},
2119/* 50 */ {FALSE, "S-1-5-21-12-23-34-45-56-553"},
2120/* Added in Windows Server 2003 */
2121/* 51 */ {TRUE, "S-1-5-64-10"}, {TRUE, "S-1-5-64-21"}, {TRUE, "S-1-5-64-14"},
2122/* 54 */ {TRUE, "S-1-5-15"}, {TRUE, "S-1-5-1000"}, {FALSE, "S-1-5-32-557"},
2123/* 57 */ {TRUE, "S-1-5-32-558"}, {TRUE, "S-1-5-32-559"}, {TRUE, "S-1-5-32-560"},
2124/* 60 */ {TRUE, "S-1-5-32-561"}, {TRUE, "S-1-5-32-562"},
2125/* Added in Windows Vista: */
2126/* 62 */ {TRUE, "S-1-5-32-568"},
2127/* 63 */ {TRUE, "S-1-5-17"}, {FALSE, "S-1-5-32-569"}, {TRUE, "S-1-16-0"},
2128/* 66 */ {TRUE, "S-1-16-4096"}, {TRUE, "S-1-16-8192"}, {TRUE, "S-1-16-12288"},
2129/* 69 */ {TRUE, "S-1-16-16384"}, {TRUE, "S-1-5-33"}, {TRUE, "S-1-3-4"},
2130/* 72 */ {FALSE, "S-1-5-21-12-23-34-45-56-571"}, {FALSE, "S-1-5-21-12-23-34-45-56-572"},
2131/* 74 */ {TRUE, "S-1-5-22"}, {FALSE, "S-1-5-21-12-23-34-45-56-521"}, {TRUE, "S-1-5-32-573"},
2132/* 77 */ {FALSE, "S-1-5-21-12-23-34-45-56-498"}, {TRUE, "S-1-5-32-574"}, {TRUE, "S-1-16-8448"},
2133/* 80 */ {FALSE, NULL}, {TRUE, "S-1-2-1"}, {TRUE, "S-1-5-65-1"}, {FALSE, NULL},
2134/* 84 */ {TRUE, "S-1-15-2-1"},
2136
2138{
2140 PSID domainsid, sid;
2141 DWORD size, error;
2142 BOOL ret;
2143 unsigned int i;
2144
2145 size = 0;
2146 SetLastError(0xdeadbeef);
2147 ret = CreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
2148 error = GetLastError();
2149 ok(!ret, "CreateWellKnownSid succeeded\n");
2150 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %lu\n", error);
2151 ok(size, "expected size > 0\n");
2152
2153 SetLastError(0xdeadbeef);
2154 ret = CreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
2155 error = GetLastError();
2156 ok(!ret, "CreateWellKnownSid succeeded\n");
2157 ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %lu\n", error);
2158
2159 sid = malloc(size);
2160 ret = CreateWellKnownSid(WinInteractiveSid, NULL, sid, &size);
2161 ok(ret, "CreateWellKnownSid failed %lu\n", GetLastError());
2162 free(sid);
2163
2164 /* a domain sid usually have three subauthorities but we test that CreateWellKnownSid doesn't check it */
2165 AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
2166
2167 for (i = 0; i < ARRAY_SIZE(well_known_sid_values); i++)
2168 {
2170 char sid_buffer[SECURITY_MAX_SID_SIZE];
2171 LPSTR str;
2172 DWORD cb;
2173
2174 if (value->sid_string == NULL)
2175 continue;
2176
2177 /* some SIDs aren't implemented by all Windows versions - detect it */
2178 cb = sizeof(sid_buffer);
2179 if (!CreateWellKnownSid(i, NULL, sid_buffer, &cb))
2180 {
2181 skip("Well known SID %u not implemented\n", i);
2182 continue;
2183 }
2184
2185 cb = sizeof(sid_buffer);
2186 ok(CreateWellKnownSid(i, value->without_domain ? NULL : domainsid, sid_buffer, &cb), "Couldn't create well known sid %u\n", i);
2188 ok(IsValidSid(sid_buffer), "The sid is not valid\n");
2189 ok(ConvertSidToStringSidA(sid_buffer, &str), "Couldn't convert SID to string\n");
2190 ok(strcmp(str, value->sid_string) == 0, "%d: SID mismatch - expected %s, got %s\n", i,
2191 value->sid_string, str);
2192 LocalFree(str);
2193
2194 if (value->without_domain)
2195 {
2196 char buf2[SECURITY_MAX_SID_SIZE];
2197 cb = sizeof(buf2);
2198 ok(CreateWellKnownSid(i, domainsid, buf2, &cb), "Couldn't create well known sid %u with optional domain\n", i);
2200 ok(memcmp(buf2, sid_buffer, cb) == 0, "SID create with domain is different than without (%u)\n", i);
2201 }
2202 }
2203
2204 FreeSid(domainsid);
2205}
2206
2207static void test_LookupAccountSid(void)
2208{
2210 CHAR accountA[MAX_PATH], domainA[MAX_PATH], usernameA[MAX_PATH];
2211 DWORD acc_sizeA, dom_sizeA, user_sizeA;
2212 DWORD real_acc_sizeA, real_dom_sizeA;
2213 WCHAR accountW[MAX_PATH], domainW[MAX_PATH];
2214 LSA_OBJECT_ATTRIBUTES object_attributes;
2215 DWORD acc_sizeW, dom_sizeW;
2216 DWORD real_acc_sizeW, real_dom_sizeW;
2217 PSID pUsersSid = NULL;
2218 SID_NAME_USE use;
2219 BOOL ret;
2220 DWORD error, size, cbti = 0;
2221 MAX_SID max_sid;
2222 CHAR *str_sidA;
2223 int i;
2224 HANDLE hToken;
2225 PTOKEN_USER ptiUser = NULL;
2228
2229 /* native windows crashes if account size, domain size, or name use is NULL */
2230
2232 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &pUsersSid);
2234 "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
2235
2236 /* not running on NT so give up */
2238 return;
2239
2240 real_acc_sizeA = MAX_PATH;
2241 real_dom_sizeA = MAX_PATH;
2242 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &real_acc_sizeA, domainA, &real_dom_sizeA, &use);
2243 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2244
2245 /* try NULL account */
2246 acc_sizeA = MAX_PATH;
2247 dom_sizeA = MAX_PATH;
2248 ret = LookupAccountSidA(NULL, pUsersSid, NULL, &acc_sizeA, domainA, &dom_sizeA, &use);
2249 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2250
2251 /* try NULL domain */
2252 acc_sizeA = MAX_PATH;
2253 dom_sizeA = MAX_PATH;
2254 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, NULL, &dom_sizeA, &use);
2255 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2256
2257 /* try a small account buffer */
2258 acc_sizeA = 1;
2259 dom_sizeA = MAX_PATH;
2260 accountA[0] = 0;
2261 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2262 ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
2264 "LookupAccountSidA() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2265
2266 /* try a 0 sized account buffer */
2267 acc_sizeA = 0;
2268 dom_sizeA = MAX_PATH;
2269 accountA[0] = 0;
2270 LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2271 /* this can fail or succeed depending on OS version but the size will always be returned */
2272 ok(acc_sizeA == real_acc_sizeA + 1,
2273 "LookupAccountSidA() Expected acc_size = %lu, got %lu\n",
2274 real_acc_sizeA + 1, acc_sizeA);
2275
2276 /* try a 0 sized account buffer */
2277 acc_sizeA = 0;
2278 dom_sizeA = MAX_PATH;
2279 LookupAccountSidA(NULL, pUsersSid, NULL, &acc_sizeA, domainA, &dom_sizeA, &use);
2280 /* this can fail or succeed depending on OS version but the size will always be returned */
2281 ok(acc_sizeA == real_acc_sizeA + 1,
2282 "LookupAccountSid() Expected acc_size = %lu, got %lu\n",
2283 real_acc_sizeA + 1, acc_sizeA);
2284
2285 /* try a small domain buffer */
2286 dom_sizeA = 1;
2287 acc_sizeA = MAX_PATH;
2288 accountA[0] = 0;
2289 ret = LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2290 ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
2292 "LookupAccountSidA() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2293
2294 /* try a 0 sized domain buffer */
2295 dom_sizeA = 0;
2296 acc_sizeA = MAX_PATH;
2297 accountA[0] = 0;
2298 LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2299 /* this can fail or succeed depending on OS version but the size will always be returned */
2300 ok(dom_sizeA == real_dom_sizeA + 1,
2301 "LookupAccountSidA() Expected dom_size = %lu, got %lu\n",
2302 real_dom_sizeA + 1, dom_sizeA);
2303
2304 /* try a 0 sized domain buffer */
2305 dom_sizeA = 0;
2306 acc_sizeA = MAX_PATH;
2307 LookupAccountSidA(NULL, pUsersSid, accountA, &acc_sizeA, NULL, &dom_sizeA, &use);
2308 /* this can fail or succeed depending on OS version but the size will always be returned */
2309 ok(dom_sizeA == real_dom_sizeA + 1,
2310 "LookupAccountSidA() Expected dom_size = %lu, got %lu\n",
2311 real_dom_sizeA + 1, dom_sizeA);
2312
2313 real_acc_sizeW = MAX_PATH;
2314 real_dom_sizeW = MAX_PATH;
2315 ret = LookupAccountSidW(NULL, pUsersSid, accountW, &real_acc_sizeW, domainW, &real_dom_sizeW, &use);
2316 ok(ret, "LookupAccountSidW() Expected TRUE, got FALSE\n");
2317
2318 /* try an invalid system name */
2319 real_acc_sizeA = MAX_PATH;
2320 real_dom_sizeA = MAX_PATH;
2321 ret = LookupAccountSidA("deepthought", pUsersSid, accountA, &real_acc_sizeA, domainA, &real_dom_sizeA, &use);
2322 ok(!ret, "LookupAccountSidA() Expected FALSE got TRUE\n");
2324 "LookupAccountSidA() Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %lu\n", GetLastError());
2325
2326 /* native windows crashes if domainW or accountW is NULL */
2327
2328 /* try a small account buffer */
2329 acc_sizeW = 1;
2330 dom_sizeW = MAX_PATH;
2331 accountW[0] = 0;
2332 ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2333 ok(!ret, "LookupAccountSidW() Expected FALSE got TRUE\n");
2335 "LookupAccountSidW() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2336
2337 /* try a 0 sized account buffer */
2338 acc_sizeW = 0;
2339 dom_sizeW = MAX_PATH;
2340 accountW[0] = 0;
2341 LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2342 /* this can fail or succeed depending on OS version but the size will always be returned */
2343 ok(acc_sizeW == real_acc_sizeW + 1,
2344 "LookupAccountSidW() Expected acc_size = %lu, got %lu\n",
2345 real_acc_sizeW + 1, acc_sizeW);
2346
2347 /* try a 0 sized account buffer */
2348 acc_sizeW = 0;
2349 dom_sizeW = MAX_PATH;
2350 LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, domainW, &dom_sizeW, &use);
2351 /* this can fail or succeed depending on OS version but the size will always be returned */
2352 ok(acc_sizeW == real_acc_sizeW + 1,
2353 "LookupAccountSidW() Expected acc_size = %lu, got %lu\n",
2354 real_acc_sizeW + 1, acc_sizeW);
2355
2356 /* try a small domain buffer */
2357 dom_sizeW = 1;
2358 acc_sizeW = MAX_PATH;
2359 accountW[0] = 0;
2360 ret = LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2361 ok(!ret, "LookupAccountSidW() Expected FALSE got TRUE\n");
2363 "LookupAccountSidW() Expected ERROR_NOT_ENOUGH_MEMORY, got %lu\n", GetLastError());
2364
2365 /* try a 0 sized domain buffer */
2366 dom_sizeW = 0;
2367 acc_sizeW = MAX_PATH;
2368 accountW[0] = 0;
2369 LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, domainW, &dom_sizeW, &use);
2370 /* this can fail or succeed depending on OS version but the size will always be returned */
2371 ok(dom_sizeW == real_dom_sizeW + 1,
2372 "LookupAccountSidW() Expected dom_size = %lu, got %lu\n",
2373 real_dom_sizeW + 1, dom_sizeW);
2374
2375 /* try a 0 sized domain buffer */
2376 dom_sizeW = 0;
2377 acc_sizeW = MAX_PATH;
2378 LookupAccountSidW(NULL, pUsersSid, accountW, &acc_sizeW, NULL, &dom_sizeW, &use);
2379 /* this can fail or succeed depending on OS version but the size will always be returned */
2380 ok(dom_sizeW == real_dom_sizeW + 1,
2381 "LookupAccountSidW() Expected dom_size = %lu, got %lu\n",
2382 real_dom_sizeW + 1, dom_sizeW);
2383
2384 acc_sizeW = dom_sizeW = use = 0;
2385 SetLastError(0xdeadbeef);
2386 ret = LookupAccountSidW(NULL, pUsersSid, NULL, &acc_sizeW, NULL, &dom_sizeW, &use);
2387 error = GetLastError();
2388 ok(!ret, "LookupAccountSidW failed %lu\n", GetLastError());
2389 ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %lu\n", error);
2390 ok(acc_sizeW, "expected non-zero account size\n");
2391 ok(dom_sizeW, "expected non-zero domain size\n");
2392 ok(!use, "expected zero use %u\n", use);
2393
2394 FreeSid(pUsersSid);
2395
2396 /* Test LookupAccountSid with Sid retrieved from token information.
2397 This assumes this process is running under the account of the current user.*/
2399 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
2400 ret = GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti);
2401 ok(!ret, "GetTokenInformation failed with error %ld\n", GetLastError());
2402 ptiUser = malloc(cbti);
2403 if (GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
2404 {
2405 acc_sizeA = dom_sizeA = MAX_PATH;
2406 ret = LookupAccountSidA(NULL, ptiUser->User.Sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use);
2407 ok(ret, "LookupAccountSidA() Expected TRUE, got FALSE\n");
2408 user_sizeA = MAX_PATH;
2409 ret = GetUserNameA(usernameA , &user_sizeA);
2410 ok(ret, "GetUserNameA() Expected TRUE, got FALSE\n");
2411 ok(lstrcmpA(usernameA, accountA) == 0, "LookupAccountSidA() Expected account name: %s got: %s\n", usernameA, accountA );
2412 }
2413 free(ptiUser);
2414
2415 trace("Well Known SIDs:\n");
2416 for (i = 0; i <= 60; i++)
2417 {
2419 if (CreateWellKnownSid(i, NULL, &max_sid.sid, &size))
2420 {
2421 if (ConvertSidToStringSidA(&max_sid.sid, &str_sidA))
2422 {
2423 acc_sizeA = MAX_PATH;
2424 dom_sizeA = MAX_PATH;
2425 if (LookupAccountSidA(NULL, &max_sid.sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use))
2426 trace(" %d: %s %s\\%s %d\n", i, str_sidA, domainA, accountA, use);
2427 LocalFree(str_sidA);
2428 }
2429 }
2430 else
2431 {
2433 trace(" CreateWellKnownSid(%d) failed: %ld\n", i, GetLastError());
2434 else
2435 trace(" %d: not supported\n", i);
2436 }
2437 }
2438
2439 ZeroMemory(&object_attributes, sizeof(object_attributes));
2440 object_attributes.Length = sizeof(object_attributes);
2441
2442 status = LsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle);
2444 "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08lx\n", status);
2445
2446 /* try a more restricted access mask if necessary */
2448 trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
2450 ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08lx\n", status);
2451 }
2452
2453 if (status == STATUS_SUCCESS)
2454 {
2457 ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy() failed, returned 0x%08lx\n", status);
2458 if (status == STATUS_SUCCESS)
2459 {
2460 ok(info->DomainSid!=0, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) missing SID\n");
2461 if (info->DomainSid)
2462 {
2463 int count = *GetSidSubAuthorityCount(info->DomainSid);
2464 CopySid(GetSidLengthRequired(count), &max_sid, info->DomainSid);
2465 test_sid_str((PSID)&max_sid.sid);
2467 max_sid.sid.SubAuthorityCount = count + 1;
2468 test_sid_str((PSID)&max_sid.sid);
2470 test_sid_str((PSID)&max_sid.sid);
2472 test_sid_str((PSID)&max_sid.sid);
2474 test_sid_str((PSID)&max_sid.sid);
2476 test_sid_str((PSID)&max_sid.sid);
2478 test_sid_str((PSID)&max_sid.sid);
2480 test_sid_str((PSID)&max_sid.sid);
2482 test_sid_str((PSID)&max_sid.sid);
2484 test_sid_str((PSID)&max_sid.sid);
2486 test_sid_str((PSID)&max_sid.sid);
2488 test_sid_str((PSID)&max_sid.sid);
2490 test_sid_str((PSID)&max_sid.sid);
2491 max_sid.sid.SubAuthority[count] = 1000; /* first user account */
2492 test_sid_str((PSID)&max_sid.sid);
2493 }
2494
2496 }
2497
2499 ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08lx\n", status);
2500 }
2501}
2502
2503static BOOL get_sid_info(PSID psid, LPSTR *user, LPSTR *dom)
2504{
2505 static CHAR account[UNLEN + 1];
2506 static CHAR domain[UNLEN + 1];
2507 DWORD size, dom_size;
2508 SID_NAME_USE use;
2509
2510 *user = account;
2511 *dom = domain;
2512
2513 size = dom_size = UNLEN + 1;
2514 account[0] = '\0';
2515 domain[0] = '\0';
2516 SetLastError(0xdeadbeef);
2517 return LookupAccountSidA(NULL, psid, account, &size, domain, &dom_size, &use);
2518}
2519
2521{
2523 PSID domainsid = NULL;
2524 char wk_sid[SECURITY_MAX_SID_SIZE];
2525 DWORD cb;
2526
2527 DWORD sid_size, domain_size;
2528 SID_NAME_USE sid_use;
2529 LPSTR domain, account, sid_domain, wk_domain, wk_account;
2530 PSID psid;
2531 BOOL ret ,ret2;
2532
2533 sid_size = 0;
2534 domain_size = 0;
2535 ret = LookupAccountNameA(NULL, name, NULL, &sid_size, NULL, &domain_size, &sid_use);
2536 ok(!ret, " %s Should have failed to lookup account name\n", name);
2537 psid = malloc(sid_size);
2538 domain = malloc(domain_size);
2539 ret = LookupAccountNameA(NULL, name, psid, &sid_size, domain, &domain_size, &sid_use);
2540
2541 if (!result)
2542 {
2543 ok(!ret, " %s Should have failed to lookup account name\n",name);
2544 goto cleanup;
2545 }
2546
2547 AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
2548 cb = sizeof(wk_sid);
2549 if (!CreateWellKnownSid(result, domainsid, wk_sid, &cb))
2550 {
2551 win_skip("SID %i is not available on the system\n",result);
2552 goto cleanup;
2553 }
2554
2555 ret2 = get_sid_info(wk_sid, &wk_account, &wk_domain);
2556 if (!ret2 && GetLastError() == ERROR_NONE_MAPPED)
2557 {
2558 win_skip("CreateWellKnownSid() succeeded but the account '%s' is not present (W2K)\n", name);
2559 goto cleanup;
2560 }
2561
2562 get_sid_info(psid, &account, &sid_domain);
2563
2564 ok(ret, "Failed to lookup account name %s\n",name);
2565 ok(sid_size != 0, "sid_size was zero\n");
2566
2567#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, Win8.1, and Win10 1607.
2568 ok(EqualSid(psid,wk_sid),"%s Sid %s fails to match well known sid %s!\n",
2569 name, debugstr_sid(psid), debugstr_sid(wk_sid));
2570#endif
2571
2572 ok(!lstrcmpA(account, wk_account), "Expected %s , got %s\n", account, wk_account);
2573 ok(!lstrcmpA(domain, wk_domain), "Expected %s, got %s\n", wk_domain, domain);
2574 ok(sid_use == SidTypeWellKnownGroup , "Expected Use (5), got %d\n", sid_use);
2575
2576cleanup:
2577 FreeSid(domainsid);
2578 free(psid);
2579 free(domain);
2580}
2581
2582static void test_LookupAccountName(void)
2583{
2584 DWORD sid_size, domain_size, user_size;
2585 DWORD sid_save, domain_save;
2586 CHAR user_name[UNLEN + 1];
2588 SID_NAME_USE sid_use;
2589 LPSTR domain, account, sid_dom;
2590 PSID psid;
2591 BOOL ret;
2592
2593 /* native crashes if (assuming all other parameters correct):
2594 * - peUse is NULL
2595 * - Sid is NULL and cbSid is > 0
2596 * - cbSid or cchReferencedDomainName are NULL
2597 * - ReferencedDomainName is NULL and cchReferencedDomainName is the correct size
2598 */
2599
2600 user_size = UNLEN + 1;
2601 SetLastError(0xdeadbeef);
2602 ret = GetUserNameA(user_name, &user_size);
2603 ok(ret, "Failed to get user name : %ld\n", GetLastError());
2604
2605 /* get sizes */
2606 sid_size = 0;
2607 domain_size = 0;
2608 sid_use = 0xcafebabe;
2609 SetLastError(0xdeadbeef);
2610 ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, NULL, &domain_size, &sid_use);
2612 {
2613 win_skip("LookupAccountNameA is not implemented\n");
2614 return;
2615 }
2616 ok(!ret, "Expected 0, got %d\n", ret);
2618 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2619 ok(sid_size != 0, "Expected non-zero sid size\n");
2620 ok(domain_size != 0, "Expected non-zero domain size\n");
2621 ok(sid_use == (SID_NAME_USE)0xcafebabe, "Expected 0xcafebabe, got %d\n", sid_use);
2622
2623 sid_save = sid_size;
2624 domain_save = domain_size;
2625
2626 psid = malloc(sid_size);
2627 domain = malloc(domain_size);
2628
2629 /* try valid account name */
2630 ret = LookupAccountNameA(NULL, user_name, psid, &sid_size, domain, &domain_size, &sid_use);
2631 get_sid_info(psid, &account, &sid_dom);
2632 ok(ret, "Failed to lookup account name\n");
2633 ok(sid_size == GetLengthSid(psid), "Expected %ld, got %ld\n", GetLengthSid(psid), sid_size);
2634 ok(!lstrcmpA(account, user_name), "Expected %s, got %s\n", user_name, account);
2635 ok(!lstrcmpiA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
2636 ok(domain_size == domain_save - 1, "Expected %ld, got %ld\n", domain_save - 1, domain_size);
2637 ok(strlen(domain) == domain_size, "Expected %d, got %ld\n", lstrlenA(domain), domain_size);
2638 ok(sid_use == SidTypeUser, "Expected SidTypeUser (%d), got %d\n", SidTypeUser, sid_use);
2639 domain_size = domain_save;
2640 sid_size = sid_save;
2641
2643 {
2644 skip("Non-English locale (test with hardcoded 'Everyone')\n");
2645 }
2646 else
2647 {
2648 ret = LookupAccountNameA(NULL, "Everyone", psid, &sid_size, domain, &domain_size, &sid_use);
2649 get_sid_info(psid, &account, &sid_dom);
2650 ok(ret, "Failed to lookup account name\n");
2651 ok(sid_size != 0, "sid_size was zero\n");
2652 ok(!lstrcmpA(account, "Everyone"), "Expected Everyone, got %s\n", account);
2653 ok(!lstrcmpiA(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
2654 ok(domain_size == 0, "Expected 0, got %ld\n", domain_size);
2655 ok(strlen(domain) == domain_size, "Expected %d, got %ld\n", lstrlenA(domain), domain_size);
2656 ok(sid_use == SidTypeWellKnownGroup, "Expected SidTypeWellKnownGroup (%d), got %d\n", SidTypeWellKnownGroup, sid_use);
2657 domain_size = domain_save;
2658 }
2659
2660 /* NULL Sid with zero sid size */
2661 SetLastError(0xdeadbeef);
2662 sid_size = 0;
2663 ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, domain, &domain_size, &sid_use);
2664 ok(!ret, "Expected 0, got %d\n", ret);
2666 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2667 ok(sid_size == sid_save, "Expected %ld, got %ld\n", sid_save, sid_size);
2668 ok(domain_size == domain_save, "Expected %ld, got %ld\n", domain_save, domain_size);
2669
2670 /* try cchReferencedDomainName - 1 */
2671 SetLastError(0xdeadbeef);
2672 domain_size--;
2673 ret = LookupAccountNameA(NULL, user_name, NULL, &sid_size, domain, &domain_size, &sid_use);
2674 ok(!ret, "Expected 0, got %d\n", ret);
2676 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2677 ok(sid_size == sid_save, "Expected %ld, got %ld\n", sid_save, sid_size);
2678 ok(domain_size == domain_save, "Expected %ld, got %ld\n", domain_save, domain_size);
2679
2680 /* NULL ReferencedDomainName with zero domain name size */
2681 SetLastError(0xdeadbeef);
2682 domain_size = 0;
2683 ret = LookupAccountNameA(NULL, user_name, psid, &sid_size, NULL, &domain_size, &sid_use);
2684 ok(!ret, "Expected 0, got %d\n", ret);
2686 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2687 ok(sid_size == sid_save, "Expected %ld, got %ld\n", sid_save, sid_size);
2688 ok(domain_size == domain_save, "Expected %ld, got %ld\n", domain_save, domain_size);
2689
2690 free(psid);
2691 free(domain);
2692
2693 /* get sizes for NULL account name */
2694 sid_size = 0;
2695 domain_size = 0;
2696 sid_use = 0xcafebabe;
2697 SetLastError(0xdeadbeef);
2698 ret = LookupAccountNameA(NULL, NULL, NULL, &sid_size, NULL, &domain_size, &sid_use);
2699 ok(!ret, "Expected 0, got %d\n", ret);
2701 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2702 ok(sid_size != 0, "Expected non-zero sid size\n");
2703 ok(domain_size != 0, "Expected non-zero domain size\n");
2704 ok(sid_use == (SID_NAME_USE)0xcafebabe, "Expected 0xcafebabe, got %d\n", sid_use);
2705
2706 psid = malloc(sid_size);
2707 domain = malloc(domain_size);
2708
2709 /* try NULL account name */
2710 ret = LookupAccountNameA(NULL, NULL, psid, &sid_size, domain, &domain_size, &sid_use);
2711 get_sid_info(psid, &account, &sid_dom);
2712 ok(ret, "Failed to lookup account name\n");
2713 /* Using a fixed string will not work on different locales */
2715 "Got %s for account and %s for domain, these should be the same\n", account, domain);
2716 ok(sid_use == SidTypeDomain, "Expected SidTypeDomain (%d), got %d\n", SidTypeDomain, sid_use);
2717
2718 free(psid);
2719 free(domain);
2720
2721 /* try an invalid account name */
2722 SetLastError(0xdeadbeef);
2723 sid_size = 0;
2724 domain_size = 0;
2725 ret = LookupAccountNameA(NULL, "oogabooga", NULL, &sid_size, NULL, &domain_size, &sid_use);
2726 ok(!ret, "Expected 0, got %d\n", ret);
2729 "Expected ERROR_NONE_MAPPED, got %ld\n", GetLastError());
2730 ok(sid_size == 0, "Expected 0, got %ld\n", sid_size);
2731 ok(domain_size == 0, "Expected 0, got %ld\n", domain_size);
2732
2733 /* try an invalid system name */
2734 SetLastError(0xdeadbeef);
2735 sid_size = 0;
2736 domain_size = 0;
2737 ret = LookupAccountNameA("deepthought", NULL, NULL, &sid_size, NULL, &domain_size, &sid_use);
2738 ok(!ret, "Expected 0, got %d\n", ret);
2740 "Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %ld\n", GetLastError());
2741 ok(sid_size == 0, "Expected 0, got %ld\n", sid_size);
2742 ok(domain_size == 0, "Expected 0, got %ld\n", domain_size);
2743
2744 /* try with the computer name as the account name */
2745 domain_size = sizeof(computer_name);
2746 GetComputerNameA(computer_name, &domain_size);
2747 sid_size = 0;
2748 domain_size = 0;
2749 ret = LookupAccountNameA(NULL, computer_name, NULL, &sid_size, NULL, &domain_size, &sid_use);
2751 GetLastError() == ERROR_NONE_MAPPED /* in a domain */ ||
2754 "LookupAccountNameA failed: %ld\n", GetLastError());
2756 {
2757 psid = malloc(sid_size);
2758 domain = malloc(domain_size);
2759 ret = LookupAccountNameA(NULL, computer_name, psid, &sid_size, domain, &domain_size, &sid_use);
2760 ok(ret, "LookupAccountNameA failed: %ld\n", GetLastError());
2761 ok(sid_use == SidTypeDomain ||
2762 (sid_use == SidTypeUser && ! strcmp(computer_name, user_name)), "expected SidTypeDomain for %s, got %d\n", computer_name, sid_use);
2763 free(domain);
2764 free(psid);
2765 }
2766
2767 /* Well Known names */
2769 {
2770 skip("Non-English locale (skipping well known name creation tests)\n");
2771 return;
2772 }
2773
2774 check_wellknown_name("LocalService", WinLocalServiceSid);
2775 check_wellknown_name("Local Service", WinLocalServiceSid);
2776 /* 2 spaces */
2777 check_wellknown_name("Local Service", 0);
2778 check_wellknown_name("NetworkService", WinNetworkServiceSid);
2779 check_wellknown_name("Network Service", WinNetworkServiceSid);
2780
2781 /* example of some names where the spaces are not optional */
2782 check_wellknown_name("Terminal Server User", WinTerminalServerSid);
2783 check_wellknown_name("TerminalServer User", 0);
2784 check_wellknown_name("TerminalServerUser", 0);
2785 check_wellknown_name("Terminal ServerUser", 0);
2786
2787 check_wellknown_name("enterprise domain controllers",WinEnterpriseControllersSid);
2788 check_wellknown_name("enterprisedomain controllers", 0);
2789 check_wellknown_name("enterprise domaincontrollers", 0);
2790 check_wellknown_name("enterprisedomaincontrollers", 0);
2791
2792 /* case insensitivity */
2793 check_wellknown_name("lOCAlServICE", WinLocalServiceSid);
2794
2795 /* fully qualified account names */
2796 check_wellknown_name("NT AUTHORITY\\LocalService", WinLocalServiceSid);
2797 check_wellknown_name("nt authority\\Network Service", WinNetworkServiceSid);
2798 check_wellknown_name("nt authority test\\Network Service", 0);
2799 check_wellknown_name("Dummy\\Network Service", 0);
2800 check_wellknown_name("ntauthority\\Network Service", 0);
2801}
2802
2804{
2805 SECURITY_DESCRIPTOR sd, *sd_rel, *sd_rel2, *sd_abs;
2806 char buf[8192];
2807 DWORD size, size_dacl, size_sacl, size_owner, size_group;
2808 BOOL isDefault, isPresent, ret;
2809 PACL pacl, dacl, sacl;
2810 PSID psid, owner, group;
2811
2812 SetLastError(0xdeadbeef);
2815 {
2816 win_skip("InitializeSecurityDescriptor is not implemented\n");
2817 return;
2818 }
2819
2820 ok(GetSecurityDescriptorOwner(&sd, &psid, &isDefault), "GetSecurityDescriptorOwner failed\n");
2821 expect_eq(psid, NULL, PSID, "%p");
2822 expect_eq(isDefault, FALSE, BOOL, "%d");
2823 sd.Control |= SE_DACL_PRESENT | SE_SACL_PRESENT;
2824
2825 SetLastError(0xdeadbeef);
2826 size = 5;
2829 ok(size > 5, "Size not increased\n");
2830 if (size <= 8192)
2831 {
2833 ok(GetSecurityDescriptorOwner(&sd, &psid, &isDefault), "GetSecurityDescriptorOwner failed\n");
2834 expect_eq(psid, NULL, PSID, "%p");
2835 expect_eq(isDefault, FALSE, BOOL, "%d");
2836 ok(GetSecurityDescriptorGroup(&sd, &psid, &isDefault), "GetSecurityDescriptorGroup failed\n");
2837 expect_eq(psid, NULL, PSID, "%p");
2838 expect_eq(isDefault, FALSE, BOOL, "%d");
2839 ok(GetSecurityDescriptorDacl(&sd, &isPresent, &pacl, &isDefault), "GetSecurityDescriptorDacl failed\n");
2840 expect_eq(isPresent, TRUE, BOOL, "%d");
2841 expect_eq(psid, NULL, PSID, "%p");
2842 expect_eq(isDefault, FALSE, BOOL, "%d");
2843 ok(GetSecurityDescriptorSacl(&sd, &isPresent, &pacl, &isDefault), "GetSecurityDescriptorSacl failed\n");
2844 expect_eq(isPresent, TRUE, BOOL, "%d");
2845 expect_eq(psid, NULL, PSID, "%p");
2846 expect_eq(isDefault, FALSE, BOOL, "%d");
2847 }
2848
2850 "O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)"
2851 "(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)"
2852 "(AU;NPSA;0x12019f;;;SU)", SDDL_REVISION_1, (void **)&sd_rel, NULL);
2853 ok(ret, "got %lu\n", GetLastError());
2854
2855 size = 0;
2856 ret = MakeSelfRelativeSD(sd_rel, NULL, &size);
2858
2859 /* convert to absolute form */
2860 size = size_dacl = size_sacl = size_owner = size_group = 0;
2861 ret = MakeAbsoluteSD(sd_rel, NULL, &size, NULL, &size_dacl, NULL, &size_sacl, NULL, &size_owner, NULL,
2862 &size_group);
2863 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError());
2864
2865 sd_abs = malloc(size + size_dacl + size_sacl + size_owner + size_group);
2866 dacl = (PACL)(sd_abs + 1);
2867 sacl = (PACL)((char *)dacl + size_dacl);
2868 owner = (PSID)((char *)sacl + size_sacl);
2869 group = (PSID)((char *)owner + size_owner);
2870 ret = MakeAbsoluteSD(sd_rel, sd_abs, &size, dacl, &size_dacl, sacl, &size_sacl, owner, &size_owner,
2871 group, &size_group);
2872 ok(ret, "got %lu\n", GetLastError());
2873
2874 size = 0;
2875 ret = MakeSelfRelativeSD(sd_abs, NULL, &size);
2876 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %lu\n", GetLastError());
2877 ok(size == 184, "got %lu\n", size);
2878
2879 size += 4;
2880 sd_rel2 = malloc(size);
2881 ret = MakeSelfRelativeSD(sd_abs, sd_rel2, &size);
2882 ok(ret, "got %lu\n", GetLastError());
2883 ok(size == 188, "got %lu\n", size);
2884
2885 free(sd_abs);
2886 free(sd_rel2);
2887 LocalFree(sd_rel);
2888}
2889
2890#define TEST_GRANTED_ACCESS(a,b) test_granted_access(a,b,0,__LINE__)
2891#define TEST_GRANTED_ACCESS2(a,b,c) test_granted_access(a,b,c,__LINE__)
2893 ACCESS_MASK alt, int line)
2894{
2895 OBJECT_BASIC_INFORMATION obj_info;
2897
2899 sizeof(obj_info), NULL );
2900 ok_(__FILE__, line)(!status, "NtQueryObject with err: %08lx\n", status);
2901 if (alt)
2902 ok_(__FILE__, line)(obj_info.GrantedAccess == access ||
2903 obj_info.GrantedAccess == alt, "Granted access should be 0x%08lx "
2904 "or 0x%08lx, instead of 0x%08lx\n", access, alt, obj_info.GrantedAccess);
2905 else
2906 ok_(__FILE__, line)(obj_info.GrantedAccess == access, "Granted access should "
2907 "be 0x%08lx, instead of 0x%08lx\n", access, obj_info.GrantedAccess);
2908}
2909
2910#define CHECK_SET_SECURITY(o,i,e) \
2911 do{ \
2912 BOOL res_; \
2913 DWORD err; \
2914 SetLastError( 0xdeadbeef ); \
2915 res_ = SetKernelObjectSecurity( o, i, SecurityDescriptor ); \
2916 err = GetLastError(); \
2917 if (e == ERROR_SUCCESS) \
2918 ok(res_, "SetKernelObjectSecurity failed with %ld\n", err); \
2919 else \
2920 ok(!res_ && err == e, "SetKernelObjectSecurity should have failed " \
2921 "with %s, instead of %ld\n", #e, err); \
2922 }while(0)
2923
2924static void test_process_security(void)
2925{
2926 BOOL res;
2928 PTOKEN_OWNER owner;
2930 PSID AdminSid = NULL, UsersSid = NULL, UserSid = NULL;
2931 PACL Acl = NULL, ThreadAcl = NULL;
2932 SECURITY_DESCRIPTOR *SecurityDescriptor = NULL, *ThreadSecurityDescriptor = NULL;
2938 DWORD size, acc_size, dom_size, ret;
2940 PSID EveryoneSid = NULL;
2941 SID_NAME_USE use;
2942
2943 Acl = malloc(256);
2944 res = InitializeAcl(Acl, 256, ACL_REVISION);
2946 {
2947 win_skip("ACLs not implemented - skipping tests\n");
2948 free(Acl);
2949 return;
2950 }
2951 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
2952
2953 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
2954 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
2955
2956 /* get owner from the token we might be running as a user not admin */
2958 ok(res, "OpenProcessToken failed with error %ld\n", GetLastError());
2959 if (!res)
2960 {
2961 free(Acl);
2962 return;
2963 }
2964
2966 ok(!res, "Expected failure, got %d\n", res);
2968 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2969
2970 owner = malloc(size);
2972 ok(res, "GetTokenInformation failed with error %ld\n", GetLastError());
2973 AdminSid = owner->Owner;
2975
2977 ok(!res, "Expected failure, got %d\n", res);
2979 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
2980
2981 group = malloc(size);
2983 ok(res, "GetTokenInformation failed with error %ld\n", GetLastError());
2984 UsersSid = group->PrimaryGroup;
2985 test_sid_str(UsersSid);
2986
2987 acc_size = sizeof(account);
2988 dom_size = sizeof(domain);
2989 ret = LookupAccountSidA( NULL, UsersSid, account, &acc_size, domain, &dom_size, &use );
2990 ok(ret, "LookupAccountSid failed with %ld\n", ret);
2991 ok(use == SidTypeGroup, "expect SidTypeGroup, got %d\n", use);
2993 skip("Non-English locale (test with hardcoded 'None')\n");
2994 else
2995 ok(!strcmp(account, "None"), "expect None, got %s\n", account);
2996
2998 ok(!res, "Expected failure, got %d\n", res);
3000 "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
3001
3002 user = malloc(size);
3004 ok(res, "GetTokenInformation failed with error %ld\n", GetLastError());
3005 UserSid = user->User.Sid;
3006 test_sid_str(UserSid);
3007 ok(EqualPrefixSid(UsersSid, UserSid), "TokenPrimaryGroup Sid and TokenUser Sid don't match.\n");
3008
3009 CloseHandle( token );
3010 if (!res)
3011 {
3012 free(group);
3013 free(owner);
3014 free(user);
3015 free(Acl);
3016 return;
3017 }
3018
3020 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError());
3022 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3023
3026 ok(res, "InitializeSecurityDescriptor failed with error %ld\n", GetLastError());
3027
3028 event = CreateEventA( NULL, TRUE, TRUE, "test_event" );
3029 ok(event != NULL, "CreateEvent %ld\n", GetLastError());
3030
3031 SecurityDescriptor->Revision = 0;
3034
3039 /* NULL DACL is valid and means that everyone has access */
3042
3043#ifdef __REACTOS__
3044 /* This crashes on Vista, Win7, and Win8.1. */
3046#endif
3047 /* Set owner and group and dacl */
3049 ok(res, "SetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
3051 test_owner_equal( event, AdminSid, __LINE__ );
3052
3054 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3056 test_group_equal( event, EveryoneSid, __LINE__ );
3057
3059 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
3061 /* setting a dacl should not change the owner or group */
3062 test_owner_equal( event, AdminSid, __LINE__ );
3063 test_group_equal( event, EveryoneSid, __LINE__ );
3064
3065 /* Test again with a different SID in case the previous SID also happens to
3066 * be the one that is incorrectly replacing the group. */
3068 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3070 test_group_equal( event, UsersSid, __LINE__ );
3071
3073 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
3075 test_group_equal( event, UsersSid, __LINE__ );
3076#ifdef __REACTOS__
3077 }
3078#endif
3079
3080 sprintf(buffer, "%s security test", myARGV[0]);
3081 memset(&startup, 0, sizeof(startup));
3082 startup.cb = sizeof(startup);
3083 startup.dwFlags = STARTF_USESHOWWINDOW;
3084 startup.wShowWindow = SW_SHOWNORMAL;
3085
3086 psa.nLength = sizeof(psa);
3087 psa.lpSecurityDescriptor = SecurityDescriptor;
3088 psa.bInheritHandle = TRUE;
3089
3090 ThreadSecurityDescriptor = malloc( SECURITY_DESCRIPTOR_MIN_LENGTH );
3091 res = InitializeSecurityDescriptor( ThreadSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION );
3092 ok(res, "InitializeSecurityDescriptor failed with error %ld\n", GetLastError());
3093
3094 ThreadAcl = malloc( 256 );
3095 res = InitializeAcl( ThreadAcl, 256, ACL_REVISION );
3096 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
3098 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError() );
3100 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3101
3102 res = SetSecurityDescriptorOwner( ThreadSecurityDescriptor, AdminSid, FALSE );
3103 ok(res, "SetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
3104 res = SetSecurityDescriptorGroup( ThreadSecurityDescriptor, UsersSid, FALSE );
3105 ok(res, "SetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3106 res = SetSecurityDescriptorDacl( ThreadSecurityDescriptor, TRUE, ThreadAcl, FALSE );
3107 ok(res, "SetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
3108
3109 tsa.nLength = sizeof(tsa);
3110 tsa.lpSecurityDescriptor = ThreadSecurityDescriptor;
3111 tsa.bInheritHandle = TRUE;
3112
3113 /* Doesn't matter what ACL say we should get full access for ourselves */
3114 res = CreateProcessA( NULL, buffer, &psa, &tsa, FALSE, 0, NULL, NULL, &startup, &info );
3115 ok(res, "CreateProcess with err:%ld\n", GetLastError());
3120 wait_child_process( info.hProcess );
3121
3122 FreeSid(EveryoneSid);
3123 CloseHandle( info.hProcess );
3124 CloseHandle( info.hThread );
3125 CloseHandle( event );
3126 free(group);
3127 free(owner);
3128 free(user);
3129 free(Acl);
3131 free(ThreadAcl);
3132 free(ThreadSecurityDescriptor);
3133}
3134
3136{
3137 HANDLE handle, handle1;
3138 BOOL ret;
3139 DWORD err;
3140
3142 ok(handle != NULL, "OpenProcess(PROCESS_TERMINATE) with err:%ld\n", GetLastError());
3144
3146 &handle1, 0, TRUE, DUPLICATE_SAME_ACCESS );
3147 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3149
3150 CloseHandle( handle1 );
3151
3152 SetLastError( 0xdeadbeef );
3154 &handle1, PROCESS_ALL_ACCESS, TRUE, 0 );
3155 err = GetLastError();
3156#ifdef __REACTOS__
3157 ok((!ret && err == ERROR_ACCESS_DENIED) || broken(ret && err == 0xdeadbeef) /* Vista-Win10 1607 */, "duplicating handle should have failed "
3158#else
3159 ok(!ret && err == ERROR_ACCESS_DENIED, "duplicating handle should have failed "
3160#endif
3161 "with STATUS_ACCESS_DENIED, instead of err:%ld\n", err);
3162
3164
3165#ifndef __REACTOS__ // Incorrect for WS03-Win10 1607
3166 /* These two should fail - they are denied by ACL */
3168 ok(handle == NULL, "OpenProcess(PROCESS_VM_READ) should have failed\n");
3170 ok(handle == NULL, "OpenProcess(PROCESS_ALL_ACCESS) should have failed\n");
3171#endif
3172
3173 /* Documented privilege elevation */
3176 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3179
3181
3182 /* Same only explicitly asking for all access rights */
3185 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3189 &handle1, PROCESS_VM_READ, TRUE, 0 );
3190 ok(ret, "duplicating handle err:%ld\n", GetLastError());
3192 CloseHandle( handle1 );
3194
3195 /* Test thread security */
3197 ok(handle != NULL, "OpenThread(THREAD_TERMINATE) with err:%ld\n", GetLastError());
3200
3201#ifndef __REACTOS__ // Incorrect for WS03-Win10 1607
3203 ok(handle == NULL, "OpenThread(THREAD_SET_THREAD_TOKEN) should have failed\n");
3204#endif
3205}
3206
3208{
3209 HANDLE Token, ProcessToken;
3210 HANDLE Token2;
3211 DWORD Size;
3214 PRIVILEGE_SET *PrivilegeSet;
3216 BOOL ret;
3217 HKEY hkey;
3218 DWORD error;
3219
3220 SetLastError(0xdeadbeef);
3223 {
3224 win_skip("ImpersonateSelf is not implemented\n");
3225 return;
3226 }
3227 ok(ret, "ImpersonateSelf(SecurityAnonymous) failed with error %ld\n", GetLastError());
3229 ok(!ret, "OpenThreadToken should have failed\n");
3230 error = GetLastError();
3231 ok(error == ERROR_CANT_OPEN_ANONYMOUS, "OpenThreadToken on anonymous token should have returned ERROR_CANT_OPEN_ANONYMOUS instead of %ld\n", error);
3232 /* can't perform access check when opening object against an anonymous impersonation token */
3233 todo_wine {
3234 error = RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
3236 "RegOpenKeyEx failed with %ld\n", error);
3237 }
3238 RevertToSelf();
3239
3241 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
3242
3243 ret = DuplicateTokenEx(ProcessToken,
3246 ok(ret, "DuplicateTokenEx failed with error %ld\n", GetLastError());
3247 /* can't increase the impersonation level */
3249 error = GetLastError();
3251 "Duplicating a token and increasing the impersonation level should have failed with ERROR_BAD_IMPERSONATION_LEVEL instead of %ld\n", error);
3252 /* we can query anything from an anonymous token, including the user */
3254 error = GetLastError();
3255 ok(!ret && error == ERROR_INSUFFICIENT_BUFFER, "GetTokenInformation(TokenUser) should have failed with ERROR_INSUFFICIENT_BUFFER instead of %ld\n", error);
3256 User = malloc(Size);
3258 ok(ret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3259 free(User);
3260
3261 /* PrivilegeCheck fails with SecurityAnonymous level */
3263 error = GetLastError();
3264 ok(!ret && error == ERROR_INSUFFICIENT_BUFFER, "GetTokenInformation(TokenPrivileges) should have failed with ERROR_INSUFFICIENT_BUFFER instead of %ld\n", error);
3267 ok(ret, "GetTokenInformation(TokenPrivileges) failed with error %ld\n", GetLastError());
3268
3269 PrivilegeSet = malloc(FIELD_OFFSET(PRIVILEGE_SET, Privilege[Privileges->PrivilegeCount]));
3270 PrivilegeSet->PrivilegeCount = Privileges->PrivilegeCount;
3271 memcpy(PrivilegeSet->Privilege, Privileges->Privileges, PrivilegeSet->PrivilegeCount * sizeof(PrivilegeSet->Privilege[0]));
3272 PrivilegeSet->Control = PRIVILEGE_SET_ALL_NECESSARY;
3274
3275 ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
3276 error = GetLastError();
3277 ok(!ret && error == ERROR_BAD_IMPERSONATION_LEVEL, "PrivilegeCheck for SecurityAnonymous token should have failed with ERROR_BAD_IMPERSONATION_LEVEL instead of %ld\n", error);
3278
3280
3282 ok(ret, "ImpersonateSelf(SecurityIdentification) failed with error %ld\n", GetLastError());
3284 ok(ret, "OpenThreadToken failed with error %ld\n", GetLastError());
3285
3286 /* can't perform access check when opening object against an identification impersonation token */
3287 error = RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
3288 todo_wine {
3290 "RegOpenKeyEx should have failed with ERROR_INVALID_HANDLE, ERROR_BAD_IMPERSONATION_LEVEL or ERROR_ACCESS_DENIED instead of %ld\n", error);
3291 }
3292 ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
3293 ok(ret, "PrivilegeCheck for SecurityIdentification failed with error %ld\n", GetLastError());
3295 RevertToSelf();
3296
3298 ok(ret, "ImpersonateSelf(SecurityImpersonation) failed with error %ld\n", GetLastError());
3300 ok(ret, "OpenThreadToken failed with error %ld\n", GetLastError());
3301 error = RegOpenKeyExA(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
3302 ok(error == ERROR_SUCCESS, "RegOpenKeyEx should have succeeded instead of failing with %ld\n", error);
3303 RegCloseKey(hkey);
3304 ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
3305 ok(ret, "PrivilegeCheck for SecurityImpersonation failed with error %ld\n", GetLastError());
3306 RevertToSelf();
3307
3309 CloseHandle(ProcessToken);
3310
3311 free(PrivilegeSet);
3312}
3313
3314static void test_SetEntriesInAclW(void)
3315{
3316 DWORD res;
3317 PSID EveryoneSid = NULL, UsersSid = NULL;
3318 PACL OldAcl = NULL, NewAcl;
3321 EXPLICIT_ACCESSW ExplicitAccess;
3322 static const WCHAR wszEveryone[] = {'E','v','e','r','y','o','n','e',0};
3323 static const WCHAR wszCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
3324
3325 NewAcl = (PACL)0xdeadbeef;
3326 res = SetEntriesInAclW(0, NULL, NULL, &NewAcl);
3327 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3328 ok(NewAcl == NULL, "NewAcl=%p, expected NULL\n", NewAcl);
3329 LocalFree(NewAcl);
3330
3331 OldAcl = malloc(256);
3332 res = InitializeAcl(OldAcl, 256, ACL_REVISION);
3334 {
3335 win_skip("ACLs not implemented - skipping tests\n");
3336 free(OldAcl);
3337 return;
3338 }
3339 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
3340
3341 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
3342 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3343
3345 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &UsersSid);
3346 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3347
3348 res = AddAccessAllowedAce(OldAcl, ACL_REVISION, KEY_READ, UsersSid);
3349 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3350
3351 ExplicitAccess.grfAccessPermissions = KEY_WRITE;
3352 ExplicitAccess.grfAccessMode = GRANT_ACCESS;
3353 ExplicitAccess.grfInheritance = NO_INHERITANCE;
3355 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3356 ExplicitAccess.Trustee.ptstrName = EveryoneSid;
3357 ExplicitAccess.Trustee.MultipleTrusteeOperation = 0xDEADBEEF;
3358 ExplicitAccess.Trustee.pMultipleTrustee = (PVOID)0xDEADBEEF;
3359 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3360 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3361 ok(NewAcl != NULL, "returned acl was NULL\n");
3362 LocalFree(NewAcl);
3363
3364 ExplicitAccess.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
3365 ExplicitAccess.Trustee.pMultipleTrustee = NULL;
3367 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3368 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3369 ok(NewAcl != NULL, "returned acl was NULL\n");
3370 LocalFree(NewAcl);
3371
3373 {
3374 skip("Non-English locale (test with hardcoded 'Everyone')\n");
3375 }
3376 else
3377 {
3378 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3379 ExplicitAccess.Trustee.ptstrName = (LPWSTR)wszEveryone;
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.Trustee.TrusteeForm = TRUSTEE_BAD_FORM;
3386 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3388 "SetEntriesInAclW failed: %lu\n", res);
3389 ok(NewAcl == NULL,
3390 "returned acl wasn't NULL: %p\n", NewAcl);
3391
3392 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3394 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3396 "SetEntriesInAclW failed: %lu\n", res);
3397 ok(NewAcl == NULL,
3398 "returned acl wasn't NULL: %p\n", NewAcl);
3399
3401 ExplicitAccess.grfAccessMode = SET_ACCESS;
3402 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3403 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3404 ok(NewAcl != NULL, "returned acl was NULL\n");
3405 LocalFree(NewAcl);
3406 }
3407
3408 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3409 ExplicitAccess.Trustee.ptstrName = (LPWSTR)wszCurrentUser;
3410 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3411 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3412 ok(NewAcl != NULL, "returned acl was NULL\n");
3413 LocalFree(NewAcl);
3414
3415 ExplicitAccess.grfAccessMode = REVOKE_ACCESS;
3416 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3417 ExplicitAccess.Trustee.ptstrName = UsersSid;
3418 res = SetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
3419 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
3420 ok(NewAcl != NULL, "returned acl was NULL\n");
3421 LocalFree(NewAcl);
3422
3423 FreeSid(UsersSid);
3424 FreeSid(EveryoneSid);
3425 free(OldAcl);
3426}
3427
3428static void test_SetEntriesInAclA(void)
3429{
3430 DWORD res;
3431 PSID EveryoneSid = NULL, UsersSid = NULL;
3432 PACL OldAcl = NULL, NewAcl;
3435 EXPLICIT_ACCESSA ExplicitAccess;
3436 static const CHAR szEveryone[] = {'E','v','e','r','y','o','n','e',0};
3437 static const CHAR szCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
3438
3439 NewAcl = (PACL)0xdeadbeef;
3440 res = SetEntriesInAclA(0, NULL, NULL, &NewAcl);
3442 {
3443 win_skip("SetEntriesInAclA is not implemented\n");
3444 return;
3445 }
3446 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3447 ok(NewAcl == NULL,
3448 "NewAcl=%p, expected NULL\n", NewAcl);
3449 LocalFree(NewAcl);
3450
3451 OldAcl = malloc(256);
3452 res = InitializeAcl(OldAcl, 256, ACL_REVISION);
3454 {
3455 win_skip("ACLs not implemented - skipping tests\n");
3456 free(OldAcl);
3457 return;
3458 }
3459 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
3460
3461 res = AllocateAndInitializeSid( &SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &EveryoneSid);
3462 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3463
3465 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &UsersSid);
3466 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
3467
3468 res = AddAccessAllowedAce(OldAcl, ACL_REVISION, KEY_READ, UsersSid);
3469 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
3470
3471 ExplicitAccess.grfAccessPermissions = KEY_WRITE;
3472 ExplicitAccess.grfAccessMode = GRANT_ACCESS;
3473 ExplicitAccess.grfInheritance = NO_INHERITANCE;
3475 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3476 ExplicitAccess.Trustee.ptstrName = EveryoneSid;
3478 ExplicitAccess.Trustee.pMultipleTrustee = NULL;
3479 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3480 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3481 ok(NewAcl != NULL, "returned acl was NULL\n");
3482 LocalFree(NewAcl);
3483
3484 ExplicitAccess.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
3485 ExplicitAccess.Trustee.pMultipleTrustee = NULL;
3487 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3488 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3489 ok(NewAcl != NULL, "returned acl was NULL\n");
3490 LocalFree(NewAcl);
3491
3493 {
3494 skip("Non-English locale (test with hardcoded 'Everyone')\n");
3495 }
3496 else
3497 {
3498 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3499 ExplicitAccess.Trustee.ptstrName = (LPSTR)szEveryone;
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.Trustee.TrusteeForm = TRUSTEE_BAD_FORM;
3506 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3508 "SetEntriesInAclA failed: %lu\n", res);
3509 ok(NewAcl == NULL,
3510 "returned acl wasn't NULL: %p\n", NewAcl);
3511
3512 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3514 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3516 "SetEntriesInAclA failed: %lu\n", res);
3517 ok(NewAcl == NULL,
3518 "returned acl wasn't NULL: %p\n", NewAcl);
3519
3521 ExplicitAccess.grfAccessMode = SET_ACCESS;
3522 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3523 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3524 ok(NewAcl != NULL, "returned acl was NULL\n");
3525 LocalFree(NewAcl);
3526 }
3527
3528 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
3529 ExplicitAccess.Trustee.ptstrName = (LPSTR)szCurrentUser;
3530 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3531 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3532 ok(NewAcl != NULL, "returned acl was NULL\n");
3533 LocalFree(NewAcl);
3534
3535 ExplicitAccess.grfAccessMode = REVOKE_ACCESS;
3536 ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
3537 ExplicitAccess.Trustee.ptstrName = UsersSid;
3538 res = SetEntriesInAclA(1, &ExplicitAccess, OldAcl, &NewAcl);
3539 ok(res == ERROR_SUCCESS, "SetEntriesInAclA failed: %lu\n", res);
3540 ok(NewAcl != NULL, "returned acl was NULL\n");
3541 LocalFree(NewAcl);
3542
3543 FreeSid(UsersSid);
3544 FreeSid(EveryoneSid);
3545 free(OldAcl);
3546}
3547
3548/* helper function for test_CreateDirectoryA */
3549static void get_nt_pathW(const char *name, UNICODE_STRING *nameW)
3550{
3554 BOOLEAN ret;
3555
3557
3559 ok(!status, "RtlAnsiStringToUnicodeString failed with %08lx\n", status);
3560
3561 ret = pRtlDosPathNameToNtPathName_U(strW.Buffer, nameW, NULL, NULL);
3562 ok(ret, "RtlDosPathNameToNtPathName_U failed\n");
3563
3565}
3566
3567static void test_inherited_dacl(PACL dacl, PSID admin_sid, PSID user_sid, DWORD flags, DWORD mask,
3568 BOOL todo_count, BOOL todo_sid, BOOL todo_flags, int line)
3569{
3570 ACL_SIZE_INFORMATION acl_size;
3571 ACCESS_ALLOWED_ACE *ace;
3572 BOOL bret;
3573
3574 bret = GetAclInformation(dacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3575 ok_(__FILE__, line)(bret, "GetAclInformation failed\n");
3576
3577 todo_wine_if (todo_count)
3578 ok_(__FILE__, line)(acl_size.AceCount == 2,
3579 "GetAclInformation returned unexpected entry count (%ld != 2)\n",
3580 acl_size.AceCount);
3581
3582 if (acl_size.AceCount > 0)
3583 {
3584 bret = GetAce(dacl, 0, (VOID **)&ace);
3585 ok_(__FILE__, line)(bret, "Failed to get Current User ACE\n");
3586
3587 bret = EqualSid(&ace->SidStart, user_sid);
3588 todo_wine_if (todo_sid)
3589 ok_(__FILE__, line)(bret, "Current User ACE (%s) != Current User SID (%s)\n", debugstr_sid(&ace->SidStart), debugstr_sid(user_sid));
3590
3591 todo_wine_if (todo_flags)
3592 ok_(__FILE__, line)(((ACE_HEADER *)ace)->AceFlags == flags,
3593 "Current User ACE has unexpected flags (0x%x != 0x%lx)\n",
3594 ((ACE_HEADER *)ace)->AceFlags, flags);
3595
3596 ok_(__FILE__, line)(ace->Mask == mask,
3597 "Current User ACE has unexpected mask (0x%lx != 0x%lx)\n",
3598 ace->Mask, mask);
3599 }
3600 if (acl_size.AceCount > 1)
3601 {
3602 bret = GetAce(dacl, 1, (VOID **)&ace);
3603 ok_(__FILE__, line)(bret, "Failed to get Administators Group ACE\n");
3604
3605 bret = EqualSid(&ace->SidStart, admin_sid);
3606 todo_wine_if (todo_sid)
3607 ok_(__FILE__, line)(bret, "Administators Group ACE (%s) != Administators Group SID (%s)\n", debugstr_sid(&ace->SidStart), debugstr_sid(admin_sid));
3608
3609 todo_wine_if (todo_flags)
3610 ok_(__FILE__, line)(((ACE_HEADER *)ace)->AceFlags == flags,
3611 "Administators Group ACE has unexpected flags (0x%x != 0x%lx)\n",
3612 ((ACE_HEADER *)ace)->AceFlags, flags);
3613
3614 ok_(__FILE__, line)(ace->Mask == mask,
3615 "Administators Group ACE has unexpected mask (0x%lx != 0x%lx)\n",
3616 ace->Mask, mask);
3617 }
3618}
3619
3620static void test_CreateDirectoryA(void)
3621{
3622 char admin_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES], *user;
3623 DWORD sid_size = sizeof(admin_ptr), user_size;
3624 PSID admin_sid = (PSID) admin_ptr, user_sid;
3626 PSECURITY_DESCRIPTOR pSD = &sd;
3627 ACL_SIZE_INFORMATION acl_size;
3628 UNICODE_STRING tmpfileW;
3631 char tmpfile[MAX_PATH];
3632 char tmpdir[MAX_PATH];
3633 HANDLE token, hTemp;
3635 struct _SID *owner;
3636 BOOL bret = TRUE;
3638 DWORD error;
3639 PACL pDacl;
3640
3642 {
3643 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
3645 }
3646 if (!bret)
3647 {
3648 win_skip("Failed to get current user token\n");
3649 return;
3650 }
3651 bret = GetTokenInformation(token, TokenUser, NULL, 0, &user_size);
3653 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3654 user = malloc(user_size);
3655 bret = GetTokenInformation(token, TokenUser, user, user_size, &user_size);
3656 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3657 CloseHandle( token );
3658 user_sid = ((TOKEN_USER *)user)->User.Sid;
3659
3660 sa.nLength = sizeof(sa);
3661 sa.lpSecurityDescriptor = pSD;
3662 sa.bInheritHandle = TRUE;
3664 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
3665 pDacl = calloc(1, 100);
3666 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
3667 ok(bret, "Failed to initialize ACL.\n");
3669 GENERIC_ALL, user_sid);
3670 ok(bret, "Failed to add Current User to ACL.\n");
3672 GENERIC_ALL, admin_sid);
3673 ok(bret, "Failed to add Administrator Group to ACL.\n");
3674 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3675 ok(bret, "Failed to add ACL to security descriptor.\n");
3676
3678 lstrcatA(tmpdir, "Please Remove Me");
3679 bret = CreateDirectoryA(tmpdir, &sa);
3680 ok(bret == TRUE, "CreateDirectoryA(%s) failed err=%ld\n", tmpdir, GetLastError());
3681 free(pDacl);
3682
3683#ifdef __REACTOS__
3684 /* The rest of this test crashes on WS03, Vista, Win7, and Win8.1. */
3686 goto done;
3687#endif
3688 SetLastError(0xdeadbeef);
3691 NULL, &pDacl, NULL, &pSD);
3693 {
3694 win_skip("GetNamedSecurityInfoA is not implemented\n");
3695 goto done;
3696 }
3697 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3699 0x1f01ff, FALSE, TRUE, FALSE, __LINE__);
3700 LocalFree(pSD);
3701
3702 /* Test inheritance of ACLs in CreateFile without security descriptor */
3704 lstrcatA(tmpfile, "/tmpfile");
3705
3708 ok(hTemp != INVALID_HANDLE_VALUE, "CreateFile error %lu\n", GetLastError());
3709
3712 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3713 ok(error == ERROR_SUCCESS, "Failed to get permissions on file\n");
3714 test_inherited_dacl(pDacl, admin_sid, user_sid, INHERITED_ACE,
3715 0x1f01ff, TRUE, TRUE, TRUE, __LINE__);
3716 LocalFree(pSD);
3717 CloseHandle(hTemp);
3718
3719 /* Test inheritance of ACLs in CreateFile with security descriptor -
3720 * When a security descriptor is set, then inheritance doesn't take effect */
3721 pSD = &sd;
3723 pDacl = malloc(sizeof(ACL));
3724 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
3725 ok(bret, "Failed to initialize ACL\n");
3726 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3727 ok(bret, "Failed to add ACL to security descriptor\n");
3728
3730 lstrcatA(tmpfile, "/tmpfile");
3731
3732 sa.nLength = sizeof(sa);
3733 sa.lpSecurityDescriptor = pSD;
3734 sa.bInheritHandle = TRUE;
3737 ok(hTemp != INVALID_HANDLE_VALUE, "CreateFile error %lu\n", GetLastError());
3738 free(pDacl);
3739
3741 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3742 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3743 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3744 ok(bret, "GetAclInformation failed\n");
3745 todo_wine
3746 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3747 acl_size.AceCount);
3748 LocalFree(pSD);
3749
3752 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3753 todo_wine
3754 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3755 if (error == ERROR_SUCCESS)
3756 {
3757 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3758 ok(bret, "GetAclInformation failed\n");
3759 todo_wine
3760 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3761 acl_size.AceCount);
3762 LocalFree(pSD);
3763 }
3764 CloseHandle(hTemp);
3765
3766 /* Test inheritance of ACLs in NtCreateFile without security descriptor */
3768 lstrcatA(tmpfile, "/tmpfile");
3769 get_nt_pathW(tmpfile, &tmpfileW);
3770
3771 attr.Length = sizeof(attr);
3772 attr.RootDirectory = 0;
3773 attr.ObjectName = &tmpfileW;
3774 attr.Attributes = OBJ_CASE_INSENSITIVE;
3775 attr.SecurityDescriptor = NULL;
3776 attr.SecurityQualityOfService = NULL;
3777
3778 status = NtCreateFile(&hTemp, GENERIC_WRITE | DELETE, &attr, &io, NULL, 0,
3780 ok(!status, "NtCreateFile failed with %08lx\n", status);
3781 RtlFreeUnicodeString(&tmpfileW);
3782
3785 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3786 ok(error == ERROR_SUCCESS, "Failed to get permissions on file\n");
3787 test_inherited_dacl(pDacl, admin_sid, user_sid, INHERITED_ACE,
3788 0x1f01ff, TRUE, TRUE, TRUE, __LINE__);
3789 LocalFree(pSD);
3790 CloseHandle(hTemp);
3791
3792 /* Test inheritance of ACLs in NtCreateFile with security descriptor -
3793 * When a security descriptor is set, then inheritance doesn't take effect */
3794 pSD = &sd;
3796 pDacl = malloc(sizeof(ACL));
3797 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
3798 ok(bret, "Failed to initialize ACL\n");
3799 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3800 ok(bret, "Failed to add ACL to security descriptor\n");
3801
3803 lstrcatA(tmpfile, "/tmpfile");
3804 get_nt_pathW(tmpfile, &tmpfileW);
3805
3806 attr.Length = sizeof(attr);
3807 attr.RootDirectory = 0;
3808 attr.ObjectName = &tmpfileW;
3809 attr.Attributes = OBJ_CASE_INSENSITIVE;
3810 attr.SecurityDescriptor = pSD;
3811 attr.SecurityQualityOfService = NULL;
3812
3813 status = NtCreateFile(&hTemp, GENERIC_WRITE | DELETE, &attr, &io, NULL, 0,
3815 ok(!status, "NtCreateFile failed with %08lx\n", status);
3816 RtlFreeUnicodeString(&tmpfileW);
3817 free(pDacl);
3818
3820 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3821 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3822 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3823 ok(bret, "GetAclInformation failed\n");
3824 todo_wine
3825 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3826 acl_size.AceCount);
3827 LocalFree(pSD);
3828
3831 (PSID *)&owner, NULL, &pDacl, NULL, &pSD);
3832 todo_wine
3833 ok(error == ERROR_SUCCESS, "GetNamedSecurityInfo failed with error %ld\n", error);
3834 if (error == ERROR_SUCCESS)
3835 {
3836 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
3837 ok(bret, "GetAclInformation failed\n");
3838 todo_wine
3839 ok(acl_size.AceCount == 0, "GetAclInformation returned unexpected entry count (%ld != 0).\n",
3840 acl_size.AceCount);
3841 LocalFree(pSD);
3842 }
3843 CloseHandle(hTemp);
3844
3845done:
3846 free(user);
3847 bret = RemoveDirectoryA(tmpdir);
3848 ok(bret == TRUE, "RemoveDirectoryA should always succeed\n");
3849}
3850
3852{
3853 char admin_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES], *user;
3854 char system_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES];
3855 char users_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES];
3857 PSID admin_sid = (PSID) admin_ptr, users_sid = (PSID) users_ptr;
3858 PSID system_sid = (PSID) system_ptr, user_sid, localsys_sid;
3859 DWORD sid_size = sizeof(admin_ptr), user_size;
3860 char invalid_path[] = "/an invalid file path";
3861 int users_ace_id = -1, admins_ace_id = -1, i;
3862 char software_key[] = "MACHINE\\Software";
3863 char sd[SECURITY_DESCRIPTOR_MIN_LENGTH+sizeof(void*)];
3865 ACL_SIZE_INFORMATION acl_size;
3868 ACCESS_ALLOWED_ACE *ace;
3869 BOOL bret = TRUE;
3870 char tmpfile[MAX_PATH];
3872 BOOL owner_defaulted;
3873 BOOL group_defaulted;
3874 BOOL dacl_defaulted;
3875 HANDLE token, hTemp, h;
3876 PSID owner, group;
3877 BOOL dacl_present;
3878 PACL pDacl;
3879 BYTE flags;
3881
3883 {
3884 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
3886 }
3887 if (!bret)
3888 {
3889 win_skip("Failed to get current user token\n");
3890 return;
3891 }
3892 bret = GetTokenInformation(token, TokenUser, NULL, 0, &user_size);
3894 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3895 user = malloc(user_size);
3896 bret = GetTokenInformation(token, TokenUser, user, user_size, &user_size);
3897 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
3898 CloseHandle( token );
3899 user_sid = ((TOKEN_USER *)user)->User.Sid;
3900
3902 ok(bret, "GetWindowsDirectory failed with error %ld\n", GetLastError());
3903
3904#ifdef __REACTOS__
3905 /* The rest of this test crashes on WS03, Vista, Win7, and Win8.1 */
3907 free(user);
3908 return;
3909 }
3910#endif
3911 SetLastError(0xdeadbeef);
3914 NULL, NULL, NULL, NULL, &pSD);
3916 {
3917 win_skip("GetNamedSecurityInfoA is not implemented\n");
3918 free(user);
3919 return;
3920 }
3921 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3922
3924 ok(bret, "GetSecurityDescriptorControl failed with error %ld\n", GetLastError());
3926 "control (0x%x) doesn't have (SE_SELF_RELATIVE|SE_DACL_PRESENT) flags set\n", control);
3927 ok(revision == SECURITY_DESCRIPTOR_REVISION1, "revision was %ld instead of 1\n", revision);
3928
3929 bret = GetSecurityDescriptorOwner(pSD, &owner, &owner_defaulted);
3930 ok(bret, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
3931 ok(owner != NULL, "owner should not be NULL\n");
3932
3933 bret = GetSecurityDescriptorGroup(pSD, &group, &group_defaulted);
3934 ok(bret, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
3935 ok(group != NULL, "group should not be NULL\n");
3936 LocalFree(pSD);
3937
3938
3939 /* NULL descriptor tests */
3940
3942 NULL, NULL, NULL, NULL, NULL);
3943 ok(error==ERROR_INVALID_PARAMETER, "GetNamedSecurityInfo failed with error %ld\n", error);
3944
3945 pDacl = NULL;
3947 NULL, NULL, &pDacl, NULL, &pSD);
3948 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
3949 ok(pDacl != NULL, "DACL should not be NULL\n");
3950 LocalFree(pSD);
3951
3953 NULL, NULL, &pDacl, NULL, NULL);
3954 ok(error==ERROR_INVALID_PARAMETER, "GetNamedSecurityInfo failed with error %ld\n", error);
3955
3956 /* Test behavior of SetNamedSecurityInfo with an invalid path */
3957 SetLastError(0xdeadbeef);
3959 NULL, NULL, NULL);
3960 ok(error == ERROR_FILE_NOT_FOUND, "Unexpected error returned: 0x%lx\n", error);
3961 ok(GetLastError() == 0xdeadbeef, "Expected last error to remain unchanged.\n");
3962
3963 /* Create security descriptor information and test that it comes back the same */
3964 pSD = &sd;
3965 pDacl = malloc(100);
3967 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
3968 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
3969 ok(bret, "Failed to initialize ACL.\n");
3970 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
3971 ok(bret, "Failed to add Current User to ACL.\n");
3972 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, admin_sid);
3973 ok(bret, "Failed to add Administrator Group to ACL.\n");
3974 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
3975 ok(bret, "Failed to add ACL to security descriptor.\n");
3976 GetTempFileNameA(".", "foo", 0, tmpfile);
3979 SetLastError(0xdeadbeef);
3981 NULL, pDacl, NULL);
3982 free(pDacl);
3984 {
3985 win_skip("SetNamedSecurityInfoA is not implemented\n");
3986 free(user);
3987 CloseHandle(hTemp);
3988 return;
3989 }
3990 ok(!error, "SetNamedSecurityInfoA failed with error %ld\n", error);
3991 SetLastError(0xdeadbeef);
3993 NULL, NULL, &pDacl, NULL, &pSD);
3995 {
3996 win_skip("GetNamedSecurityInfoA is not implemented\n");
3997 free(user);
3998 CloseHandle(hTemp);
3999 return;
4000 }
4001 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4002
4003 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4004 ok(bret, "GetAclInformation failed\n");
4005 if (acl_size.AceCount > 0)
4006 {
4007 bret = GetAce(pDacl, 0, (VOID **)&ace);
4008 ok(bret, "Failed to get Current User ACE.\n");
4009 bret = EqualSid(&ace->SidStart, user_sid);
4010 todo_wine ok(bret, "Current User ACE (%s) != Current User SID (%s).\n",
4011 debugstr_sid(&ace->SidStart), debugstr_sid(user_sid));
4012 ok(((ACE_HEADER *)ace)->AceFlags == 0,
4013 "Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
4014 ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%lx != 0x1f01ff)\n",
4015 ace->Mask);
4016 }
4017 if (acl_size.AceCount > 1)
4018 {
4019 bret = GetAce(pDacl, 1, (VOID **)&ace);
4020 ok(bret, "Failed to get Administators Group ACE.\n");
4021 bret = EqualSid(&ace->SidStart, admin_sid);
4022 todo_wine ok(bret || broken(!bret) /* win2k */,
4023 "Administators Group ACE (%s) != Administators Group SID (%s).\n",
4024 debugstr_sid(&ace->SidStart), debugstr_sid(admin_sid));
4025 ok(((ACE_HEADER *)ace)->AceFlags == 0,
4026 "Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
4027 ok(ace->Mask == 0x1f01ff || broken(ace->Mask == GENERIC_ALL) /* win2k */,
4028 "Administators Group ACE has unexpected mask (0x%lx != 0x1f01ff)\n", ace->Mask);
4029 }
4030 LocalFree(pSD);
4031
4032 /* show that setting empty DACL is not removing all file permissions */
4033 pDacl = malloc(sizeof(ACL));
4034 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
4035 ok(bret, "Failed to initialize ACL.\n");
4037 NULL, NULL, pDacl, NULL);
4038 ok(!error, "SetNamedSecurityInfoA failed with error %ld\n", error);
4039 free(pDacl);
4040
4042 NULL, NULL, &pDacl, NULL, &pSD);
4043 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4044
4045 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4046 ok(bret, "GetAclInformation failed\n");
4047 if (acl_size.AceCount > 0)
4048 {
4049 bret = GetAce(pDacl, 0, (VOID **)&ace);
4050 ok(bret, "Failed to get ACE.\n");
4052 "ACE has unexpected flags: 0x%x\n", ((ACE_HEADER *)ace)->AceFlags);
4053 }
4054 LocalFree(pSD);
4055
4057 NULL, OPEN_EXISTING, 0, NULL);
4058 ok(h != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4059 CloseHandle(h);
4060
4061 /* test setting NULL DACL */
4064 ok(!error, "SetNamedSecurityInfoA failed with error %ld\n", error);
4065
4067 NULL, NULL, &pDacl, NULL, &pSD);
4068 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4069 todo_wine ok(!pDacl, "pDacl != NULL\n");
4070 LocalFree(pSD);
4071
4073 NULL, OPEN_EXISTING, 0, NULL);
4074 ok(h != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4075 CloseHandle(h);
4076
4077 /* NtSetSecurityObject doesn't inherit DACL entries */
4078 pSD = sd+sizeof(void*)-((ULONG_PTR)sd)%sizeof(void*);
4080 pDacl = malloc(100);
4081 bret = InitializeAcl(pDacl, sizeof(ACL), ACL_REVISION);
4082 ok(bret, "Failed to initialize ACL.\n");
4083 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4084 ok(bret, "Failed to add ACL to security descriptor.\n");
4086 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4087
4089 NULL, OPEN_EXISTING, 0, NULL);
4090 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4091 CloseHandle(h);
4092
4095 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4096
4098 NULL, OPEN_EXISTING, 0, NULL);
4099 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4100 CloseHandle(h);
4101
4105 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4106
4108 NULL, OPEN_EXISTING, 0, NULL);
4109 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4110 CloseHandle(h);
4111
4112 /* test if DACL is properly mapped to permission */
4113 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
4114 ok(bret, "Failed to initialize ACL.\n");
4115 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4116 ok(bret, "Failed to add Current User to ACL.\n");
4117 bret = AddAccessDeniedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4118 ok(bret, "Failed to add Current User to ACL.\n");
4119 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4120 ok(bret, "Failed to add ACL to security descriptor.\n");
4122 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4123
4125 NULL, OPEN_EXISTING, 0, NULL);
4126 ok(h != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4127 CloseHandle(h);
4128
4129 bret = InitializeAcl(pDacl, 100, ACL_REVISION);
4130 ok(bret, "Failed to initialize ACL.\n");
4131 bret = AddAccessDeniedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4132 ok(bret, "Failed to add Current User to ACL.\n");
4133 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4134 ok(bret, "Failed to add Current User to ACL.\n");
4135 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4136 ok(bret, "Failed to add ACL to security descriptor.\n");
4138 ok(status == ERROR_SUCCESS, "NtSetSecurityObject returned %lx\n", status);
4139
4141 NULL, OPEN_EXISTING, 0, NULL);
4142 ok(h == INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
4143 free(pDacl);
4144 free(user);
4145 CloseHandle(hTemp);
4146
4147 /* Test querying the ownership of a built-in registry key */
4148 sid_size = sizeof(system_ptr);
4149 CreateWellKnownSid(WinLocalSystemSid, NULL, system_sid, &sid_size);
4152 NULL, NULL, NULL, NULL, &pSD);
4153 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4154
4155 bret = AllocateAndInitializeSid(&SIDAuthNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &localsys_sid);
4156 ok(bret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
4157
4158 bret = GetSecurityDescriptorOwner(pSD, &owner, &owner_defaulted);
4159 ok(bret, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
4160 ok(owner != NULL, "owner should not be NULL\n");
4161 ok(EqualSid(owner, admin_sid) || EqualSid(owner, localsys_sid),
4162 "MACHINE\\Software owner SID (%s) != Administrators SID (%s) or Local System Sid (%s).\n",
4163 debugstr_sid(owner), debugstr_sid(admin_sid), debugstr_sid(localsys_sid));
4164
4165 bret = GetSecurityDescriptorGroup(pSD, &group, &group_defaulted);
4166 ok(bret, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
4167 ok(group != NULL, "group should not be NULL\n");
4168 ok(EqualSid(group, admin_sid) || broken(EqualSid(group, system_sid)) /* before Win7 */
4169 || broken(((SID*)group)->SubAuthority[0] == SECURITY_NT_NON_UNIQUE) /* Vista */,
4170 "MACHINE\\Software group SID (%s) != Local System SID (%s or %s)\n",
4171 debugstr_sid(group), debugstr_sid(admin_sid), debugstr_sid(system_sid));
4172 LocalFree(pSD);
4173
4174 /* Test querying the DACL of a built-in registry key */
4175 sid_size = sizeof(users_ptr);
4176 CreateWellKnownSid(WinBuiltinUsersSid, NULL, users_sid, &sid_size);
4178 NULL, NULL, NULL, NULL, &pSD);
4179 ok(!error, "GetNamedSecurityInfo failed with error %ld\n", error);
4180
4181 bret = GetSecurityDescriptorDacl(pSD, &dacl_present, &pDacl, &dacl_defaulted);
4182 ok(bret, "GetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
4183 ok(dacl_present, "DACL should be present\n");
4184 ok(pDacl && IsValidAcl(pDacl), "GetSecurityDescriptorDacl returned invalid DACL.\n");
4185 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4186 ok(bret, "GetAclInformation failed\n");
4187 ok(acl_size.AceCount != 0, "GetAclInformation returned no ACLs\n");
4188 for (i=0; i<acl_size.AceCount; i++)
4189 {
4190 bret = GetAce(pDacl, i, (VOID **)&ace);
4191 ok(bret, "Failed to get ACE %d.\n", i);
4192 bret = EqualSid(&ace->SidStart, users_sid);
4193 if (bret) users_ace_id = i;
4194 bret = EqualSid(&ace->SidStart, admin_sid);
4195 if (bret) admins_ace_id = i;
4196 }
4197 ok(users_ace_id != -1 || broken(users_ace_id == -1) /* win2k */,
4198 "Builtin Users ACE not found.\n");
4199 if (users_ace_id != -1)
4200 {
4201 bret = GetAce(pDacl, users_ace_id, (VOID **)&ace);
4202 ok(bret, "Failed to get Builtin Users ACE.\n");
4203 flags = ((ACE_HEADER *)ace)->AceFlags;
4206 || broken(flags == (CONTAINER_INHERIT_ACE|INHERITED_ACE)) /* win 10 wow64 */
4207 || broken(flags == CONTAINER_INHERIT_ACE), /* win 10 */
4208 "Builtin Users ACE has unexpected flags (0x%x != 0x%x)\n", flags,
4210 ok(ace->Mask == GENERIC_READ
4211 || broken(ace->Mask == KEY_READ), /* win 10 */
4212 "Builtin Users ACE has unexpected mask (0x%lx != 0x%x)\n",
4213 ace->Mask, GENERIC_READ);
4214 }
4215 ok(admins_ace_id != -1, "Builtin Admins ACE not found.\n");
4216 if (admins_ace_id != -1)
4217 {
4218 bret = GetAce(pDacl, admins_ace_id, (VOID **)&ace);
4219 ok(bret, "Failed to get Builtin Admins ACE.\n");
4220 flags = ((ACE_HEADER *)ace)->AceFlags;
4221 ok(flags == 0x0
4225 || broken(flags == (CONTAINER_INHERIT_ACE|INHERITED_ACE)) /* win 10 wow64 */
4226 || broken(flags == CONTAINER_INHERIT_ACE), /* win 10 */
4227 "Builtin Admins ACE has unexpected flags (0x%x != 0x0)\n", flags);
4228 ok(ace->Mask == KEY_ALL_ACCESS || broken(ace->Mask == GENERIC_ALL) /* w2k8 */,
4229 "Builtin Admins ACE has unexpected mask (0x%lx != 0x%x)\n", ace->Mask, KEY_ALL_ACCESS);
4230 }
4231
4232 FreeSid(localsys_sid);
4233 LocalFree(pSD);
4234}
4235
4237{
4238 BOOL ret;
4240 static const WCHAR Blank[] = { 0 };
4241 unsigned int i;
4242 ULONG size;
4243 ACL *acl;
4244 static const struct
4245 {
4246 const char *sidstring;
4248 BOOL ret;
4249 DWORD GLE;
4250 DWORD altGLE;
4251 DWORD ace_Mask;
4252 } cssd[] =
4253 {
4254 { "D:(A;;GA;;;WD)", 0xdeadbeef, FALSE, ERROR_UNKNOWN_REVISION },
4255 /* test ACE string type */
4256 { "D:(A;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4257 { "D:(D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4258 { "ERROR:(D;;GA;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_PARAMETER },
4259 /* test ACE string with spaces */
4260 { " D:(D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4261 { "D: (D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4262 { "D:( D;;GA;;;WD)", SDDL_REVISION_1, TRUE },
4263 { "D:(D ;;GA;;;WD)", SDDL_REVISION_1, FALSE, RPC_S_INVALID_STRING_UUID, ERROR_INVALID_ACL }, /* Vista+ */
4264 { "D:(D; ;GA;;;WD)", SDDL_REVISION_1, TRUE },
4265 { "D:(D;; GA;;;WD)", SDDL_REVISION_1, TRUE },
4266 { "D:(D;;GA ;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
4267 { "D:(D;;GA; ;;WD)", SDDL_REVISION_1, TRUE },
4268 { "D:(D;;GA;; ;WD)", SDDL_REVISION_1, TRUE },
4269 { "D:(D;;GA;;; WD)", SDDL_REVISION_1, TRUE },
4270 { "D:(D;;GA;;;WD )", SDDL_REVISION_1, TRUE },
4271 /* test ACE string access rights */
4272 { "D:(A;;GA;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_ALL },
4273 { "D:(A;;1;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, 1 },
4274 { "D:(A;;020000000000;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_READ },
4275 { "D:(A;;0X40000000;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_WRITE },
4276 { "D:(A;;GRGWGX;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE },
4277 { "D:(A;;RCSDWDWO;;;WD)", SDDL_REVISION_1, TRUE, 0, 0, READ_CONTROL | DELETE | WRITE_DAC | WRITE_OWNER },
4278 { "D:(A;;RPWPCCDCLCSWLODTCR;;;WD)", SDDL_REVISION_1, TRUE },
4279 { "D:(A;;FAFRFWFX;;;WD)", SDDL_REVISION_1, TRUE },
4280 { "D:(A;;KAKRKWKX;;;WD)", SDDL_REVISION_1, TRUE },
4281 { "D:(A;;0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
4282 { "S:(AU;;0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
4283 { "S:(AU;;0xDeAdBeEf;;;WD)", SDDL_REVISION_1, TRUE },
4284 { "S:(AU;;GR0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
4285 { "S:(AU;;0xFFFFFFFFGR;;;WD)", SDDL_REVISION_1, TRUE },
4286 { "S:(AU;;0xFFFFFGR;;;WD)", SDDL_REVISION_1, TRUE },
4287 /* test ACE string access right error case */
4288 { "D:(A;;ROB;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
4289 /* test behaviour with empty strings */
4290 { "", SDDL_REVISION_1, TRUE },
4291 /* test ACE string SID */
4292 { "D:(D;;GA;;;S-1-0-0)", SDDL_REVISION_1, TRUE },
4293 { "D:(D;;GA;;;WDANDSUCH)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
4294 { "D:(D;;GA;;;Nonexistent account)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL, ERROR_INVALID_SID }, /* W2K */
4295 };
4296
4297 for (i = 0; i < ARRAY_SIZE(cssd); i++)
4298 {
4299 DWORD GLE;
4300
4301 SetLastError(0xdeadbeef);
4303 cssd[i].sidstring, cssd[i].revision, &pSD, NULL);
4304 GLE = GetLastError();
4305 ok(ret == cssd[i].ret, "(%02u) Expected %s (%ld)\n", i, cssd[i].ret ? "success" : "failure", GLE);
4306 if (!cssd[i].ret)
4307 ok(GLE == cssd[i].GLE ||
4308 (cssd[i].altGLE && GLE == cssd[i].altGLE),
4309 "(%02u) Unexpected last error %ld\n", i, GLE);
4310 if (ret)
4311 {
4312 if (cssd[i].ace_Mask)
4313 {
4314 ACCESS_ALLOWED_ACE *ace;
4315
4316 acl = (ACL *)((char *)pSD + sizeof(SECURITY_DESCRIPTOR_RELATIVE));
4317 ok(acl->AclRevision == ACL_REVISION, "(%02u) Got %u\n", i, acl->AclRevision);
4318
4319 ace = (ACCESS_ALLOWED_ACE *)(acl + 1);
4320 ok(ace->Mask == cssd[i].ace_Mask, "(%02u) Expected %08lx, got %08lx\n",
4321 i, cssd[i].ace_Mask, ace->Mask);
4322 }
4323 LocalFree(pSD);
4324 }
4325 }
4326
4327 /* test behaviour with NULL parameters */
4328 SetLastError(0xdeadbeef);
4330 NULL, 0xdeadbeef, &pSD, NULL);
4331 todo_wine
4333 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4334 GetLastError());
4335
4336 SetLastError(0xdeadbeef);
4338 NULL, 0xdeadbeef, &pSD, NULL);
4340 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4341 GetLastError());
4342
4343 SetLastError(0xdeadbeef);
4345 "D:(A;;ROB;;;WD)", 0xdeadbeef, NULL, NULL);
4347 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4348 GetLastError());
4349
4350 SetLastError(0xdeadbeef);
4352 "D:(A;;ROB;;;WD)", SDDL_REVISION_1, NULL, NULL);
4354 "ConvertStringSecurityDescriptorToSecurityDescriptor should have failed with ERROR_INVALID_PARAMETER instead of %ld\n",
4355 GetLastError());
4356
4357 /* test behaviour with empty strings */
4358 SetLastError(0xdeadbeef);
4360 Blank, SDDL_REVISION_1, &pSD, NULL);
4361 ok(ret, "ConvertStringSecurityDescriptorToSecurityDescriptor failed with error %ld\n", GetLastError());
4362 LocalFree(pSD);
4363
4364 SetLastError(0xdeadbeef);
4366 "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);
4367 ok(ret || broken(!ret && GetLastError() == ERROR_INVALID_DATATYPE) /* win2k */,
4368 "ConvertStringSecurityDescriptorToSecurityDescriptor failed with error %lu\n", GetLastError());
4369 if (ret) LocalFree(pSD);
4370
4371 /* empty DACL */
4372 size = 0;
4373 SetLastError(0xdeadbeef);
4375 ok(ret, "unexpected error %lu\n", GetLastError());
4376 ok(size == sizeof(SECURITY_DESCRIPTOR_RELATIVE) + sizeof(ACL), "got %lu\n", size);
4377 acl = (ACL *)((char *)pSD + sizeof(SECURITY_DESCRIPTOR_RELATIVE));
4378 ok(acl->AclRevision == ACL_REVISION, "got %u\n", acl->AclRevision);
4379 ok(!acl->Sbz1, "got %u\n", acl->Sbz1);
4380 ok(acl->AclSize == sizeof(*acl), "got %u\n", acl->AclSize);
4381 ok(!acl->AceCount, "got %u\n", acl->AceCount);
4382 ok(!acl->Sbz2, "got %u\n", acl->Sbz2);
4383 LocalFree(pSD);
4384
4385 /* empty SACL */
4386 size = 0;
4387 SetLastError(0xdeadbeef);
4389 ok(ret, "unexpected error %lu\n", GetLastError());
4390 ok(size == sizeof(SECURITY_DESCRIPTOR_RELATIVE) + sizeof(ACL), "got %lu\n", size);
4391 acl = (ACL *)((char *)pSD + sizeof(SECURITY_DESCRIPTOR_RELATIVE));
4392 ok(!acl->Sbz1, "got %u\n", acl->Sbz1);
4393 ok(acl->AclSize == sizeof(*acl), "got %u\n", acl->AclSize);
4394 ok(!acl->AceCount, "got %u\n", acl->AceCount);
4395 ok(!acl->Sbz2, "got %u\n", acl->Sbz2);
4396 LocalFree(pSD);
4397}
4398
4400{
4403 LPSTR string;
4404 DWORD size;
4405 PSID psid, psid2;
4406 PACL pacl;
4407 char sid_buf[256];
4408 char acl_buf[8192];
4409 ULONG len;
4410
4411/* It seems Windows XP adds an extra character to the length of the string for each ACE in an ACL. We
4412 * don't replicate this feature so we only test len >= strlen+1. */
4413#define CHECK_RESULT_AND_FREE(exp_str) \
4414 ok(strcmp(string, (exp_str)) == 0, "String mismatch (expected \"%s\", got \"%s\")\n", (exp_str), string); \
4415 ok(len >= (strlen(exp_str) + 1), "Length mismatch (expected %d, got %ld)\n", lstrlenA(exp_str) + 1, len); \
4416 LocalFree(string);
4417
4418#define CHECK_ONE_OF_AND_FREE(exp_str1, exp_str2) \
4419 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); \
4420 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); \
4421 LocalFree(string);
4422
4424 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4426
4427 size = 4096;
4428 CreateWellKnownSid(WinLocalSid, NULL, sid_buf, &size);
4430 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4431 CHECK_RESULT_AND_FREE("O:S-1-2-0");
4432
4434 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4435 CHECK_RESULT_AND_FREE("O:S-1-2-0");
4436
4437 size = sizeof(sid_buf);
4438 CreateWellKnownSid(WinLocalSystemSid, NULL, sid_buf, &size);
4440 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4441 CHECK_RESULT_AND_FREE("O:SY");
4442
4443 ConvertStringSidToSidA("S-1-5-21-93476-23408-4576", &psid);
4445 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4446 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576");
4447
4449 CHECK_RESULT_AND_FREE("G:S-1-5-21-93476-23408-4576");
4450
4451 pacl = (PACL)acl_buf;
4452 InitializeAcl(pacl, sizeof(acl_buf), ACL_REVISION);
4454 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4455 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:");
4456
4458 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4459 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:");
4460
4461 ConvertStringSidToSidA("S-1-5-6", &psid2);
4463 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4464 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)");
4465
4467 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4468 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)");
4469
4471 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4472 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)");
4473
4474
4475 pacl = (PACL)acl_buf;
4476 InitializeAcl(pacl, sizeof(acl_buf), ACL_REVISION);
4478 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4479 CHECK_RESULT_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:S:");
4480
4481 /* fails in win2k */
4484 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4485 CHECK_ONE_OF_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)", /* XP */
4486 "O:SYG:S-1-5-21-93476-23408-4576D:NO_ACCESS_CONTROLS:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)" /* Vista */);
4487
4488 /* fails in win2k */
4490 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4491 CHECK_ONE_OF_AND_FREE("O:SYG:S-1-5-21-93476-23408-4576D:S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)", /* XP */
4492 "O:SYG:S-1-5-21-93476-23408-4576D:NO_ACCESS_CONTROLS:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)" /* Vista */);
4493
4494 LocalFree(psid2);
4495 LocalFree(psid);
4496}
4497
4499{
4502
4503 SECURITY_DESCRIPTOR_CONTROL const mutable
4507 | 0x00000040 | 0x00000080 /* not defined in winnt.h */
4508 ;
4509 SECURITY_DESCRIPTOR_CONTROL const immutable
4514 ;
4515
4516 int bit;
4517 DWORD dwRevision;
4518 LPCSTR fmt = "Expected error %s, got %u\n";
4519
4520 GetSecurityDescriptorControl (sec, &ref, &dwRevision);
4521
4522 /* The mutable bits are mutable regardless of the truth of
4523 SE_DACL_PRESENT and/or SE_SACL_PRESENT */
4524
4525 /* Check call barfs if any bit-of-interest is immutable */
4526 for (bit = 0; bit < 16; ++bit)
4527 {
4528 SECURITY_DESCRIPTOR_CONTROL const bitOfInterest = 1 << bit;
4529 SECURITY_DESCRIPTOR_CONTROL setOrClear = ref & bitOfInterest;
4530
4532
4533 DWORD dwExpect = (bitOfInterest & immutable)
4534 ? ERROR_INVALID_PARAMETER : 0xbebecaca;
4535 LPCSTR strExpect = (bitOfInterest & immutable)
4536 ? "ERROR_INVALID_PARAMETER" : "0xbebecaca";
4537
4538 ctrl = (bitOfInterest & mutable) ? ref + bitOfInterest : ref;
4539 setOrClear ^= bitOfInterest;
4540 SetLastError (0xbebecaca);
4541 SetSecurityDescriptorControl (sec, bitOfInterest, setOrClear);
4542 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4543 GetSecurityDescriptorControl(sec, &test, &dwRevision);
4544 expect_eq(test, ctrl, int, "%x");
4545
4546 setOrClear ^= bitOfInterest;
4547 SetLastError (0xbebecaca);
4548 SetSecurityDescriptorControl (sec, bitOfInterest, setOrClear);
4549 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4550 GetSecurityDescriptorControl (sec, &test, &dwRevision);
4551 expect_eq(test, ref, int, "%x");
4552 }
4553
4554 /* Check call barfs if any bit-to-set is immutable
4555 even when not a bit-of-interest */
4556 for (bit = 0; bit < 16; ++bit)
4557 {
4558 SECURITY_DESCRIPTOR_CONTROL const bitsOfInterest = mutable;
4559 SECURITY_DESCRIPTOR_CONTROL setOrClear = ref & bitsOfInterest;
4560
4562
4563 DWORD dwExpect = ((1 << bit) & immutable)
4564 ? ERROR_INVALID_PARAMETER : 0xbebecaca;
4565 LPCSTR strExpect = ((1 << bit) & immutable)
4566 ? "ERROR_INVALID_PARAMETER" : "0xbebecaca";
4567
4568 ctrl = ((1 << bit) & immutable) ? test : ref | mutable;
4569 setOrClear ^= bitsOfInterest;
4570 SetLastError (0xbebecaca);
4571 SetSecurityDescriptorControl (sec, bitsOfInterest, setOrClear | (1 << bit));
4572 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4573 GetSecurityDescriptorControl(sec, &test, &dwRevision);
4574 expect_eq(test, ctrl, int, "%x");
4575
4576 ctrl = ((1 << bit) & immutable) ? test : ref | (1 << bit);
4577 setOrClear ^= bitsOfInterest;
4578 SetLastError (0xbebecaca);
4579 SetSecurityDescriptorControl (sec, bitsOfInterest, setOrClear | (1 << bit));
4580 ok (GetLastError () == dwExpect, fmt, strExpect, GetLastError ());
4581 GetSecurityDescriptorControl(sec, &test, &dwRevision);
4582 expect_eq(test, ctrl, int, "%x");
4583 }
4584}
4585
4587{
4591 DWORD dwDescSize;
4592 DWORD dwRevision;
4593 DWORD retSize;
4594 LPSTR string;
4595 ULONG len;
4597 BOOL ret;
4598
4600 "O:SY"
4601 "G:S-1-5-21-93476-23408-4576"
4602 "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)"
4603 "(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4604 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)",
4605 SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n");
4606
4608
4609 LocalFree(sec);
4610
4612 "O:SY"
4613 "G:S-1-5-21-93476-23408-4576",
4614 SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n");
4615
4617
4618 LocalFree(sec);
4619
4621 "O:SY"
4622 "G:S-1-5-21-93476-23408-4576"
4623 "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4624 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)", SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n");
4625 buf = malloc(dwDescSize);
4627 GetSecurityDescriptorControl(sec, &ctrl, &dwRevision);
4628 expect_eq(ctrl, 0x9014, int, "%x");
4629
4630 ret = GetPrivateObjectSecurity(sec, GROUP_SECURITY_INFORMATION, buf, dwDescSize, &retSize);
4631 ok(ret, "GetPrivateObjectSecurity failed (err=%lu)\n", GetLastError());
4632 ok(retSize <= dwDescSize, "Buffer too small (%ld vs %ld)\n", retSize, dwDescSize);
4633 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4634 CHECK_RESULT_AND_FREE("G:S-1-5-21-93476-23408-4576");
4635 GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
4636 expect_eq(ctrl, 0x8000, int, "%x");
4637
4639 ok(ret, "GetPrivateObjectSecurity failed (err=%lu)\n", GetLastError());
4640 ok(retSize <= dwDescSize, "Buffer too small (%ld vs %ld)\n", retSize, dwDescSize);
4642 ok(ret, "Conversion failed err=%lu\n", GetLastError());
4643 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)",
4644 "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 */
4645 GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
4646 expect_eq(ctrl & (~ SE_DACL_PROTECTED), 0x8004, int, "%x");
4647
4648 ret = GetPrivateObjectSecurity(sec, sec_info, buf, dwDescSize, &retSize);
4649 ok(ret, "GetPrivateObjectSecurity failed (err=%lu)\n", GetLastError());
4650 ok(retSize == dwDescSize, "Buffer too small (%ld vs %ld)\n", retSize, dwDescSize);
4651 ok(ConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
4653 "G:S-1-5-21-93476-23408-4576"
4654 "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4655 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)",
4656 "O:SY"
4657 "G:S-1-5-21-93476-23408-4576"
4658 "D:P(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
4659 "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)"); /* Win7 */
4660 GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
4661 expect_eq(ctrl & (~ SE_DACL_PROTECTED), 0x8014, int, "%x");
4662
4663 SetLastError(0xdeadbeef);
4664 ok(GetPrivateObjectSecurity(sec, sec_info, buf, 5, &retSize) == FALSE, "GetPrivateObjectSecurity should have failed\n");
4665 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected error ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
4666
4667 LocalFree(sec);
4668 free(buf);
4669}
4670#undef CHECK_RESULT_AND_FREE
4671#undef CHECK_ONE_OF_AND_FREE
4672
4673static void test_InitializeAcl(void)
4674{
4675 char buffer[256];
4676 PACL pAcl = (PACL)buffer;
4677 BOOL ret;
4678
4679 SetLastError(0xdeadbeef);
4680 ret = InitializeAcl(pAcl, sizeof(ACL) - 1, ACL_REVISION);
4682 {
4683 win_skip("InitializeAcl is not implemented\n");
4684 return;
4685 }
4686
4687 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "InitializeAcl with too small a buffer should have failed with ERROR_INSUFFICIENT_BUFFER instead of %ld\n", GetLastError());
4688
4689 SetLastError(0xdeadbeef);
4690 ret = InitializeAcl(pAcl, 0xffffffff, ACL_REVISION);
4691 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl with too large a buffer should have failed with ERROR_INVALID_PARAMETER instead of %ld\n", GetLastError());
4692
4693 SetLastError(0xdeadbeef);
4694 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION1);
4695 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl(ACL_REVISION1) should have failed with ERROR_INVALID_PARAMETER instead of %ld\n", GetLastError());
4696
4697 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION2);
4698 ok(ret, "InitializeAcl(ACL_REVISION2) failed with error %ld\n", GetLastError());
4699
4700 ret = IsValidAcl(pAcl);
4701 ok(ret, "IsValidAcl failed with error %ld\n", GetLastError());
4702
4703 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION3);
4704 ok(ret, "InitializeAcl(ACL_REVISION3) failed with error %ld\n", GetLastError());
4705
4706 ret = IsValidAcl(pAcl);
4707 ok(ret, "IsValidAcl failed with error %ld\n", GetLastError());
4708
4709 SetLastError(0xdeadbeef);
4710 ret = InitializeAcl(pAcl, sizeof(buffer), ACL_REVISION4);
4711 ok(ret, "InitializeAcl(ACL_REVISION4) failed with error %ld\n", GetLastError());
4712
4713 ret = IsValidAcl(pAcl);
4714 ok(ret, "IsValidAcl failed with error %ld\n", GetLastError());
4715
4716 SetLastError(0xdeadbeef);
4717 ret = InitializeAcl(pAcl, sizeof(buffer), -1);
4718 ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "InitializeAcl(-1) failed with error %ld\n", GetLastError());
4719}
4720
4721static void test_GetSecurityInfo(void)
4722{
4723 char domain_users_ptr[sizeof(TOKEN_USER) + sizeof(SID) + sizeof(DWORD)*SID_MAX_SUB_AUTHORITIES];
4724 char b[sizeof(TOKEN_USER) + sizeof(SID) + sizeof(DWORD)*SID_MAX_SUB_AUTHORITIES];
4725 char admin_ptr[sizeof(SID)+sizeof(ULONG)*SID_MAX_SUB_AUTHORITIES], dacl[100];
4726 PSID domain_users_sid = (PSID) domain_users_ptr, domain_sid;
4728 int domain_users_ace_id = -1, admins_ace_id = -1, i;
4729 DWORD sid_size = sizeof(admin_ptr), l = sizeof(b);
4730 SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa)};
4731 PSID admin_sid = (PSID) admin_ptr, user_sid;
4733 BOOL owner_defaulted, group_defaulted;
4734 BOOL dacl_defaulted, dacl_present;
4735 ACL_SIZE_INFORMATION acl_size;
4737 ACCESS_ALLOWED_ACE *ace;
4738 HANDLE token, obj;
4739 PSID owner, group;
4740 BOOL bret = TRUE;
4741 PACL pDacl;
4742 BYTE flags;
4743 DWORD ret;
4744
4745 static const SE_OBJECT_TYPE kernel_types[] =
4746 {
4750 };
4751
4752 static const SE_OBJECT_TYPE invalid_types[] =
4753 {
4760 0xdeadbeef,
4761 };
4762
4764 {
4765 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
4767 }
4768 if (!bret)
4769 {
4770 win_skip("Failed to get current user token\n");
4771 return;
4772 }
4773 bret = GetTokenInformation(token, TokenUser, b, l, &l);
4774 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
4775 CloseHandle( token );
4776 user_sid = ((TOKEN_USER *)b)->User.Sid;
4777
4778 /* Create something. Files have lots of associated security info. */
4782 {
4783 skip("Couldn't create an object for GetSecurityInfo test\n");
4784 return;
4785 }
4786
4789 &owner, &group, &pDacl, NULL, &pSD);
4791 {
4792 win_skip("GetSecurityInfo is not implemented\n");
4794 return;
4795 }
4796 ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %ld\n", ret);
4797 ok(pSD != NULL, "GetSecurityInfo\n");
4798 ok(owner != NULL, "GetSecurityInfo\n");
4799 ok(group != NULL, "GetSecurityInfo\n");
4800 if (pDacl != NULL)
4801 ok(IsValidAcl(pDacl), "GetSecurityInfo\n");
4802 else
4803 win_skip("No ACL information returned\n");
4804
4805 LocalFree(pSD);
4806
4807 /* If we don't ask for the security descriptor, Windows will still give us
4808 the other stuff, leaving us no way to free it. */
4811 &owner, &group, &pDacl, NULL, NULL);
4812 ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %ld\n", ret);
4813 ok(owner != NULL, "GetSecurityInfo\n");
4814 ok(group != NULL, "GetSecurityInfo\n");
4815 if (pDacl != NULL)
4816 ok(IsValidAcl(pDacl), "GetSecurityInfo\n");
4817 else
4818 win_skip("No ACL information returned\n");
4819
4820 /* Create security descriptor information and test that it comes back the same */
4821 pSD = &sd;
4822 pDacl = (PACL)&dacl;
4824 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
4825 bret = InitializeAcl(pDacl, sizeof(dacl), ACL_REVISION);
4826 ok(bret, "Failed to initialize ACL.\n");
4827 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
4828 ok(bret, "Failed to add Current User to ACL.\n");
4829 bret = AddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, admin_sid);
4830 ok(bret, "Failed to add Administrator Group to ACL.\n");
4831 bret = SetSecurityDescriptorDacl(pSD, TRUE, pDacl, FALSE);
4832 ok(bret, "Failed to add ACL to security descriptor.\n");
4834 NULL, NULL, pDacl, NULL);
4835 ok(ret == ERROR_SUCCESS, "SetSecurityInfo returned %ld\n", ret);
4837 NULL, NULL, &pDacl, NULL, &pSD);
4838 ok(ret == ERROR_SUCCESS, "GetSecurityInfo returned %ld\n", ret);
4839 ok(pDacl && IsValidAcl(pDacl), "GetSecurityInfo returned invalid DACL.\n");
4840 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4841 ok(bret, "GetAclInformation failed\n");
4842 if (acl_size.AceCount > 0)
4843 {
4844 bret = GetAce(pDacl, 0, (VOID **)&ace);
4845 ok(bret, "Failed to get Current User ACE.\n");
4846#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
4847 bret = EqualSid(&ace->SidStart, user_sid);
4848 todo_wine ok(bret, "Current User ACE (%s) != Current User SID (%s).\n",
4849 debugstr_sid(&ace->SidStart), debugstr_sid(user_sid));
4850#endif
4851 ok(((ACE_HEADER *)ace)->AceFlags == 0,
4852 "Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
4853 ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%lx != 0x1f01ff)\n",
4854 ace->Mask);
4855 }
4856 if (acl_size.AceCount > 1)
4857 {
4858 bret = GetAce(pDacl, 1, (VOID **)&ace);
4859 ok(bret, "Failed to get Administators Group ACE.\n");
4860#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
4861 bret = EqualSid(&ace->SidStart, admin_sid);
4862 todo_wine ok(bret, "Administators Group ACE (%s) != Administators Group SID (%s).\n", debugstr_sid(&ace->SidStart), debugstr_sid(admin_sid));
4863#endif
4864 ok(((ACE_HEADER *)ace)->AceFlags == 0,
4865 "Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
4866 ok(ace->Mask == 0x1f01ff, "Administators Group ACE has unexpected mask (0x%lx != 0x1f01ff)\n",
4867 ace->Mask);
4868 }
4869 LocalFree(pSD);
4871
4872 /* Obtain the "domain users" SID from the user SID */
4873 if (!AllocateAndInitializeSid(&sia, 4, *GetSidSubAuthority(user_sid, 0),
4874 *GetSidSubAuthority(user_sid, 1),
4875 *GetSidSubAuthority(user_sid, 2),
4876 *GetSidSubAuthority(user_sid, 3), 0, 0, 0, 0, &domain_sid))
4877 {
4878 win_skip("Failed to get current domain SID\n");
4879 return;
4880 }
4881 sid_size = sizeof(domain_users_ptr);
4882 CreateWellKnownSid(WinAccountDomainUsersSid, domain_sid, domain_users_sid, &sid_size);
4883 FreeSid(domain_sid);
4884
4885 /* Test querying the ownership of a process */
4888 NULL, NULL, NULL, NULL, &pSD);
4889 ok(!ret, "GetNamedSecurityInfo failed with error %ld\n", ret);
4890
4891 bret = GetSecurityDescriptorOwner(pSD, &owner, &owner_defaulted);
4892 ok(bret, "GetSecurityDescriptorOwner failed with error %ld\n", GetLastError());
4893 ok(owner != NULL, "owner should not be NULL\n");
4894 ok(EqualSid(owner, admin_sid) || EqualSid(owner, user_sid),
4895 "Process owner SID != Administrators SID.\n");
4896
4897 bret = GetSecurityDescriptorGroup(pSD, &group, &group_defaulted);
4898 ok(bret, "GetSecurityDescriptorGroup failed with error %ld\n", GetLastError());
4899 ok(group != NULL, "group should not be NULL\n");
4900 ok(EqualSid(group, domain_users_sid), "Process group SID != Domain Users SID.\n");
4901 LocalFree(pSD);
4902
4903 /* Test querying the DACL of a process */
4905 NULL, NULL, NULL, NULL, &pSD);
4906 ok(!ret, "GetSecurityInfo failed with error %ld\n", ret);
4907
4908 bret = GetSecurityDescriptorDacl(pSD, &dacl_present, &pDacl, &dacl_defaulted);
4909 ok(bret, "GetSecurityDescriptorDacl failed with error %ld\n", GetLastError());
4910 ok(dacl_present, "DACL should be present\n");
4911 ok(pDacl && IsValidAcl(pDacl), "GetSecurityDescriptorDacl returned invalid DACL.\n");
4912 bret = GetAclInformation(pDacl, &acl_size, sizeof(acl_size), AclSizeInformation);
4913 ok(bret, "GetAclInformation failed\n");
4914 ok(acl_size.AceCount != 0, "GetAclInformation returned no ACLs\n");
4915 for (i=0; i<acl_size.AceCount; i++)
4916 {
4917 bret = GetAce(pDacl, i, (VOID **)&ace);
4918 ok(bret, "Failed to get ACE %d.\n", i);
4919 bret = EqualSid(&ace->SidStart, domain_users_sid);
4920 if (bret) domain_users_ace_id = i;
4921 bret = EqualSid(&ace->SidStart, admin_sid);
4922 if (bret) admins_ace_id = i;
4923 }
4924 ok(domain_users_ace_id != -1 || broken(domain_users_ace_id == -1) /* win2k */,
4925 "Domain Users ACE not found.\n");
4926 if (domain_users_ace_id != -1)
4927 {
4928 bret = GetAce(pDacl, domain_users_ace_id, (VOID **)&ace);
4929 ok(bret, "Failed to get Domain Users ACE.\n");
4930 flags = ((ACE_HEADER *)ace)->AceFlags;
4932 "Domain Users ACE has unexpected flags (0x%x != 0x%x)\n", flags,
4934 ok(ace->Mask == GENERIC_READ, "Domain Users ACE has unexpected mask (0x%lx != 0x%x)\n",
4935 ace->Mask, GENERIC_READ);
4936 }
4937 ok(admins_ace_id != -1 || broken(admins_ace_id == -1) /* xp */,
4938 "Builtin Admins ACE not found.\n");
4939 if (admins_ace_id != -1)
4940 {
4941 bret = GetAce(pDacl, admins_ace_id, (VOID **)&ace);
4942 ok(bret, "Failed to get Builtin Admins ACE.\n");
4943 flags = ((ACE_HEADER *)ace)->AceFlags;
4944 ok(flags == 0x0, "Builtin Admins ACE has unexpected flags (0x%x != 0x0)\n", flags);
4945 ok(ace->Mask == PROCESS_ALL_ACCESS || broken(ace->Mask == 0x1f0fff) /* win2k */,
4946 "Builtin Admins ACE has unexpected mask (0x%lx != 0x%x)\n", ace->Mask, PROCESS_ALL_ACCESS);
4947 }
4948 LocalFree(pSD);
4949
4951 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4952
4955 ok(!ret, "got error %lu\n", ret);
4956 LocalFree(pSD);
4957
4958 sa.lpSecurityDescriptor = sd;
4960 pDacl = (PACL)&dacl;
4961
4962 for (size_t i = 0; i < ARRAY_SIZE(kernel_types); ++i)
4963 {
4964 winetest_push_context("Type %#x", kernel_types[i]);
4965
4966 ret = GetSecurityInfo(NULL, kernel_types[i],
4968 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4969
4970 ret = GetSecurityInfo(GetCurrentProcess(), kernel_types[i],
4972 ok(!ret, "got error %lu\n", ret);
4973 LocalFree(pSD);
4974
4975 ret = GetSecurityInfo(obj, kernel_types[i],
4977 ok(!ret, "got error %lu\n", ret);
4978 LocalFree(pSD);
4979
4980 ret = SetSecurityInfo(NULL, kernel_types[i],
4982 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4983
4984 ret = SetSecurityInfo(obj, kernel_types[i],
4986 ok(!ret || ret == ERROR_NO_SECURITY_ON_OBJECT /* win 7 */, "got error %lu\n", ret);
4987
4989 }
4990
4993 todo_wine ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4994
4997 todo_wine ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
4998
5000
5001 for (size_t i = 0; i < ARRAY_SIZE(invalid_types); ++i)
5002 {
5003 winetest_push_context("Type %#x", invalid_types[i]);
5004
5005 ret = GetSecurityInfo(NULL, invalid_types[i],
5007 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
5008
5009 ret = GetSecurityInfo((HANDLE)0xdeadbeef, invalid_types[i],
5011 todo_wine ok(ret == ERROR_INVALID_PARAMETER, "got error %lu\n", ret);
5012
5013 ret = SetSecurityInfo(NULL, invalid_types[i],
5015 ok(ret == ERROR_INVALID_HANDLE, "got error %lu\n", ret);
5016
5017 ret = SetSecurityInfo((HANDLE)0xdeadbeef, invalid_types[i],
5019 todo_wine ok(ret == ERROR_INVALID_PARAMETER, "got error %lu\n", ret);
5020
5022 }
5023}
5024
5026{
5027 PSID psid = NULL;
5028
5029 /* Note: on windows passing in an invalid index like -1, lets GetSidSubAuthority return 0x05000000 but
5030 still GetLastError returns ERROR_SUCCESS then. We don't test these unlikely cornercases here for now */
5031 ok(ConvertStringSidToSidA("S-1-5-21-93476-23408-4576",&psid),"ConvertStringSidToSidA failed\n");
5032 ok(IsValidSid(psid),"Sid is not valid\n");
5033 SetLastError(0xbebecaca);
5034 ok(*GetSidSubAuthorityCount(psid) == 4,"GetSidSubAuthorityCount gave %d expected 4\n", *GetSidSubAuthorityCount(psid));
5035 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5036 SetLastError(0xbebecaca);
5037 ok(*GetSidSubAuthority(psid,0) == 21,"GetSidSubAuthority gave %ld expected 21\n", *GetSidSubAuthority(psid,0));
5038 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5039 SetLastError(0xbebecaca);
5040 ok(*GetSidSubAuthority(psid,1) == 93476,"GetSidSubAuthority gave %ld expected 93476\n", *GetSidSubAuthority(psid,1));
5041 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5042 SetLastError(0xbebecaca);
5043 ok(GetSidSubAuthority(psid,4) != NULL,"Expected out of bounds GetSidSubAuthority to return a non-NULL pointer\n");
5044 ok(GetLastError() == 0,"GetLastError returned %ld instead of 0\n",GetLastError());
5045 LocalFree(psid);
5046}
5047
5049{
5050 PTOKEN_GROUPS token_groups;
5051 DWORD size;
5052 HANDLE process_token, token;
5053 BOOL is_member;
5054 BOOL ret;
5055 DWORD i;
5056
5058 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
5059
5060 ret = DuplicateToken(process_token, SecurityImpersonation, &token);
5061 ok(ret, "DuplicateToken failed with error %ld\n", GetLastError());
5062
5063 /* groups */
5066 "GetTokenInformation(TokenGroups) %s with error %ld\n",
5067 ret ? "succeeded" : "failed", GetLastError());
5068 token_groups = malloc(size);
5069 ret = GetTokenInformation(token, TokenGroups, token_groups, size, &size);
5070 ok(ret, "GetTokenInformation(TokenGroups) failed with error %ld\n", GetLastError());
5071
5072 for (i = 0; i < token_groups->GroupCount; i++)
5073 {
5074 if (token_groups->Groups[i].Attributes & SE_GROUP_ENABLED)
5075 break;
5076 }
5077
5078 if (i == token_groups->GroupCount)
5079 {
5080 free(token_groups);
5082 skip("user not a member of any group\n");
5083 return;
5084 }
5085
5086 is_member = FALSE;
5087 ret = CheckTokenMembership(token, token_groups->Groups[i].Sid, &is_member);
5088 ok(ret, "CheckTokenMembership failed with error %ld\n", GetLastError());
5089 ok(is_member, "CheckTokenMembership should have detected sid as member\n");
5090
5091 is_member = FALSE;
5092 ret = CheckTokenMembership(NULL, token_groups->Groups[i].Sid, &is_member);
5093 ok(ret, "CheckTokenMembership failed with error %ld\n", GetLastError());
5094 ok(is_member, "CheckTokenMembership should have detected sid as member\n");
5095
5096 is_member = TRUE;
5097 SetLastError(0xdeadbeef);
5098 ret = CheckTokenMembership(process_token, token_groups->Groups[i].Sid, &is_member);
5100 "CheckTokenMembership with process token %s with error %ld\n",
5101 ret ? "succeeded" : "failed", GetLastError());
5102 ok(!is_member, "CheckTokenMembership should have cleared is_member\n");
5103
5104 free(token_groups);
5106 CloseHandle(process_token);
5107}
5108
5109static void test_EqualSid(void)
5110{
5111 PSID sid1, sid2;
5112 BOOL ret;
5115
5116 SetLastError(0xdeadbeef);
5118 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &sid1);
5120 {
5121 win_skip("AllocateAndInitializeSid is not implemented\n");
5122 return;
5123 }
5124 ok(ret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
5125 ok(GetLastError() == 0xdeadbeef,
5126 "AllocateAndInitializeSid shouldn't have set last error to %ld\n",
5127 GetLastError());
5128
5130 0, 0, 0, 0, 0, 0, 0, &sid2);
5131 ok(ret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
5132
5133 SetLastError(0xdeadbeef);
5134 ret = EqualSid(sid1, sid2);
5135 ok(!ret, "World and domain admins sids shouldn't have been equal\n");
5137 "EqualSid should have set last error to ERROR_SUCCESS instead of %ld\n",
5138 GetLastError());
5139
5140 SetLastError(0xdeadbeef);
5141 sid2 = FreeSid(sid2);
5142 ok(!sid2, "FreeSid should have returned NULL instead of %p\n", sid2);
5143 ok(GetLastError() == 0xdeadbeef,
5144 "FreeSid shouldn't have set last error to %ld\n",
5145 GetLastError());
5146
5148 DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &sid2);
5149 ok(ret, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
5150
5151#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
5152 SetLastError(0xdeadbeef);
5153 ret = EqualSid(sid1, sid2);
5154 ok(ret, "Same sids should have been equal %s != %s\n",
5155 debugstr_sid(sid1), debugstr_sid(sid2));
5157 "EqualSid should have set last error to ERROR_SUCCESS instead of %ld\n",
5158 GetLastError());
5159#endif
5160
5161 ((SID *)sid2)->Revision = 2;
5162 SetLastError(0xdeadbeef);
5163 ret = EqualSid(sid1, sid2);
5164 ok(!ret, "EqualSid with invalid sid should have returned FALSE\n");
5166 "EqualSid should have set last error to ERROR_SUCCESS instead of %ld\n",
5167 GetLastError());
5168 ((SID *)sid2)->Revision = SID_REVISION;
5169
5170 FreeSid(sid1);
5171 FreeSid(sid2);
5172}
5173
5174static void test_GetUserNameA(void)
5175{
5176 char buffer[UNLEN + 1], filler[UNLEN + 1];
5177 DWORD required_len, buffer_len;
5178 BOOL ret;
5179
5180 /* Test crashes on Windows. */
5181 if (0)
5182 {
5183 SetLastError(0xdeadbeef);
5185 }
5186
5187 SetLastError(0xdeadbeef);
5188 required_len = 0;
5189 ret = GetUserNameA(NULL, &required_len);
5190 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5191 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5192 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5193
5194 SetLastError(0xdeadbeef);
5195 required_len = 1;
5196 ret = GetUserNameA(NULL, &required_len);
5197 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5198 ok(required_len != 0 && required_len != 1, "Outputted buffer length was %lu\n", required_len);
5199 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5200
5201 /* Tests crashes on Windows. */
5202 if (0)
5203 {
5204 SetLastError(0xdeadbeef);
5205 required_len = UNLEN + 1;
5206 GetUserNameA(NULL, &required_len);
5207
5208 SetLastError(0xdeadbeef);
5210 }
5211
5212 memset(filler, 'x', sizeof(filler));
5213
5214 /* Note that GetUserNameA on XP and newer outputs the number of bytes
5215 * required for a Unicode string, which affects a test in the next block. */
5216 SetLastError(0xdeadbeef);
5217 memcpy(buffer, filler, sizeof(filler));
5218 required_len = 0;
5219 ret = GetUserNameA(buffer, &required_len);
5220 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5221 ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
5222 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5223 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5224
5225 SetLastError(0xdeadbeef);
5226 memcpy(buffer, filler, sizeof(filler));
5227 buffer_len = required_len;
5228 ret = GetUserNameA(buffer, &buffer_len);
5229 ok(ret == TRUE, "GetUserNameA returned %d, last error %lu\n", ret, GetLastError());
5230 ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
5231 ok(buffer_len == required_len ||
5232 broken(buffer_len == required_len / sizeof(WCHAR)), /* XP+ */
5233 "Outputted buffer length was %lu\n", buffer_len);
5234 ok(GetLastError() == 0xdeadbeef, "Last error was %lu\n", GetLastError());
5235
5236 /* Use the reported buffer size from the last GetUserNameA call and pass
5237 * a length that is one less than the required value. */
5238 SetLastError(0xdeadbeef);
5239 memcpy(buffer, filler, sizeof(filler));
5240 buffer_len--;
5241 ret = GetUserNameA(buffer, &buffer_len);
5242 ok(ret == FALSE, "GetUserNameA returned %d\n", ret);
5243 ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was untouched\n");
5244 ok(buffer_len == required_len, "Outputted buffer length was %lu\n", buffer_len);
5245 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5246}
5247
5248static void test_GetUserNameW(void)
5249{
5250 WCHAR buffer[UNLEN + 1], filler[UNLEN + 1];
5251 DWORD required_len, buffer_len;
5252 BOOL ret;
5253
5254 /* Test crashes on Windows. */
5255 if (0)
5256 {
5257 SetLastError(0xdeadbeef);
5259 }
5260
5261 SetLastError(0xdeadbeef);
5262 required_len = 0;
5263 ret = GetUserNameW(NULL, &required_len);
5264 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5265 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5266 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5267
5268 SetLastError(0xdeadbeef);
5269 required_len = 1;
5270 ret = GetUserNameW(NULL, &required_len);
5271 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5272 ok(required_len != 0 && required_len != 1, "Outputted buffer length was %lu\n", required_len);
5273 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5274
5275 /* Tests crash on Windows. */
5276 if (0)
5277 {
5278 SetLastError(0xdeadbeef);
5279 required_len = UNLEN + 1;
5280 GetUserNameW(NULL, &required_len);
5281
5282 SetLastError(0xdeadbeef);
5284 }
5285
5286 memset(filler, 'x', sizeof(filler));
5287
5288 SetLastError(0xdeadbeef);
5289 memcpy(buffer, filler, sizeof(filler));
5290 required_len = 0;
5291 ret = GetUserNameW(buffer, &required_len);
5292 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5293 ok(!memcmp(buffer, filler, sizeof(filler)), "Output buffer was altered\n");
5294 ok(required_len != 0, "Outputted buffer length was %lu\n", required_len);
5295 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5296
5297 SetLastError(0xdeadbeef);
5298 memcpy(buffer, filler, sizeof(filler));
5299 buffer_len = required_len;
5300 ret = GetUserNameW(buffer, &buffer_len);
5301 ok(ret == TRUE, "GetUserNameW returned %d, last error %lu\n", ret, GetLastError());
5302 ok(memcmp(buffer, filler, sizeof(filler)) != 0, "Output buffer was untouched\n");
5303 ok(buffer_len == required_len, "Outputted buffer length was %lu\n", buffer_len);
5304 ok(GetLastError() == 0xdeadbeef, "Last error was %lu\n", GetLastError());
5305
5306 /* GetUserNameW on XP and newer writes a truncated portion of the username string to the buffer. */
5307 SetLastError(0xdeadbeef);
5308 memcpy(buffer, filler, sizeof(filler));
5309 buffer_len--;
5310 ret = GetUserNameW(buffer, &buffer_len);
5311 ok(ret == FALSE, "GetUserNameW returned %d\n", ret);
5312 ok(!memcmp(buffer, filler, sizeof(filler)) ||
5313 broken(memcmp(buffer, filler, sizeof(filler)) != 0), /* XP+ */
5314 "Output buffer was altered\n");
5315 ok(buffer_len == required_len, "Outputted buffer length was %lu\n", buffer_len);
5316 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Last error was %lu\n", GetLastError());
5317}
5318
5320{
5321 HANDLE process_token, token, r_token;
5322 PTOKEN_GROUPS token_groups, groups2;
5323 LUID_AND_ATTRIBUTES lattr;
5324 SID_AND_ATTRIBUTES sattr;
5326 SID *removed_sid = NULL;
5327 char privs_buffer[1000];
5328 TOKEN_PRIVILEGES *privs = (TOKEN_PRIVILEGES *)privs_buffer;
5329 PRIVILEGE_SET priv_set;
5331 BOOL is_member;
5332 DWORD size;
5333 LUID luid = { 0, 0 };
5334 BOOL ret;
5335 DWORD i;
5336
5338 ok(ret, "got error %ld\n", GetLastError());
5339
5342 ok(ret, "got error %ld\n", GetLastError());
5343
5346 "got %d with error %ld\n", ret, GetLastError());
5347 token_groups = malloc(size);
5348 ret = GetTokenInformation(token, TokenGroups, token_groups, size, &size);
5349 ok(ret, "got error %ld\n", GetLastError());
5350
5351 for (i = 0; i < token_groups->GroupCount; i++)
5352 {
5353 if (token_groups->Groups[i].Attributes & SE_GROUP_ENABLED)
5354 {
5355 removed_sid = token_groups->Groups[i].Sid;
5356 break;
5357 }
5358 }
5359 ok(!!removed_sid, "user is not a member of any group\n");
5360
5361 is_member = FALSE;
5362 ret = CheckTokenMembership(token, removed_sid, &is_member);
5363 ok(ret, "got error %ld\n", GetLastError());
5364 ok(is_member, "not a member\n");
5365
5366 sattr.Sid = removed_sid;
5367 sattr.Attributes = 0;
5368 r_token = NULL;
5369 ret = CreateRestrictedToken(token, 0, 1, &sattr, 0, NULL, 0, NULL, &r_token);
5370 ok(ret, "got error %ld\n", GetLastError());
5371
5372 is_member = TRUE;
5373 ret = CheckTokenMembership(r_token, removed_sid, &is_member);
5374 ok(ret, "got error %ld\n", GetLastError());
5375 ok(!is_member, "not a member\n");
5376
5377 ret = GetTokenInformation(r_token, TokenGroups, NULL, 0, &size);
5378 ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %d with error %ld\n",
5379 ret, GetLastError());
5380 groups2 = malloc(size);
5381 ret = GetTokenInformation(r_token, TokenGroups, groups2, size, &size);
5382 ok(ret, "got error %ld\n", GetLastError());
5383
5384 for (i = 0; i < groups2->GroupCount; i++)
5385 {
5386 if (EqualSid(groups2->Groups[i].Sid, removed_sid))
5387 {
5388 DWORD attr = groups2->Groups[i].Attributes;
5389 ok(attr & SE_GROUP_USE_FOR_DENY_ONLY, "got wrong attributes %#lx\n", attr);
5390 ok(!(attr & SE_GROUP_ENABLED), "got wrong attributes %#lx\n", attr);
5391 break;
5392 }
5393 }
5394
5395 free(groups2);
5396
5397 size = sizeof(type);
5398 ret = GetTokenInformation(r_token, TokenType, &type, size, &size);
5399 ok(ret, "got error %ld\n", GetLastError());
5400 ok(type == TokenImpersonation, "got type %u\n", type);
5401
5402 size = sizeof(level);
5404 ok(ret, "got error %ld\n", GetLastError());
5405 ok(level == SecurityImpersonation, "got level %u\n", type);
5406
5407 CloseHandle(r_token);
5408
5409 r_token = NULL;
5410 ret = CreateRestrictedToken(process_token, 0, 1, &sattr, 0, NULL, 0, NULL, &r_token);
5411 ok(ret, "got error %lu\n", GetLastError());
5412
5413 size = sizeof(type);
5414 ret = GetTokenInformation(r_token, TokenType, &type, size, &size);
5415 ok(ret, "got error %lu\n", GetLastError());
5416 ok(type == TokenPrimary, "got type %u\n", type);
5417
5418 CloseHandle(r_token);
5419
5420 ret = GetTokenInformation(token, TokenPrivileges, privs, sizeof(privs_buffer), &size);
5421 ok(ret, "got error %lu\n", GetLastError());
5422
5423 for (i = 0; i < privs->PrivilegeCount; i++)
5424 {
5426 {
5427 luid = privs->Privileges[i].Luid;
5428 break;
5429 }
5430 }
5431 ok(i < privs->PrivilegeCount, "user has no privileges\n");
5432
5433 lattr.Luid = luid;
5434 lattr.Attributes = 0;
5435 r_token = NULL;
5436 ret = CreateRestrictedToken(token, 0, 0, NULL, 1, &lattr, 0, NULL, &r_token);
5437 ok(ret, "got error %lu\n", GetLastError());
5438
5439 priv_set.PrivilegeCount = 1;
5440 priv_set.Control = 0;
5441 priv_set.Privilege[0].Luid = luid;
5442 priv_set.Privilege[0].Attributes = 0;
5443 ret = PrivilegeCheck(r_token, &priv_set, &is_member);
5444 ok(ret, "got error %lu\n", GetLastError());
5445 ok(!is_member, "privilege should not be enabled\n");
5446
5447 ret = GetTokenInformation(r_token, TokenPrivileges, privs, sizeof(privs_buffer), &size);
5448 ok(ret, "got error %lu\n", GetLastError());
5449
5450 is_member = FALSE;
5451 for (i = 0; i < privs->PrivilegeCount; i++)
5452 {
5453 if (!memcmp(&privs->Privileges[i].Luid, &luid, sizeof(luid)))
5454 is_member = TRUE;
5455 }
5456 ok(!is_member, "disabled privilege should not be present\n");
5457
5458 CloseHandle(r_token);
5459
5460 removed_sid->SubAuthority[0] = 0xdeadbeef;
5461 lattr.Luid.LowPart = 0xdeadbeef;
5462 r_token = NULL;
5463 ret = CreateRestrictedToken(token, 0, 1, &sattr, 1, &lattr, 0, NULL, &r_token);
5464 ok(ret, "got error %lu\n", GetLastError());
5465 CloseHandle(r_token);
5466
5467 free(token_groups);
5469 CloseHandle(process_token);
5470}
5471
5473{
5474 BOOL ret, present, defaulted;
5475 ACL *acl;
5476 void *sid;
5477
5479 ok(ret, "security descriptor is not valid\n");
5480
5481 present = -1;
5482 defaulted = -1;
5483 acl = (void *)0xdeadbeef;
5484 SetLastError(0xdeadbeef);
5485 ret = GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted);
5486 ok(ret, "GetSecurityDescriptorDacl error %ld\n", GetLastError());
5487 todo_wine
5488 ok(present == 1, "acl is not present\n");
5489 todo_wine
5490 ok(acl != (void *)0xdeadbeef && acl != NULL, "acl pointer is not set\n");
5491 ok(defaulted == 0, "defaulted is set to TRUE\n");
5492
5493 defaulted = -1;
5494 sid = (void *)0xdeadbeef;
5495 SetLastError(0xdeadbeef);
5496 ret = GetSecurityDescriptorOwner(sd, &sid, &defaulted);
5497 ok(ret, "GetSecurityDescriptorOwner error %ld\n", GetLastError());
5498 todo_wine
5499 ok(sid != (void *)0xdeadbeef && sid != NULL, "sid pointer is not set\n");
5500 ok(defaulted == 0, "defaulted is set to TRUE\n");
5501
5502 defaulted = -1;
5503 sid = (void *)0xdeadbeef;
5504 SetLastError(0xdeadbeef);
5505 ret = GetSecurityDescriptorGroup(sd, &sid, &defaulted);
5506 ok(ret, "GetSecurityDescriptorGroup error %ld\n", GetLastError());
5507 todo_wine
5508 ok(sid != (void *)0xdeadbeef && sid != NULL, "sid pointer is not set\n");
5509 ok(defaulted == 0, "defaulted is set to TRUE\n");
5510}
5511
5513{
5514 DWORD ret, granted, priv_set_len;
5515 BOOL status;
5516 PRIVILEGE_SET priv_set;
5518
5521
5522 priv_set_len = sizeof(priv_set);
5523 granted = 0xdeadbeef;
5524 status = 0xdeadbeef;
5525 SetLastError(0xdeadbeef);
5526 ret = AccessCheck(sd, token, MAXIMUM_ALLOWED, 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->GenericAll, "expected all access %#lx, got %#lx\n", mapping->GenericAll, granted);
5531}
5532 priv_set_len = sizeof(priv_set);
5533 granted = 0xdeadbeef;
5534 status = 0xdeadbeef;
5535 SetLastError(0xdeadbeef);
5536 ret = AccessCheck(sd, token, 0, mapping, &priv_set, &priv_set_len, &granted, &status);
5537todo_wine {
5538 ok(ret, "AccessCheck error %ld\n", GetLastError());
5539 ok(status == 0, "expected 0, got %d\n", status);
5540 ok(granted == 0, "expected 0, got %#lx\n", granted);
5541}
5542 priv_set_len = sizeof(priv_set);
5543 granted = 0xdeadbeef;
5544 status = 0xdeadbeef;
5545 SetLastError(0xdeadbeef);
5546 ret = AccessCheck(sd, token, ACCESS_SYSTEM_SECURITY, mapping, &priv_set, &priv_set_len, &granted, &status);
5547todo_wine {
5548 ok(ret, "AccessCheck error %ld\n", GetLastError());
5549 ok(status == 0, "expected 0, got %d\n", status);
5550 ok(granted == 0, "expected 0, got %#lx\n", granted);
5551}
5552 priv_set_len = sizeof(priv_set);
5553 granted = 0xdeadbeef;
5554 status = 0xdeadbeef;
5555 SetLastError(0xdeadbeef);
5556 ret = AccessCheck(sd, token, mapping->GenericRead, mapping, &priv_set, &priv_set_len, &granted, &status);
5557todo_wine {
5558 ok(ret, "AccessCheck error %ld\n", GetLastError());
5559 ok(status == 1, "expected 1, got %d\n", status);
5560 ok(granted == mapping->GenericRead, "expected read access %#lx, got %#lx\n", mapping->GenericRead, granted);
5561}
5562 priv_set_len = sizeof(priv_set);
5563 granted = 0xdeadbeef;
5564 status = 0xdeadbeef;
5565 SetLastError(0xdeadbeef);
5566 ret = AccessCheck(sd, token, mapping->GenericWrite, mapping, &priv_set, &priv_set_len, &granted, &status);
5567todo_wine {
5568 ok(ret, "AccessCheck error %ld\n", GetLastError());
5569 ok(status == 1, "expected 1, got %d\n", status);
5570 ok(granted == mapping->GenericWrite, "expected write access %#lx, got %#lx\n", mapping->GenericWrite, granted);
5571}
5572 priv_set_len = sizeof(priv_set);
5573 granted = 0xdeadbeef;
5574 status = 0xdeadbeef;
5575 SetLastError(0xdeadbeef);
5576 ret = AccessCheck(sd, token, mapping->GenericExecute, mapping, &priv_set, &priv_set_len, &granted, &status);
5577todo_wine {
5578 ok(ret, "AccessCheck error %ld\n", GetLastError());
5579 ok(status == 1, "expected 1, got %d\n", status);
5580 ok(granted == mapping->GenericExecute, "expected execute access %#lx, got %#lx\n", mapping->GenericExecute, granted);
5581}
5582 free(sd);
5583}
5584
5586{
5589
5591 ok(!status, "NtQueryObject error %#lx\n", status);
5592
5593 return info.GrantedAccess;
5594}
5595
5597{
5598 DWORD ret, i, access;
5599 HANDLE mutex, dup;
5604 static const struct
5605 {
5606 int generic, mapped;
5607 } map[] =
5608 {
5609 { 0, 0 },
5614 };
5615
5616 SetLastError(0xdeadbeef);
5617 mutex = OpenMutexA(0, FALSE, "WineTestMutex");
5618 ok(!mutex, "mutex should not exist\n");
5619 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
5620
5621 SetLastError(0xdeadbeef);
5622 mutex = CreateMutexA(NULL, FALSE, "WineTestMutex");
5623 ok(mutex != 0, "CreateMutex error %ld\n", GetLastError());
5624
5626 ok(access == MUTANT_ALL_ACCESS, "expected MUTANT_ALL_ACCESS, got %#lx\n", access);
5627
5628 for (i = 0; i < ARRAY_SIZE(map); i++)
5629 {
5630 SetLastError( 0xdeadbeef );
5632 map[i].generic, FALSE, 0);
5633 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5634
5636 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5637
5639
5640 SetLastError(0xdeadbeef);
5641 dup = OpenMutexA(0, FALSE, "WineTestMutex");
5642 todo_wine
5643 ok(!dup, "OpenMutex should fail\n");
5644 todo_wine
5645 ok(GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError());
5646 }
5647
5649
5651}
5652
5654{
5655 DWORD ret, i, access;
5656 HANDLE event, dup;
5661 static const struct
5662 {
5663 int generic, mapped;
5664 } map[] =
5665 {
5666 { 0, 0 },
5671 };
5672
5673 SetLastError(0xdeadbeef);
5674 event = OpenEventA(0, FALSE, "WineTestEvent");
5675 ok(!event, "event should not exist\n");
5676 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
5677
5678 SetLastError(0xdeadbeef);
5679 event = CreateEventA(NULL, FALSE, FALSE, "WineTestEvent");
5680 ok(event != 0, "CreateEvent error %ld\n", GetLastError());
5681
5683 ok(access == EVENT_ALL_ACCESS, "expected EVENT_ALL_ACCESS, got %#lx\n", access);
5684
5685 for (i = 0; i < ARRAY_SIZE(map); i++)
5686 {
5687 SetLastError( 0xdeadbeef );
5689 map[i].generic, FALSE, 0);
5690 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5691
5693 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5694
5696
5697 SetLastError(0xdeadbeef);
5698 dup = OpenEventA(0, FALSE, "WineTestEvent");
5699 todo_wine
5700 ok(!dup, "OpenEvent should fail\n");
5701 todo_wine
5702 ok(GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError());
5703 }
5704
5706
5708}
5709
5711{
5712 DWORD ret, i, access;
5713 HANDLE sem, dup;
5718 static const struct
5719 {
5720 int generic, mapped;
5721 } map[] =
5722 {
5723 { 0, 0 },
5728 };
5729
5730 SetLastError(0xdeadbeef);
5731 sem = OpenSemaphoreA(0, FALSE, "WineTestSemaphore");
5732 ok(!sem, "semaphore should not exist\n");
5733 ok(GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %lu\n", GetLastError());
5734
5735 SetLastError(0xdeadbeef);
5736 sem = CreateSemaphoreA(NULL, 0, 10, "WineTestSemaphore");
5737 ok(sem != 0, "CreateSemaphore error %ld\n", GetLastError());
5738
5740 ok(access == SEMAPHORE_ALL_ACCESS, "expected SEMAPHORE_ALL_ACCESS, got %#lx\n", access);
5741
5742 for (i = 0; i < ARRAY_SIZE(map); i++)
5743 {
5744 SetLastError( 0xdeadbeef );
5746 map[i].generic, FALSE, 0);
5747 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5748
5750 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5751
5753 }
5754
5756
5758}
5759
5760#define WINE_TEST_PIPE "\\\\.\\pipe\\WineTestPipe"
5762{
5763 DWORD ret, i, access;
5764 HANDLE pipe, file, dup;
5769 static const struct
5770 {
5771 int generic, mapped;
5772 } map[] =
5773 {
5774 { 0, 0 },
5779 };
5780 static const struct
5781 {
5782 DWORD open_mode;
5783 DWORD access;
5784 } creation_access[] =
5785 {
5791 /* ACCESS_SYSTEM_SECURITY is also valid, but will fail with ERROR_PRIVILEGE_NOT_HELD */
5792 };
5793
5794 /* Test the different security access options for pipes */
5795 for (i = 0; i < ARRAY_SIZE(creation_access); i++)
5796 {
5797 SetLastError(0xdeadbeef);
5798 pipe = CreateNamedPipeA(WINE_TEST_PIPE, creation_access[i].open_mode,
5801 ok(pipe != INVALID_HANDLE_VALUE, "CreateNamedPipe(0x%lx) error %ld\n",
5802 creation_access[i].open_mode, GetLastError());
5803 access = get_obj_access(pipe);
5804 ok(access == creation_access[i].access,
5805 "CreateNamedPipeA(0x%lx) pipe expected access 0x%lx (got 0x%lx)\n",
5806 creation_access[i].open_mode, creation_access[i].access, access);
5807 CloseHandle(pipe);
5808 }
5809
5810 SetLastError(0xdeadbeef);
5814 ok(pipe != INVALID_HANDLE_VALUE, "CreateNamedPipe error %ld\n", GetLastError());
5815
5817
5818 SetLastError(0xdeadbeef);
5820 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5821
5823 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5824
5825 for (i = 0; i < ARRAY_SIZE(map); i++)
5826 {
5827 SetLastError( 0xdeadbeef );
5829 map[i].generic, FALSE, 0);
5830 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5831
5833 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5834
5836 }
5837
5839 CloseHandle(pipe);
5840
5841 SetLastError(0xdeadbeef);
5843 ok(file != INVALID_HANDLE_VALUE || broken(file == INVALID_HANDLE_VALUE) /* before Vista */, "CreateFile error %ld\n", GetLastError());
5844
5846 {
5848 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5849
5850 for (i = 0; i < ARRAY_SIZE(map); i++)
5851 {
5852 SetLastError( 0xdeadbeef );
5854 map[i].generic, FALSE, 0);
5855 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5856
5858 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5860 }
5861 }
5862
5864}
5865
5867{
5868 DWORD ret, i, access, bytes;
5869 HANDLE file, dup;
5870 static const struct
5871 {
5872 int generic, mapped;
5873 } map[] =
5874 {
5875 { 0, 0 },
5880 };
5881 char temp_path[MAX_PATH];
5882 char file_name[MAX_PATH];
5883 char buf[16];
5884
5887
5888 /* file */
5889 SetLastError(0xdeadbeef);
5891 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5892
5894 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5895
5896 for (i = 0; i < ARRAY_SIZE(map); i++)
5897 {
5898 SetLastError( 0xdeadbeef );
5900 map[i].generic, FALSE, 0);
5901 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5902
5904 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5905
5907 }
5908
5910
5911 SetLastError(0xdeadbeef);
5913 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5914
5916 ok(access == (FILE_READ_ATTRIBUTES | SYNCHRONIZE), "expected FILE_READ_ATTRIBUTES | SYNCHRONIZE, got %#lx\n", access);
5917
5918 bytes = 0xdeadbeef;
5919 SetLastError(0xdeadbeef);
5920 ret = ReadFile(file, buf, sizeof(buf), &bytes, NULL);
5921 ok(!ret, "ReadFile should fail\n");
5922 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
5923 ok(bytes == 0, "expected 0, got %lu\n", bytes);
5924
5926
5927 SetLastError(0xdeadbeef);
5929 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5930
5932 ok(access == (FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES), "expected FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES, got %#lx\n", access);
5933
5934 bytes = 0xdeadbeef;
5935 SetLastError(0xdeadbeef);
5936 ret = ReadFile(file, buf, sizeof(buf), &bytes, NULL);
5937 ok(!ret, "ReadFile should fail\n");
5938 ok(GetLastError() == ERROR_ACCESS_DENIED, "expected ERROR_ACCESS_DENIED, got %ld\n", GetLastError());
5939 ok(bytes == 0, "expected 0, got %lu\n", bytes);
5940
5943
5944 /* directory */
5945 SetLastError(0xdeadbeef);
5947 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5948
5950 ok(access == FILE_ALL_ACCESS, "expected FILE_ALL_ACCESS, got %#lx\n", access);
5951
5952 for (i = 0; i < ARRAY_SIZE(map); i++)
5953 {
5954 SetLastError( 0xdeadbeef );
5956 map[i].generic, FALSE, 0);
5957 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
5958
5960 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
5961
5963 }
5964
5966
5967 SetLastError(0xdeadbeef);
5969 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5970
5972 ok(access == (FILE_READ_ATTRIBUTES | SYNCHRONIZE), "expected FILE_READ_ATTRIBUTES | SYNCHRONIZE, got %#lx\n", access);
5973
5975
5976 SetLastError(0xdeadbeef);
5978 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
5979
5981 ok(access == (FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES), "expected FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES, got %#lx\n", access);
5982
5984}
5985
5986static void test_filemap_security(void)
5987{
5988 char temp_path[MAX_PATH];
5989 char file_name[MAX_PATH];
5990 DWORD ret, i, access;
5991 HANDLE file, mapping, dup, created_mapping;
5992 static const struct
5993 {
5994 int generic, mapped;
5995 BOOL open_only;
5996 } map[] =
5997 {
5998 { 0, 0 },
6008 };
6009 static const struct
6010 {
6011 int prot, mapped;
6012 } prot_map[] =
6013 {
6014 { 0, 0 },
6015 { PAGE_NOACCESS, 0 },
6019 { PAGE_EXECUTE, 0 },
6023 };
6024
6027
6028 SetLastError(0xdeadbeef);
6030 ok(file != INVALID_HANDLE_VALUE, "CreateFile error %ld\n", GetLastError());
6033
6034 for (i = 0; i < ARRAY_SIZE(prot_map); i++)
6035 {
6036 if (map[i].open_only) continue;
6037
6038 SetLastError(0xdeadbeef);
6039 mapping = CreateFileMappingW(file, NULL, prot_map[i].prot, 0, 4096, NULL);
6040 if (prot_map[i].mapped)
6041 {
6042 ok(mapping != 0, "CreateFileMapping(%04x) error %ld\n", prot_map[i].prot, GetLastError());
6043 }
6044 else
6045 {
6046 ok(!mapping, "CreateFileMapping(%04x) should fail\n", prot_map[i].prot);
6047 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
6048 continue;
6049 }
6050
6052 ok(access == prot_map[i].mapped, "%ld: expected %#x, got %#lx\n", i, prot_map[i].mapped, access);
6053
6055 }
6056
6057 SetLastError(0xdeadbeef);
6059 ok(mapping != 0, "CreateFileMapping error %ld\n", GetLastError());
6060
6063 "expected STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ | SECTION_MAP_WRITE | SECTION_MAP_EXECUTE, got %#lx\n", access);
6064
6065 for (i = 0; i < ARRAY_SIZE(map); i++)
6066 {
6067 if (map[i].open_only) continue;
6068
6069 SetLastError( 0xdeadbeef );
6071 map[i].generic, FALSE, 0);
6072 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6073
6075 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6076
6078 }
6079
6083
6084 created_mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000,
6085 "Wine Test Open Mapping");
6086 ok(created_mapping != NULL, "CreateFileMapping failed with error %lu\n", GetLastError());
6087
6088 for (i = 0; i < ARRAY_SIZE(map); i++)
6089 {
6090 if (!map[i].generic) continue;
6091
6092 mapping = OpenFileMappingA(map[i].generic, FALSE, "Wine Test Open Mapping");
6093 ok(mapping != NULL, "OpenFileMapping failed with error %ld\n", GetLastError());
6095 ok(access == map[i].mapped, "%ld: unexpected access flags %#lx, expected %#x\n",
6096 i, access, map[i].mapped);
6098 }
6099
6100 CloseHandle(created_mapping);
6101}
6102
6103static void test_thread_security(void)
6104{
6105 DWORD ret, i, access;
6106 HANDLE thread, dup;
6107 static const struct
6108 {
6109 int generic, mapped;
6110 } map[] =
6111 {
6112 { 0, 0 },
6117 };
6118
6119 SetLastError(0xdeadbeef);
6120 thread = CreateThread(NULL, 0, (void *)0xdeadbeef, NULL, CREATE_SUSPENDED, &ret);
6121 ok(thread != 0, "CreateThread error %ld\n", GetLastError());
6122
6124 ok(access == THREAD_ALL_ACCESS_NT4 || access == THREAD_ALL_ACCESS_VISTA, "expected THREAD_ALL_ACCESS, got %#lx\n", access);
6125
6126 for (i = 0; i < ARRAY_SIZE(map); i++)
6127 {
6128 SetLastError( 0xdeadbeef );
6130 map[i].generic, FALSE, 0);
6131 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6132
6134 switch (map[i].generic)
6135 {
6136 case GENERIC_READ:
6137 case GENERIC_EXECUTE:
6138 ok(access == map[i].mapped ||
6139 access == (map[i].mapped | THREAD_QUERY_LIMITED_INFORMATION) /* Vista+ */ ||
6140 access == (map[i].mapped | THREAD_QUERY_LIMITED_INFORMATION | THREAD_RESUME) /* win8 */,
6141 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6142 break;
6143 case GENERIC_WRITE:
6144 ok(access == map[i].mapped ||
6145 access == (map[i].mapped | THREAD_SET_LIMITED_INFORMATION) /* Vista+ */ ||
6146 access == (map[i].mapped | THREAD_SET_LIMITED_INFORMATION | THREAD_RESUME) /* win8 */,
6147 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6148 break;
6149 case GENERIC_ALL:
6150 ok(access == map[i].mapped || access == THREAD_ALL_ACCESS_VISTA,
6151 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6152 break;
6153 default:
6154 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6155 break;
6156 }
6157
6159 }
6160
6161 SetLastError( 0xdeadbeef );
6164 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6167 access == THREAD_QUERY_INFORMATION /* before Vista */,
6168 "expected THREAD_QUERY_INFORMATION|THREAD_QUERY_LIMITED_INFORMATION, got %#lx\n", access);
6170
6173}
6174
6175static void test_process_access(void)
6176{
6177 DWORD ret, i, access;
6179 STARTUPINFOA sti;
6181 char cmdline[] = "winver.exe";
6182 static const struct
6183 {
6184 int generic, mapped;
6185 } map[] =
6186 {
6187 { 0, 0 },
6193 };
6194
6195 memset(&sti, 0, sizeof(sti));
6196 sti.cb = sizeof(sti);
6197 SetLastError(0xdeadbeef);
6199 ok(ret, "CreateProcess() error %ld\n", GetLastError());
6200
6203
6205 ok(access == PROCESS_ALL_ACCESS_NT4 || access == PROCESS_ALL_ACCESS_VISTA, "expected PROCESS_ALL_ACCESS, got %#lx\n", access);
6206
6207 for (i = 0; i < ARRAY_SIZE(map); i++)
6208 {
6209 SetLastError( 0xdeadbeef );
6211 map[i].generic, FALSE, 0);
6212 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6213
6215 switch (map[i].generic)
6216 {
6217 case GENERIC_READ:
6218 ok(access == map[i].mapped || access == (map[i].mapped | PROCESS_QUERY_LIMITED_INFORMATION) /* Vista+ */,
6219 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6220 break;
6221 case GENERIC_WRITE:
6222 ok(access == map[i].mapped ||
6223 access == (map[i].mapped | PROCESS_TERMINATE) /* before Vista */ ||
6224 access == (map[i].mapped | PROCESS_SET_LIMITED_INFORMATION) /* win8 */ ||
6225 access == (map[i].mapped | PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_SET_LIMITED_INFORMATION) /* Win10 Anniversary Update */,
6226 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6227 break;
6228 case GENERIC_EXECUTE:
6229 ok(access == map[i].mapped || access == (map[i].mapped | PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_TERMINATE) /* Vista+ */,
6230 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6231 break;
6232 case GENERIC_ALL:
6233 ok(access == map[i].mapped || access == PROCESS_ALL_ACCESS_VISTA,
6234 "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6235 break;
6236 default:
6237 ok(access == map[i].mapped, "%ld: expected %#x, got %#lx\n", i, map[i].mapped, access);
6238 break;
6239 }
6240
6242 }
6243
6244 SetLastError( 0xdeadbeef );
6247 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6250 access == PROCESS_QUERY_INFORMATION /* before Vista */,
6251 "expected PROCESS_QUERY_INFORMATION|PROCESS_QUERY_LIMITED_INFORMATION, got %#lx\n", access);
6253
6254 SetLastError( 0xdeadbeef );
6257 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6259 ok(access == PROCESS_VM_OPERATION, "unexpected access right %lx\n", access);
6261
6262 SetLastError( 0xdeadbeef );
6265 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6267 ok(access == PROCESS_VM_WRITE, "unexpected access right %lx\n", access);
6269
6270 SetLastError( 0xdeadbeef );
6273 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6276 broken(access == (PROCESS_VM_OPERATION | PROCESS_VM_WRITE)) /* Win8 and before */,
6277 "expected PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_QUERY_LIMITED_INFORMATION, got %#lx\n", access);
6279
6280 SetLastError( 0xdeadbeef );
6283 ok(ret, "DuplicateHandle error %ld\n", GetLastError());
6285 ok(access == (PROCESS_VM_OPERATION | PROCESS_VM_READ), "unexpected access right %lx\n", access);
6287
6290}
6291
6293{
6294 DWORD ret, needed;
6297
6298 type = 0xdeadbeef;
6299 needed = 0;
6300 SetLastError(0xdeadbeef);
6301 ret = GetTokenInformation(token, TokenType, &type, sizeof(type), &needed);
6302 ok(ret, "GetTokenInformation error %ld\n", GetLastError());
6303 ok(needed == sizeof(type), "GetTokenInformation should return required buffer length\n");
6304 ok(type == TokenPrimary || type == TokenImpersonation, "expected TokenPrimary or TokenImpersonation, got %d\n", type);
6305
6306 *token_type = type;
6307 if (type != TokenImpersonation) return FALSE;
6308
6309 needed = 0;
6310 SetLastError(0xdeadbeef);
6311 ret = GetTokenInformation(token, TokenImpersonationLevel, &sil, sizeof(sil), &needed);
6312 ok(ret, "GetTokenInformation error %ld\n", GetLastError());
6313 ok(needed == sizeof(sil), "GetTokenInformation should return required buffer length\n");
6314 ok(sil == SecurityImpersonation, "expected SecurityImpersonation, got %d\n", sil);
6315
6316 needed = 0xdeadbeef;
6317 SetLastError(0xdeadbeef);
6319 ok(!ret, "GetTokenInformation should fail\n");
6320 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6321 ok(needed != 0xdeadbeef, "GetTokenInformation should return required buffer length\n");
6322 ok(needed > sizeof(TOKEN_DEFAULT_DACL), "GetTokenInformation returned empty default DACL\n");
6323
6324 needed = 0xdeadbeef;
6325 SetLastError(0xdeadbeef);
6326 ret = GetTokenInformation(token, TokenOwner, NULL, 0, &needed);
6327 ok(!ret, "GetTokenInformation should fail\n");
6328 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6329 ok(needed != 0xdeadbeef, "GetTokenInformation should return required buffer length\n");
6330 ok(needed > sizeof(TOKEN_OWNER), "GetTokenInformation returned empty token owner\n");
6331
6332 needed = 0xdeadbeef;
6333 SetLastError(0xdeadbeef);
6335 ok(!ret, "GetTokenInformation should fail\n");
6336 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
6337 ok(needed != 0xdeadbeef, "GetTokenInformation should return required buffer length\n");
6338 ok(needed > sizeof(TOKEN_PRIMARY_GROUP), "GetTokenInformation returned empty token primary group\n");
6339
6340 return TRUE;
6341}
6342
6344{
6345 HANDLE token, process_token;
6346 DWORD ret, token_type;
6347
6349 ok(ret, "OpenProcessToken error %ld\n", GetLastError());
6350
6351 ret = validate_impersonation_token(process_token, &token_type);
6352 ok(token_type == TokenPrimary, "expected TokenPrimary, got %ld\n", token_type);
6353 ok(!ret, "access token should not be an impersonation token\n");
6354
6355 ret = DuplicateToken(process_token, SecurityImpersonation, &token);
6356 ok(ret, "DuplicateToken error %ld\n", GetLastError());
6357
6358 ret = validate_impersonation_token(token, &token_type);
6359 ok(ret, "access token should be a valid impersonation token\n");
6360 ok(token_type == TokenImpersonation, "expected TokenImpersonation, got %ld\n", token_type);
6361
6370 /* FIXME: test other kernel object types */
6371
6372 CloseHandle(process_token);
6374}
6375
6377{
6379 BYTE buffer[64]; /* using max. 28 byte in win7 x64 */
6380 HANDLE token;
6381 DWORD size;
6382 DWORD res;
6383 static SID medium_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6385 static SID high_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6387
6388 SetLastError(0xdeadbeef);
6390 ok(res, "got %ld with %ld (expected TRUE)\n", res, GetLastError());
6391
6392 SetLastError(0xdeadbeef);
6394
6395 /* not supported before Vista */
6397 {
6398 win_skip("TokenIntegrityLevel not supported\n");
6400 return;
6401 }
6402
6403 ok(res, "got %lu with %lu (expected TRUE)\n", res, GetLastError());
6404 if (!res)
6405 {
6407 return;
6408 }
6409
6412 "got 0x%lx (expected 0x%x)\n", tml->Label.Attributes, (SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED));
6413
6414#ifdef __REACTOS__ // This crashes on Vista, Win7, and Win8.1.
6416#endif
6417 ok(EqualSid(tml->Label.Sid, &medium_level) || EqualSid(tml->Label.Sid, &high_level),
6418 "got %s (expected %s or %s)\n", debugstr_sid(tml->Label.Sid),
6419 debugstr_sid(&medium_level), debugstr_sid(&high_level));
6420
6422}
6423
6425{
6426 TOKEN_USER *token_user;
6427 TOKEN_OWNER *token_owner;
6428 TOKEN_PRIMARY_GROUP *token_primary_group;
6430 BOOL ret, defaulted, present, found;
6431 DWORD size, index;
6434 PSID owner, group;
6435 ACL *dacl;
6436 ACCESS_ALLOWED_ACE *ace;
6437
6439 ok(ret, "OpenProcessToken failed with error %ld\n", GetLastError());
6440
6441 token_user = get_alloc_token_user( token );
6442 token_owner = get_alloc_token_owner( token );
6443 token_primary_group = get_alloc_token_primary_group( token );
6444
6445 CloseHandle( token );
6446
6449 ok( ret, "error %lu\n", GetLastError() );
6450
6451 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
6452 sa.lpSecurityDescriptor = sd;
6453 sa.bInheritHandle = FALSE;
6454 handle = CreateEventA( &sa, TRUE, TRUE, "test_event" );
6455 ok( handle != NULL, "error %lu\n", GetLastError() );
6456
6457 size = 0;
6459 ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "error %lu\n", GetLastError() );
6460
6461 sd = malloc( size );
6463 ok( ret, "error %lu\n", GetLastError() );
6464
6465 owner = (void *)0xdeadbeef;
6466 defaulted = TRUE;
6467 ret = GetSecurityDescriptorOwner( sd, &owner, &defaulted );
6468 ok( ret, "error %lu\n", GetLastError() );
6469 ok( owner != (void *)0xdeadbeef, "owner not set\n" );
6470 ok( !defaulted, "owner defaulted\n" );
6471 ok( EqualSid( owner, token_owner->Owner ), "owner shall equal token owner\n" );
6472
6473 group = (void *)0xdeadbeef;
6474 defaulted = TRUE;
6475 ret = GetSecurityDescriptorGroup( sd, &group, &defaulted );
6476 ok( ret, "error %lu\n", GetLastError() );
6477 ok( group != (void *)0xdeadbeef, "group not set\n" );
6478 ok( !defaulted, "group defaulted\n" );
6479 ok( EqualSid( group, token_primary_group->PrimaryGroup ), "group shall equal token primary group\n" );
6480
6481 dacl = (void *)0xdeadbeef;
6482 present = FALSE;
6483 defaulted = TRUE;
6484 ret = GetSecurityDescriptorDacl( sd, &present, &dacl, &defaulted );
6485 ok( ret, "error %lu\n", GetLastError() );
6486 ok( present, "dacl not present\n" );
6487 ok( dacl != (void *)0xdeadbeef, "dacl not set\n" );
6488 ok( !defaulted, "dacl defaulted\n" );
6489
6490 index = 0;
6491 found = FALSE;
6492 while (GetAce( dacl, index++, (void **)&ace ))
6493 {
6495 "expected ACCESS_ALLOWED_ACE_TYPE, got %d\n", ace->Header.AceType );
6496 if (EqualSid( &ace->SidStart, owner )) found = TRUE;
6497 }
6498 ok( found, "owner sid not found in dacl\n" );
6499
6500 if (!EqualSid( token_user->User.Sid, token_owner->Owner ))
6501 {
6502 index = 0;
6503 found = FALSE;
6504 while (GetAce( dacl, index++, (void **)&ace ))
6505 {
6506 ok( ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE,
6507 "expected ACCESS_ALLOWED_ACE_TYPE, got %d\n", ace->Header.AceType );
6508 if (EqualSid( &ace->SidStart, token_user->User.Sid )) found = TRUE;
6509 }
6510 ok( !found, "DACL shall not reference token user if it is different from token owner\n" );
6511 }
6512
6513 free( sa.lpSecurityDescriptor );
6514 free( sd );
6516
6517 free( token_primary_group );
6518 free( token_owner );
6519 free( token_user );
6520}
6521
6523{
6525 HANDLE token;
6526 DWORD len;
6527 LUID luid;
6528 BOOL ret;
6529
6531 return;
6532
6534 {
6536 return;
6537 }
6538
6539 tp.PrivilegeCount = 1;
6540 tp.Privileges[0].Luid = luid;
6541 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
6542
6543 len = 0xdeadbeef;
6545 ok(ret, "got %d\n", ret);
6546 ok(len == 0xdeadbeef, "got length %ld\n", len);
6547
6548 /* revert */
6549 tp.PrivilegeCount = 1;
6550 tp.Privileges[0].Luid = luid;
6551 tp.Privileges[0].Attributes = 0;
6553 ok(ret, "got %d\n", ret);
6554
6556}
6557
6558static void test_AddAce(void)
6559{
6561
6562 char acl_buf[1024], ace_buf[256];
6563 ACCESS_ALLOWED_ACE *ace = (ACCESS_ALLOWED_ACE*)ace_buf;
6564 PACL acl = (PACL)acl_buf;
6565 BOOL ret;
6566
6567 memset(ace, 0, sizeof(ace_buf));
6569 ace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD)+sizeof(SID);
6570 memcpy(&ace->SidStart, &sidWorld, sizeof(sidWorld));
6571
6572 ret = InitializeAcl(acl, sizeof(acl_buf), ACL_REVISION2);
6573 ok(ret, "InitializeAcl failed: %ld\n", GetLastError());
6574
6575 ret = AddAce(acl, ACL_REVISION1, MAXDWORD, ace, ace->Header.AceSize);
6576 ok(ret, "AddAce failed: %ld\n", GetLastError());
6577 ret = AddAce(acl, ACL_REVISION2, MAXDWORD, ace, ace->Header.AceSize);
6578 ok(ret, "AddAce failed: %ld\n", GetLastError());
6579 ret = AddAce(acl, ACL_REVISION3, MAXDWORD, ace, ace->Header.AceSize);
6580 ok(ret, "AddAce failed: %ld\n", GetLastError());
6581 ok(acl->AclRevision == ACL_REVISION3, "acl->AclRevision = %d\n", acl->AclRevision);
6582 ret = AddAce(acl, ACL_REVISION4, MAXDWORD, ace, ace->Header.AceSize);
6583 ok(ret, "AddAce failed: %ld\n", GetLastError());
6584 ok(acl->AclRevision == ACL_REVISION4, "acl->AclRevision = %d\n", acl->AclRevision);
6585 ret = AddAce(acl, ACL_REVISION1, MAXDWORD, ace, ace->Header.AceSize);
6586 ok(ret, "AddAce failed: %ld\n", GetLastError());
6587 ok(acl->AclRevision == ACL_REVISION4, "acl->AclRevision = %d\n", acl->AclRevision);
6588 ret = AddAce(acl, ACL_REVISION2, MAXDWORD, ace, ace->Header.AceSize);
6589 ok(ret, "AddAce failed: %ld\n", GetLastError());
6590
6591 ret = AddAce(acl, MIN_ACL_REVISION-1, MAXDWORD, ace, ace->Header.AceSize);
6592 ok(ret, "AddAce failed: %ld\n", GetLastError());
6593 /* next test succeededs but corrupts ACL */
6594 ret = AddAce(acl, MAX_ACL_REVISION+1, MAXDWORD, ace, ace->Header.AceSize);
6595 ok(ret, "AddAce failed: %ld\n", GetLastError());
6596 ok(acl->AclRevision == MAX_ACL_REVISION+1, "acl->AclRevision = %d\n", acl->AclRevision);
6597 SetLastError(0xdeadbeef);
6598 ret = AddAce(acl, ACL_REVISION1, MAXDWORD, ace, ace->Header.AceSize);
6599 ok(!ret, "AddAce succeeded\n");
6600 ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %ld\n", GetLastError());
6601}
6602
6603static void test_AddMandatoryAce(void)
6604{
6605 static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6607 static SID medium_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
6610 char buffer_sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
6611 SECURITY_DESCRIPTOR *sd2, *sd = (SECURITY_DESCRIPTOR *)&buffer_sd;
6612 BOOL defaulted, present, ret;
6613 ACL_SIZE_INFORMATION acl_size_info;
6615 char buffer_acl[256];
6616 ACL *acl = (ACL *)&buffer_acl;
6618 DWORD size;
6619 HANDLE handle;
6620 SID *everyone;
6621 ACL *sacl;
6622
6623 if (!pAddMandatoryAce)
6624 {
6625 win_skip("AddMandatoryAce not supported, skipping test\n");
6626 return;
6627 }
6628
6630 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
6631
6632 sa.nLength = sizeof(sa);
6633 sa.lpSecurityDescriptor = sd;
6634 sa.bInheritHandle = FALSE;
6635
6636 handle = CreateEventA(&sa, TRUE, TRUE, "test_event");
6637 ok(handle != NULL, "CreateEventA failed with error %lu\n", GetLastError());
6638
6641 "Unexpected GetKernelObjectSecurity return value %u, error %lu\n", ret, GetLastError());
6642
6643 sd2 = malloc(size);
6645 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6646
6647 sacl = (void *)0xdeadbeef;
6648 present = TRUE;
6649 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6650 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6651 ok(!present, "SACL is present\n");
6652 ok(sacl == (void *)0xdeadbeef, "SACL is set\n");
6653
6654 free(sd2);
6656
6657 memset(buffer_acl, 0, sizeof(buffer_acl));
6658 ret = InitializeAcl(acl, 256, ACL_REVISION);
6659 ok(ret, "InitializeAcl failed with %lu\n", GetLastError());
6660
6661 SetLastError(0xdeadbeef);
6662 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, 0x1234, &low_level);
6663 ok(!ret, "AddMandatoryAce succeeded\n");
6665 "Expected ERROR_INVALID_PARAMETER got %lu\n", GetLastError());
6666
6667 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, &low_level);
6668 ok(ret, "AddMandatoryAce failed with %lu\n", GetLastError());
6669
6670 ret = GetAce(acl, 0, (void **)&ace);
6671 ok(ret, "got error %lu\n", GetLastError());
6672 ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "got type %#x\n", ace->Header.AceType);
6673 ok(!ace->Header.AceFlags, "got flags %#x\n", ace->Header.AceFlags);
6674 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "got mask %#lx\n", ace->Mask);
6675 ok(EqualSid(&ace->SidStart, &low_level), "wrong sid\n");
6676
6677 SetLastError(0xdeadbeef);
6678 ret = GetAce(acl, 1, (void **)&ace);
6679 ok(!ret, "expected failure\n");
6680 ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
6681
6683 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6684
6685 handle = CreateEventA(&sa, TRUE, TRUE, "test_event");
6686 ok(handle != NULL, "CreateEventA failed with error %lu\n", GetLastError());
6687
6690 "Unexpected GetKernelObjectSecurity return value %u, error %lu\n", ret, GetLastError());
6691
6692 sd2 = malloc(size);
6694 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6695
6696 sacl = (void *)0xdeadbeef;
6697 present = FALSE;
6698 defaulted = TRUE;
6699 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6700 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6701 ok(present, "SACL not present\n");
6702 ok(sacl != (void *)0xdeadbeef, "SACL not set\n");
6703 ok(!defaulted, "SACL defaulted\n");
6704 ret = GetAclInformation(sacl, &acl_size_info, sizeof(acl_size_info), AclSizeInformation);
6705 ok(ret, "GetAclInformation failed with error %lu\n", GetLastError());
6706 ok(acl_size_info.AceCount == 1, "SACL contains an unexpected ACE count %lu\n", acl_size_info.AceCount);
6707
6708 ret = GetAce(sacl, 0, (void **)&ace);
6709 ok(ret, "GetAce failed with error %lu\n", GetLastError());
6710 ok (ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "Unexpected ACE type %#x\n", ace->Header.AceType);
6711 ok(!ace->Header.AceFlags, "Unexpected ACE flags %#x\n", ace->Header.AceFlags);
6712 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "Unexpected ACE mask %#lx\n", ace->Mask);
6713 ok(EqualSid(&ace->SidStart, &low_level), "Expected low integrity level\n");
6714
6715 free(sd2);
6716
6717 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP, &medium_level);
6718 ok(ret, "AddMandatoryAce failed with error %lu\n", GetLastError());
6719
6721 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6722
6725 "Unexpected GetKernelObjectSecurity return value %u, error %lu\n", ret, GetLastError());
6726
6727 sd2 = malloc(size);
6729 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6730
6731 sacl = (void *)0xdeadbeef;
6732 present = FALSE;
6733 defaulted = TRUE;
6734 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6735 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6736 ok(present, "SACL not present\n");
6737 ok(sacl != (void *)0xdeadbeef, "SACL not set\n");
6738 ok(sacl->AceCount == 2, "Expected 2 ACEs, got %d\n", sacl->AceCount);
6739 ok(!defaulted, "SACL defaulted\n");
6740
6741 ret = GetAce(acl, 0, (void **)&ace);
6742 ok(ret, "got error %lu\n", GetLastError());
6743 ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "got type %#x\n", ace->Header.AceType);
6744 ok(!ace->Header.AceFlags, "got flags %#x\n", ace->Header.AceFlags);
6745 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "got mask %#lx\n", ace->Mask);
6746 ok(EqualSid(&ace->SidStart, &low_level), "wrong sid\n");
6747
6748 ret = GetAce(acl, 1, (void **)&ace);
6749 ok(ret, "got error %lu\n", GetLastError());
6750 ok(ace->Header.AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE, "got type %#x\n", ace->Header.AceType);
6751 ok(!ace->Header.AceFlags, "got flags %#x\n", ace->Header.AceFlags);
6752 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP, "got mask %#lx\n", ace->Mask);
6753 ok(EqualSid(&ace->SidStart, &medium_level), "wrong sid\n");
6754
6755 SetLastError(0xdeadbeef);
6756 ret = GetAce(acl, 2, (void **)&ace);
6757 ok(!ret, "expected failure\n");
6758 ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
6759
6760 free(sd2);
6761
6763 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6764
6766 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6767
6770 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
6771
6772 sd2 = malloc(size);
6774 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6775
6776 sacl = (void *)0xdeadbeef;
6777 present = FALSE;
6778 defaulted = TRUE;
6779 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6780 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6781 ok(present, "SACL not present\n");
6782 ok(sacl && sacl != (void *)0xdeadbeef, "SACL not set\n");
6783 ok(!defaulted, "SACL defaulted\n");
6784 ok(!sacl->AceCount, "SACL contains an unexpected ACE count %u\n", sacl->AceCount);
6785
6786 free(sd2);
6787
6788 ret = InitializeAcl(acl, 256, ACL_REVISION);
6789 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
6790
6791 ret = pAddMandatoryAce(acl, ACL_REVISION3, 0, SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP, &medium_level);
6792 ok(ret, "AddMandatoryAce failed with error %lu\n", GetLastError());
6793
6795 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6796
6798 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6799
6802 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
6803
6804 sd2 = malloc(size);
6806 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6807
6808 sacl = (void *)0xdeadbeef;
6809 present = FALSE;
6810 defaulted = TRUE;
6811 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6812 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6813 ok(present, "SACL not present\n");
6814 ok(sacl != (void *)0xdeadbeef, "SACL not set\n");
6815 ok(sacl->AclRevision == ACL_REVISION3, "Expected revision 3, got %d\n", sacl->AclRevision);
6816 ok(!defaulted, "SACL defaulted\n");
6817
6818 free(sd2);
6819
6820 ret = InitializeAcl(acl, 256, ACL_REVISION);
6821 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
6822
6823 ret = AllocateAndInitializeSid(&sia_world, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, (void **)&everyone);
6824 ok(ret, "AllocateAndInitializeSid failed with error %lu\n", GetLastError());
6825
6826 ret = AddAccessAllowedAce(acl, ACL_REVISION, KEY_READ, everyone);
6827 ok(ret, "AddAccessAllowedAce failed with error %lu\n", GetLastError());
6828
6830 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6831
6833 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
6834
6837 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
6838
6839 sd2 = malloc(size);
6841 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
6842
6843 sacl = (void *)0xdeadbeef;
6844 present = FALSE;
6845 defaulted = TRUE;
6846 ret = GetSecurityDescriptorSacl(sd2, &present, &sacl, &defaulted);
6847 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
6848 ok(present, "SACL not present\n");
6849 ok(sacl && sacl != (void *)0xdeadbeef, "SACL not set\n");
6850 ok(!defaulted, "SACL defaulted\n");
6851 ok(!sacl->AceCount, "SACL contains an unexpected ACE count %u\n", sacl->AceCount);
6852
6853 FreeSid(everyone);
6854 free(sd2);
6856}
6857
6859{
6860 static const WCHAR testkeyW[] =
6861 {'S','O','F','T','W','A','R','E','\\','W','i','n','e','\\','S','A','C','L','t','e','s','t',0};
6862 LONG res;
6863 HKEY hkey;
6865 ACL *sacl;
6866 DWORD err, len = 128;
6867 TOKEN_PRIVILEGES priv, *priv_prev;
6868 HANDLE token;
6869 LUID luid;
6870 BOOL ret;
6871
6874 {
6875 CloseHandle( token );
6876 return;
6877 }
6878
6879 /* ACCESS_SYSTEM_SECURITY requires special privilege */
6881 if (res == ERROR_ACCESS_DENIED)
6882 {
6883 skip( "unprivileged user\n" );
6884 CloseHandle( token );
6885 return;
6886 }
6887 todo_wine ok( res == ERROR_PRIVILEGE_NOT_HELD, "got %ld\n", res );
6888
6889 priv.PrivilegeCount = 1;
6890 priv.Privileges[0].Luid = luid;
6892
6893 priv_prev = malloc( len );
6894 ret = AdjustTokenPrivileges( token, FALSE, &priv, len, priv_prev, &len );
6895 ok( ret, "got %lu\n", GetLastError());
6896
6899 {
6900 win_skip( "privilege not held\n" );
6901 free( priv_prev );
6902 CloseHandle( token );
6903 return;
6904 }
6905 ok( !res, "got %ld\n", res );
6906
6907 /* restore privileges */
6908 ret = AdjustTokenPrivileges( token, FALSE, priv_prev, 0, NULL, NULL );
6909 ok( ret, "got %lu\n", GetLastError() );
6910 free( priv_prev );
6911
6912 /* privilege is checked on access */
6915 if (err == ERROR_SUCCESS)
6916 LocalFree( sd );
6917
6918 priv.PrivilegeCount = 1;
6919 priv.Privileges[0].Luid = luid;
6921
6922 priv_prev = malloc( len );
6923 ret = AdjustTokenPrivileges( token, FALSE, &priv, len, priv_prev, &len );
6924 ok( ret, "got %lu\n", GetLastError());
6925
6927 ok( err == ERROR_SUCCESS, "got %lu\n", err );
6928 RegCloseKey( hkey );
6929 LocalFree( sd );
6930
6931 /* handle created without ACCESS_SYSTEM_SECURITY, privilege held */
6932 res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ, NULL, &hkey, NULL );
6933 ok( res == ERROR_SUCCESS, "got %ld\n", res );
6934
6935 sd = NULL;
6937 todo_wine ok( err == ERROR_SUCCESS, "got %lu\n", err );
6938 RegCloseKey( hkey );
6939 LocalFree( sd );
6940
6941 /* restore privileges */
6942 ret = AdjustTokenPrivileges( token, FALSE, priv_prev, 0, NULL, NULL );
6943 ok( ret, "got %lu\n", GetLastError() );
6944 free( priv_prev );
6945
6946 /* handle created without ACCESS_SYSTEM_SECURITY, privilege not held */
6947 res = RegCreateKeyExW( HKEY_LOCAL_MACHINE, testkeyW, 0, NULL, 0, KEY_READ, NULL, &hkey, NULL );
6948 ok( res == ERROR_SUCCESS, "got %ld\n", res );
6949
6951 ok( err == ERROR_PRIVILEGE_NOT_HELD || err == ERROR_ACCESS_DENIED, "got %lu\n", err );
6952 RegCloseKey( hkey );
6953
6954 res = RegDeleteKeyW( HKEY_LOCAL_MACHINE, testkeyW );
6955 ok( !res, "got %ld\n", res );
6956 CloseHandle( token );
6957}
6958
6960{
6961#ifdef __REACTOS__
6962 char *user, buffer1[SECURITY_MAX_SID_SIZE];
6963 PSID domain_sid = (PSID *)&buffer1;
6964#else
6965 char *user, buffer1[SECURITY_MAX_SID_SIZE], buffer2[SECURITY_MAX_SID_SIZE];
6967 PSID domain_sid = (PSID *)&buffer1;
6968 PSID domain_sid2 = (PSID *)&buffer2;
6969#endif
6970 DWORD sid_size;
6971 PSID user_sid;
6972 HANDLE token;
6973 BOOL bret = TRUE;
6974#ifndef __REACTOS__
6975 int i;
6976#endif
6977
6979 {
6980 if (GetLastError() != ERROR_NO_TOKEN) bret = FALSE;
6982 }
6983 if (!bret)
6984 {
6985 win_skip("Failed to get current user token\n");
6986 return;
6987 }
6988
6989 bret = GetTokenInformation(token, TokenUser, NULL, 0, &sid_size);
6991 "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
6992 user = malloc(sid_size);
6993 bret = GetTokenInformation(token, TokenUser, user, sid_size, &sid_size);
6994 ok(bret, "GetTokenInformation(TokenUser) failed with error %ld\n", GetLastError());
6996 user_sid = ((TOKEN_USER *)user)->User.Sid;
6997
6998 SetLastError(0xdeadbeef);
6999 bret = GetWindowsAccountDomainSid(0, 0, 0);
7000 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
7001 ok(GetLastError() == ERROR_INVALID_SID, "expected ERROR_INVALID_SID, got %ld\n", GetLastError());
7002
7003 SetLastError(0xdeadbeef);
7004 bret = GetWindowsAccountDomainSid(user_sid, 0, 0);
7005 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
7006 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
7007
7008 sid_size = SECURITY_MAX_SID_SIZE;
7009 SetLastError(0xdeadbeef);
7010 bret = GetWindowsAccountDomainSid(user_sid, 0, &sid_size);
7011 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
7012 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
7013 ok(sid_size == GetSidLengthRequired(4), "expected size %ld, got %ld\n", GetSidLengthRequired(4), sid_size);
7014
7015 SetLastError(0xdeadbeef);
7016 bret = GetWindowsAccountDomainSid(user_sid, domain_sid, 0);
7017 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
7018 ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
7019
7020 sid_size = 1;
7021 SetLastError(0xdeadbeef);
7022 bret = GetWindowsAccountDomainSid(user_sid, domain_sid, &sid_size);
7023 ok(!bret, "GetWindowsAccountDomainSid succeeded\n");
7024 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
7025 ok(sid_size == GetSidLengthRequired(4), "expected size %ld, got %ld\n", GetSidLengthRequired(4), sid_size);
7026
7027 sid_size = SECURITY_MAX_SID_SIZE;
7028 bret = GetWindowsAccountDomainSid(user_sid, domain_sid, &sid_size);
7029 ok(bret, "GetWindowsAccountDomainSid failed with error %ld\n", GetLastError());
7030 ok(sid_size == GetSidLengthRequired(4), "expected size %ld, got %ld\n", GetSidLengthRequired(4), sid_size);
7031#ifndef __REACTOS__ // This crashes on WS03, Vista, Win7, and Win8.1.
7032 InitializeSid(domain_sid2, &domain_ident, 4);
7033 for (i = 0; i < 4; i++)
7034 *GetSidSubAuthority(domain_sid2, i) = *GetSidSubAuthority(user_sid, i);
7035 ok(EqualSid(domain_sid, domain_sid2), "unexpected domain sid %s != %s\n",
7036 debugstr_sid(domain_sid), debugstr_sid(domain_sid2));
7037#endif
7038
7039 free(user);
7040}
7041
7043{
7045 PSID authority_sid = (PSID *)buffer;
7047 BOOL ret;
7048
7049 memset(buffer, 0xcc, sizeof(buffer));
7050 ret = IsValidSid(authority_sid);
7051 ok(!ret, "expected FALSE, got %u\n", ret);
7052
7053 SetLastError(0xdeadbeef);
7054 id = GetSidIdentifierAuthority(authority_sid);
7055 ok(id != NULL, "got NULL pointer as identifier authority\n");
7056 ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %lu\n", GetLastError());
7057
7058 SetLastError(0xdeadbeef);
7060 ok(id != NULL, "got NULL pointer as identifier authority\n");
7061 ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %lu\n", GetLastError());
7062}
7063
7064static void test_pseudo_tokens(void)
7065{
7066 TOKEN_STATISTICS statistics1, statistics2;
7067 HANDLE token;
7068 DWORD retlen;
7069 BOOL ret;
7070
7072 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7073 memset(&statistics1, 0x11, sizeof(statistics1));
7074 ret = GetTokenInformation(token, TokenStatistics, &statistics1, sizeof(statistics1), &retlen);
7075 ok(ret, "GetTokenInformation failed with %lu\n", GetLastError());
7077
7078 /* test GetCurrentProcessToken() */
7079 SetLastError(0xdeadbeef);
7080 memset(&statistics2, 0x22, sizeof(statistics2));
7081 ret = GetTokenInformation(GetCurrentProcessToken(), TokenStatistics,
7082 &statistics2, sizeof(statistics2), &retlen);
7084 "GetTokenInformation failed with %lu\n", GetLastError());
7085 if (ret)
7086 ok(!memcmp(&statistics1, &statistics2, sizeof(statistics1)), "Token statistics do not match\n");
7087 else
7088 win_skip("CurrentProcessToken not supported, skipping test\n");
7089
7090 /* test GetCurrentThreadEffectiveToken() */
7091 SetLastError(0xdeadbeef);
7092 memset(&statistics2, 0x22, sizeof(statistics2));
7093 ret = GetTokenInformation(GetCurrentThreadEffectiveToken(), TokenStatistics,
7094 &statistics2, sizeof(statistics2), &retlen);
7096 "GetTokenInformation failed with %lu\n", GetLastError());
7097 if (ret)
7098 ok(!memcmp(&statistics1, &statistics2, sizeof(statistics1)), "Token statistics do not match\n");
7099 else
7100 win_skip("CurrentThreadEffectiveToken not supported, skipping test\n");
7101
7102 SetLastError(0xdeadbeef);
7104 ok(!ret, "OpenThreadToken should have failed\n");
7105 ok(GetLastError() == ERROR_NO_TOKEN, "Expected ERROR_NO_TOKEN, got %lu\n", GetLastError());
7106
7107 /* test GetCurrentThreadToken() */
7108 SetLastError(0xdeadbeef);
7109 ret = GetTokenInformation(GetCurrentThreadToken(), TokenStatistics,
7110 &statistics2, sizeof(statistics2), &retlen);
7112 "Expected ERROR_NO_TOKEN, got %lu\n", GetLastError());
7113}
7114
7115static void test_maximum_allowed(void)
7116{
7117 HANDLE (WINAPI *pCreateEventExA)(SECURITY_ATTRIBUTES *, LPCSTR, DWORD, DWORD);
7118 char buffer_sd[SECURITY_DESCRIPTOR_MIN_LENGTH], buffer_acl[256];
7121 ACL *acl = (ACL *)&buffer_acl;
7122 HMODULE hkernel32 = GetModuleHandleA("kernel32.dll");
7124 HANDLE handle;
7125 BOOL ret;
7126
7127 pCreateEventExA = (void *)GetProcAddress(hkernel32, "CreateEventExA");
7128 if (!pCreateEventExA)
7129 {
7130 win_skip("CreateEventExA is not available\n");
7131 return;
7132 }
7133
7135 ok(ret, "InitializeSecurityDescriptor failed with %lu\n", GetLastError());
7136 memset(buffer_acl, 0, sizeof(buffer_acl));
7137 ret = InitializeAcl(acl, 256, ACL_REVISION);
7138 ok(ret, "InitializeAcl failed with %lu\n", GetLastError());
7140 ok(ret, "SetSecurityDescriptorDacl failed with %lu\n", GetLastError());
7141
7142 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
7143 sa.lpSecurityDescriptor = sd;
7144 sa.bInheritHandle = FALSE;
7145
7146 handle = pCreateEventExA(&sa, NULL, 0, MAXIMUM_ALLOWED | 0x4);
7147 ok(handle != NULL, "CreateEventExA failed with error %lu\n", GetLastError());
7149 ok(mask == EVENT_ALL_ACCESS, "Expected %x, got %lx\n", EVENT_ALL_ACCESS, mask);
7151}
7152
7153static void check_token_label(HANDLE token, DWORD *level, BOOL sacl_inherited)
7154{
7155 static SID medium_sid = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7157 static SID high_sid = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7161 BOOL ret, present, defaulted;
7163 ACL *sacl = NULL, *dacl;
7165 char *str;
7166 SID *sid;
7167
7170 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7171
7172 sd = malloc(size);
7174 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7175
7177 ok(ret, "GetSecurityDescriptorControl failed with error %lu\n", GetLastError());
7178 if (sacl_inherited)
7180 "Unexpected security descriptor control %#x\n", control);
7181 else
7183 "Unexpected security descriptor control %#x\n", control);
7184 ok(revision == 1, "Unexpected security descriptor revision %lu\n", revision);
7185
7186 sid = (void *)0xdeadbeef;
7187 defaulted = TRUE;
7188 ret = GetSecurityDescriptorOwner(sd, (void **)&sid, &defaulted);
7189 ok(ret, "GetSecurityDescriptorOwner failed with error %lu\n", GetLastError());
7190 ok(!sid, "Owner present\n");
7191 ok(!defaulted, "Owner defaulted\n");
7192
7193 sid = (void *)0xdeadbeef;
7194 defaulted = TRUE;
7195 ret = GetSecurityDescriptorGroup(sd, (void **)&sid, &defaulted);
7196 ok(ret, "GetSecurityDescriptorGroup failed with error %lu\n", GetLastError());
7197 ok(!sid, "Group present\n");
7198 ok(!defaulted, "Group defaulted\n");
7199
7200 ret = GetSecurityDescriptorSacl(sd, &present, &sacl, &defaulted);
7201 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
7202 ok(present, "No SACL in the security descriptor\n");
7203 ok(!!sacl, "NULL SACL in the security descriptor\n");
7204 ok(!defaulted, "SACL defaulted\n");
7205 ok(sacl->AceCount == 1, "SACL contains an unexpected ACE count %u\n", sacl->AceCount);
7206
7207 ret = GetAce(sacl, 0, (void **)&ace);
7208 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7209
7211 "Unexpected ACE type %#x\n", ace->Header.AceType);
7212 ok(!ace->Header.AceFlags, "Unexpected ACE flags %#x\n", ace->Header.AceFlags);
7213 ok(ace->Header.AceSize, "Unexpected ACE size %u\n", ace->Header.AceSize);
7214 ok(ace->Mask == SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, "Unexpected ACE mask %#lx\n", ace->Mask);
7215
7216 sid = (SID *)&ace->SidStart;
7218 ok(EqualSid(sid, &medium_sid) || EqualSid(sid, &high_sid), "Got unexpected SID %s\n", str);
7219 *level = sid->SubAuthority[0];
7220 LocalFree(str);
7221
7222 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
7223 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7224 todo_wine ok(!present, "DACL present\n");
7225
7226 free(sd);
7227}
7228
7229static void test_token_label(void)
7230{
7233 char sacl_buffer[50];
7234 SECURITY_ATTRIBUTES attr = {.nLength = sizeof(SECURITY_ATTRIBUTES)};
7235 ACL *sacl = (ACL *)sacl_buffer;
7236 TOKEN_LINKED_TOKEN linked;
7237 DWORD level, level2, size;
7239 HANDLE token, token2;
7240 BOOL ret;
7241
7242 if (!pAddMandatoryAce)
7243 {
7244 win_skip("Mandatory integrity control is not supported.\n");
7245 return;
7246 }
7247
7249 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7250
7252
7254 ok(ret, "Failed to duplicate token, error %lu\n", GetLastError());
7255
7256 check_token_label(token2, &level2, TRUE);
7257 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7258
7259 CloseHandle(token2);
7260
7262 ok(ret, "Failed to duplicate token, error %lu\n", GetLastError());
7263
7264 check_token_label(token2, &level2, TRUE);
7265 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7266
7267 CloseHandle(token2);
7268
7269 /* Any label set in the SD when calling DuplicateTokenEx() is ignored. */
7270
7272 ok(!ret, "expected failure\n");
7273 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
7274
7275 sd = malloc(size);
7277 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7278
7279 InitializeAcl(sacl, sizeof(sacl_buffer), ACL_REVISION);
7280#ifdef __REACTOS__
7281 pAddMandatoryAce(sacl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, &low_sid);
7282#else
7284#endif
7286
7287 attr.lpSecurityDescriptor = sd;
7289 ok(ret, "Failed to duplicate token, error %lu\n", GetLastError());
7290
7291 check_token_label(token2, &level2, TRUE);
7292 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7293
7294 /* Trying to set a SD on the token also claims success but has no effect. */
7295
7297 ok(ret, "Failed to set SD, error %lu\n", GetLastError());
7298
7299 check_token_label(token2, &level2, FALSE);
7300 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7301
7302 free(sd);
7303
7304 /* Test the linked token. */
7305
7306#ifdef __REACTOS__
7307 /* This test crashes on Vista and Win7 */
7309 skip("Linked token tests crash on Vista and Win7.\n");
7310 }
7311 else {
7312#endif
7313 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
7314 ok(ret, "Failed to get linked token, error %lu\n", GetLastError());
7315
7316 check_token_label(linked.LinkedToken, &level2, TRUE);
7317 ok(level2 == level, "Expected level %#lx, got %#lx.\n", level, level2);
7318
7319 CloseHandle(linked.LinkedToken);
7320#ifdef __REACTOS__
7321 }
7322#endif
7323
7325}
7326
7328{
7329 static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7331 char buffer_sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
7332 SECURITY_DESCRIPTOR *sd = (SECURITY_DESCRIPTOR *)&buffer_sd, *sd2;
7333 char buffer_acl[256], buffer[MAX_PATH];
7334 ACL *acl = (ACL *)&buffer_acl, *acl2, *acl_child;
7335 BOOL defaulted, present, ret, found;
7336 HANDLE token, token2, token3;
7337 EXPLICIT_ACCESSW exp_access;
7339 DWORD size, index, retd;
7340 ACCESS_ALLOWED_ACE *ace;
7343 PSID psid;
7344
7345 /* Test whether we can create tokens with security descriptors */
7347 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7348
7350 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
7351
7352 memset(buffer_acl, 0, sizeof(buffer_acl));
7353 ret = InitializeAcl(acl, 256, ACL_REVISION);
7354 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
7355
7356 ret = ConvertStringSidToSidA("S-1-5-6", &psid);
7357 ok(ret, "ConvertStringSidToSidA failed with error %lu\n", GetLastError());
7358
7360 ok(ret, "AddAccessAllowedAceEx failed with error %lu\n", GetLastError());
7361
7363 ok(ret, "SetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7364
7365 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
7366 sa.lpSecurityDescriptor = sd;
7367 sa.bInheritHandle = FALSE;
7368
7370 ok(ret, "DuplicateTokenEx failed with error %lu\n", GetLastError());
7371
7374 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7375
7376 sd2 = malloc(size);
7378 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7379
7380 acl2 = (void *)0xdeadbeef;
7381 present = FALSE;
7382 defaulted = TRUE;
7383 ret = GetSecurityDescriptorDacl(sd2, &present, &acl2, &defaulted);
7384 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7385 ok(present, "acl2 not present\n");
7386 ok(acl2 != (void *)0xdeadbeef, "acl2 not set\n");
7387 ok(acl2->AceCount == 1, "Expected 1 ACE, got %d\n", acl2->AceCount);
7388 ok(!defaulted, "acl2 defaulted\n");
7389
7390 ret = GetAce(acl2, 0, (void **)&ace);
7391 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7392 ok(ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE, "Unexpected ACE type %#x\n", ace->Header.AceType);
7393 ok(EqualSid(&ace->SidStart, psid), "Expected access allowed ACE\n");
7395 "Expected NO_PROPAGATE_INHERIT_ACE as flags, got %x\n", ace->Header.AceFlags);
7396
7397 free(sd2);
7398
7399 /* Duplicate token without security attributes.
7400 * Tokens do not inherit the security descriptor in DuplicateToken. */
7402 ok(ret, "DuplicateTokenEx failed with error %lu\n", GetLastError());
7403
7406 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7407
7408 sd2 = malloc(size);
7410 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7411
7412 acl2 = (void *)0xdeadbeef;
7413 present = FALSE;
7414 defaulted = TRUE;
7415 ret = GetSecurityDescriptorDacl(sd2, &present, &acl2, &defaulted);
7416 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7417 ok(present, "DACL not present\n");
7418
7419 ok(acl2 != (void *)0xdeadbeef, "DACL not set\n");
7420 ok(!defaulted, "DACL defaulted\n");
7421
7422 index = 0;
7423 found = FALSE;
7424 while (GetAce(acl2, index++, (void **)&ace))
7425 {
7426 if (ace->Header.AceType == ACCESS_ALLOWED_ACE_TYPE && EqualSid(&ace->SidStart, psid))
7427 found = TRUE;
7428 }
7429 ok(!found, "Access allowed ACE was inherited\n");
7430
7431 free(sd2);
7432
7433 /* When creating a child process, the process does inherit the token of
7434 * the parent but not the DACL of the token */
7437 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7438
7439 sd2 = malloc(size);
7441 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7442
7443 acl2 = (void *)0xdeadbeef;
7444 present = FALSE;
7445 defaulted = TRUE;
7446 ret = GetSecurityDescriptorDacl(sd2, &present, &acl2, &defaulted);
7447 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7448 ok(present, "DACL not present\n");
7449 ok(acl2 != (void *)0xdeadbeef, "DACL not set\n");
7450 ok(!defaulted, "DACL defaulted\n");
7451
7452 exp_access.grfAccessPermissions = GENERIC_ALL;
7453 exp_access.grfAccessMode = GRANT_ACCESS;
7455 exp_access.Trustee.pMultipleTrustee = NULL;
7456 exp_access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
7459 exp_access.Trustee.ptstrName = (void*)psid;
7460
7461 retd = SetEntriesInAclW(1, &exp_access, acl2, &acl_child);
7462 ok(retd == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %lu\n", retd);
7463
7464 memset(sd, 0, sizeof(buffer_sd));
7466 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
7467
7468 ret = SetSecurityDescriptorDacl(sd, TRUE, acl_child, FALSE);
7469 ok(ret, "SetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7470
7472 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
7473
7474 /* The security label is also not inherited */
7475 if (pAddMandatoryAce)
7476 {
7477 ret = InitializeAcl(acl, 256, ACL_REVISION);
7478 ok(ret, "InitializeAcl failed with error %lu\n", GetLastError());
7479
7480 ret = pAddMandatoryAce(acl, ACL_REVISION, 0, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP, &low_level);
7481 ok(ret, "AddMandatoryAce failed with error %lu\n", GetLastError());
7482
7483 memset(sd, 0, sizeof(buffer_sd));
7485 ok(ret, "InitializeSecurityDescriptor failed with error %lu\n", GetLastError());
7486
7488 ok(ret, "SetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
7489
7491 ok(ret, "SetKernelObjectSecurity failed with error %lu\n", GetLastError());
7492 }
7493 else
7494 win_skip("SYSTEM_MANDATORY_LABEL not supported\n");
7495
7496 /* Start child process with our modified token */
7497 memset(&startup, 0, sizeof(startup));
7498 startup.cb = sizeof(startup);
7499 startup.dwFlags = STARTF_USESHOWWINDOW;
7500 startup.wShowWindow = SW_SHOWNORMAL;
7501
7502 sprintf(buffer, "%s security test_token_sd", myARGV[0]);
7504 ok(ret, "CreateProcess failed with error %lu\n", GetLastError());
7505 wait_child_process(info.hProcess);
7506 CloseHandle(info.hProcess);
7507 CloseHandle(info.hThread);
7508
7509 LocalFree(acl_child);
7510 free(sd2);
7511 LocalFree(psid);
7512
7513 CloseHandle(token3);
7514 CloseHandle(token2);
7516}
7517
7518static void test_child_token_sd(void)
7519{
7520 static SID low_level = {SID_REVISION, 1, {SECURITY_MANDATORY_LABEL_AUTHORITY},
7522 SYSTEM_MANDATORY_LABEL_ACE *ace_label;
7523 BOOL ret, present, defaulted;
7524 ACCESS_ALLOWED_ACE *acc_ace;
7526 DWORD size, i;
7527 HANDLE token;
7528 PSID psid;
7529 ACL *acl;
7530
7531 ret = ConvertStringSidToSidA("S-1-5-6", &psid);
7532 ok(ret, "ConvertStringSidToSidA failed with error %lu\n", GetLastError());
7533
7535 ok(ret, "OpenProcessToken failed with error %lu\n", GetLastError());
7536
7539 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7540
7541 sd = malloc(size);
7543 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7544
7545 acl = NULL;
7546 present = FALSE;
7547 defaulted = TRUE;
7548 ret = GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted);
7549 ok(ret, "GetSecurityDescriptorDacl failed with error %lu\n", GetLastError());
7550 ok(present, "DACL not present\n");
7551 ok(acl && acl != (void *)0xdeadbeef, "Got invalid DACL\n");
7552 ok(!defaulted, "DACL defaulted\n");
7553
7554 ok(acl->AceCount, "Expected at least one ACE\n");
7555 for (i = 0; i < acl->AceCount; i++)
7556 {
7557 ret = GetAce(acl, i, (void **)&acc_ace);
7558 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7559 ok(acc_ace->Header.AceType != ACCESS_ALLOWED_ACE_TYPE || !EqualSid(&acc_ace->SidStart, psid),
7560 "ACE inherited from the parent\n");
7561 }
7562
7563 LocalFree(psid);
7564 free(sd);
7565
7566 if (!pAddMandatoryAce)
7567 {
7568 win_skip("SYSTEM_MANDATORY_LABEL not supported\n");
7569 return;
7570 }
7571
7574 "Unexpected GetKernelObjectSecurity return value %d, error %lu\n", ret, GetLastError());
7575
7576 sd = malloc(size);
7578 ok(ret, "GetKernelObjectSecurity failed with error %lu\n", GetLastError());
7579
7580 acl = NULL;
7581 present = FALSE;
7582 defaulted = TRUE;
7583 ret = GetSecurityDescriptorSacl(sd, &present, &acl, &defaulted);
7584 ok(ret, "GetSecurityDescriptorSacl failed with error %lu\n", GetLastError());
7585 ok(present, "SACL not present\n");
7586 ok(acl && acl != (void *)0xdeadbeef, "Got invalid SACL\n");
7587 ok(!defaulted, "SACL defaulted\n");
7588 ok(acl->AceCount == 1, "Expected exactly one ACE\n");
7589 ret = GetAce(acl, 0, (void **)&ace_label);
7590 ok(ret, "GetAce failed with error %lu\n", GetLastError());
7592 "Unexpected ACE type %#x\n", ace_label->Header.AceType);
7593 ok(!EqualSid(&ace_label->SidStart, &low_level),
7594 "Low integrity level should not have been inherited\n");
7595
7596 free(sd);
7597}
7598
7600{
7601 static const WCHAR wszCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
7604 PSID everyone_sid = NULL, users_sid = NULL;
7606 EXPLICIT_ACCESSW *access2;
7607 PACL new_acl, old_acl = NULL;
7608 ULONG count;
7609 DWORD res;
7610
7611 old_acl = malloc(256);
7612 res = InitializeAcl(old_acl, 256, ACL_REVISION);
7613 ok(res, "InitializeAcl failed with error %ld\n", GetLastError());
7614
7615 res = AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &everyone_sid);
7616 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
7617
7619 DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &users_sid);
7620 ok(res, "AllocateAndInitializeSid failed with error %ld\n", GetLastError());
7621
7622 res = AddAccessAllowedAce(old_acl, ACL_REVISION, KEY_READ, users_sid);
7623 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
7624
7625 access2 = NULL;
7626 res = GetExplicitEntriesFromAclW(old_acl, &count, &access2);
7627 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7628 ok(count == 1, "Expected count == 1, got %ld\n", count);
7629 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7630 ok(access2[0].grfAccessPermissions == KEY_READ, "Expected KEY_READ, got %ld\n", access2[0].grfAccessPermissions);
7631 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7632 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7633 ok(EqualSid(access2[0].Trustee.ptstrName, users_sid), "Expected equal SIDs\n");
7634 LocalFree(access2);
7635
7636 access.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
7637 access.Trustee.pMultipleTrustee = NULL;
7638
7639 access.grfAccessPermissions = KEY_WRITE;
7640 access.grfAccessMode = GRANT_ACCESS;
7641 access.grfInheritance = NO_INHERITANCE;
7642 access.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
7643 access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
7644 access.Trustee.ptstrName = everyone_sid;
7645 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7646 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7647 ok(new_acl != NULL, "returned acl was NULL\n");
7648
7649 access2 = NULL;
7650 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7651 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7652 ok(count == 2, "Expected count == 2, got %ld\n", count);
7653 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7654 ok(access2[0].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[0].grfAccessPermissions);
7655 ok(access2[0].Trustee.TrusteeType == TRUSTEE_IS_UNKNOWN,
7656 "Expected TRUSTEE_IS_UNKNOWN trustee type, got %d\n", access2[0].Trustee.TrusteeType);
7657 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7658 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7659 ok(EqualSid(access2[0].Trustee.ptstrName, everyone_sid), "Expected equal SIDs\n");
7660 LocalFree(access2);
7661 LocalFree(new_acl);
7662
7663 access.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN;
7664 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7665 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7666 ok(new_acl != NULL, "returned acl was NULL\n");
7667
7668 access2 = NULL;
7669 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7670 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7671 ok(count == 2, "Expected count == 2, got %ld\n", count);
7672 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7673 ok(access2[0].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[0].grfAccessPermissions);
7674 ok(access2[0].Trustee.TrusteeType == TRUSTEE_IS_UNKNOWN,
7675 "Expected TRUSTEE_IS_UNKNOWN trustee type, got %d\n", access2[0].Trustee.TrusteeType);
7676 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7677 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7678 ok(EqualSid(access2[0].Trustee.ptstrName, everyone_sid), "Expected equal SIDs\n");
7679 LocalFree(access2);
7680 LocalFree(new_acl);
7681
7682 access.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
7683 access.Trustee.ptstrName = (LPWSTR)wszCurrentUser;
7684 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7685 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7686 ok(new_acl != NULL, "returned acl was NULL\n");
7687
7688 access2 = NULL;
7689 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7690 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7691 ok(count == 2, "Expected count == 2, got %ld\n", count);
7692 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7693 ok(access2[0].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[0].grfAccessPermissions);
7694 ok(access2[0].Trustee.TrusteeType == TRUSTEE_IS_UNKNOWN,
7695 "Expected TRUSTEE_IS_UNKNOWN trustee type, got %d\n", access2[0].Trustee.TrusteeType);
7696 ok(access2[0].Trustee.TrusteeForm == TRUSTEE_IS_SID, "Expected SID trustee, got %d\n", access2[0].Trustee.TrusteeForm);
7697 ok(access2[0].grfInheritance == NO_INHERITANCE, "Expected NO_INHERITANCE, got %lx\n", access2[0].grfInheritance);
7698 LocalFree(access2);
7699 LocalFree(new_acl);
7700
7701 access.grfAccessMode = REVOKE_ACCESS;
7702 access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
7703 access.Trustee.ptstrName = users_sid;
7704 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7705 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7706 ok(new_acl != NULL, "returned acl was NULL\n");
7707
7708 access2 = (void *)0xdeadbeef;
7709 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7710 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7711 ok(count == 0, "Expected count == 0, got %ld\n", count);
7712 ok(access2 == NULL, "access2 was not NULL\n");
7713 LocalFree(new_acl);
7714
7715 /* Make the ACL both Allow and Deny Everyone. */
7716 res = AddAccessAllowedAce(old_acl, ACL_REVISION, KEY_READ, everyone_sid);
7717 ok(res, "AddAccessAllowedAce failed with error %ld\n", GetLastError());
7718 res = AddAccessDeniedAce(old_acl, ACL_REVISION, KEY_WRITE, everyone_sid);
7719 ok(res, "AddAccessDeniedAce failed with error %ld\n", GetLastError());
7720 /* Revoke Everyone. */
7721 access.Trustee.ptstrName = everyone_sid;
7722 access.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
7723 access.grfAccessPermissions = 0;
7724 new_acl = NULL;
7725 res = SetEntriesInAclW(1, &access, old_acl, &new_acl);
7726 ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %lu\n", res);
7727 ok(new_acl != NULL, "returned acl was NULL\n");
7728 /* Deny Everyone should remain (along with Grant Users from earlier). */
7729 access2 = NULL;
7730 res = GetExplicitEntriesFromAclW(new_acl, &count, &access2);
7731 ok(res == ERROR_SUCCESS, "GetExplicitEntriesFromAclW failed with error %ld\n", GetLastError());
7732 ok(count == 2, "Expected count == 2, got %ld\n", count);
7733#ifdef __REACTOS__
7734 if (!access2) {
7735 ok(FALSE, "FIXME: access2 should not be null!\n"); // Happens on ReactOS currently
7736 } else {
7737#endif
7738 ok(access2[0].grfAccessMode == GRANT_ACCESS, "Expected GRANT_ACCESS, got %d\n", access2[0].grfAccessMode);
7739 ok(access2[0].grfAccessPermissions == KEY_READ , "Expected KEY_READ, got %ld\n", access2[0].grfAccessPermissions);
7740 ok(EqualSid(access2[0].Trustee.ptstrName, users_sid), "Expected equal SIDs\n");
7741 ok(access2[1].grfAccessMode == DENY_ACCESS, "Expected DENY_ACCESS, got %d\n", access2[1].grfAccessMode);
7742 ok(access2[1].grfAccessPermissions == KEY_WRITE, "Expected KEY_WRITE, got %ld\n", access2[1].grfAccessPermissions);
7743 ok(EqualSid(access2[1].Trustee.ptstrName, everyone_sid), "Expected equal SIDs\n");
7744 LocalFree(access2);
7745#ifdef __REACTOS__
7746 }
7747#endif
7748
7749 FreeSid(users_sid);
7750 FreeSid(everyone_sid);
7751 free(old_acl);
7752}
7753
7755{
7756 SECURITY_DESCRIPTOR old_sd, *new_sd, *rel_sd;
7757 ULONG new_sd_size;
7758 DWORD buf_size;
7759 char buf[1024];
7760 BOOL success;
7761 DWORD ret;
7762
7764
7765 buf_size = sizeof(buf);
7766 rel_sd = (SECURITY_DESCRIPTOR *)buf;
7767 success = MakeSelfRelativeSD(&old_sd, rel_sd, &buf_size);
7768 ok(success, "MakeSelfRelativeSD failed with %lu\n", GetLastError());
7769
7770 new_sd = NULL;
7771 new_sd_size = 0;
7772 ret = BuildSecurityDescriptorW(NULL, NULL, 0, NULL, 0, NULL, NULL, &new_sd_size, (void **)&new_sd);
7773 ok(ret == ERROR_SUCCESS, "BuildSecurityDescriptor failed with %lu\n", ret);
7774 ok(new_sd != NULL, "expected new_sd != NULL\n");
7775 LocalFree(new_sd);
7776
7777 new_sd = (void *)0xdeadbeef;
7778 ret = BuildSecurityDescriptorW(NULL, NULL, 0, NULL, 0, NULL, &old_sd, &new_sd_size, (void **)&new_sd);
7779 ok(ret == ERROR_INVALID_SECURITY_DESCR, "expected ERROR_INVALID_SECURITY_DESCR, got %lu\n", ret);
7780 ok(new_sd == (void *)0xdeadbeef, "expected new_sd == 0xdeadbeef, got %p\n", new_sd);
7781
7782 new_sd = NULL;
7783 new_sd_size = 0;
7784 ret = BuildSecurityDescriptorW(NULL, NULL, 0, NULL, 0, NULL, rel_sd, &new_sd_size, (void **)&new_sd);
7785 ok(ret == ERROR_SUCCESS, "BuildSecurityDescriptor failed with %lu\n", ret);
7786 ok(new_sd != NULL, "expected new_sd != NULL\n");
7787 LocalFree(new_sd);
7788}
7789
7790static void test_EqualDomainSid(void)
7791{
7793 char sid_buffer[SECURITY_MAX_SID_SIZE], sid_buffer2[SECURITY_MAX_SID_SIZE];
7794 PSID domainsid, sid = sid_buffer, sid2 = sid_buffer2;
7795 DWORD size;
7796 BOOL ret, equal;
7797 unsigned int i;
7798
7799 ret = AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
7800 ok(ret, "AllocateAndInitializeSid error %lu\n", GetLastError());
7801
7802 SetLastError(0xdeadbeef);
7804 ok(!ret, "got %d\n", ret);
7805 ok(GetLastError() == ERROR_INVALID_SID, "got %lu\n", GetLastError());
7806
7807 SetLastError(0xdeadbeef);
7808 ret = EqualDomainSid(domainsid, domainsid, NULL);
7809 ok(!ret, "got %d\n", ret);
7811
7812 for (i = 0; i < ARRAY_SIZE(well_known_sid_values); i++)
7813 {
7814 SID *pisid = sid;
7815
7816 size = sizeof(sid_buffer);
7817 if (!CreateWellKnownSid(i, NULL, sid, &size))
7818 {
7819 trace("Well known SID %u not supported\n", i);
7820 continue;
7821 }
7822
7823 equal = 0xdeadbeef;
7824 SetLastError(0xdeadbeef);
7825 ret = EqualDomainSid(sid, domainsid, &equal);
7827 {
7828 ok(!ret, "%u: got %d\n", i, ret);
7829 ok(GetLastError() == ERROR_NON_DOMAIN_SID, "%u: got %lu\n", i, GetLastError());
7830 ok(equal == 0xdeadbeef, "%u: got %d\n", i, equal);
7831 continue;
7832 }
7833
7834 ok(ret, "%u: got %d\n", i, ret);
7835 ok(GetLastError() == 0, "%u: got %lu\n", i, GetLastError());
7836 ok(equal == 0, "%u: got %d\n", i, equal);
7837
7838 size = sizeof(sid_buffer2);
7839 ret = CreateWellKnownSid(i, well_known_sid_values[i].without_domain ? NULL : domainsid, sid2, &size);
7840 ok(ret, "%u: CreateWellKnownSid error %lu\n", i, GetLastError());
7841
7842 equal = 0xdeadbeef;
7843 SetLastError(0xdeadbeef);
7844 ret = EqualDomainSid(sid, sid2, &equal);
7845 ok(ret, "%u: got %d\n", i, ret);
7846 ok(GetLastError() == 0, "%u: got %lu\n", i, GetLastError());
7847 ok(equal == 1, "%u: got %d\n", i, equal);
7848 }
7849
7850 FreeSid(domainsid);
7851}
7852
7854{
7855 HANDLE event = arg, event2;
7856 BOOL ret;
7857
7858 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7859 ok(!!event2, "got error %lu\n", GetLastError());
7860 CloseHandle(event2);
7861
7862 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7863 ok(!!event2, "got error %lu\n", GetLastError());
7864 CloseHandle(event2);
7865
7867 &event2, EVENT_MODIFY_STATE, FALSE, 0);
7868 ok(ret, "got error %lu\n", GetLastError());
7869 CloseHandle(event2);
7870
7871 return 0;
7872}
7873
7875{
7876 char acl_buffer[200], everyone_sid_buffer[100], local_sid_buffer[100], cmdline[300];
7877 HANDLE token, restricted, impersonation, all_event, sync_event, event2, thread;
7878 SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa)};
7879 SID *everyone_sid = (SID *)everyone_sid_buffer;
7880 SID *local_sid = (SID *)local_sid_buffer;
7881 ACL *acl = (ACL *)acl_buffer;
7882 SID_AND_ATTRIBUTES sid_attr;
7885 STARTUPINFOA si = {0};
7886 DWORD size;
7887 BOOL ret;
7888
7889 /* DuplicateHandle() validates access against the calling thread's token and
7890 * the target process's token. It does *not* validate access against the
7891 * calling process's token, even if the calling thread is not impersonating.
7892 */
7893
7895 ok(ret, "got error %lu\n", GetLastError());
7896
7897 size = sizeof(everyone_sid_buffer);
7898 ret = CreateWellKnownSid(WinWorldSid, NULL, everyone_sid, &size);
7899 ok(ret, "got error %lu\n", GetLastError());
7900 size = sizeof(local_sid_buffer);
7901 ret = CreateWellKnownSid(WinLocalSid, NULL, local_sid, &size);
7902 ok(ret, "got error %lu\n", GetLastError());
7903
7904 InitializeAcl(acl, sizeof(acl_buffer), ACL_REVISION);
7905 ret = AddAccessAllowedAce(acl, ACL_REVISION, SYNCHRONIZE, everyone_sid);
7906 ok(ret, "got error %lu\n", GetLastError());
7909 ok(ret, "got error %lu\n", GetLastError());
7912 ok(ret, "got error %lu\n", GetLastError());
7913 sa.lpSecurityDescriptor = &sd;
7914
7915 sid_attr.Sid = local_sid;
7916 sid_attr.Attributes = 0;
7917 ret = CreateRestrictedToken(token, 0, 1, &sid_attr, 0, NULL, 0, NULL, &restricted);
7918 ok(ret, "got error %lu\n", GetLastError());
7920 SecurityImpersonation, TokenImpersonation, &impersonation);
7921 ok(ret, "got error %lu\n", GetLastError());
7922
7923 all_event = CreateEventA(&sa, TRUE, TRUE, "test_dup");
7924 ok(!!all_event, "got error %lu\n", GetLastError());
7925 sync_event = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7926 ok(!!sync_event, "got error %lu\n", GetLastError());
7927
7928 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7929 ok(!!event2, "got error %lu\n", GetLastError());
7930 CloseHandle(event2);
7931
7932 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7933 ok(!!event2, "got error %lu\n", GetLastError());
7934 CloseHandle(event2);
7935
7937 ok(ret, "got error %lu\n", GetLastError());
7938 CloseHandle(event2);
7939
7941 ok(ret, "got error %lu\n", GetLastError());
7942 CloseHandle(event2);
7943
7944 ret = SetThreadToken(NULL, impersonation);
7945 ok(ret, "got error %lu\n", GetLastError());
7946
7949 ok(!ret, "wait failed\n");
7950
7951 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
7952 ok(!!event2, "got error %lu\n", GetLastError());
7953 CloseHandle(event2);
7954
7955 SetLastError(0xdeadbeef);
7956 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
7957 ok(!event2, "expected failure\n");
7958 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7959
7961 ok(ret, "got error %lu\n", GetLastError());
7962 CloseHandle(event2);
7963
7964 SetLastError(0xdeadbeef);
7966 ok(!ret, "expected failure\n");
7967 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7968
7969 ret = RevertToSelf();
7970 ok(ret, "got error %lu\n", GetLastError());
7971
7972 sprintf(cmdline, "%s security duplicate %Iu %lu %Iu", myARGV[0],
7973 (ULONG_PTR)sync_event, GetCurrentProcessId(), (ULONG_PTR)impersonation );
7974 ret = CreateProcessAsUserA(restricted, NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
7975 ok(ret, "got error %lu\n", GetLastError());
7976
7978 ok(ret, "got error %lu\n", GetLastError());
7979
7980 SetLastError(0xdeadbeef);
7982 ok(!ret, "expected failure\n");
7983 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
7984
7986 ok(!ret, "wait failed\n");
7987
7988 CloseHandle(impersonation);
7989 CloseHandle(restricted);
7991 CloseHandle(sync_event);
7992 CloseHandle(all_event);
7993}
7994
7996{
7997 HANDLE event, event2, process, token;
7998 BOOL ret;
7999
8002 ok(!!process, "failed to open process, error %lu\n", GetLastError());
8003
8004 event2 = OpenEventA(SYNCHRONIZE, FALSE, "test_dup");
8005 ok(!!event2, "got error %lu\n", GetLastError());
8006 CloseHandle(event2);
8007
8008 SetLastError(0xdeadbeef);
8009 event2 = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_dup");
8010 ok(!event2, "expected failure\n");
8011 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8012
8014 ok(ret, "got error %lu\n", GetLastError());
8015
8016 SetLastError(0xdeadbeef);
8018 ok(!ret, "expected failure\n");
8019 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8020
8023 ok(ret, "failed to retrieve token, error %lu\n", GetLastError());
8025 ok(ret, "failed to set thread token, error %lu\n", GetLastError());
8026
8027 SetLastError(0xdeadbeef);
8029 ok(!ret, "expected failure\n");
8030 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8031
8032 SetLastError(0xdeadbeef);
8034 ok(!ret, "expected failure\n");
8035 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8036
8037 ret = RevertToSelf();
8038 ok(ret, "failed to revert, error %lu\n", GetLastError());
8041}
8042
8043#define join_process(a) join_process_(__LINE__, a)
8045{
8047 ok_(__FILE__, line)(!ret, "wait failed\n");
8050}
8051
8053{
8054 char cmdline[300], acl_buffer[200], sid_buffer[100];
8055 SECURITY_ATTRIBUTES sa = {.nLength = sizeof(sa)};
8056 ACL *acl = (ACL *)acl_buffer;
8057 SID *sid = (SID *)sid_buffer;
8058 SID_AND_ATTRIBUTES sid_attr;
8059 HANDLE event, token, token2;
8062 STARTUPINFOA si = {0};
8063 DWORD size;
8064 BOOL ret;
8065
8066 size = sizeof(sid_buffer);
8067 ret = CreateWellKnownSid(WinLocalSid, NULL, sid, &size);
8068 ok(ret, "got error %lu\n", GetLastError());
8069 ret = InitializeAcl(acl, sizeof(acl_buffer), ACL_REVISION);
8070 ok(ret, "got error %lu\n", GetLastError());
8072 ok(ret, "got error %lu\n", GetLastError());
8075 ok(ret, "got error %lu\n", GetLastError());
8076 sa.lpSecurityDescriptor = &sd;
8077 event = CreateEventA(&sa, TRUE, TRUE, "test_event");
8078 ok(!!event, "got error %lu\n", GetLastError());
8079
8080 sprintf(cmdline, "%s security restricted 0", myARGV[0]);
8081
8082#ifdef __REACTOS__
8083 /* This block creates test failures on WS03 */
8085#endif
8087 ok(ret, "got error %lu\n", GetLastError());
8088 join_process(&pi);
8089#ifdef __REACTOS__
8090 }
8091#endif
8092
8093 ret = CreateProcessAsUserA(GetCurrentProcessToken(), NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
8094 todo_wine ok(!ret, "expected failure\n");
8095 todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError());
8096 if (ret) join_process(&pi);
8097
8099 ok(ret, "got error %lu\n", GetLastError());
8101 ok(ret || broken(GetLastError() == ERROR_ACCESS_DENIED) /* < 7 */, "got error %lu\n", GetLastError());
8102 if (ret) join_process(&pi);
8104
8106 ok(ret, "got error %lu\n", GetLastError());
8108 ok(!ret, "expected failure\n");
8109 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8111
8113 ok(ret, "got error %lu\n", GetLastError());
8115 ok(!ret, "expected failure\n");
8116 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8118
8120 ok(ret, "got error %lu\n", GetLastError());
8121
8124 ok(ret, "got error %lu\n", GetLastError());
8125 ret = CreateProcessAsUserA(token2, NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
8126 ok(ret || broken(GetLastError() == ERROR_BAD_TOKEN_TYPE) /* < 7 */, "got error %lu\n", GetLastError());
8127 if (ret) join_process(&pi);
8128 CloseHandle(token2);
8129
8130 sprintf(cmdline, "%s security restricted 1", myARGV[0]);
8131 sid_attr.Sid = sid;
8132 sid_attr.Attributes = 0;
8133 ret = CreateRestrictedToken(token, 0, 1, &sid_attr, 0, NULL, 0, NULL, &token2);
8134 ok(ret, "got error %lu\n", GetLastError());
8135 ret = CreateProcessAsUserA(token2, NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
8136 ok(ret, "got error %lu\n", GetLastError());
8137 join_process(&pi);
8138 CloseHandle(token2);
8139
8141
8143}
8144
8146{
8147 HANDLE event;
8148
8149 SetLastError(0xdeadbeef);
8150 event = OpenEventA(EVENT_MODIFY_STATE, FALSE, "test_event");
8151 if (!atoi(myARGV[3]))
8152 {
8153 ok(!!event, "got error %lu\n", GetLastError());
8155 }
8156 else
8157 {
8158 ok(!event, "expected failure\n");
8159 ok(GetLastError() == ERROR_ACCESS_DENIED, "got error %lu\n", GetLastError());
8160 }
8161}
8162
8164{
8165 char buffer[200];
8166 PSECURITY_DESCRIPTOR sd = buffer, sd_ptr;
8167 unsigned int i;
8168 DWORD size;
8169 BOOL ret;
8170
8171 static const HKEY keys[] =
8172 {
8176 HKEY_USERS,
8180 };
8181
8182#ifdef __REACTOS__
8184#else
8186#endif
8187 ok(ret, "got error %lu\n", GetLastError());
8188
8189#ifdef __REACTOS__
8191#else
8193#endif
8194 ok(ret, "got error %lu\n", GetLastError());
8195
8196 for (i = 0; i < ARRAY_SIZE(keys); ++i)
8197 {
8198 SetLastError(0xdeadbeef);
8199#ifdef __REACTOS__
8201#else
8203#endif
8204 ok(!ret, "key %p: expected failure\n", keys[i]);
8205 ok(GetLastError() == ERROR_INVALID_HANDLE, "key %p: got error %lu\n", keys[i], GetLastError());
8206
8210 ok(ret == ERROR_INVALID_HANDLE, "key %p: got error %u\n", keys[i], ret);
8211 else if (keys[i] == HKEY_DYN_DATA)
8213 "key %p: got error %u\n", keys[i], ret);
8214 else
8215 ok(!ret, "key %p: got error %u\n", keys[i], ret);
8216 if (!ret) LocalFree(sd_ptr);
8217
8220 ok(ret == ERROR_INVALID_HANDLE, "key %p: got error %u\n", keys[i], ret);
8221 }
8222}
8223
8224static const LUID_AND_ATTRIBUTES *find_privilege(const TOKEN_PRIVILEGES *privs, const LUID *luid)
8225{
8226 DWORD i;
8227
8228 for (i = 0; i < privs->PrivilegeCount; ++i)
8229 {
8230 if (!memcmp(luid, &privs->Privileges[i].Luid, sizeof(LUID)))
8231 return &privs->Privileges[i];
8232 }
8233
8234 return NULL;
8235}
8236
8237static void test_duplicate_token(void)
8238{
8240 char prev_privs_buffer[128], ret_privs_buffer[1024];
8241 TOKEN_PRIVILEGES *prev_privs = (void *)prev_privs_buffer;
8242 TOKEN_PRIVILEGES *ret_privs = (void *)ret_privs_buffer;
8243 const LUID_AND_ATTRIBUTES *priv;
8244 TOKEN_PRIVILEGES privs;
8245 SECURITY_QUALITY_OF_SERVICE qos = {.Length = sizeof(qos)};
8246 OBJECT_ATTRIBUTES attr = {.Length = sizeof(attr)};
8248 HANDLE token, token2;
8249 DWORD size;
8250 BOOL ret;
8251
8252 ret = OpenProcessToken(GetCurrentProcess(), orig_access, &token);
8253 ok(ret, "got error %lu\n", GetLastError());
8254
8255 /* Disable a privilege, to see if that privilege modification is preserved
8256 * in the duplicated tokens. */
8257 privs.PrivilegeCount = 1;
8258 ret = LookupPrivilegeValueA(NULL, "SeChangeNotifyPrivilege", &privs.Privileges[0].Luid);
8259 ok(ret, "got error %lu\n", GetLastError());
8260 privs.Privileges[0].Attributes = 0;
8261 ret = AdjustTokenPrivileges(token, FALSE, &privs, sizeof(prev_privs_buffer), prev_privs, &size);
8262 ok(ret, "got error %lu\n", GetLastError());
8263
8265 ok(ret, "got error %lu\n", GetLastError());
8268 ok(ret, "got error %lu\n", GetLastError());
8269 ok(level == SecurityAnonymous, "got impersonation level %#x\n", level);
8270 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8271 ok(ret, "got error %lu\n", GetLastError());
8272 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8273 ok(!!priv, "Privilege should exist\n");
8274 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8275 CloseHandle(token2);
8276
8278 ok(ret, "got error %lu\n", GetLastError());
8279 TEST_GRANTED_ACCESS(token2, orig_access);
8281 ok(!ret, "expected failure\n");
8282 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got error %lu.\n", GetLastError());
8283 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8284 ok(ret, "got error %lu\n", GetLastError());
8285 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8286 ok(!!priv, "Privilege should exist\n");
8287 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8288 CloseHandle(token2);
8289
8291 ok(ret, "got error %lu\n", GetLastError());
8293 CloseHandle(token2);
8294
8296 ok(ret, "got error %lu\n", GetLastError());
8298 CloseHandle(token2);
8299
8301 ok(ret, "got error %lu\n", GetLastError());
8302 TEST_GRANTED_ACCESS(token2, orig_access);
8304 ok(ret, "got error %lu\n", GetLastError());
8305 ok(level == SecurityIdentification, "got impersonation level %#x\n", level);
8306 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8307 ok(ret, "got error %lu\n", GetLastError());
8308 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8309 ok(!!priv, "Privilege should exist\n");
8310 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8311 CloseHandle(token2);
8312
8314 ok(ret == STATUS_SUCCESS, "Got status %#x.\n", ret);
8315 TEST_GRANTED_ACCESS(token2, orig_access);
8317 ok(ret, "got error %lu\n", GetLastError());
8318 ok(level == SecurityAnonymous, "got impersonation level %#x\n", level);
8319 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8320 ok(ret, "got error %lu\n", GetLastError());
8321 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8322 ok(!!priv, "Privilege should exist\n");
8323 todo_wine ok(priv->Attributes == SE_GROUP_MANDATORY, "Got attributes %#lx\n", priv->Attributes);
8324 CloseHandle(token2);
8325
8327 ok(ret == STATUS_SUCCESS, "Got status %#x.\n", ret);
8328 TEST_GRANTED_ACCESS(token2, orig_access);
8329 ret = GetTokenInformation(token2, TokenPrivileges, ret_privs, sizeof(ret_privs_buffer), &size);
8330 ok(ret, "got error %lu\n", GetLastError());
8331 priv = find_privilege(ret_privs, &privs.Privileges[0].Luid);
8332 todo_wine ok(!priv, "Privilege shouldn't exist\n");
8333 CloseHandle(token2);
8334
8337 qos.EffectiveOnly = FALSE;
8338 attr.SecurityQualityOfService = &qos;
8340 ok(ret == STATUS_SUCCESS, "Got status %#x.\n", ret);
8341 TEST_GRANTED_ACCESS(token2, orig_access);
8343 ok(ret, "got error %lu\n", GetLastError());
8344 ok(level == SecurityIdentification, "got impersonation level %#x\n", level);
8345 CloseHandle(token2);
8346
8348 ret = AdjustTokenPrivileges(token, FALSE, &privs, sizeof(prev_privs_buffer), prev_privs, &size);
8349 ok(ret, "got error %lu\n", GetLastError());
8350
8352}
8353
8355{
8356 /* Basic tests for parameter validation. */
8357
8359 DWORD size, ret_size, revision;
8360 BOOL ret, present, defaulted;
8362 PSID sid;
8363 ACL *acl;
8364
8365 SetLastError(0xdeadbeef);
8366 size = 0xdeadbeef;
8368 ok(!ret, "expected failure\n");
8369 ok(GetLastError() == ERROR_INVALID_HANDLE, "got error %lu\n", GetLastError());
8370 ok(size == 0xdeadbeef, "got size %lu\n", size);
8371
8372 SetLastError(0xdeadbeef);
8374 ok(!ret, "expected failure\n");
8375 ok(GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError());
8376
8377 SetLastError(0xdeadbeef);
8378 size = 0xdeadbeef;
8380 ok(!ret, "expected failure\n");
8381 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
8382 ok(size > 0 && size != 0xdeadbeef, "got size 0\n");
8383
8384 sd = malloc(size + 1);
8385
8386 SetLastError(0xdeadbeef);
8388 ok(!ret, "expected failure\n");
8389 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
8390 ok(ret_size == size, "expected size %lu, got %lu\n", size, ret_size);
8391
8392 SetLastError(0xdeadbeef);
8394 ok(ret, "expected success\n");
8395 ok(GetLastError() == 0xdeadbeef, "got error %lu\n", GetLastError());
8396 ok(ret_size == size, "expected size %lu, got %lu\n", size, ret_size);
8397
8398 free(sd);
8399
8400 /* Calling the function with flags not defined succeeds and yields an empty
8401 * descriptor. */
8402
8403 SetLastError(0xdeadbeef);
8405 ok(!ret, "expected failure\n");
8406 ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError());
8407
8408 sd = malloc(size);
8409 SetLastError(0xdeadbeef);
8410 ret = GetKernelObjectSecurity(GetCurrentProcess(), 0x100000, sd, size, &ret_size);
8411 ok(ret, "expected success\n");
8412 ok(GetLastError() == 0xdeadbeef, "got error %lu\n", GetLastError());
8413 ok(ret_size == size, "expected size %lu, got %lu\n", size, ret_size);
8414
8416 ok(ret, "got error %lu\n", GetLastError());
8417 todo_wine ok(control == SE_SELF_RELATIVE, "got control %#x\n", control);
8418 ok(revision == SECURITY_DESCRIPTOR_REVISION1, "got revision %lu\n", revision);
8419
8420 ret = GetSecurityDescriptorOwner(sd, &sid, &defaulted);
8421 ok(ret, "got error %lu\n", GetLastError());
8422 ok(!sid, "expected no owner SID\n");
8423 ok(!defaulted, "expected owner not defaulted\n");
8424
8425 ret = GetSecurityDescriptorGroup(sd, &sid, &defaulted);
8426 ok(ret, "got error %lu\n", GetLastError());
8427 ok(!sid, "expected no group SID\n");
8428 ok(!defaulted, "expected group not defaulted\n");
8429
8430 ret = GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted);
8431 ok(ret, "got error %lu\n", GetLastError());
8432 todo_wine ok(!present, "expected no DACL present\n");
8433 /* the descriptor is defaulted only on Windows >= 7 */
8434
8435 ret = GetSecurityDescriptorSacl(sd, &present, &acl, &defaulted);
8436 ok(ret, "got error %lu\n", GetLastError());
8437 ok(!present, "expected no SACL present\n");
8438 /* the descriptor is defaulted only on Windows >= 7 */
8439
8440 free(sd);
8441}
8442
8443static void check_different_token(HANDLE token1, HANDLE token2)
8444{
8445 TOKEN_STATISTICS stats1, stats2;
8446 DWORD size;
8447 BOOL ret;
8448
8449 ret = GetTokenInformation(token1, TokenStatistics, &stats1, sizeof(stats1), &size);
8450 ok(ret, "got error %lu\n", GetLastError());
8451 ret = GetTokenInformation(token2, TokenStatistics, &stats2, sizeof(stats2), &size);
8452 ok(ret, "got error %lu\n", GetLastError());
8453
8454 ok(memcmp(&stats1.TokenId, &stats2.TokenId, sizeof(LUID)), "expected different IDs\n");
8455}
8456
8457static void test_elevation(void)
8458{
8459 TOKEN_LINKED_TOKEN linked, linked2;
8460 DWORD orig_type, type, size;
8461 TOKEN_ELEVATION elevation;
8462 HANDLE token, token2;
8463 BOOL ret;
8464
8465#ifdef __REACTOS__
8467 skip("test_elevation() is invalid for WS03\n");
8468 return;
8469 }
8470#endif
8473 ok(ret, "got error %lu\n", GetLastError());
8474
8476 ok(ret, "got error %lu\n", GetLastError());
8477 orig_type = type;
8478 ret = GetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation), &size);
8479 ok(ret, "got error %lu\n", GetLastError());
8480 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
8481 if (!ret && GetLastError() == ERROR_NO_SUCH_LOGON_SESSION) /* fails on w2008s64 */
8482 {
8483 win_skip("Failed to get linked token.\n");
8485 return;
8486 }
8487 ok(ret, "got error %lu\n", GetLastError());
8488
8490 {
8491 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8492 ok(!linked.LinkedToken, "expected no linked token\n");
8493 }
8494 else if (type == TokenElevationTypeLimited)
8495 {
8496 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8497 ok(!!linked.LinkedToken, "expected a linked token\n");
8498
8501 ok(ret, "got error %lu\n", GetLastError());
8502 ok(type == TokenElevationTypeFull, "got type %#lx\n", type);
8503 ret = GetTokenInformation(linked.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8504 ok(ret, "got error %lu\n", GetLastError());
8505 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8506 ret = GetTokenInformation(linked.LinkedToken, TokenType, &type, sizeof(type), &size);
8507 ok(ret, "got error %lu\n", GetLastError());
8508 ok(type == TokenImpersonation, "got type %#lx\n", type);
8510 ok(ret, "got error %lu\n", GetLastError());
8511 ok(type == SecurityIdentification, "got impersonation level %#lx\n", type);
8512
8513 /* Asking for the linked token again gives us a different token. */
8514 ret = GetTokenInformation(token, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8515 ok(ret, "got error %lu\n", GetLastError());
8516
8518 ok(ret, "got error %lu\n", GetLastError());
8519 ok(type == TokenElevationTypeFull, "got type %#lx\n", type);
8520 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8521 ok(ret, "got error %lu\n", GetLastError());
8522 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8523
8525
8526 CloseHandle(linked2.LinkedToken);
8527
8528 /* Asking for the linked token's linked token gives us a new limited token. */
8529 ret = GetTokenInformation(linked.LinkedToken, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8530 ok(ret, "got error %lu\n", GetLastError());
8531
8533 ok(ret, "got error %lu\n", GetLastError());
8534 ok(type == TokenElevationTypeLimited, "got type %#lx\n", type);
8535 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8536 ok(ret, "got error %lu\n", GetLastError());
8537 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8538
8540
8541 CloseHandle(linked2.LinkedToken);
8542
8543 CloseHandle(linked.LinkedToken);
8544
8547 ok(!ret, "expected failure\n");
8548 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8549
8550 elevation.TokenIsElevated = FALSE;
8551 ret = SetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation));
8552 ok(!ret, "expected failure\n");
8553 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8554 }
8555 else
8556 {
8557 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8558 ok(!!linked.LinkedToken, "expected a linked token\n");
8559
8562 ok(ret, "got error %lu\n", GetLastError());
8563 ok(type == TokenElevationTypeLimited, "got type %#lx\n", type);
8564 ret = GetTokenInformation(linked.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8565 ok(ret, "got error %lu\n", GetLastError());
8566 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8567 ret = GetTokenInformation(linked.LinkedToken, TokenType, &type, sizeof(type), &size);
8568 ok(ret, "got error %lu\n", GetLastError());
8569 ok(type == TokenImpersonation, "got type %#lx\n", type);
8571 ok(ret, "got error %lu\n", GetLastError());
8572 ok(type == SecurityIdentification, "got impersonation level %#lx\n", type);
8573
8574 /* Asking for the linked token again gives us a different token. */
8575 ret = GetTokenInformation(token, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8576 ok(ret, "got error %lu\n", GetLastError());
8577
8579 ok(ret, "got error %lu\n", GetLastError());
8580 ok(type == TokenElevationTypeLimited, "got type %#lx\n", type);
8581 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8582 ok(ret, "got error %lu\n", GetLastError());
8583 ok(elevation.TokenIsElevated == FALSE, "got elevation %#lx\n", elevation.TokenIsElevated);
8584
8586
8587 CloseHandle(linked2.LinkedToken);
8588
8589 /* Asking for the linked token's linked token gives us a new elevated token. */
8590 ret = GetTokenInformation(linked.LinkedToken, TokenLinkedToken, &linked2, sizeof(linked2), &size);
8591 ok(ret, "got error %lu\n", GetLastError());
8592
8594 ok(ret, "got error %lu\n", GetLastError());
8595 ok(type == TokenElevationTypeFull, "got type %#lx\n", type);
8596 ret = GetTokenInformation(linked2.LinkedToken, TokenElevation, &elevation, sizeof(elevation), &size);
8597 ok(ret, "got error %lu\n", GetLastError());
8598 ok(elevation.TokenIsElevated == TRUE, "got elevation %#lx\n", elevation.TokenIsElevated);
8599
8601
8602 CloseHandle(linked2.LinkedToken);
8603
8604 CloseHandle(linked.LinkedToken);
8605
8608 ok(!ret, "expected failure\n");
8609 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8610
8611 elevation.TokenIsElevated = FALSE;
8612 ret = SetTokenInformation(token, TokenElevation, &elevation, sizeof(elevation));
8613 ok(!ret, "expected failure\n");
8614 todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError());
8615 }
8616
8618 ok(ret, "got error %lu\n", GetLastError());
8619 ret = GetTokenInformation(token2, TokenElevationType, &type, sizeof(type), &size);
8620 ok(ret, "got error %lu\n", GetLastError());
8621 ok(type == orig_type, "expected same type\n");
8622 ret = GetTokenInformation(token2, TokenElevation, &elevation, sizeof(elevation), &size);
8623 ok(ret, "got error %lu\n", GetLastError());
8624 ok(elevation.TokenIsElevated == (type == TokenElevationTypeFull), "got elevation %#lx\n", elevation.TokenIsElevated);
8625 ret = GetTokenInformation(token2, TokenLinkedToken, &linked, sizeof(linked), &size);
8626 ok(ret, "got error %lu\n", GetLastError());
8628 {
8629 ok(!linked.LinkedToken, "expected no linked token\n");
8630 ret = GetTokenInformation(linked.LinkedToken, TokenType, &type, sizeof(type), &size);
8631 ok(ret, "got error %lu\n", GetLastError());
8632 ok(type == TokenImpersonation, "got type %#lx\n", type);
8634 ok(ret, "got error %lu\n", GetLastError());
8635 ok(type == SecurityIdentification, "got impersonation level %#lx\n", type);
8636 CloseHandle(linked.LinkedToken);
8637 }
8638 else
8639 ok(!!linked.LinkedToken, "expected a linked token\n");
8640 CloseHandle(token2);
8641
8642 ret = CreateRestrictedToken(token, 0, 0, NULL, 0, NULL, 0, NULL, &token2);
8643 ok(ret, "got error %lu\n", GetLastError());
8644 ret = GetTokenInformation(token2, TokenElevationType, &type, sizeof(type), &size);
8645 ok(ret, "got error %lu\n", GetLastError());
8646 ok(type == orig_type, "expected same type\n");
8647 ret = GetTokenInformation(token2, TokenElevation, &elevation, sizeof(elevation), &size);
8648 ok(ret, "got error %lu\n", GetLastError());
8649 ok(elevation.TokenIsElevated == (type == TokenElevationTypeFull), "got elevation %#lx\n", elevation.TokenIsElevated);
8650 ret = GetTokenInformation(token2, TokenLinkedToken, &linked, sizeof(linked), &size);
8651 ok(ret, "got error %lu\n", GetLastError());
8653 ok(!linked.LinkedToken, "expected no linked token\n");
8654 else
8655 ok(!!linked.LinkedToken, "expected a linked token\n");
8656 CloseHandle(linked.LinkedToken);
8657 CloseHandle(token2);
8658
8660 {
8661 char prev_privs_buffer[128], acl_buffer[256], prev_acl_buffer[256];
8662 TOKEN_PRIVILEGES privs, *prev_privs = (TOKEN_PRIVILEGES *)prev_privs_buffer;
8663 TOKEN_DEFAULT_DACL *prev_acl = (TOKEN_DEFAULT_DACL *)prev_acl_buffer;
8664 TOKEN_DEFAULT_DACL *ret_acl = (TOKEN_DEFAULT_DACL *)acl_buffer;
8665 TOKEN_DEFAULT_DACL default_acl;
8666 PRIVILEGE_SET priv_set;
8667 BOOL ret, is_member;
8668 DWORD size;
8669 ACL acl;
8670
8671 /* Linked tokens do not preserve privilege modifications. */
8672
8673 privs.PrivilegeCount = 1;
8674 ret = LookupPrivilegeValueA(NULL, "SeChangeNotifyPrivilege", &privs.Privileges[0].Luid);
8675 ok(ret, "got error %lu\n", GetLastError());
8677 ret = AdjustTokenPrivileges(token, FALSE, &privs, sizeof(prev_privs_buffer), prev_privs, &size);
8678 ok(ret, "got error %lu\n", GetLastError());
8679
8680 priv_set.PrivilegeCount = 1;
8681 priv_set.Control = 0;
8682 priv_set.Privilege[0] = privs.Privileges[0];
8683 ret = PrivilegeCheck(token, &priv_set, &is_member);
8684 ok(ret, "got error %lu\n", GetLastError());
8685 ok(!is_member, "not a member\n");
8686
8687 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
8688 ok(ret, "got error %lu\n", GetLastError());
8689
8690 ret = PrivilegeCheck(linked.LinkedToken, &priv_set, &is_member);
8691 ok(ret, "got error %lu\n", GetLastError());
8692 ok(is_member, "not a member\n");
8693
8694 CloseHandle(linked.LinkedToken);
8695
8696 ret = AdjustTokenPrivileges(token, FALSE, prev_privs, 0, NULL, NULL);
8697 ok(ret, "got error %lu\n", GetLastError());
8698
8699 /* Linked tokens do not preserve default DACL modifications. */
8700
8701 ret = GetTokenInformation(token, TokenDefaultDacl, prev_acl, sizeof(prev_acl_buffer), &size);
8702 ok(ret, "got error %lu\n", GetLastError());
8703 ok(prev_acl->DefaultDacl->AceCount, "expected non-empty default DACL\n");
8704
8705 InitializeAcl(&acl, sizeof(acl), ACL_REVISION);
8706 default_acl.DefaultDacl = &acl;
8707 ret = SetTokenInformation(token, TokenDefaultDacl, &default_acl, sizeof(default_acl));
8708 ok(ret, "got error %lu\n", GetLastError());
8709
8710 ret = GetTokenInformation(token, TokenDefaultDacl, ret_acl, sizeof(acl_buffer), &size);
8711 ok(ret, "got error %lu\n", GetLastError());
8712 ok(!ret_acl->DefaultDacl->AceCount, "expected empty default DACL\n");
8713
8714 ret = GetTokenInformation(token, TokenLinkedToken, &linked, sizeof(linked), &size);
8715 ok(ret, "got error %lu\n", GetLastError());
8716
8717 ret = GetTokenInformation(linked.LinkedToken, TokenDefaultDacl, ret_acl, sizeof(acl_buffer), &size);
8718 ok(ret, "got error %lu\n", GetLastError());
8719 ok(ret_acl->DefaultDacl->AceCount, "expected non-empty default DACL\n");
8720
8721 CloseHandle(linked.LinkedToken);
8722
8723 ret = SetTokenInformation(token, TokenDefaultDacl, prev_acl, sizeof(*prev_acl));
8724 ok(ret, "got error %lu\n", GetLastError());
8725 }
8726
8728}
8729
8731{
8732 char sd_buffer[200], sid_buffer[100];
8735 SID *admin_sid = (SID *)sid_buffer;
8736 BOOL ret, present, defaulted;
8737 SECURITY_DESCRIPTOR new_sd;
8738 HANDLE file;
8739 DWORD size;
8740 ACL *dacl;
8741
8742 /* The EA Origin client sets the SD owner of a directory to Administrators,
8743 * while using the default DACL, and subsequently tries to create
8744 * subdirectories. */
8745
8746 size = sizeof(sid_buffer);
8747 CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &size);
8748
8749 ret = CheckTokenMembership(NULL, admin_sid, &present);
8750 ok(ret, "got error %lu\n", GetLastError());
8751 if (!present)
8752 {
8753 skip("user is not an administrator\n");
8754 return;
8755 }
8756
8758 sprintf(path, "%s\\testdir", temp_path);
8759
8761 ok(ret, "got error %lu\n", GetLastError());
8762
8764 ok(file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError());
8765
8766 ret = GetKernelObjectSecurity(file, DACL_SECURITY_INFORMATION, sd_buffer, sizeof(sd_buffer), &size);
8767 ok(ret, "got error %lu\n", GetLastError());
8768 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
8769 ok(ret, "got error %lu\n", GetLastError());
8770
8772
8773 ret = SetSecurityDescriptorOwner(&new_sd, admin_sid, FALSE);
8774 ok(ret, "got error %lu\n", GetLastError());
8775
8776 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
8777 ok(ret, "got error %lu\n", GetLastError());
8778
8779 ret = SetSecurityDescriptorDacl(&new_sd, present, dacl, defaulted);
8780 ok(ret, "got error %lu\n", GetLastError());
8781
8783 ok(ret, "got error %lu\n", GetLastError());
8784
8786
8787 sprintf(path, "%s\\testdir\\subdir", temp_path);
8789 ok(ret, "got error %lu\n", GetLastError());
8790
8792 ok(ret, "got error %lu\n", GetLastError());
8793 sprintf(path, "%s\\testdir", temp_path);
8795 ok(ret, "got error %lu\n", GetLastError());
8796}
8797
8799{
8801 BOOL ret;
8802
8803 SetLastError(0xdeadbeef);
8805 ok(!ret, "Unexpected return value %d.\n", ret);
8806 ok(GetLastError() == ERROR_INVALID_SECURITY_DESCR, "Unexpected error %ld.\n", GetLastError());
8807
8809
8810 SetLastError(0xdeadbeef);
8812 ok(!ret, "Unexpected return value %d.\n", ret);
8813 ok(GetLastError() == ERROR_INVALID_SECURITY_DESCR, "Unexpected error %ld.\n", GetLastError());
8814
8816 ok(ret, "Unexpected return value %d, error %ld.\n", ret, GetLastError());
8817
8818 SetLastError(0xdeadbeef);
8820 ok(ret, "Unexpected return value %d.\n", ret);
8821 ok(GetLastError() == 0xdeadbeef, "Unexpected error %ld.\n", GetLastError());
8822
8823 free(sd);
8824}
8825
8826static void test_window_security(void)
8827{
8829 BOOL present, defaulted;
8830 HDESK desktop;
8831 DWORD ret;
8832 ACL *dacl;
8833
8835
8838 ok(!ret, "got error %lu\n", ret);
8839
8840 ret = GetSecurityDescriptorDacl(sd, &present, &dacl, &defaulted);
8841 ok(ret == TRUE, "got error %lu\n", GetLastError());
8842 todo_wine ok(present == TRUE, "got present %d\n", present);
8843 ok(defaulted == FALSE, "got defaulted %d\n", defaulted);
8844
8845 LocalFree(sd);
8846}
8847
8849{
8850 init();
8851 if (!hmod) return;
8852
8853 if (myARGC >= 3)
8854 {
8855 if (!strcmp(myARGV[2], "test_token_sd"))
8857 else if (!strcmp(myARGV[2], "test"))
8859 else if (!strcmp(myARGV[2], "duplicate"))
8861 else if (!strcmp(myARGV[2], "restricted"))
8863 return;
8864 }
8867 test_trustee();
8894 test_EqualSid();
8901 test_AddAce();
8919
8920 /* Must be the last test, modifies process token */
8922}
@ ObjectBasicInformation
Definition: DriverTester.h:54
NTSTATUS NtQueryObject(IN HANDLE Handle, IN OBJECT_INFO_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT PULONG ReturnLength)
#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
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
#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 LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
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:1376
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1225
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
#define __cdecl
Definition: corecrt.h:121
_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
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
GLsizei const GLchar *const * strings
Definition: glext.h:7622
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:168
#define PROCESS_TERMINATE
Definition: pstypes.h:158
#define PROCESS_VM_READ
Definition: pstypes.h:162
#define PROCESS_QUERY_INFORMATION
Definition: pstypes.h:167
#define THREAD_SET_THREAD_TOKEN
Definition: pstypes.h:151
#define PROCESS_VM_WRITE
Definition: pstypes.h:163
#define PROCESS_CREATE_THREAD
Definition: pstypes.h:159
#define THREAD_QUERY_INFORMATION
Definition: pstypes.h:150
#define PROCESS_VM_OPERATION
Definition: pstypes.h:161
#define PROCESS_SET_INFORMATION
Definition: pstypes.h:166
#define PROCESS_CREATE_PROCESS
Definition: pstypes.h:164
#define PROCESS_SET_QUOTA
Definition: pstypes.h:165
#define THREAD_SET_CONTEXT
#define PROCESS_DUP_HANDLE
#define THREAD_SUSPEND_RESUME
#define THREAD_GET_CONTEXT
#define C_ASSERT(e)
Definition: intsafe.h:73
#define NtCurrentTeb
#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
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
#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)
#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:130
static void test_CreateWellKnownSid(void)
Definition: security.c:2137
static void test_pseudo_handle_security(void)
Definition: security.c:8163
static PGENERIC_MAPPING
Definition: security.c:130
static POBJECTS_AND_NAME_A SE_OBJECT_TYPE LPSTR ObjectTypeName
Definition: security.c:120
static void test_GetSidIdentifierAuthority(void)
Definition: security.c:7042
static void test_EqualDomainSid(void)
Definition: security.c:7790
static NTSTATUS *static PUNICODE_STRING
Definition: security.c:132
static void test_AddMandatoryAce(void)
Definition: security.c:6603
#define TEST_GRANTED_ACCESS(a, b)
Definition: security.c:2890
static void test_token_attr(void)
Definition: security.c:1812
static void test_duplicate_handle_access_child(void)
Definition: security.c:7995
#define SE_TAKE_OWNERSHIP_PRIVILEGE
Definition: security.c:593
static void test_duplicate_token(void)
Definition: security.c:8237
#define PROCESS_ALL_ACCESS_VISTA
Definition: security.c:94
static void test_GetExplicitEntriesFromAclW(void)
Definition: security.c:7599
#define THREAD_QUERY_LIMITED_INFORMATION
Definition: security.c:106
static void init(void)
Definition: security.c:162
static POBJECTS_AND_SID pObjSid
Definition: security.c:124
#define SE_MIN_WELL_KNOWN_PRIVILEGE
Definition: security.c:585
#define EVENT_QUERY_STATE
Definition: security.c:97
static BOOL get_sid_info(PSID psid, LPSTR *user, LPSTR *dom)
Definition: security.c:2503
#define SE_SYSTEM_PROFILE_PRIVILEGE
Definition: security.c:595
#define SE_SYNC_AGENT_PRIVILEGE
Definition: security.c:610
#define THREAD_SET_LIMITED_INFORMATION
Definition: security.c:105
static void test_elevation(void)
Definition: security.c:8457
#define SE_REMOTE_SHUTDOWN_PRIVILEGE
Definition: security.c:608
#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
Definition: security.c:587
static void test_window_security(void)
Definition: security.c:8826
static void test_kernel_objects_security(void)
Definition: security.c:6343
static void test_GetTokenInformation(void)
Definition: security.c:2045
static void test_CheckTokenMembership(void)
Definition: security.c:5048
static DWORD WINAPI duplicate_handle_access_thread(void *arg)
Definition: security.c:7853
static void test_AdjustTokenPrivileges(void)
Definition: security.c:6522
static PSID pSid
Definition: security.c:115
static void test_AccessCheck(void)
Definition: security.c:1154
#define join_process(a)
Definition: security.c:8043
static void test_AddAce(void)
Definition: security.c:6558
static void test_create_process_token_child(void)
Definition: security.c:8145
static void test_system_security_access(void)
Definition: security.c:6858
#define PROCESS_ALL_ACCESS_NT4
Definition: security.c:93
static HANDLE
Definition: security.c:130
static void test_file_security(HANDLE token)
Definition: security.c:5866
static void test_process_security_child(void)
Definition: security.c:3135
static void test_lookupPrivilegeName(void)
Definition: security.c:646
static void test_owner_equal(HANDLE Handle, PSID expected, int line)
Definition: security.c:202
static POBJECTS_AND_NAME_A pObjName
Definition: security.c:118
static void test_duplicate_handle_access(void)
Definition: security.c:7874
static void test_EqualSid(void)
Definition: security.c:5109
#define SE_IMPERSONATE_PRIVILEGE
Definition: security.c:613
#define SE_DEBUG_PRIVILEGE
Definition: security.c:604
#define SE_CREATE_TOKEN_PRIVILEGE
Definition: security.c:586
static POBJECTS_AND_SID GUID * pObjectGuid
Definition: security.c:125
static void test_InitializeAcl(void)
Definition: security.c:4673
#define CHECK_SET_SECURITY(o, i, e)
Definition: security.c:2910
static int myARGC
Definition: security.c:135
static void test_default_dacl_owner_group_sid(void)
Definition: security.c:6424
static void test_LookupAccountName(void)
Definition: security.c:2582
static void test_process_security(void)
Definition: security.c:2924
#define SE_SYSTEMTIME_PRIVILEGE
Definition: security.c:596
static void test_group_as_file_owner(void)
Definition: security.c:8730
#define WINE_TEST_PIPE
Definition: security.c:5760
#define SE_CREATE_PERMANENT_PRIVILEGE
Definition: security.c:600
#define SE_MACHINE_ACCOUNT_PRIVILEGE
Definition: security.c:590
static void test_SetSecurityDescriptorControl(PSECURITY_DESCRIPTOR sec)
Definition: security.c:4498
#define THREAD_ALL_ACCESS_NT4
Definition: security.c:109
static void test_IsValidSecurityDescriptor(void)
Definition: security.c:8798
#define SE_SECURITY_PRIVILEGE
Definition: security.c:592
static TOKEN_USER * get_alloc_token_user(HANDLE token)
Definition: security.c:1757
static void test_LookupAccountSid(void)
Definition: security.c:2207
static void test_GetWindowsAccountDomainSid(void)
Definition: security.c:6959
static PPRIVILEGE_SET
Definition: security.c:131
static void test_child_token_sd(void)
Definition: security.c:7518
#define expect_eq(expr, value, type, format)
Definition: security.c:112
static ACCESS_MASK get_obj_access(HANDLE obj)
Definition: security.c:5585
static SECURITY_DESCRIPTOR * test_get_security_descriptor(HANDLE handle, int line)
Definition: security.c:176
static void test_semaphore_security(HANDLE token)
Definition: security.c:5710
#define CHECK_ONE_OF_AND_FREE(exp_str1, exp_str2)
static void test_FileSecurity(void)
Definition: security.c:793
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:3567
#define SE_AUDIT_PRIVILEGE
Definition: security.c:605
static void test_ConvertStringSecurityDescriptor(void)
Definition: security.c:4236
#define SEMAPHORE_QUERY_STATE
Definition: security.c:101
#define TEST_GRANTED_ACCESS2(a, b, c)
Definition: security.c:2891
#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE
Definition: security.c:606
static void join_process_(int line, const PROCESS_INFORMATION *pi)
Definition: security.c:8044
static char ** myARGV
Definition: security.c:136
static void test_CreateDirectoryA(void)
Definition: security.c:3620
static void test_maximum_allowed(void)
Definition: security.c:7115
#define SE_MANAGE_VOLUME_PRIVILEGE
Definition: security.c:612
static TOKEN_OWNER * get_alloc_token_owner(HANDLE token)
Definition: security.c:1775
#define SE_INC_BASE_PRIORITY_PRIVILEGE
Definition: security.c:598
static const struct well_known_sid_value well_known_sid_values[]
static void test_GetNamedSecurityInfoA(void)
Definition: security.c:3851
static void test_GetUserNameW(void)
Definition: security.c:5248
static void test_GetSecurityInfo(void)
Definition: security.c:4721
static void test_lookupPrivilegeValue(void)
Definition: security.c:713
static void test_GetUserNameA(void)
Definition: security.c:5174
static void test_impersonation_level(void)
Definition: security.c:3207
static void test_event_security(HANDLE token)
Definition: security.c:5653
static void check_token_label(HANDLE token, DWORD *level, BOOL sacl_inherited)
Definition: security.c:7153
static void test_PrivateObjectSecurity(void)
Definition: security.c:4586
static void test_GetSidSubAuthority(void)
Definition: security.c:5025
static void test_create_process_token(void)
Definition: security.c:8052
#define SE_UNDOCK_PRIVILEGE
Definition: security.c:609
static void test_TokenIntegrityLevel(void)
Definition: security.c:6376
static void test_mutex_security(HANDLE token)
Definition: security.c:5596
static TOKEN_PRIMARY_GROUP * get_alloc_token_primary_group(HANDLE token)
Definition: security.c:1793
static void test_SetEntriesInAclW(void)
Definition: security.c:3314
static void test_token_security_descriptor(void)
Definition: security.c:7327
#define SE_SHUTDOWN_PRIVILEGE
Definition: security.c:603
#define SE_LOCK_MEMORY_PRIVILEGE
Definition: security.c:588
static void test_token_label(void)
Definition: security.c:7229
#define SE_BACKUP_PRIVILEGE
Definition: security.c:601
#define SE_RESTORE_PRIVILEGE
Definition: security.c:602
static void test_pseudo_tokens(void)
Definition: security.c:7064
#define PROCESS_QUERY_LIMITED_INFORMATION
Definition: security.c:89
static void test_default_handle_security(HANDLE token, HANDLE handle, GENERIC_MAPPING *mapping)
Definition: security.c:5512
static void test_sid_str(PSID *sid)
Definition: security.c:2075
static PBOOLEAN
Definition: security.c:129
static void get_nt_pathW(const char *name, UNICODE_STRING *nameW)
Definition: security.c:3549
static POBJECTS_AND_SID GUID GUID * pInheritedObjectGuid
Definition: security.c:126
#define SE_TCB_PRIVILEGE
Definition: security.c:591
static void test_CreateRestrictedToken(void)
Definition: security.c:5319
static LPSTR pName
Definition: security.c:116
static void test_allocateLuid(void)
Definition: security.c:618
#define SE_PROF_SINGLE_PROCESS_PRIVILEGE
Definition: security.c:597
static void test_named_pipe_security(HANDLE token)
Definition: security.c:5761
static void test_SetEntriesInAclA(void)
Definition: security.c:3428
static void test_trustee(void)
Definition: security.c:435
static void test_ConvertSecurityDescriptorToString(void)
Definition: security.c:4399
static void test_security_descriptor(void)
Definition: security.c:2803
static void test_thread_security(void)
Definition: security.c:6103
static void check_different_token(HANDLE token1, HANDLE token2)
Definition: security.c:8443
static void test_filemap_security(void)
Definition: security.c:5986
#define SE_CHANGE_NOTIFY_PRIVILEGE
Definition: security.c:607
#define SE_ENABLE_DELEGATION_PRIVILEGE
Definition: security.c:611
static void check_wellknown_name(const char *name, WELL_KNOWN_SID_TYPE result)
Definition: security.c:2520
#define CHECK_RESULT_AND_FREE(exp_str)
static BOOL validate_impersonation_token(HANDLE token, DWORD *token_type)
Definition: security.c:6292
static BOOLEAN
Definition: security.c:129
#define SE_INCREASE_QUOTA_PRIVILEGE
Definition: security.c:589
static void test_BuildSecurityDescriptorW(void)
Definition: security.c:7754
#define SE_LOAD_DRIVER_PRIVILEGE
Definition: security.c:594
static const LUID_AND_ATTRIBUTES * find_privilege(const TOKEN_PRIVILEGES *privs, const LUID *luid)
Definition: security.c:8224
static void validate_default_security_descriptor(SECURITY_DESCRIPTOR *sd)
Definition: security.c:5472
static void test_granted_access(HANDLE handle, ACCESS_MASK access, ACCESS_MASK alt, int line)
Definition: security.c:2892
#define SE_MAX_WELL_KNOWN_PRIVILEGE
Definition: security.c:615
static PULONG
Definition: security.c:131
#define SE_CREATE_GLOBAL_PRIVILEGE
Definition: security.c:614
static void test_ConvertStringSidToSid(void)
Definition: security.c:248
static void test_GetKernelObjectSecurity(void)
Definition: security.c:8354
static NTSTATUS *static PWSTR CURDIR *static HMODULE hmod
Definition: security.c:134
#define THREAD_ALL_ACCESS_VISTA
Definition: security.c:110
static POBJECTS_AND_NAME_A SE_OBJECT_TYPE LPSTR LPSTR InheritedObjectTypeName
Definition: security.c:121
static void test_process_access(void)
Definition: security.c:6175
#define SE_CREATE_PAGEFILE_PRIVILEGE
Definition: security.c:599
static void test_group_equal(HANDLE Handle, PSID expected, int line)
Definition: security.c:225
BOOL expected
Definition: store.c:2000
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
ObjectType
Definition: metafile.c:81
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:100
static LPCWSTR file_name
Definition: protocol.c:147
WCHAR strW[12]
Definition: clipboard.c:2025
#define ctrl
Definition: input.c:1756
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
Definition: rtl.c:119
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
_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
ULONG ACCESS_MASK
Definition: nt_native.h:40
#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
#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
long LONG
Definition: pedump.c:60
#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:177
#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
TCHAR str_pos[MAX_LOADSTRING]
Definition: sndrec32.cpp:58
#define UNLEN
Definition: sspi.c:28
TCHAR * cmdline
Definition: stretchblt.cpp:32
const char * name
Definition: security.c:709
DWORD lowPart
Definition: security.c:710
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:2072
SID sid
Definition: security.c:2071
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:158
const char * refStr
Definition: security.c:159
Definition: ps.c:97
const char * sid_string
Definition: security.c:2100
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
#define vsnprintf
Definition: tif_win32.c:406
_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
#define MAKEWORD(a, b)
Definition: typedefs.h:248
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
void * PVOID
Definition: typedefs.h:50
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:1146
#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:1156
#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
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193