sync advapi32 winetest to wine 1.1.31

svn path=/trunk/; revision=43556
This commit is contained in:
Christoph von Wittich 2009-10-18 14:57:22 +00:00
parent 58a1fb8784
commit c3565096d4
6 changed files with 233 additions and 76 deletions

View file

@ -101,8 +101,8 @@ static void test_CredWriteA(void)
ret = pCredWriteA(&new_cred, 0); ret = pCredWriteA(&new_cred, 0);
if (ret) if (ret)
{ {
/* Vista */ ok(GetLastError() == ERROR_SUCCESS ||
ok(GetLastError() == ERROR_IO_PENDING, GetLastError() == ERROR_IO_PENDING, /* Vista */
"Expected ERROR_IO_PENDING, got %d\n", GetLastError()); "Expected ERROR_IO_PENDING, got %d\n", GetLastError());
} }
else else
@ -154,12 +154,13 @@ static void test_CredReadDomainCredentialsA(void)
/* these two tests would crash on both native and Wine. Implementations /* these two tests would crash on both native and Wine. Implementations
* does not check for NULL output pointers and try to zero them out early */ * does not check for NULL output pointers and try to zero them out early */
#if 0 if(0)
{
ok(!pCredReadDomainCredentialsA(&info, 0, NULL, &creds) && ok(!pCredReadDomainCredentialsA(&info, 0, NULL, &creds) &&
GetLastError() == ERROR_INVALID_PARAMETER, "!\n"); GetLastError() == ERROR_INVALID_PARAMETER, "!\n");
ok(!pCredReadDomainCredentialsA(&info, 0, &count, NULL) && ok(!pCredReadDomainCredentialsA(&info, 0, &count, NULL) &&
GetLastError() == ERROR_INVALID_PARAMETER, "!\n"); GetLastError() == ERROR_INVALID_PARAMETER, "!\n");
#endif }
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ret = pCredReadDomainCredentialsA(NULL, 0, &count, &creds); ret = pCredReadDomainCredentialsA(NULL, 0, &count, &creds);

View file

@ -35,21 +35,22 @@ typedef struct {
static void test_sha_ctx(void) static void test_sha_ctx(void)
{ {
FARPROC pA_SHAInit, pA_SHAUpdate, pA_SHAFinal; void (WINAPI *pA_SHAInit)(PSHA_CTX);
static const char test_buffer[] = "In our Life there's If" void (WINAPI *pA_SHAUpdate)(PSHA_CTX, const unsigned char *, UINT);
void (WINAPI *pA_SHAFinal)(PSHA_CTX, PULONG);
static const unsigned char test_buffer[] = "In our Life there's If"
"In our beliefs there's Lie" "In our beliefs there's Lie"
"In our business there is Sin" "In our business there is Sin"
"In our bodies, there is Die"; "In our bodies, there is Die";
ULONG test_buffer_size = strlen(test_buffer);
HMODULE hmod; HMODULE hmod;
SHA_CTX ctx; SHA_CTX ctx;
ULONG result[5]; ULONG result[5];
ULONG result_correct[5] = {0xe014f93, 0xe09791ec, 0x6dcf96c8, 0x8e9385fc, 0x1611c1bb}; ULONG result_correct[5] = {0xe014f93, 0xe09791ec, 0x6dcf96c8, 0x8e9385fc, 0x1611c1bb};
hmod = GetModuleHandleA("advapi32.dll"); hmod = GetModuleHandleA("advapi32.dll");
pA_SHAInit = GetProcAddress(hmod, "A_SHAInit"); pA_SHAInit = (void *)GetProcAddress(hmod, "A_SHAInit");
pA_SHAUpdate = GetProcAddress(hmod, "A_SHAUpdate"); pA_SHAUpdate = (void *)GetProcAddress(hmod, "A_SHAUpdate");
pA_SHAFinal = GetProcAddress(hmod, "A_SHAFinal"); pA_SHAFinal = (void *)GetProcAddress(hmod, "A_SHAFinal");
if (!pA_SHAInit || !pA_SHAUpdate || !pA_SHAFinal) if (!pA_SHAInit || !pA_SHAUpdate || !pA_SHAFinal)
{ {
@ -59,8 +60,8 @@ static void test_sha_ctx(void)
RtlZeroMemory(&ctx, sizeof(ctx)); RtlZeroMemory(&ctx, sizeof(ctx));
pA_SHAInit(&ctx); pA_SHAInit(&ctx);
pA_SHAUpdate(&ctx, test_buffer, test_buffer_size); pA_SHAUpdate(&ctx, test_buffer, sizeof(test_buffer)-1);
pA_SHAUpdate(&ctx, test_buffer, test_buffer_size); pA_SHAUpdate(&ctx, test_buffer, sizeof(test_buffer)-1);
pA_SHAFinal(&ctx, result); pA_SHAFinal(&ctx, result);
ok(!memcmp(result, result_correct, sizeof(result)), "incorrect result\n"); ok(!memcmp(result, result_correct, sizeof(result)), "incorrect result\n");
} }

View file

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

View file

@ -111,57 +111,6 @@ static const char *wine_debugstr_an( const char *str, int n )
return res; return res;
} }
static const char *wine_debugstr_wn( const WCHAR *str, int n )
{
char *dst, *res;
size_t size;
if (!HIWORD(str))
{
if (!str) return "(null)";
res = get_temp_buffer( 6 );
sprintf( res, "#%04x", LOWORD(str) );
return res;
}
if (n == -1) n = lstrlenW(str);
if (n < 0) n = 0;
size = 12 + min( 300, n * 5);
dst = res = get_temp_buffer( n * 5 + 7 );
*dst++ = 'L';
*dst++ = '"';
while (n-- > 0 && dst <= res + size - 10)
{
WCHAR c = *str++;
switch (c)
{
case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
case '\t': *dst++ = '\\'; *dst++ = 't'; break;
case '"': *dst++ = '\\'; *dst++ = '"'; break;
case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
default:
if (c >= ' ' && c <= 126)
*dst++ = (char)c;
else
{
*dst++ = '\\';
sprintf(dst,"%04x",c);
dst+=4;
}
}
}
*dst++ = '"';
if (n > 0)
{
*dst++ = '.';
*dst++ = '.';
*dst++ = '.';
}
*dst = 0;
return res;
}
#define ADVAPI32_GET_PROC(func) \ #define ADVAPI32_GET_PROC(func) \
p ## func = (void*)GetProcAddress(hadvapi32, #func); p ## func = (void*)GetProcAddress(hadvapi32, #func);
@ -288,8 +237,8 @@ static void _test_hkey_main_Value_W(int line, LPCWSTR name, LPCWSTR string,
if (string) if (string)
{ {
lok(memcmp(value, string, cbData) == 0, "RegQueryValueExW failed: %s/%d != %s/%d\n", lok(memcmp(value, string, cbData) == 0, "RegQueryValueExW failed: %s/%d != %s/%d\n",
wine_debugstr_wn((WCHAR*)value, cbData / sizeof(WCHAR)), cbData, wine_dbgstr_wn((WCHAR*)value, cbData / sizeof(WCHAR)), cbData,
wine_debugstr_wn(string, full_byte_len / sizeof(WCHAR)), full_byte_len); wine_dbgstr_wn(string, full_byte_len / sizeof(WCHAR)), full_byte_len);
} }
/* This implies that when cbData == 0, RegQueryValueExW() should not modify the buffer */ /* This implies that when cbData == 0, RegQueryValueExW() should not modify the buffer */
lok(*(value+cbData) == 0xbd, "RegQueryValueExW/2 overflowed at %u: %02x != bd\n", cbData, *(value+cbData)); lok(*(value+cbData) == 0xbd, "RegQueryValueExW/2 overflowed at %u: %02x != bd\n", cbData, *(value+cbData));
@ -959,6 +908,12 @@ static void test_reg_open_key(void)
ret = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Test", NULL); ret = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Test", NULL);
ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", ret); ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", ret);
ret = RegOpenKeyA(HKEY_CURRENT_USER, NULL, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", ret);
ret = RegOpenKeyA(NULL, NULL, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", ret);
/* beginning backslash character */ /* beginning backslash character */
ret = RegOpenKeyA(HKEY_CURRENT_USER, "\\Software\\Wine\\Test", &hkResult); ret = RegOpenKeyA(HKEY_CURRENT_USER, "\\Software\\Wine\\Test", &hkResult);
ok(ret == ERROR_BAD_PATHNAME || /* NT/2k/XP */ ok(ret == ERROR_BAD_PATHNAME || /* NT/2k/XP */

View file

@ -92,6 +92,9 @@ typedef BOOL (WINAPI *fnSetFileSecurityA)(LPCSTR, SECURITY_INFORMATION,
static DWORD (WINAPI *pGetNamedSecurityInfoA)(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION, static DWORD (WINAPI *pGetNamedSecurityInfoA)(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
PSID*, PSID*, PACL*, PACL*, PSID*, PSID*, PACL*, PACL*,
PSECURITY_DESCRIPTOR*); PSECURITY_DESCRIPTOR*);
static PDWORD (WINAPI *pGetSidSubAuthority)(PSID, DWORD);
static PUCHAR (WINAPI *pGetSidSubAuthorityCount)(PSID);
static BOOL (WINAPI *pIsValidSid)(PSID);
typedef DWORD (WINAPI *fnRtlAdjustPrivilege)(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN); typedef DWORD (WINAPI *fnRtlAdjustPrivilege)(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
typedef BOOL (WINAPI *fnCreateWellKnownSid)(WELL_KNOWN_SID_TYPE,PSID,PSID,DWORD*); typedef BOOL (WINAPI *fnCreateWellKnownSid)(WELL_KNOWN_SID_TYPE,PSID,PSID,DWORD*);
typedef BOOL (WINAPI *fnDuplicateTokenEx)(HANDLE,DWORD,LPSECURITY_ATTRIBUTES, typedef BOOL (WINAPI *fnDuplicateTokenEx)(HANDLE,DWORD,LPSECURITY_ATTRIBUTES,
@ -160,6 +163,9 @@ static void init(void)
pSetFileSecurityA = (fnSetFileSecurityA)GetProcAddress(hmod, "SetFileSecurityA" ); pSetFileSecurityA = (fnSetFileSecurityA)GetProcAddress(hmod, "SetFileSecurityA" );
pCreateWellKnownSid = (fnCreateWellKnownSid)GetProcAddress( hmod, "CreateWellKnownSid" ); pCreateWellKnownSid = (fnCreateWellKnownSid)GetProcAddress( hmod, "CreateWellKnownSid" );
pGetNamedSecurityInfoA = (void *)GetProcAddress(hmod, "GetNamedSecurityInfoA"); pGetNamedSecurityInfoA = (void *)GetProcAddress(hmod, "GetNamedSecurityInfoA");
pGetSidSubAuthority = (void *)GetProcAddress(hmod, "GetSidSubAuthority");
pGetSidSubAuthorityCount = (void *)GetProcAddress(hmod, "GetSidSubAuthorityCount");
pIsValidSid = (void *)GetProcAddress(hmod, "IsValidSid");
pMakeSelfRelativeSD = (void *)GetProcAddress(hmod, "MakeSelfRelativeSD"); pMakeSelfRelativeSD = (void *)GetProcAddress(hmod, "MakeSelfRelativeSD");
pSetEntriesInAclW = (void *)GetProcAddress(hmod, "SetEntriesInAclW"); pSetEntriesInAclW = (void *)GetProcAddress(hmod, "SetEntriesInAclW");
pSetSecurityDescriptorControl = (void *)GetProcAddress(hmod, "SetSecurityDescriptorControl"); pSetSecurityDescriptorControl = (void *)GetProcAddress(hmod, "SetSecurityDescriptorControl");
@ -2390,7 +2396,8 @@ static void test_impersonation_level(void)
/* can't perform access check when opening object against an anonymous impersonation token */ /* can't perform access check when opening object against an anonymous impersonation token */
todo_wine { todo_wine {
error = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey); error = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
ok(error == ERROR_INVALID_HANDLE, "RegOpenKeyEx should have failed with ERROR_INVALID_HANDLE instead of %d\n", error); ok(error == ERROR_INVALID_HANDLE || error == ERROR_CANT_OPEN_ANONYMOUS,
"RegOpenKeyEx should have failed with ERROR_INVALID_HANDLE or ERROR_CANT_OPEN_ANONYMOUS instead of %d\n", error);
} }
RevertToSelf(); RevertToSelf();
@ -2443,7 +2450,8 @@ static void test_impersonation_level(void)
/* can't perform access check when opening object against an identification impersonation token */ /* can't perform access check when opening object against an identification impersonation token */
error = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey); error = RegOpenKeyEx(HKEY_CURRENT_USER, "Software", 0, KEY_READ, &hkey);
todo_wine { todo_wine {
ok(error == ERROR_INVALID_HANDLE, "RegOpenKeyEx should have failed with ERROR_INVALID_HANDLE instead of %d\n", error); ok(error == ERROR_INVALID_HANDLE || error == ERROR_BAD_IMPERSONATION_LEVEL,
"RegOpenKeyEx should have failed with ERROR_INVALID_HANDLE or ERROR_BAD_IMPERSONATION_LEVEL instead of %d\n", error);
} }
ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted); ret = PrivilegeCheck(Token, PrivilegeSet, &AccessGranted);
ok(ret, "PrivilegeCheck for SecurityIdentification failed with error %d\n", GetLastError()); ok(ret, "PrivilegeCheck for SecurityIdentification failed with error %d\n", GetLastError());
@ -2476,6 +2484,7 @@ static void test_SetEntriesInAcl(void)
SID_IDENTIFIER_AUTHORITY SIDAuthNT = { SECURITY_NT_AUTHORITY }; SID_IDENTIFIER_AUTHORITY SIDAuthNT = { SECURITY_NT_AUTHORITY };
EXPLICIT_ACCESSW ExplicitAccess; EXPLICIT_ACCESSW ExplicitAccess;
static const WCHAR wszEveryone[] = {'E','v','e','r','y','o','n','e',0}; static const WCHAR wszEveryone[] = {'E','v','e','r','y','o','n','e',0};
static const WCHAR wszCurrentUser[] = { 'C','U','R','R','E','N','T','_','U','S','E','R','\0'};
if (!pSetEntriesInAclW) if (!pSetEntriesInAclW)
{ {
@ -2569,6 +2578,13 @@ static void test_SetEntriesInAcl(void)
LocalFree(NewAcl); LocalFree(NewAcl);
} }
ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_USER;
ExplicitAccess.Trustee.ptstrName = (LPWSTR)wszCurrentUser;
res = pSetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl);
ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %u\n", res);
ok(NewAcl != NULL, "returned acl was NULL\n");
LocalFree(NewAcl);
ExplicitAccess.grfAccessMode = REVOKE_ACCESS; ExplicitAccess.grfAccessMode = REVOKE_ACCESS;
ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID; ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ExplicitAccess.Trustee.ptstrName = UsersSid; ExplicitAccess.Trustee.ptstrName = UsersSid;
@ -3036,20 +3052,25 @@ static void test_PrivateObjectSecurity(void)
"GetPrivateObjectSecurity failed (err=%u)\n", GetLastError()); "GetPrivateObjectSecurity failed (err=%u)\n", GetLastError());
ok(retSize <= dwDescSize, "Buffer too small (%d vs %d)\n", retSize, dwDescSize); ok(retSize <= dwDescSize, "Buffer too small (%d vs %d)\n", retSize, dwDescSize);
ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed err=%u\n", GetLastError()); ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed err=%u\n", GetLastError());
CHECK_RESULT_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)"); 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)",
"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 */
GetSecurityDescriptorControl(buf, &ctrl, &dwRevision); GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
expect_eq(ctrl, 0x8004, int, "%x"); expect_eq(ctrl & (~ SE_DACL_PROTECTED), 0x8004, int, "%x");
ok(GetPrivateObjectSecurity(sec, sec_info, buf, dwDescSize, &retSize), ok(GetPrivateObjectSecurity(sec, sec_info, buf, dwDescSize, &retSize),
"GetPrivateObjectSecurity failed (err=%u)\n", GetLastError()); "GetPrivateObjectSecurity failed (err=%u)\n", GetLastError());
ok(retSize == dwDescSize, "Buffer too small (%d vs %d)\n", retSize, dwDescSize); ok(retSize == dwDescSize, "Buffer too small (%d vs %d)\n", retSize, dwDescSize);
ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n"); ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(buf, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
CHECK_RESULT_AND_FREE("O:SY" CHECK_ONE_OF_AND_FREE("O:SY"
"G:S-1-5-21-93476-23408-4576" "G:S-1-5-21-93476-23408-4576"
"D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)" "D:(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
"S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)"); "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)",
"O:SY"
"G:S-1-5-21-93476-23408-4576"
"D:P(A;NP;GAGXGWGR;;;SU)(A;IOID;CCDC;;;SU)(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)"
"S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)"); /* Win7 */
GetSecurityDescriptorControl(buf, &ctrl, &dwRevision); GetSecurityDescriptorControl(buf, &ctrl, &dwRevision);
expect_eq(ctrl, 0x8014, int, "%x"); expect_eq(ctrl & (~ SE_DACL_PROTECTED), 0x8014, int, "%x");
SetLastError(0xdeadbeef); SetLastError(0xdeadbeef);
ok(GetPrivateObjectSecurity(sec, sec_info, buf, 5, &retSize) == FALSE, "GetPrivateObjectSecurity should have failed\n"); ok(GetPrivateObjectSecurity(sec, sec_info, buf, 5, &retSize) == FALSE, "GetPrivateObjectSecurity should have failed\n");
@ -3176,6 +3197,34 @@ static void test_GetSecurityInfo(void)
CloseHandle(obj); CloseHandle(obj);
} }
static void test_GetSidSubAuthority(void)
{
PSID psid = NULL;
if (!pGetSidSubAuthority || !pConvertStringSidToSidA || !pIsValidSid || !pGetSidSubAuthorityCount)
{
win_skip("Some functions not available\n");
return;
}
/* Note: on windows passing in an invalid index like -1, lets GetSidSubAuthority return 0x05000000 but
still GetLastError returns ERROR_SUCCESS then. We don't test these unlikely cornercases here for now */
ok(pConvertStringSidToSidA("S-1-5-21-93476-23408-4576",&psid),"ConvertStringSidToSidA failed\n");
ok(pIsValidSid(psid),"Sid is not valid\n");
SetLastError(0xbebecaca);
ok(*pGetSidSubAuthorityCount(psid) == 4,"GetSidSubAuthorityCount gave %d expected 4\n",*pGetSidSubAuthorityCount(psid));
ok(GetLastError() == 0,"GetLastError returned %d instead of 0\n",GetLastError());
SetLastError(0xbebecaca);
ok(*pGetSidSubAuthority(psid,0) == 21,"GetSidSubAuthority gave %d expected 21\n",*pGetSidSubAuthority(psid,0));
ok(GetLastError() == 0,"GetLastError returned %d instead of 0\n",GetLastError());
SetLastError(0xbebecaca);
ok(*pGetSidSubAuthority(psid,1) == 93476,"GetSidSubAuthority gave %d expected 93476\n",*pGetSidSubAuthority(psid,1));
ok(GetLastError() == 0,"GetLastError returned %d instead of 0\n",GetLastError());
SetLastError(0xbebecaca);
todo_wine ok(*pGetSidSubAuthority(psid,4) == 0,"GetSidSubAuthority gave %d,expected 0\n",*pGetSidSubAuthority(psid,4));
ok(GetLastError() == 0,"GetLastError returned %d instead of 0\n",GetLastError());
LocalFree(psid);
}
START_TEST(security) START_TEST(security)
{ {
init(); init();
@ -3205,4 +3254,5 @@ START_TEST(security)
test_PrivateObjectSecurity(); test_PrivateObjectSecurity();
test_acls(); test_acls();
test_GetSecurityInfo(); test_GetSecurityInfo();
test_GetSidSubAuthority();
} }

View file

@ -28,6 +28,7 @@
#include "winsvc.h" #include "winsvc.h"
#include "winnls.h" #include "winnls.h"
#include "lmcons.h" #include "lmcons.h"
#include "aclapi.h"
#include "wine/test.h" #include "wine/test.h"
@ -37,6 +38,8 @@ static BOOL (WINAPI *pChangeServiceConfig2A)(SC_HANDLE,DWORD,LPVOID);
static BOOL (WINAPI *pEnumServicesStatusExA)(SC_HANDLE, SC_ENUM_TYPE, DWORD, static BOOL (WINAPI *pEnumServicesStatusExA)(SC_HANDLE, SC_ENUM_TYPE, DWORD,
DWORD, LPBYTE, DWORD, LPDWORD, DWORD, LPBYTE, DWORD, LPDWORD,
LPDWORD, LPDWORD, LPCSTR); LPDWORD, LPDWORD, LPCSTR);
static DWORD (WINAPI *pGetSecurityInfo)(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
static BOOL (WINAPI *pQueryServiceConfig2A)(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); static BOOL (WINAPI *pQueryServiceConfig2A)(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
static BOOL (WINAPI *pQueryServiceConfig2W)(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); static BOOL (WINAPI *pQueryServiceConfig2W)(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
static BOOL (WINAPI *pQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE, static BOOL (WINAPI *pQueryServiceStatusEx)(SC_HANDLE, SC_STATUS_TYPE, LPBYTE,
@ -48,6 +51,7 @@ static void init_function_pointers(void)
pChangeServiceConfig2A = (void*)GetProcAddress(hadvapi32, "ChangeServiceConfig2A"); pChangeServiceConfig2A = (void*)GetProcAddress(hadvapi32, "ChangeServiceConfig2A");
pEnumServicesStatusExA= (void*)GetProcAddress(hadvapi32, "EnumServicesStatusExA"); pEnumServicesStatusExA= (void*)GetProcAddress(hadvapi32, "EnumServicesStatusExA");
pGetSecurityInfo = (void *)GetProcAddress(hadvapi32, "GetSecurityInfo");
pQueryServiceConfig2A= (void*)GetProcAddress(hadvapi32, "QueryServiceConfig2A"); pQueryServiceConfig2A= (void*)GetProcAddress(hadvapi32, "QueryServiceConfig2A");
pQueryServiceConfig2W= (void*)GetProcAddress(hadvapi32, "QueryServiceConfig2W"); pQueryServiceConfig2W= (void*)GetProcAddress(hadvapi32, "QueryServiceConfig2W");
pQueryServiceStatusEx= (void*)GetProcAddress(hadvapi32, "QueryServiceStatusEx"); pQueryServiceStatusEx= (void*)GetProcAddress(hadvapi32, "QueryServiceStatusEx");
@ -1743,7 +1747,17 @@ static void test_sequence(void)
return; return;
} }
else else
{
ok(svc_handle != NULL, "Could not create the service : %d\n", GetLastError()); ok(svc_handle != NULL, "Could not create the service : %d\n", GetLastError());
if ((svc_handle != NULL) && (pGetSecurityInfo != NULL))
{
PSID sidOwner, sidGroup;
PACL dacl, sacl;
PSECURITY_DESCRIPTOR pSD;
HRESULT retval = pGetSecurityInfo(svc_handle,SE_SERVICE,DACL_SECURITY_INFORMATION,&sidOwner,&sidGroup,&dacl,&sacl,&pSD);
todo_wine ok(ERROR_SUCCESS == retval, "Expected GetSecurityInfo to succeed: result %d\n",retval);
}
}
if (!svc_handle) return; if (!svc_handle) return;