2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Tests for Lock/UnlockServiceDatabase and QueryServiceLockStatusA/W
5 * PROGRAMMER: Hermès BÉLUSCA - MAÏTO
10 #define TESTING_SERVICE L"Spooler"
12 static void Test_LockUnlockServiceDatabase(void)
16 SC_HANDLE hScm
= NULL
;
19 /* First of all, try to lock / unlock the services database with invalid handles */
20 SetLastError(0xdeadbeef);
22 hLock
= LockServiceDatabase(hScm
);
23 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
24 ok_err(ERROR_INVALID_HANDLE
);
26 SetLastError(0xdeadbeef);
27 hScm
= (SC_HANDLE
)0xdeadbeef;
28 hLock
= LockServiceDatabase(hScm
);
29 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
30 ok_err(ERROR_INVALID_HANDLE
);
32 /** This test seems to make this application crash on Windows 7... I do not know why... **/
33 SetLastError(0xdeadbeef);
35 bError
= UnlockServiceDatabase(hLock
);
36 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
37 ok_err(ERROR_INVALID_SERVICE_LOCK
);
38 /*****************************************************************************************/
40 SetLastError(0xdeadbeef);
41 hLock
= (SC_LOCK
)0xdeadbeef;
42 bError
= UnlockServiceDatabase(hLock
);
43 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
44 ok_err(ERROR_INVALID_SERVICE_LOCK
);
47 /* Then, try to lock the services database without having rights */
48 SetLastError(0xdeadbeef);
49 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
50 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
53 skip("No service control manager; cannot proceed with LockUnlockServiceDatabase test\n");
56 ok_err(ERROR_SUCCESS
);
58 SetLastError(0xdeadbeef);
59 hLock
= LockServiceDatabase(hScm
);
60 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
61 ok_err(ERROR_ACCESS_DENIED
);
64 UnlockServiceDatabase(hLock
);
65 CloseServiceHandle(hScm
);
67 /* Try to lock the services database with good rights */
68 SetLastError(0xdeadbeef);
69 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
);
70 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
73 skip("No service control manager; cannot proceed with LockUnlockServiceDatabase test\n");
76 ok_err(ERROR_SUCCESS
);
78 SetLastError(0xdeadbeef);
79 hLock
= LockServiceDatabase(hScm
);
80 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
81 ok_err(ERROR_SUCCESS
);
86 SetLastError(0xdeadbeef);
87 bError
= UnlockServiceDatabase(hLock
);
88 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
89 ok_err(ERROR_SUCCESS
);
95 CloseServiceHandle(hScm
);
100 static void Test_LockUnlockServiceDatabaseWithServiceStart(void)
104 SC_HANDLE hScm
= NULL
;
105 SC_HANDLE hSvc
= NULL
;
106 SC_LOCK hLock
= NULL
;
108 LPQUERY_SERVICE_CONFIGW lpConfig
= NULL
;
109 DWORD dwRequiredSize
= 0;
110 SERVICE_STATUS status
;
111 BOOL bWasRunning
= FALSE
;
112 DWORD dwOldStartType
= 0;
114 /* Open the services database */
115 SetLastError(0xdeadbeef);
116 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
);
117 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
120 skip("No service control manager; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n");
123 ok_err(ERROR_SUCCESS
);
125 /* Grab a handle to the testing service */
126 SetLastError(0xdeadbeef);
127 hSvc
= OpenServiceW(hScm
, TESTING_SERVICE
, SERVICE_START
| SERVICE_STOP
| SERVICE_CHANGE_CONFIG
| SERVICE_QUERY_CONFIG
| SERVICE_QUERY_STATUS
);
128 ok(hSvc
!= NULL
, "hSvc = 0x%p, expected non-null, error=0x%08lx\n", hSvc
, GetLastError());
131 skip("Cannot open a handle to service %S; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n", TESTING_SERVICE
);
134 ok_err(ERROR_SUCCESS
);
136 /* Lock the services database */
137 SetLastError(0xdeadbeef);
138 hLock
= LockServiceDatabase(hScm
);
139 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero, error=0x%08lx\n", hLock
, GetLastError());
142 skip("Cannot lock the services database; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n");
145 ok_err(ERROR_SUCCESS
);
147 /* To proceed further, firstly attempt to stop the testing service */
148 QueryServiceConfigW(hSvc
, NULL
, 0, &dwRequiredSize
);
149 lpConfig
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
150 QueryServiceConfigW(hSvc
, lpConfig
, dwRequiredSize
, &dwRequiredSize
);
151 dwOldStartType
= lpConfig
->dwStartType
;
152 HeapFree(GetProcessHeap(), 0, lpConfig
);
153 if (dwOldStartType
== SERVICE_DISABLED
)
155 ChangeServiceConfigW(hSvc
,
157 SERVICE_DEMAND_START
,
167 QueryServiceStatus(hSvc
, &status
);
168 bWasRunning
= (status
.dwCurrentState
!= SERVICE_STOPPED
);
171 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
172 Sleep(1000); /* Wait 1 second for the service to stop */
175 /* Now try to start it (this test won't work under Windows Vista / 7 / 8) */
176 SetLastError(0xdeadbeef);
177 bError
= StartServiceW(hSvc
, 0, NULL
);
178 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
179 ok_err(ERROR_SERVICE_DATABASE_LOCKED
);
180 Sleep(1000); /* Wait 1 second for the service to start */
182 /* Stop the testing service */
183 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
184 Sleep(1000); /* Wait 1 second for the service to stop */
186 /* Now unlock the services database */
187 SetLastError(0xdeadbeef);
188 bError
= UnlockServiceDatabase(hLock
);
189 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
190 ok_err(ERROR_SUCCESS
);
192 /* Try to start again the service, this time the database unlocked */
193 SetLastError(0xdeadbeef);
194 bError
= StartServiceW(hSvc
, 0, NULL
);
195 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
196 ok_err(ERROR_SUCCESS
);
197 Sleep(1000); /* Wait 1 second for the service to start */
199 /* Stop the testing service */
200 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
201 Sleep(1000); /* Wait 1 second for the service to stop */
203 /* Restore its original state */
206 StartServiceW(hSvc
, 0, NULL
);
209 if (dwOldStartType
== SERVICE_DISABLED
)
211 ChangeServiceConfigW(hSvc
,
227 CloseServiceHandle(hSvc
);
230 CloseServiceHandle(hScm
);
235 static void Test_QueryLockStatusW(void)
239 SC_HANDLE hScm
= NULL
;
240 SC_LOCK hLock
= NULL
;
241 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
= NULL
;
242 DWORD dwRequiredSize
= 0;
244 /* Firstly try to get lock status with invalid handles */
245 SetLastError(0xdeadbeef);
246 bError
= QueryServiceLockStatusW(hScm
,
250 ok(bError
== FALSE
&& GetLastError() == ERROR_INVALID_HANDLE
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INVALID_HANDLE
);
251 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
253 /* Open the services database without having rights */
254 SetLastError(0xdeadbeef);
255 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
256 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
259 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
262 ok_err(ERROR_SUCCESS
);
264 /* Try to get lock status */
265 SetLastError(0xdeadbeef);
266 bError
= QueryServiceLockStatusW(hScm
,
270 ok(bError
== FALSE
&& GetLastError() == ERROR_ACCESS_DENIED
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_ACCESS_DENIED
);
271 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
273 CloseServiceHandle(hScm
);
277 * Query only the lock status.
280 SetLastError(0xdeadbeef);
281 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_QUERY_LOCK_STATUS
);
282 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
285 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
288 ok_err(ERROR_SUCCESS
);
290 /* Get the needed size */
291 SetLastError(0xdeadbeef);
292 bError
= QueryServiceLockStatusW(hScm
,
296 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
297 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
298 if (dwRequiredSize
== 0)
300 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
304 /* Allocate memory */
305 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
306 if (lpLockStatus
== NULL
)
308 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
312 /* Get the actual value */
313 SetLastError(0xdeadbeef);
314 bError
= QueryServiceLockStatusW(hScm
,
318 ok(bError
, "bError = %u, expected TRUE\n", bError
);
320 /* These conditions must be verified iff the services database wasn't previously locked */
321 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
322 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
323 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
324 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
326 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
328 CloseServiceHandle(hScm
);
332 * Now, try to lock the database and check its lock status.
335 SetLastError(0xdeadbeef);
336 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
);
337 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
340 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
343 ok_err(ERROR_SUCCESS
);
345 /* Get the needed size */
346 SetLastError(0xdeadbeef);
347 bError
= QueryServiceLockStatusW(hScm
,
351 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
352 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
353 if (dwRequiredSize
== 0)
355 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
359 /* Allocate memory */
360 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
361 if (lpLockStatus
== NULL
)
363 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
367 /* Get the actual value */
368 SetLastError(0xdeadbeef);
369 bError
= QueryServiceLockStatusW(hScm
,
373 ok(bError
, "bError = %u, expected TRUE\n", bError
);
375 /* These conditions must be verified iff the services database wasn't previously locked */
376 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
377 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
378 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
379 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
381 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
385 * Try again, this time with the database locked.
388 SetLastError(0xdeadbeef);
389 hLock
= LockServiceDatabase(hScm
);
390 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
391 ok_err(ERROR_SUCCESS
);
393 Sleep(1000); /* Wait 1 second to let lpLockStatus->dwLockDuration increment */
395 /* Get the needed size */
396 SetLastError(0xdeadbeef);
397 bError
= QueryServiceLockStatusW(hScm
,
401 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
402 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
403 if (dwRequiredSize
== 0)
405 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
409 /* Allocate memory */
410 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
411 if (lpLockStatus
== NULL
)
413 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
417 /* Get the actual value */
418 SetLastError(0xdeadbeef);
419 bError
= QueryServiceLockStatusW(hScm
,
423 ok(bError
, "bError = %u, expected TRUE\n", bError
);
425 /* These conditions must be verified iff the services database is locked */
426 ok(lpLockStatus
->fIsLocked
!= 0, "lpLockStatus->fIsLocked = %lu, expected non-zero\n", lpLockStatus
->fIsLocked
);
427 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
428 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
!= 0, "*lpLockStatus->lpLockOwner = \"\\0\", expected non-zero\n");
429 ok(lpLockStatus
->dwLockDuration
!= 0, "lpLockStatus->dwLockDuration = %lu, expected non-zero\n", lpLockStatus
->dwLockDuration
);
431 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
435 * Last try, with the database again unlocked.
438 SetLastError(0xdeadbeef);
439 bError
= UnlockServiceDatabase(hLock
);
440 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
441 ok_err(ERROR_SUCCESS
);
444 /* Get the needed size */
445 SetLastError(0xdeadbeef);
446 bError
= QueryServiceLockStatusW(hScm
,
450 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
451 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
452 if (dwRequiredSize
== 0)
454 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
458 /* Allocate memory */
459 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
460 if (lpLockStatus
== NULL
)
462 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
466 /* Get the actual value */
467 SetLastError(0xdeadbeef);
468 bError
= QueryServiceLockStatusW(hScm
,
472 ok(bError
, "bError = %u, expected TRUE\n", bError
);
474 /* These conditions must be verified iff the services database is unlocked */
475 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
476 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
477 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
478 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
480 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
485 UnlockServiceDatabase(hLock
);
488 CloseServiceHandle(hScm
);
493 static void Test_QueryLockStatusA(void)
497 SC_HANDLE hScm
= NULL
;
498 SC_LOCK hLock
= NULL
;
499 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
= NULL
;
500 DWORD dwRequiredSize
= 0;
502 /* Firstly try to get lock status with invalid handles */
503 SetLastError(0xdeadbeef);
504 bError
= QueryServiceLockStatusA(hScm
,
508 ok(bError
== FALSE
&& GetLastError() == ERROR_INVALID_HANDLE
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INVALID_HANDLE
);
509 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
511 /* Open the services database without having rights */
512 SetLastError(0xdeadbeef);
513 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_CONNECT
);
514 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
517 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
520 ok_err(ERROR_SUCCESS
);
522 /* Try to get lock status */
523 SetLastError(0xdeadbeef);
524 bError
= QueryServiceLockStatusA(hScm
,
528 ok(bError
== FALSE
&& GetLastError() == ERROR_ACCESS_DENIED
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_ACCESS_DENIED
);
529 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
531 CloseServiceHandle(hScm
);
535 * Query only the lock status.
538 SetLastError(0xdeadbeef);
539 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_QUERY_LOCK_STATUS
);
540 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
543 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
546 ok_err(ERROR_SUCCESS
);
548 /* Get the needed size */
549 SetLastError(0xdeadbeef);
550 bError
= QueryServiceLockStatusA(hScm
,
554 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
555 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
556 if (dwRequiredSize
== 0)
558 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
562 /* Allocate memory */
563 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
564 if (lpLockStatus
== NULL
)
566 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
570 /* Get the actual value */
571 SetLastError(0xdeadbeef);
572 bError
= QueryServiceLockStatusA(hScm
,
576 ok(bError
, "bError = %u, expected TRUE\n", bError
);
578 /* These conditions must be verified iff the services database wasn't previously locked */
579 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
580 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
581 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
582 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
584 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
586 CloseServiceHandle(hScm
);
590 * Now, try to lock the database and check its lock status.
593 SetLastError(0xdeadbeef);
594 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
);
595 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
598 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
601 ok_err(ERROR_SUCCESS
);
603 /* Get the needed size */
604 SetLastError(0xdeadbeef);
605 bError
= QueryServiceLockStatusA(hScm
,
609 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
610 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
611 if (dwRequiredSize
== 0)
613 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
617 /* Allocate memory */
618 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
619 if (lpLockStatus
== NULL
)
621 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
625 /* Get the actual value */
626 SetLastError(0xdeadbeef);
627 bError
= QueryServiceLockStatusA(hScm
,
631 ok(bError
, "bError = %u, expected TRUE\n", bError
);
633 /* These conditions must be verified iff the services database wasn't previously locked */
634 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
635 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
636 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
637 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
639 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
643 * Try again, this time with the database locked.
646 SetLastError(0xdeadbeef);
647 hLock
= LockServiceDatabase(hScm
);
648 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
649 ok_err(ERROR_SUCCESS
);
651 Sleep(1000); /* Wait 1 second to let lpLockStatus->dwLockDuration increment */
653 /* Get the needed size */
654 SetLastError(0xdeadbeef);
655 bError
= QueryServiceLockStatusA(hScm
,
659 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
660 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
661 if (dwRequiredSize
== 0)
663 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
667 /* Allocate memory */
668 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
669 if (lpLockStatus
== NULL
)
671 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
675 /* Get the actual value */
676 SetLastError(0xdeadbeef);
677 bError
= QueryServiceLockStatusA(hScm
,
681 ok(bError
, "bError = %u, expected TRUE\n", bError
);
683 /* These conditions must be verified iff the services database is locked */
684 ok(lpLockStatus
->fIsLocked
!= 0, "lpLockStatus->fIsLocked = %lu, expected non-zero\n", lpLockStatus
->fIsLocked
);
685 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
686 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
!= 0, "*lpLockStatus->lpLockOwner = \"\\0\", expected non-zero\n");
687 ok(lpLockStatus
->dwLockDuration
!= 0, "lpLockStatus->dwLockDuration = %lu, expected non-zero\n", lpLockStatus
->dwLockDuration
);
689 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
693 * Last try, with the database again unlocked.
696 SetLastError(0xdeadbeef);
697 bError
= UnlockServiceDatabase(hLock
);
698 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
699 ok_err(ERROR_SUCCESS
);
702 /* Get the needed size */
703 SetLastError(0xdeadbeef);
704 bError
= QueryServiceLockStatusA(hScm
,
708 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
709 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
710 if (dwRequiredSize
== 0)
712 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
716 /* Allocate memory */
717 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
718 if (lpLockStatus
== NULL
)
720 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
724 /* Get the actual value */
725 SetLastError(0xdeadbeef);
726 bError
= QueryServiceLockStatusA(hScm
,
730 ok(bError
, "bError = %u, expected TRUE\n", bError
);
732 /* These conditions must be verified iff the services database is unlocked */
733 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
734 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
735 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
736 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
738 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
743 UnlockServiceDatabase(hLock
);
746 CloseServiceHandle(hScm
);
752 START_TEST(LockServiceDatabase
)
754 Test_LockUnlockServiceDatabase();
755 Test_LockUnlockServiceDatabaseWithServiceStart();
756 Test_QueryLockStatusW();
757 Test_QueryLockStatusA();