Author: dchapyshev Date: Sun Feb 8 03:32:24 2009 New Revision: 39481
URL: http://svn.reactos.org/svn/reactos?rev=39481&view=rev Log: - Sync advapi32_winetest with Wine head
Modified: trunk/rostests/winetests/advapi32/cred.c trunk/rostests/winetests/advapi32/crypt.c trunk/rostests/winetests/advapi32/crypt_lmhash.c trunk/rostests/winetests/advapi32/crypt_md4.c trunk/rostests/winetests/advapi32/crypt_md5.c trunk/rostests/winetests/advapi32/registry.c trunk/rostests/winetests/advapi32/security.c trunk/rostests/winetests/advapi32/service.c
Modified: trunk/rostests/winetests/advapi32/cred.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/cred.c?... ============================================================================== --- trunk/rostests/winetests/advapi32/cred.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/cred.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -34,6 +34,8 @@ static BOOL (WINAPI *pCredReadA)(LPCSTR,DWORD,DWORD,PCREDENTIALA *); static BOOL (WINAPI *pCredRenameA)(LPCSTR,LPCSTR,DWORD,DWORD); static BOOL (WINAPI *pCredWriteA)(PCREDENTIALA,DWORD); +static BOOL (WINAPI *pCredReadDomainCredentialsA)(PCREDENTIAL_TARGET_INFORMATIONA,DWORD,DWORD*,PCREDENTIALA**); +
#define TEST_TARGET_NAME "credtest.winehq.org" #define TEST_TARGET_NAME2 "credtest2.winehq.org" @@ -133,6 +135,65 @@ ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0xdeadbeef); ok(!ret && ( GetLastError() == ERROR_INVALID_FLAGS || GetLastError() == ERROR_INVALID_PARAMETER /* Vista */ ), "CredDeleteA should have failed with ERROR_INVALID_FLAGS or ERROR_INVALID_PARAMETER instead of %d\n", + GetLastError()); +} + +static void test_CredReadDomainCredentialsA(void) +{ + BOOL ret; + char target_name[] = "no_such_target"; + CREDENTIAL_TARGET_INFORMATIONA info = {target_name, NULL, target_name, NULL, NULL, NULL, NULL, 0, 0, NULL}; + DWORD count; + PCREDENTIAL* creds; + + if (!pCredReadDomainCredentialsA) + { + win_skip("CredReadDomainCredentialsA() is not implemented\n"); + return; + } + + /* 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 */ +#if 0 + ok(!pCredReadDomainCredentialsA(&info, 0, NULL, &creds) && + GetLastError() == ERROR_INVALID_PARAMETER, "!\n"); + ok(!pCredReadDomainCredentialsA(&info, 0, &count, NULL) && + GetLastError() == ERROR_INVALID_PARAMETER, "!\n"); +#endif + + SetLastError(0xdeadbeef); + ret = pCredReadDomainCredentialsA(NULL, 0, &count, &creds); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "CredReadDomainCredentialsA should have failed with ERROR_INVALID_PARAMETER instead of %d\n", + GetLastError()); + + SetLastError(0xdeadbeef); + creds = (void*)0x12345; + count = 2; + ret = pCredReadDomainCredentialsA(&info, 0, &count, &creds); + ok(!ret && GetLastError() == ERROR_NOT_FOUND, + "CredReadDomainCredentialsA should have failed with ERROR_NOT_FOUND instead of %d\n", + GetLastError()); + ok(count ==0 && creds == NULL, "CredReadDomainCredentialsA must not return any result\n"); + + info.TargetName = NULL; + + SetLastError(0xdeadbeef); + ret = pCredReadDomainCredentialsA(&info, 0, &count, &creds); + ok(!ret, "CredReadDomainCredentialsA should have failed\n"); + ok(GetLastError() == ERROR_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */ + "Expected ERROR_NOT_FOUND or ERROR_INVALID_PARAMETER instead of %d\n", + GetLastError()); + + info.DnsServerName = NULL; + + SetLastError(0xdeadbeef); + ret = pCredReadDomainCredentialsA(&info, 0, &count, &creds); + ok(!ret, "CredReadDomainCredentialsA should have failed\n"); + ok(GetLastError() == ERROR_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */ + "Expected ERROR_NOT_FOUND or ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); }
@@ -279,6 +340,7 @@ pCredDeleteA = (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredDeleteA"); pCredReadA = (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredReadA"); pCredRenameA = (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredRenameA"); + pCredReadDomainCredentialsA = (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredReadDomainCredentialsA");
if (!pCredEnumerateA || !pCredFree || !pCredWriteA || !pCredDeleteA || !pCredReadA) @@ -304,6 +366,8 @@ test_CredWriteA(); test_CredDeleteA();
+ test_CredReadDomainCredentialsA(); + trace("generic:\n"); if (persists[CRED_TYPE_GENERIC] == CRED_PERSIST_NONE) skip("CRED_TYPE_GENERIC credentials are not supported or are disabled. Skipping\n");
Modified: trunk/rostests/winetests/advapi32/crypt.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/crypt.c... ============================================================================== --- trunk/rostests/winetests/advapi32/crypt.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/crypt.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -461,8 +461,8 @@ RegQueryInfoKey(hKey, NULL, NULL, NULL, pdwProvCount, pcbProvName, NULL, NULL, NULL, NULL, NULL, NULL); (*pcbProvName)++; - - if (!(*pszProvName = ((LPSTR)LocalAlloc(LMEM_ZEROINIT, *pcbProvName)))) + + if (!(*pszProvName = LocalAlloc(LMEM_ZEROINIT, *pcbProvName))) return FALSE; RegEnumKeyEx(hKey, dwIndex, *pszProvName, pcbProvName, NULL, NULL, NULL, NULL); @@ -518,7 +518,7 @@ /* alloc provider to half the size required * cbName holds the size required */ providerLen = cbName / 2; - if (!(provider = ((LPSTR)LocalAlloc(LMEM_ZEROINIT, providerLen)))) + if (!(provider = LocalAlloc(LMEM_ZEROINIT, providerLen))) return;
result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, provider, &providerLen); @@ -546,7 +546,7 @@ /* check expected versus actual values returned */ result = pCryptEnumProvidersA(dwIndex, NULL, 0, &type, NULL, &providerLen); ok(result && providerLen==cbName, "expected %i, got %i\n", (int)cbName, (int)providerLen); - if (!(provider = ((LPSTR)LocalAlloc(LMEM_ZEROINIT, providerLen)))) + if (!(provider = LocalAlloc(LMEM_ZEROINIT, providerLen))) return; providerLen = 0xdeadbeef; @@ -670,7 +670,7 @@ /* alloc provider type to half the size required * cbTypeName holds the size required */ typeNameSize = cbTypeName / 2; - if (!(typeName = ((LPSTR)LocalAlloc(LMEM_ZEROINIT, typeNameSize)))) + if (!(typeName = LocalAlloc(LMEM_ZEROINIT, typeNameSize))) goto cleanup;
SetLastError(0xdeadbeef); @@ -700,7 +700,7 @@ /* check expected versus actual values returned */ result = pCryptEnumProviderTypesA(index, NULL, 0, &provType, NULL, &typeNameSize); ok(result && typeNameSize==cbTypeName, "expected %d, got %d\n", cbTypeName, typeNameSize); - if (!(typeName = ((LPSTR)LocalAlloc(LMEM_ZEROINIT, typeNameSize)))) + if (!(typeName = LocalAlloc(LMEM_ZEROINIT, typeNameSize))) goto cleanup;
typeNameSize = 0xdeadbeef; @@ -870,12 +870,13 @@ /* remove the default provider and then set it to MS_DEF_PROV/PROV_RSA_FULL */ SetLastError(0xdeadbeef); result = pCryptSetProviderExA(MS_DEF_PROV, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT | CRYPT_DELETE_DEFAULT); - if (!result && (GetLastError() == ERROR_ACCESS_DENIED)) - { + if (!result) + { + ok( GetLastError() == ERROR_ACCESS_DENIED || broken(GetLastError() == ERROR_INVALID_PARAMETER), + "wrong error %u\n", GetLastError() ); skip("Not enough rights to remove the default provider\n"); return; } - ok(result, "%d\n", GetLastError());
result = pCryptSetProviderExA(MS_DEF_PROV, PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT); ok(result, "%d\n", GetLastError());
Modified: trunk/rostests/winetests/advapi32/crypt_lmhash.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/crypt_l... ============================================================================== --- trunk/rostests/winetests/advapi32/crypt_lmhash.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/crypt_lmhash.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -259,7 +259,7 @@ key.Length = 0x100; key.MaximumLength = 0x100;
- r = pSystemFunction004(&in, &key, (struct ustring *)&out); + r = pSystemFunction004(&in, &key, &out); ok(r == STATUS_BUFFER_TOO_SMALL, "function failed\n");
in.Buffer = inbuf;
Modified: trunk/rostests/winetests/advapi32/crypt_md4.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/crypt_m... ============================================================================== --- trunk/rostests/winetests/advapi32/crypt_md4.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/crypt_md4.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -49,7 +49,7 @@ md4hashfunc pSystemFunction010; md4hashfunc pSystemFunction011;
-#define ctxcmp( a, b ) memcmp( (char*)a, (char*)b, FIELD_OFFSET( MD4_CTX, in ) ) +#define ctxcmp( a, b ) memcmp( a, b, FIELD_OFFSET( MD4_CTX, in ) )
static void test_md4_ctx(void) {
Modified: trunk/rostests/winetests/advapi32/crypt_md5.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/crypt_m... ============================================================================== --- trunk/rostests/winetests/advapi32/crypt_md5.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/crypt_md5.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -41,7 +41,7 @@ fnMD5Update pMD5Update; fnMD5Final pMD5Final;
-#define ctxcmp( a, b ) memcmp( (char*)a, (char*)b, FIELD_OFFSET( MD5_CTX, in ) ) +#define ctxcmp( a, b ) memcmp( a, b, FIELD_OFFSET( MD5_CTX, in ) )
static void test_md5_ctx(void) {
Modified: trunk/rostests/winetests/advapi32/registry.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/registr... ============================================================================== --- trunk/rostests/winetests/advapi32/registry.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/registry.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -1475,6 +1475,52 @@ "Expected ERROR_FILE_NOT_FOUND, got %d\n", ret); }
+static void test_rw_order(void) +{ + HKEY hKey; + DWORD dw = 0; + static char keyname[] = "test_rw_order"; + char value_buf[2]; + DWORD values, value_len, value_name_max_len; + LSTATUS ret; + + RegDeleteKeyA(HKEY_CURRENT_USER, keyname); + ret = RegCreateKeyA(HKEY_CURRENT_USER, keyname, &hKey); + if(ret != ERROR_SUCCESS) { + skip("Couldn't create key. Skipping.\n"); + return; + } + + ok(!RegSetValueExA(hKey, "A", 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)), + "RegSetValueExA for value "A" failed\n"); + ok(!RegSetValueExA(hKey, "C", 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)), + "RegSetValueExA for value "C" failed\n"); + ok(!RegSetValueExA(hKey, "D", 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)), + "RegSetValueExA for value "D" failed\n"); + ok(!RegSetValueExA(hKey, "B", 0, REG_DWORD, (LPBYTE)&dw, sizeof(dw)), + "RegSetValueExA for value "B" failed\n"); + + ok(!RegQueryInfoKeyA(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &values, + &value_name_max_len, NULL, NULL, NULL), "RegQueryInfoKeyA failed\n"); + ok(values == 4, "Expected 4 values, got %u\n", values); + + /* Value enumeration preserves RegSetValueEx call order */ + value_len = 2; + ok(!RegEnumValueA(hKey, 0, value_buf, &value_len, NULL, NULL, NULL, NULL), "RegEnumValueA failed\n"); + ok(strcmp(value_buf, "A") == 0, "Expected name "A", got %s\n", value_buf); + value_len = 2; + ok(!RegEnumValueA(hKey, 1, value_buf, &value_len, NULL, NULL, NULL, NULL), "RegEnumValueA failed\n"); + todo_wine ok(strcmp(value_buf, "C") == 0, "Expected name "C", got %s\n", value_buf); + value_len = 2; + ok(!RegEnumValueA(hKey, 2, value_buf, &value_len, NULL, NULL, NULL, NULL), "RegEnumValueA failed\n"); + todo_wine ok(strcmp(value_buf, "D") == 0, "Expected name "D", got %s\n", value_buf); + value_len = 2; + ok(!RegEnumValueA(hKey, 3, value_buf, &value_len, NULL, NULL, NULL, NULL), "RegEnumValueA failed\n"); + todo_wine ok(strcmp(value_buf, "B") == 0, "Expected name "B", got %s\n", value_buf); + + ok(!RegDeleteKey(HKEY_CURRENT_USER, keyname), "Failed to delete key\n"); +} + START_TEST(registry) { /* Load pointers for functions that are not available in all Windows versions */ @@ -1506,6 +1552,7 @@ }
test_reg_delete_tree(); + test_rw_order();
/* cleanup */ delete_key( hkey_main );
Modified: trunk/rostests/winetests/advapi32/security.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/securit... ============================================================================== --- trunk/rostests/winetests/advapi32/security.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/security.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -107,6 +107,8 @@ SECURITY_DESCRIPTOR_CONTROL); static DWORD (WINAPI *pGetSecurityInfo)(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*); +static NTSTATUS (WINAPI *pNtAccessCheck)(PSECURITY_DESCRIPTOR, HANDLE, ACCESS_MASK, PGENERIC_MAPPING, + PPRIVILEGE_SET, PULONG, PULONG, NTSTATUS*);
static HMODULE hmod; static int myARGC; @@ -142,6 +144,7 @@
hntdll = GetModuleHandleA("ntdll.dll"); pNtQueryObject = (void *)GetProcAddress( hntdll, "NtQueryObject" ); + pNtAccessCheck = (void *)GetProcAddress( hntdll, "NtAccessCheck" );
hmod = GetModuleHandle("advapi32.dll"); pAddAccessAllowedAceEx = (void *)GetProcAddress(hmod, "AddAccessAllowedAceEx"); @@ -240,7 +243,7 @@ GetLastError() );
ok(pConvertStringSidToSidA("S-1-5-21-93476-23408-4576", &psid), "ConvertStringSidToSidA failed\n"); - pisid = (SID *)psid; + pisid = psid; ok(pisid->SubAuthorityCount == 4, "Invalid sub authority count - expected 4, got %d\n", pisid->SubAuthorityCount); ok(pisid->SubAuthority[0] == 21, "Invalid subauthority 0 - expceted 21, got %d\n", pisid->SubAuthority[0]); ok(pisid->SubAuthority[3] == 4576, "Invalid subauthority 0 - expceted 4576, got %d\n", pisid->SubAuthority[3]); @@ -266,7 +269,7 @@
r = pConvertStringSidToSidA( refs[i].refStr, &psid ); ok( r, "failed to parse sid string\n" ); - pisid = (PISID)psid; + pisid = psid; ok( pisid && !memcmp( pisid->IdentifierAuthority.Value, refs[i].auth.Value, sizeof(refs[i].auth) ), @@ -373,7 +376,7 @@ "MultipleTrusteeOperation wrong\n"); ok( trustee.TrusteeForm == TRUSTEE_IS_SID, "TrusteeForm wrong\n"); ok( trustee.TrusteeType == TRUSTEE_IS_UNKNOWN, "TrusteeType wrong\n"); - ok( trustee.ptstrName == (LPSTR) psid, "ptstrName wrong\n" ); + ok( trustee.ptstrName == psid, "ptstrName wrong\n" );
/* test BuildTrusteeWithObjectsAndSidA (test 1) */ memset( &trustee, 0xff, sizeof trustee ); @@ -842,6 +845,7 @@ HMODULE NtDllModule; BOOLEAN Enabled; DWORD err; + NTSTATUS ntret, ntAccessStatus;
NtDllModule = GetModuleHandle("ntdll.dll"); if (!NtDllModule) @@ -917,6 +921,7 @@
/* Generic access mask */ SetLastError(0xdeadbeef); + Access = AccessStatus = 0xdeadbeef; ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); err = GetLastError(); @@ -925,7 +930,41 @@ ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, "Access and/or AccessStatus were changed!\n");
+ /* Generic access mask - no privilegeset buffer */ + SetLastError(0xdeadbeef); + Access = AccessStatus = 0xdeadbeef; + ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + NULL, &PrivSetLen, &Access, &AccessStatus); + err = GetLastError(); + ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " + "with ERROR_NOACCESS, instead of %d\n", err); + ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + + /* Generic access mask - no returnlength */ + SetLastError(0xdeadbeef); + Access = AccessStatus = 0xdeadbeef; + ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + PrivSet, NULL, &Access, &AccessStatus); + err = GetLastError(); + ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " + "with ERROR_NOACCESS, instead of %d\n", err); + ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + + /* Generic access mask - no privilegeset buffer, no returnlength */ + SetLastError(0xdeadbeef); + Access = AccessStatus = 0xdeadbeef; + ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + NULL, NULL, &Access, &AccessStatus); + err = GetLastError(); + ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " + "with ERROR_NOACCESS, instead of %d\n", err); + ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + /* sd with no dacl present */ + Access = AccessStatus = 0xdeadbeef; ret = SetSecurityDescriptorDacl(SecurityDescriptor, FALSE, NULL, FALSE); ok(ret, "SetSecurityDescriptorDacl failed with error %d\n", GetLastError()); ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, @@ -935,7 +974,63 @@ "AccessCheck failed to grant access with error %d\n", GetLastError());
+ /* sd with no dacl present - no privilegeset buffer */ + SetLastError(0xdeadbeef); + Access = AccessStatus = 0xdeadbeef; + ret = AccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + NULL, &PrivSetLen, &Access, &AccessStatus); + err = GetLastError(); + ok(!ret && err == ERROR_NOACCESS, "AccessCheck should have failed " + "with ERROR_NOACCESS, instead of %d\n", err); + ok(Access == 0xdeadbeef && AccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + + if(pNtAccessCheck) + { + /* Generic access mask - no privilegeset buffer */ + SetLastError(0xdeadbeef); + Access = ntAccessStatus = 0xdeadbeef; + ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + NULL, &PrivSetLen, &Access, &ntAccessStatus); + err = GetLastError(); + ok(ntret == STATUS_ACCESS_VIOLATION, + "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %x\n", ntret); + ok(err == 0xdeadbeef, + "NtAccessCheck shouldn't set last error, got %d\n", err); + ok(Access == 0xdeadbeef && ntAccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + + /* Generic access mask - no returnlength */ + SetLastError(0xdeadbeef); + Access = ntAccessStatus = 0xdeadbeef; + ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + PrivSet, NULL, &Access, &ntAccessStatus); + err = GetLastError(); + ok(ntret == STATUS_ACCESS_VIOLATION, + "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %x\n", ntret); + ok(err == 0xdeadbeef, + "NtAccessCheck shouldn't set last error, got %d\n", err); + ok(Access == 0xdeadbeef && ntAccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + + /* Generic access mask - no privilegeset buffer, no returnlength */ + SetLastError(0xdeadbeef); + Access = ntAccessStatus = 0xdeadbeef; + ntret = pNtAccessCheck(SecurityDescriptor, Token, GENERIC_READ, &Mapping, + NULL, NULL, &Access, &ntAccessStatus); + err = GetLastError(); + ok(ntret == STATUS_ACCESS_VIOLATION, + "NtAccessCheck should have failed with STATUS_ACCESS_VIOLATION, got %x\n", ntret); + ok(err == 0xdeadbeef, + "NtAccessCheck shouldn't set last error, got %d\n", err); + ok(Access == 0xdeadbeef && ntAccessStatus == 0xdeadbeef, + "Access and/or AccessStatus were changed!\n"); + } + else + win_skip("NtAccessCheck unavailable. Skipping.\n"); + /* sd with NULL dacl */ + Access = AccessStatus = 0xdeadbeef; ret = SetSecurityDescriptorDacl(SecurityDescriptor, TRUE, NULL, FALSE); ok(ret, "SetSecurityDescriptorDacl failed with error %d\n", GetLastError()); ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, @@ -963,6 +1058,7 @@ ok(res, "AddAccessDeniedAce failed with error %d\n", GetLastError());
/* sd with dacl */ + Access = AccessStatus = 0xdeadbeef; ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); ok(ret, "AccessCheck failed with error %d\n", GetLastError()); @@ -980,6 +1076,7 @@
/* Access denied by SD */ SetLastError(0xdeadbeef); + Access = AccessStatus = 0xdeadbeef; ret = AccessCheck(SecurityDescriptor, Token, KEY_WRITE, &Mapping, PrivSet, &PrivSetLen, &Access, &AccessStatus); ok(ret, "AccessCheck failed with error %d\n", GetLastError()); @@ -1254,7 +1351,7 @@ /* 74 */ {TRUE, "S-1-5-22"}, {FALSE, "S-1-5-21-12-23-34-45-56-521"}, {TRUE, "S-1-5-32-573"} };
-static void test_CreateWellKnownSid() +static void test_CreateWellKnownSid(void) { SID_IDENTIFIER_AUTHORITY ident = { SECURITY_NT_AUTHORITY }; PSID domainsid; @@ -1608,6 +1705,7 @@ DWORD sid_size, domain_size, user_size; DWORD sid_save, domain_save; CHAR user_name[UNLEN + 1]; + CHAR computer_name[UNLEN + 1]; SID_NAME_USE sid_use; LPSTR domain, account, sid_dom; PSID psid; @@ -1728,7 +1826,9 @@ sid_use = 0xcafebabe; SetLastError(0xdeadbeef); ret = LookupAccountNameA(NULL, NULL, NULL, &sid_size, NULL, &domain_size, &sid_use); - if (!ret && GetLastError() != ERROR_NONE_MAPPED) + if (!ret && GetLastError() == ERROR_NONE_MAPPED) + win_skip("NULL account name doesn't work on NT4\n"); + else { ok(!ret, "Expected 0, got %d\n", ret); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, @@ -1753,8 +1853,6 @@ HeapFree(GetProcessHeap(), 0, psid); HeapFree(GetProcessHeap(), 0, domain); } - else - win_skip("NULL account name doesn't work on NT4\n");
/* try an invalid account name */ SetLastError(0xdeadbeef); @@ -1778,6 +1876,27 @@ "Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %d\n", GetLastError()); ok(sid_size == 0, "Expected 0, got %d\n", sid_size); ok(domain_size == 0, "Expected 0, got %d\n", domain_size); + + /* try with the computer name as the account name */ + domain_size = sizeof(computer_name); + GetComputerNameA(computer_name, &domain_size); + sid_size = 0; + domain_size = 0; + ret = LookupAccountNameA(NULL, computer_name, NULL, &sid_size, NULL, &domain_size, &sid_use); + ok(!ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || + broken(GetLastError() == ERROR_TRUSTED_DOMAIN_FAILURE) || + broken(GetLastError() == ERROR_TRUSTED_RELATIONSHIP_FAILURE)), + "LookupAccountNameA failed: %d\n", GetLastError()); + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + psid = HeapAlloc(GetProcessHeap(), 0, sid_size); + domain = HeapAlloc(GetProcessHeap(), 0, domain_size); + ret = LookupAccountNameA(NULL, computer_name, psid, &sid_size, domain, &domain_size, &sid_use); + ok(ret, "LookupAccountNameA failed: %d\n", GetLastError()); + ok(sid_use == SidTypeDomain, "expected SidTypeDomain, got %d\n", sid_use); + HeapFree(GetProcessHeap(), 0, domain); + HeapFree(GetProcessHeap(), 0, psid); + } }
static void test_security_descriptor(void) @@ -1870,7 +1989,8 @@ static void test_process_security(void) { BOOL res; - char owner[32], group[32]; + PTOKEN_OWNER owner; + PTOKEN_PRIMARY_GROUP group; PSID AdminSid = NULL, UsersSid = NULL; PACL Acl = NULL; SECURITY_DESCRIPTOR *SecurityDescriptor = NULL; @@ -1879,7 +1999,7 @@ STARTUPINFOA startup; SECURITY_ATTRIBUTES psa; HANDLE token, event; - DWORD tmp; + DWORD size;
Acl = HeapAlloc(GetProcessHeap(), 0, 256); res = InitializeAcl(Acl, 256, ACL_REVISION); @@ -1900,16 +2020,31 @@ return; }
- res = GetTokenInformation( token, TokenOwner, owner, sizeof(owner), &tmp ); + res = GetTokenInformation( token, TokenOwner, NULL, 0, &size ); + ok(!res, "Expected failure, got %d\n", res); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError()); + + owner = HeapAlloc(GetProcessHeap(), 0, size); + res = GetTokenInformation( token, TokenOwner, owner, size, &size ); ok(res, "GetTokenInformation failed with error %d\n", GetLastError()); AdminSid = ((TOKEN_OWNER*)owner)->Owner; - res = GetTokenInformation( token, TokenPrimaryGroup, group, sizeof(group), &tmp ); + + res = GetTokenInformation( token, TokenPrimaryGroup, NULL, 0, &size ); + ok(!res, "Expected failure, got %d\n", res); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError()); + + group = HeapAlloc(GetProcessHeap(), 0, size); + res = GetTokenInformation( token, TokenPrimaryGroup, group, size, &size ); ok(res, "GetTokenInformation failed with error %d\n", GetLastError()); UsersSid = ((TOKEN_PRIMARY_GROUP*)group)->PrimaryGroup;
CloseHandle( token ); if (!res) { + HeapFree(GetProcessHeap(), 0, group); + HeapFree(GetProcessHeap(), 0, owner); HeapFree(GetProcessHeap(), 0, Acl); return; } @@ -1969,6 +2104,8 @@ CloseHandle( info.hProcess ); CloseHandle( info.hThread ); CloseHandle( event ); + HeapFree(GetProcessHeap(), 0, group); + HeapFree(GetProcessHeap(), 0, owner); HeapFree(GetProcessHeap(), 0, Acl); HeapFree(GetProcessHeap(), 0, SecurityDescriptor); } @@ -2197,7 +2334,7 @@ ExplicitAccess.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID; ExplicitAccess.Trustee.TrusteeType = TRUSTEE_IS_UNKNOWN; - ExplicitAccess.Trustee.ptstrName = (LPWSTR)EveryoneSid; + ExplicitAccess.Trustee.ptstrName = EveryoneSid; res = pSetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl); ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %u\n", res); ok(NewAcl != NULL, "returned acl was NULL\n"); @@ -2245,7 +2382,7 @@
ExplicitAccess.grfAccessMode = REVOKE_ACCESS; ExplicitAccess.Trustee.TrusteeForm = TRUSTEE_IS_SID; - ExplicitAccess.Trustee.ptstrName = (LPWSTR)UsersSid; + ExplicitAccess.Trustee.ptstrName = UsersSid; res = pSetEntriesInAclW(1, &ExplicitAccess, OldAcl, &NewAcl); ok(res == ERROR_SUCCESS, "SetEntriesInAclW failed: %u\n", res); ok(NewAcl != NULL, "returned acl was NULL\n"); @@ -2291,7 +2428,8 @@
ret = GetSecurityDescriptorControl(pSecDesc, &control, &revision); ok(ret, "GetSecurityDescriptorControl failed with error %d\n", GetLastError()); - ok((control & (SE_SELF_RELATIVE|SE_DACL_PRESENT)) == (SE_SELF_RELATIVE|SE_DACL_PRESENT), + ok((control & (SE_SELF_RELATIVE|SE_DACL_PRESENT)) == (SE_SELF_RELATIVE|SE_DACL_PRESENT) || + broken((control & (SE_SELF_RELATIVE|SE_DACL_PRESENT)) == SE_DACL_PRESENT), /* NT4 */ "control (0x%x) doesn't have (SE_SELF_RELATIVE|SE_DACL_PRESENT) flags set\n", control); ok(revision == SECURITY_DESCRIPTOR_REVISION1, "revision was %d instead of 1\n", revision); ret = GetSecurityDescriptorOwner(pSecDesc, &owner, &owner_defaulted); @@ -2300,6 +2438,7 @@ ret = GetSecurityDescriptorGroup(pSecDesc, &group, &group_defaulted); ok(ret, "GetSecurityDescriptorGroup failed with error %d\n", GetLastError()); ok(group != NULL, "group should not be NULL\n"); + LocalFree(pSecDesc); }
static void test_ConvertStringSecurityDescriptor(void) @@ -2447,7 +2586,7 @@ "Expected ERROR_INVALID_ACL or ERROR_INVALID_SID, got %d\n", GetLastError()); }
-static void test_ConvertSecurityDescriptorToString() +static void test_ConvertSecurityDescriptorToString(void) { SECURITY_DESCRIPTOR desc; SECURITY_INFORMATION sec_info = OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION|DACL_SECURITY_INFORMATION|SACL_SECURITY_INFORMATION; @@ -2488,17 +2627,17 @@
size = 4096; pCreateWellKnownSid(WinLocalSid, NULL, sid_buf, &size); - SetSecurityDescriptorOwner(&desc, (PSID)sid_buf, FALSE); + SetSecurityDescriptorOwner(&desc, sid_buf, FALSE); ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n"); CHECK_RESULT_AND_FREE("O:S-1-2-0");
- SetSecurityDescriptorOwner(&desc, (PSID)sid_buf, TRUE); + SetSecurityDescriptorOwner(&desc, sid_buf, TRUE); ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n"); CHECK_RESULT_AND_FREE("O:S-1-2-0");
size = sizeof(sid_buf); pCreateWellKnownSid(WinLocalSystemSid, NULL, sid_buf, &size); - SetSecurityDescriptorOwner(&desc, (PSID)sid_buf, TRUE); + SetSecurityDescriptorOwner(&desc, sid_buf, TRUE); ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n"); CHECK_RESULT_AND_FREE("O:SY");
@@ -2676,6 +2815,7 @@ "(D;OICI;0xffffffff;;;S-1-5-21-93476-23408-4576)" "S:(AU;OICINPIOIDSAFA;CCDCLCSWRPRC;;;SU)(AU;NPSA;0x12019f;;;SU)", SDDL_REVISION_1, &sec, &dwDescSize), "Creating descriptor failed\n"); // FIXME: ConvertStringSecurityDescriptorToSecurityDescriptor fails and 'sec' isn't set +
test_SetSecurityDescriptorControl(sec);
Modified: trunk/rostests/winetests/advapi32/service.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/advapi32/service... ============================================================================== --- trunk/rostests/winetests/advapi32/service.c [iso-8859-1] (original) +++ trunk/rostests/winetests/advapi32/service.c [iso-8859-1] Sun Feb 8 03:32:24 2009 @@ -60,11 +60,7 @@ /* No access rights */ SetLastError(0xdeadbeef); scm_handle = OpenSCManagerA(NULL, NULL, 0); - ok(scm_handle != NULL, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3, Vista */ || - GetLastError() == 0xdeadbeef /* NT4, XP */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError()); CloseServiceHandle(scm_handle);
/* Unknown database name */ @@ -84,31 +80,24 @@ /* Remote unknown host */ SetLastError(0xdeadbeef); scm_handle = OpenSCManagerA("DOESNOTEXIST", SERVICES_ACTIVE_DATABASEA, SC_MANAGER_CONNECT); + todo_wine + { ok(!scm_handle, "Expected failure\n"); - todo_wine ok(GetLastError() == RPC_S_SERVER_UNAVAILABLE || GetLastError() == RPC_S_INVALID_NET_ADDR /* w2k8 */, "Expected RPC_S_SERVER_UNAVAILABLE or RPC_S_INVALID_NET_ADDR, got %d\n", GetLastError()); + } CloseServiceHandle(scm_handle); /* Just in case */
/* Proper call with an empty hostname */ SetLastError(0xdeadbeef); scm_handle = OpenSCManagerA("", SERVICES_ACTIVE_DATABASEA, SC_MANAGER_CONNECT); - ok(scm_handle != NULL, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3, Vista */ || - GetLastError() == ERROR_ENVVAR_NOT_FOUND /* NT4 */ || - GetLastError() == 0xdeadbeef /* XP */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING, ERROR_ENVVAR_NOT_FOUND or 0xdeadbeef, got %d\n", GetLastError()); + ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError()); CloseServiceHandle(scm_handle);
/* Again a correct one */ SetLastError(0xdeadbeef); scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); - ok(scm_handle != NULL, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3, Vista */ || - GetLastError() == 0xdeadbeef /* NT4, XP */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError()); CloseServiceHandle(scm_handle); }
@@ -151,11 +140,7 @@ skip("Not enough rights to get a handle to the service\n"); else { - ok(svc_handle != NULL, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3, Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* XP, NT4 */, - "Expected ERROR_SUCCESS or 0xdeadbeef, got %d\n", GetLastError()); + ok(svc_handle != NULL, "Expected success, got error %u\n", GetLastError()); CloseServiceHandle(svc_handle); }
@@ -386,10 +371,6 @@ svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL); ok(svc_handle1 != NULL, "Could not create the service : %d\n", GetLastError()); - ok(GetLastError() == ERROR_SUCCESS /* W2K3, Vista */ || - GetLastError() == 0xdeadbeef /* NT4, XP */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
/* DeleteService however must have proper rights */ SetLastError(0xdeadbeef); @@ -407,14 +388,9 @@ /* Now that we have the proper rights, we should be able to delete */ SetLastError(0xdeadbeef); ret = DeleteService(svc_handle1); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError());
CloseServiceHandle(svc_handle1); - CloseServiceHandle(scm_handle);
/* Wait a while. One of the following tests also does a CreateService for the @@ -440,6 +416,8 @@ DWORD displaysize, tempsize, tempsizeW; static const CHAR deadbeef[] = "Deadbeef"; static const WCHAR spoolerW[] = {'S','p','o','o','l','e','r',0}; + static const WCHAR deadbeefW[] = {'D','e','a','d','b','e','e','f',0}; + static const WCHAR abcW[] = {'A','B','C',0}; static const CHAR servicename[] = "Winetest"; static const CHAR pathname[] = "we_dont_care.exe";
@@ -476,6 +454,85 @@ ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError());
+ SetLastError(0xdeadbeef); + ret = GetServiceDisplayNameA(scm_handle, deadbeef, NULL, &displaysize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + todo_wine ok(displaysize == 1, "Service size expected 1, got %d\n", displaysize); + + displaysize = 15; + strcpy(displayname, "ABC"); + ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + todo_wine ok(displaysize == 15, "Service size expected 15, got %d\n", displaysize); + ok(displayname[0] == 0, "Service name not empty\n"); + + displaysize = 15; + lstrcpyW( displaynameW, abcW ); + ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(displaysize == 15, "Service size expected 15, got %d\n", displaysize); + ok(displaynameW[0] == 0, "Service name not empty\n"); + + displaysize = 0; + strcpy(displayname, "ABC"); + ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + todo_wine ok(displaysize == 1, "Service size expected 1, got %d\n", displaysize); + ok(displayname[0] == 'A', "Service name changed\n"); + + displaysize = 0; + lstrcpyW( displaynameW, abcW ); + ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize); + ok(!ret, "Expected failure\n"); + ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(displaynameW[0] == 'A', "Service name changed\n"); + + displaysize = 1; + strcpy(displayname, "ABC"); + ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + todo_wine ok(displaysize == 1, "Service size expected 1, got %d\n", displaysize); + ok(displayname[0] == 0, "Service name not empty\n"); + + displaysize = 1; + lstrcpyW( displaynameW, abcW ); + ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize); + ok(!ret, "Expected failure\n"); + ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(displaynameW[0] == 'A', "Service name changed\n"); + + displaysize = 2; + strcpy(displayname, "ABC"); + ret = GetServiceDisplayNameA(scm_handle, deadbeef, displayname, &displaysize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + todo_wine ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize); + ok(displayname[0] == 0, "Service name not empty\n"); + + displaysize = 2; + lstrcpyW( displaynameW, abcW ); + ret = GetServiceDisplayNameW(scm_handle, deadbeefW, displaynameW, &displaysize); + ok(!ret, "Expected failure\n"); + ok(displaysize == 2, "Service size expected 2, got %d\n", displaysize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(displaynameW[0] == 0, "Service name not empty\n"); + /* Check if 'Spooler' exists */ svc_handle = OpenServiceA(scm_handle, spooler, GENERIC_READ); if (!svc_handle) @@ -518,33 +575,21 @@ SetLastError(0xdeadbeef); displaysize = (tempsize / 2) + 1; ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize); - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(displaysize == ((tempsize / 2) + 1), "Expected no change for the needed buffer size\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
/* Now with the original returned size */ SetLastError(0xdeadbeef); displaysize = tempsize; ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize); - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(displaysize == tempsize, "Expected no change for the needed buffer size\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
/* And with a bigger than needed buffer */ SetLastError(0xdeadbeef); displaysize = tempsize * 2; ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError()); /* Test that shows that if the buffersize is enough, it's not changed */ ok(displaysize == tempsize * 2, "Expected no change for the needed buffer size\n"); ok(lstrlen(displayname) == tempsize/2, @@ -581,11 +626,7 @@ SetLastError(0xdeadbeef); displaysize = tempsizeW + 1; /* This caters for the null terminating character */ ret = GetServiceDisplayNameW(scm_handle, spoolerW, displaynameW, &displaysize); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(displaysize == tempsizeW, "Expected the needed buffersize\n"); ok(lstrlenW(displaynameW) == displaysize, "Expected the buffer to be the length of the string\n") ; @@ -639,13 +680,9 @@ /* Get the displayname */ SetLastError(0xdeadbeef); ret = GetServiceDisplayNameA(scm_handle, servicename, displayname, &displaysize); - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(!lstrcmpi(displayname, servicename), "Expected displayname to be %s, got %s\n", servicename, displayname); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
/* Delete the service */ ret = DeleteService(svc_handle); @@ -669,6 +706,7 @@ BOOL ret; static const CHAR deadbeef[] = "Deadbeef"; static const WCHAR deadbeefW[] = {'D','e','a','d','b','e','e','f',0}; + static const WCHAR abcW[] = {'A','B','C',0};
/* Having NULL for the size of the buffer will crash on W2K3 */
@@ -711,29 +749,73 @@ strcpy(servicename, "ABC"); ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize); ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); todo_wine ok(servicesize == 15, "Service size expected 15, got %d\n", servicesize); ok(servicename[0] == 0, "Service name not empty\n");
servicesize = 15; - servicenameW[0] = 'A'; + lstrcpyW( servicenameW, abcW ); ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize); ok(!ret, "Expected failure\n"); - todo_wine ok(servicesize == 15, "Service size expected 15, got %d\n", servicesize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(servicesize == 15, "Service size expected 15, got %d\n", servicesize); ok(servicenameW[0] == 0, "Service name not empty\n");
servicesize = 0; strcpy(servicename, "ABC"); ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize); ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); todo_wine ok(servicesize == 1, "Service size expected 1, got %d\n", servicesize); ok(servicename[0] == 'A', "Service name changed\n");
servicesize = 0; - servicenameW[0] = 'A'; + lstrcpyW( servicenameW, abcW ); ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize); ok(!ret, "Expected failure\n"); + ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(servicenameW[0] == 'A', "Service name changed\n"); + + servicesize = 1; + strcpy(servicename, "ABC"); + ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + todo_wine ok(servicesize == 1, "Service size expected 1, got %d\n", servicesize); + ok(servicename[0] == 0, "Service name not empty\n"); + + servicesize = 1; + lstrcpyW( servicenameW, abcW ); + ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize); + ok(!ret, "Expected failure\n"); + ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(servicenameW[0] == 'A', "Service name changed\n"); + + servicesize = 2; + strcpy(servicename, "ABC"); + ret = GetServiceKeyNameA(scm_handle, deadbeef, servicename, &servicesize); + ok(!ret, "Expected failure\n"); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); todo_wine ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize); - ok(servicenameW[0] == 'A', "Service name changed\n"); + ok(servicename[0] == 0, "Service name not empty\n"); + + servicesize = 2; + lstrcpyW( servicenameW, abcW ); + ret = GetServiceKeyNameW(scm_handle, deadbeefW, servicenameW, &servicesize); + ok(!ret, "Expected failure\n"); + ok(servicesize == 2, "Service size expected 2, got %d\n", servicesize); + ok(GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST, + "Expected ERROR_SERVICE_DOES_NOT_EXIST, got %d\n", GetLastError()); + ok(servicenameW[0] == 0, "Service name not empty\n");
/* Check if 'Spooler' exists */ svc_handle = OpenServiceA(scm_handle, spooler, GENERIC_READ); @@ -762,11 +844,7 @@ tempsize = servicesize; servicesize *= 2; ret = GetServiceKeyNameA(scm_handle, displayname, servicename, &servicesize); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError()); if (ret) { ok(lstrlen(servicename) == tempsize/2, @@ -780,11 +858,7 @@ SetLastError(0xdeadbeef); servicesize *= 2; ret = GetServiceKeyNameW(scm_handle, displaynameW, servicenameW, &servicesize); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError()); if (ret) { ok(lstrlen(servicename) == tempsize/2, @@ -854,11 +928,7 @@
SetLastError(0xdeadbeef); ret = QueryServiceStatus(svc_handle, &status); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP and Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Unexpected last error %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError());
CloseServiceHandle(svc_handle);
@@ -937,11 +1007,7 @@ bufsize = sizeof(SERVICE_STATUS_PROCESS); SetLastError(0xdeadbeef); ret = pQueryServiceStatusEx(svc_handle, 0, (BYTE*)statusproc, bufsize, &needed); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP and Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Unexpected last error %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError()); if (statusproc->dwCurrentState == SERVICE_RUNNING) ok(statusproc->dwProcessId != 0, "Expect a process id for this running service\n"); @@ -959,7 +1025,7 @@ SC_HANDLE scm_handle; BOOL ret; DWORD bufsize, needed, returned, resume; - DWORD tempneeded, tempreturned; + DWORD tempneeded, tempreturned, missing; DWORD servicecountactive, servicecountinactive; ENUM_SERVICE_STATUS *services; ENUM_SERVICE_STATUS_PROCESS *exservices; @@ -1001,7 +1067,8 @@ SetLastError(0xdeadbeef); ret = EnumServicesStatusA(scm_handle, 0, 0, NULL, 0, &needed, NULL, NULL); ok(!ret, "Expected failure\n"); - ok(needed == 0xdeadbeef, "Expected no change to the needed buffer variable\n"); + ok(needed == 0xdeadbeef || broken(needed != 0xdeadbeef), /* nt4 */ + "Expected no change to the needed buffer variable\n"); todo_wine ok(GetLastError() == ERROR_INVALID_ADDRESS || GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */, @@ -1015,7 +1082,8 @@ ok(!ret, "Expected failure\n"); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); @@ -1029,7 +1097,8 @@ ok(!ret, "Expected failure\n"); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); @@ -1044,7 +1113,8 @@ ok(!ret, "Expected failure\n"); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); @@ -1059,7 +1129,8 @@ ok(!ret, "Expected failure\n"); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(returned == 0, "Expected number of services to be set to 0, got %d\n", returned); } ok(GetLastError() == ERROR_ACCESS_DENIED, @@ -1097,13 +1168,9 @@ services, bufsize, &needed, &returned, NULL); todo_wine { - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(needed == 0, "Expected needed buffer to be 0 as we are done\n"); ok(returned != 0xdeadbeef && returned > 0, "Expected some returned services\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP and Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Unexpected last error %d\n", GetLastError()); } HeapFree(GetProcessHeap(), 0, services);
@@ -1111,8 +1178,8 @@ tempreturned = returned;
/* Allocate less than the needed bytes and don't specify a resume handle */ - services = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); - bufsize = tempneeded - 1; + services = HeapAlloc(GetProcessHeap(), 0, tempneeded); + bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUS); needed = 0xdeadbeef; returned = 0xdeadbeef; SetLastError(0xdeadbeef); @@ -1122,15 +1189,13 @@ todo_wine { ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n"); - ok(returned == (tempreturned - 1), "Expected one service less to be returned\n"); + ok(returned < tempreturned, "Expected fewer services to be returned\n"); ok(GetLastError() == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", GetLastError()); } - HeapFree(GetProcessHeap(), 0, services);
/* Allocate less than the needed bytes, this time with a correct resume handle */ - services = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); - bufsize = tempneeded - 1; + bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUS); needed = 0xdeadbeef; returned = 0xdeadbeef; resume = 0; @@ -1141,15 +1206,14 @@ todo_wine { ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size for this one service\n"); - ok(returned == (tempreturned - 1), "Expected one service less to be returned\n"); + ok(returned < tempreturned, "Expected fewer services to be returned\n"); ok(resume, "Expected a resume handle\n"); ok(GetLastError() == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", GetLastError()); } - HeapFree(GetProcessHeap(), 0, services); - - /* Fetch that last service but pass a bigger buffer size */ - services = HeapAlloc(GetProcessHeap(), 0, tempneeded); + + /* Fetch the missing services but pass a bigger buffer size */ + missing = tempreturned - returned; bufsize = tempneeded; needed = 0xdeadbeef; returned = 0xdeadbeef; @@ -1158,13 +1222,9 @@ services, bufsize, &needed, &returned, &resume); todo_wine { - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(needed == 0, "Expected needed buffer to be 0 as we are done\n"); - ok(returned == 1, "Expected only 1 service to be returned\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP and Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Unexpected last error %d\n", GetLastError()); + ok(returned == missing, "Expected %u services to be returned\n", missing); } ok(resume == 0, "Expected the resume handle to be 0\n"); HeapFree(GetProcessHeap(), 0, services); @@ -1249,8 +1309,8 @@
todo_wine { - ok(servicecountactive == 0, "Active services mismatch\n"); - ok(servicecountinactive == 0, "Inactive services mismatch\n"); + ok(servicecountactive == 0, "Active services mismatch %u\n", servicecountactive); + ok(servicecountinactive == 0, "Inactive services mismatch %u\n", servicecountinactive); }
CloseServiceHandle(scm_handle); @@ -1290,7 +1350,8 @@ SetLastError(0xdeadbeef); ret = pEnumServicesStatusExA(scm_handle, 0, 0, 0, NULL, 0, &needed, NULL, NULL, NULL); ok(!ret, "Expected failure\n"); - ok(needed == 0xdeadbeef, "Expected no change to the needed buffer variable\n"); + ok(needed == 0xdeadbeef || broken(needed != 0xdeadbeef), /* nt4 */ + "Expected no change to the needed buffer variable\n"); todo_wine ok(GetLastError() == ERROR_INVALID_ADDRESS || GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */, @@ -1318,7 +1379,8 @@ ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); } @@ -1333,7 +1395,8 @@ ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); } @@ -1348,7 +1411,8 @@ ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); } @@ -1363,7 +1427,8 @@ ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned); todo_wine { - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); } @@ -1376,7 +1441,8 @@ NULL, 0, &needed, &returned, NULL, NULL); ok(!ret, "Expected failure\n"); todo_wine - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned); ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); @@ -1391,7 +1457,8 @@ NULL, 0, &needed, &returned, NULL, "deadbeef_group"); ok(!ret, "Expected failure\n"); todo_wine - ok(needed == 0, "Expected needed buffer size to be set to 0, got %d\n", needed); + ok(needed == 0 || broken(needed != 0), /* nt4 */ + "Expected needed buffer size to be set to 0, got %d\n", needed); ok(returned == 0, "Expected number of service to be set to 0, got %d\n", returned); ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); @@ -1447,13 +1514,9 @@ (BYTE*)exservices, bufsize, &needed, &returned, NULL, NULL); todo_wine { - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(needed == 0, "Expected needed buffer to be 0 as we are done\n"); ok(returned == tempreturned, "Expected the same number of service from this function\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP and Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Unexpected last error %d\n", GetLastError()); } HeapFree(GetProcessHeap(), 0, exservices);
@@ -1461,8 +1524,8 @@ tempreturned = returned;
/* Allocate less than the needed bytes and don't specify a resume handle */ - exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); - bufsize = tempneeded - 1; + exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded); + bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUS); needed = 0xdeadbeef; returned = 0xdeadbeef; SetLastError(0xdeadbeef); @@ -1472,15 +1535,13 @@ todo_wine { ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n"); - ok(returned == (tempreturned - 1), "Expected one service less to be returned\n"); + ok(returned < tempreturned, "Expected fewer services to be returned\n"); ok(GetLastError() == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", GetLastError()); } - HeapFree(GetProcessHeap(), 0, exservices);
/* Allocate less than the needed bytes, this time with a correct resume handle */ - exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); - bufsize = tempneeded - 1; + bufsize = (tempreturned - 1) * sizeof(ENUM_SERVICE_STATUS); needed = 0xdeadbeef; returned = 0xdeadbeef; resume = 0; @@ -1491,15 +1552,14 @@ todo_wine { ok(needed != 0xdeadbeef && needed > 0, "Expected the needed buffer size\n"); - ok(returned == (tempreturned - 1), "Expected one service less to be returned\n"); + ok(returned < tempreturned, "Expected fewer services to be returned\n"); ok(resume, "Expected a resume handle\n"); ok(GetLastError() == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %d\n", GetLastError()); } - HeapFree(GetProcessHeap(), 0, exservices);
/* Fetch that last service but pass a bigger buffer size */ - exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded); + missing = tempreturned - returned; bufsize = tempneeded; needed = 0xdeadbeef; returned = 0xdeadbeef; @@ -1508,14 +1568,10 @@ (BYTE*)exservices, bufsize, &needed, &returned, &resume, NULL); todo_wine { - ok(ret, "Expected success\n"); + ok(ret, "Expected success, got error %u\n", GetLastError()); ok(needed == 0, "Expected needed buffer to be 0 as we are done\n"); - ok(returned == 1, "Expected only 1 service to be returned\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP and Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Unexpected last error %d\n", GetLastError()); - } + } + ok(returned == missing, "Expected %u services to be returned\n", missing); ok(resume == 0, "Expected the resume handle to be 0\n"); HeapFree(GetProcessHeap(), 0, exservices);
@@ -1594,7 +1650,8 @@ else { /* We shouldn't have a process id for inactive services */ - ok(status.dwProcessId == 0, "This service shouldn't have an associated process id\n"); + ok(status.dwProcessId == 0, "Service %s state %u shouldn't have an associated process id\n", + exservices[i].lpServiceName, status.dwCurrentState);
servicecountinactive--; } @@ -1602,8 +1659,8 @@ } HeapFree(GetProcessHeap(), 0, exservices);
- ok(servicecountactive == 0, "Active services mismatch\n"); - ok(servicecountinactive == 0, "Inactive services mismatch\n"); + ok(servicecountactive == 0, "Active services mismatch %u\n", servicecountactive); + ok(servicecountinactive == 0, "Inactive services mismatch %u\n", servicecountinactive);
CloseServiceHandle(scm_handle); } @@ -1625,11 +1682,7 @@ handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); SetLastError(0xdeadbeef); ret = CloseServiceHandle(handle); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_IO_PENDING /* W2K */ || - GetLastError() == ERROR_SUCCESS /* W2K3 */ || - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success got error %u\n", GetLastError()); }
static void test_sequence(void) @@ -1708,11 +1761,7 @@ given = needed; SetLastError(0xdeadbeef); ret = QueryServiceConfigA(svc_handle, config, given, &needed); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */|| - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); + ok(ret, "Expected success, got error %u\n", GetLastError()); todo_wine { ok(given == needed, "Expected the given (%d) and needed (%d) buffersizes to be equal\n", given, needed); @@ -1754,12 +1803,7 @@
SetLastError(0xdeadbeef); ret = DeleteService(svc_handle); - ok(ret, "Expected success\n"); - ok(GetLastError() == ERROR_SUCCESS /* W2K3 */|| - GetLastError() == 0xdeadbeef /* NT4, XP, Vista */ || - GetLastError() == ERROR_IO_PENDING /* W2K */, - "Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError()); - + ok(ret, "Expected success, got error %u\n", GetLastError()); CloseServiceHandle(svc_handle);
/* Wait a while. The following test does a CreateService again */ @@ -1973,15 +2017,15 @@ svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL); - ok(svc_handle1 != NULL, "Expected success\n"); + ok(svc_handle1 != NULL, "Expected success, got error %u\n", GetLastError());
/* Get a handle to this new service */ svc_handle2 = OpenServiceA(scm_handle, servicename, GENERIC_READ); - ok(svc_handle2 != NULL, "Expected success\n"); + ok(svc_handle2 != NULL, "Expected success, got error %u\n", GetLastError());
/* Get another handle to this new service */ svc_handle3 = OpenServiceA(scm_handle, servicename, GENERIC_READ); - ok(svc_handle3 != NULL, "Expected success\n"); + ok(svc_handle3 != NULL, "Expected success, got error %u\n", GetLastError());
/* Check if we can close the handle to the Service Control Manager */ ret = CloseServiceHandle(scm_handle); @@ -1989,11 +2033,11 @@
/* Get a new handle to the Service Control Manager */ scm_handle = OpenSCManagerA(NULL, NULL, GENERIC_ALL); - ok(scm_handle != NULL, "Expected success\n"); + ok(scm_handle != NULL, "Expected success, got error %u\n", GetLastError());
/* Get a handle to this new service */ svc_handle4 = OpenServiceA(scm_handle, servicename, GENERIC_ALL); - ok(svc_handle4 != NULL, "Expected success\n"); + ok(svc_handle4 != NULL, "Expected success, got error %u\n", GetLastError());
/* Delete the service */ ret = DeleteService(svc_handle4); @@ -2040,7 +2084,7 @@ svc_handle5 = CreateServiceA(scm_handle, servicename, NULL, GENERIC_ALL, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_DISABLED, 0, pathname, NULL, NULL, NULL, NULL, NULL); - ok(svc_handle5 != NULL, "Expected success\n"); + ok(svc_handle5 != NULL, "Expected success, got error %u\n", GetLastError());
/* Delete the service */ ret = DeleteService(svc_handle5);