[ros-diffs] [dchapyshev] 39481: - Sync advapi32_winetest with Wine head
dchapyshev at svn.reactos.org
dchapyshev at svn.reactos.org
Sun Feb 8 10:32:25 CET 2009
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?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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_lmhash.c?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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_md4.c?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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_md5.c?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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/registry.c?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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/security.c?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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.c?rev=39481&r1=39480&r2=39481&view=diff
==============================================================================
--- 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);
More information about the Ros-diffs
mailing list