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
13 #define TESTING_SERVICE L"Spooler"
15 static void Test_LockUnlockServiceDatabase(void)
19 SC_HANDLE hScm
= NULL
;
22 /* First of all, try to lock / unlock the services database with invalid handles */
23 SetLastError(0xdeadbeef);
25 hLock
= LockServiceDatabase(hScm
);
26 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
27 ok_err(ERROR_INVALID_HANDLE
);
29 SetLastError(0xdeadbeef);
30 hScm
= (SC_HANDLE
)0xdeadbeef;
31 hLock
= LockServiceDatabase(hScm
);
32 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
33 ok_err(ERROR_INVALID_HANDLE
);
35 /** This test seems to make this application crash on Windows 7... I do not know why... **/
36 SetLastError(0xdeadbeef);
38 bError
= UnlockServiceDatabase(hLock
);
39 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
40 ok_err(ERROR_INVALID_SERVICE_LOCK
);
41 /*****************************************************************************************/
43 SetLastError(0xdeadbeef);
44 hLock
= (SC_LOCK
)0xdeadbeef;
45 bError
= UnlockServiceDatabase(hLock
);
46 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
47 ok_err(ERROR_INVALID_SERVICE_LOCK
);
50 /* Then, try to lock the services database without having rights */
51 SetLastError(0xdeadbeef);
52 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
53 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
56 skip("No service control manager; cannot proceed with LockUnlockServiceDatabase test\n");
59 ok_err(ERROR_SUCCESS
);
61 SetLastError(0xdeadbeef);
62 hLock
= LockServiceDatabase(hScm
);
63 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
64 ok_err(ERROR_ACCESS_DENIED
);
67 UnlockServiceDatabase(hLock
);
68 CloseServiceHandle(hScm
);
70 /* Try to lock the services database with good rights */
71 SetLastError(0xdeadbeef);
72 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
);
73 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
76 skip("No service control manager; cannot proceed with LockUnlockServiceDatabase test\n");
79 ok_err(ERROR_SUCCESS
);
81 SetLastError(0xdeadbeef);
82 hLock
= LockServiceDatabase(hScm
);
83 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
84 ok_err(ERROR_SUCCESS
);
89 SetLastError(0xdeadbeef);
90 bError
= UnlockServiceDatabase(hLock
);
91 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
92 ok_err(ERROR_SUCCESS
);
98 CloseServiceHandle(hScm
);
103 static void Test_LockUnlockServiceDatabaseWithServiceStart(void)
107 SC_HANDLE hScm
= NULL
;
108 SC_HANDLE hSvc
= NULL
;
109 SC_LOCK hLock
= NULL
;
111 LPQUERY_SERVICE_CONFIGW lpConfig
= NULL
;
112 DWORD dwRequiredSize
= 0;
113 SERVICE_STATUS status
;
114 BOOL bWasRunning
= FALSE
;
115 DWORD dwOldStartType
= 0;
117 /* Open the services database */
118 SetLastError(0xdeadbeef);
119 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
);
120 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
123 skip("No service control manager; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n");
126 ok_err(ERROR_SUCCESS
);
128 /* Grab a handle to the testing service */
129 SetLastError(0xdeadbeef);
130 hSvc
= OpenServiceW(hScm
, TESTING_SERVICE
, SERVICE_START
| SERVICE_STOP
| SERVICE_CHANGE_CONFIG
| SERVICE_QUERY_CONFIG
| SERVICE_QUERY_STATUS
);
131 ok(hSvc
!= NULL
, "hSvc = 0x%p, expected non-null, error=0x%08lx\n", hSvc
, GetLastError());
134 skip("Cannot open a handle to service %S; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n", TESTING_SERVICE
);
137 ok_err(ERROR_SUCCESS
);
139 /* Lock the services database */
140 SetLastError(0xdeadbeef);
141 hLock
= LockServiceDatabase(hScm
);
142 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero, error=0x%08lx\n", hLock
, GetLastError());
145 skip("Cannot lock the services database; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n");
148 ok_err(ERROR_SUCCESS
);
150 /* To proceed further, firstly attempt to stop the testing service */
151 QueryServiceConfigW(hSvc
, NULL
, 0, &dwRequiredSize
);
152 lpConfig
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
153 QueryServiceConfigW(hSvc
, lpConfig
, dwRequiredSize
, &dwRequiredSize
);
154 dwOldStartType
= lpConfig
->dwStartType
;
155 HeapFree(GetProcessHeap(), 0, lpConfig
);
156 if (dwOldStartType
== SERVICE_DISABLED
)
158 ChangeServiceConfigW(hSvc
,
160 SERVICE_DEMAND_START
,
170 QueryServiceStatus(hSvc
, &status
);
171 bWasRunning
= (status
.dwCurrentState
!= SERVICE_STOPPED
);
174 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
175 Sleep(1000); /* Wait 1 second for the service to stop */
178 /* Now try to start it (this test won't work under Windows Vista / 7 / 8) */
179 SetLastError(0xdeadbeef);
180 bError
= StartServiceW(hSvc
, 0, NULL
);
181 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
182 ok_err(ERROR_SERVICE_DATABASE_LOCKED
);
183 Sleep(1000); /* Wait 1 second for the service to start */
185 /* Stop the testing service */
186 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
187 Sleep(1000); /* Wait 1 second for the service to stop */
189 /* Now unlock the services database */
190 SetLastError(0xdeadbeef);
191 bError
= UnlockServiceDatabase(hLock
);
192 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
193 ok_err(ERROR_SUCCESS
);
195 /* Try to start again the service, this time the database unlocked */
196 SetLastError(0xdeadbeef);
197 bError
= StartServiceW(hSvc
, 0, NULL
);
198 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
199 ok_err(ERROR_SUCCESS
);
200 Sleep(1000); /* Wait 1 second for the service to start */
202 /* Stop the testing service */
203 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
204 Sleep(1000); /* Wait 1 second for the service to stop */
206 /* Restore its original state */
209 StartServiceW(hSvc
, 0, NULL
);
212 if (dwOldStartType
== SERVICE_DISABLED
)
214 ChangeServiceConfigW(hSvc
,
230 CloseServiceHandle(hSvc
);
233 CloseServiceHandle(hScm
);
238 static void Test_QueryLockStatusW(void)
242 SC_HANDLE hScm
= NULL
;
243 SC_LOCK hLock
= NULL
;
244 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
= NULL
;
245 DWORD dwRequiredSize
= 0;
247 /* Firstly try to get lock status with invalid handles */
248 SetLastError(0xdeadbeef);
249 bError
= QueryServiceLockStatusW(hScm
,
253 ok(bError
== FALSE
&& GetLastError() == ERROR_INVALID_HANDLE
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INVALID_HANDLE
);
254 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
256 /* Open the services database without having rights */
257 SetLastError(0xdeadbeef);
258 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
259 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
262 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
265 ok_err(ERROR_SUCCESS
);
267 /* Try to get lock status */
268 SetLastError(0xdeadbeef);
269 bError
= QueryServiceLockStatusW(hScm
,
273 ok(bError
== FALSE
&& GetLastError() == ERROR_ACCESS_DENIED
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_ACCESS_DENIED
);
274 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
276 CloseServiceHandle(hScm
);
280 * Query only the lock status.
283 SetLastError(0xdeadbeef);
284 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_QUERY_LOCK_STATUS
);
285 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
288 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
291 ok_err(ERROR_SUCCESS
);
293 /* Get the needed size */
294 SetLastError(0xdeadbeef);
295 bError
= QueryServiceLockStatusW(hScm
,
299 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
300 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
301 if (dwRequiredSize
== 0)
303 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
307 /* Allocate memory */
308 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
309 if (lpLockStatus
== NULL
)
311 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
315 /* Get the actual value */
316 SetLastError(0xdeadbeef);
317 bError
= QueryServiceLockStatusW(hScm
,
321 ok(bError
, "bError = %u, expected TRUE\n", bError
);
323 /* These conditions must be verified iff the services database wasn't previously locked */
324 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
325 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
326 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
327 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
329 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
331 CloseServiceHandle(hScm
);
335 * Now, try to lock the database and check its lock status.
338 SetLastError(0xdeadbeef);
339 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
);
340 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
343 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
346 ok_err(ERROR_SUCCESS
);
348 /* Get the needed size */
349 SetLastError(0xdeadbeef);
350 bError
= QueryServiceLockStatusW(hScm
,
354 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
355 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
356 if (dwRequiredSize
== 0)
358 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
362 /* Allocate memory */
363 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
364 if (lpLockStatus
== NULL
)
366 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
370 /* Get the actual value */
371 SetLastError(0xdeadbeef);
372 bError
= QueryServiceLockStatusW(hScm
,
376 ok(bError
, "bError = %u, expected TRUE\n", bError
);
378 /* These conditions must be verified iff the services database wasn't previously locked */
379 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
380 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
381 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
382 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
384 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
388 * Try again, this time with the database locked.
391 SetLastError(0xdeadbeef);
392 hLock
= LockServiceDatabase(hScm
);
393 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
394 ok_err(ERROR_SUCCESS
);
396 Sleep(1000); /* Wait 1 second to let lpLockStatus->dwLockDuration increment */
398 /* Get the needed size */
399 SetLastError(0xdeadbeef);
400 bError
= QueryServiceLockStatusW(hScm
,
404 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
405 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
406 if (dwRequiredSize
== 0)
408 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
412 /* Allocate memory */
413 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
414 if (lpLockStatus
== NULL
)
416 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
420 /* Get the actual value */
421 SetLastError(0xdeadbeef);
422 bError
= QueryServiceLockStatusW(hScm
,
426 ok(bError
, "bError = %u, expected TRUE\n", bError
);
428 /* These conditions must be verified iff the services database is locked */
429 ok(lpLockStatus
->fIsLocked
!= 0, "lpLockStatus->fIsLocked = %lu, expected non-zero\n", lpLockStatus
->fIsLocked
);
430 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
431 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
!= 0, "*lpLockStatus->lpLockOwner = \"\\0\", expected non-zero\n");
432 ok(lpLockStatus
->dwLockDuration
!= 0, "lpLockStatus->dwLockDuration = %lu, expected non-zero\n", lpLockStatus
->dwLockDuration
);
434 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
438 * Last try, with the database again unlocked.
441 SetLastError(0xdeadbeef);
442 bError
= UnlockServiceDatabase(hLock
);
443 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
444 ok_err(ERROR_SUCCESS
);
447 /* Get the needed size */
448 SetLastError(0xdeadbeef);
449 bError
= QueryServiceLockStatusW(hScm
,
453 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
454 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
455 if (dwRequiredSize
== 0)
457 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
461 /* Allocate memory */
462 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
463 if (lpLockStatus
== NULL
)
465 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
469 /* Get the actual value */
470 SetLastError(0xdeadbeef);
471 bError
= QueryServiceLockStatusW(hScm
,
475 ok(bError
, "bError = %u, expected TRUE\n", bError
);
477 /* These conditions must be verified iff the services database is unlocked */
478 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
479 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
480 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
481 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
483 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
488 UnlockServiceDatabase(hLock
);
491 CloseServiceHandle(hScm
);
496 static void Test_QueryLockStatusA(void)
500 SC_HANDLE hScm
= NULL
;
501 SC_LOCK hLock
= NULL
;
502 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
= NULL
;
503 DWORD dwRequiredSize
= 0;
505 /* Firstly try to get lock status with invalid handles */
506 SetLastError(0xdeadbeef);
507 bError
= QueryServiceLockStatusA(hScm
,
511 ok(bError
== FALSE
&& GetLastError() == ERROR_INVALID_HANDLE
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INVALID_HANDLE
);
512 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
514 /* Open the services database without having rights */
515 SetLastError(0xdeadbeef);
516 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_CONNECT
);
517 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
520 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
523 ok_err(ERROR_SUCCESS
);
525 /* Try to get lock status */
526 SetLastError(0xdeadbeef);
527 bError
= QueryServiceLockStatusA(hScm
,
531 ok(bError
== FALSE
&& GetLastError() == ERROR_ACCESS_DENIED
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_ACCESS_DENIED
);
532 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
534 CloseServiceHandle(hScm
);
538 * Query only the lock status.
541 SetLastError(0xdeadbeef);
542 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_QUERY_LOCK_STATUS
);
543 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
546 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
549 ok_err(ERROR_SUCCESS
);
551 /* Get the needed size */
552 SetLastError(0xdeadbeef);
553 bError
= QueryServiceLockStatusA(hScm
,
557 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
558 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
559 if (dwRequiredSize
== 0)
561 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
565 /* Allocate memory */
566 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
567 if (lpLockStatus
== NULL
)
569 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
573 /* Get the actual value */
574 SetLastError(0xdeadbeef);
575 bError
= QueryServiceLockStatusA(hScm
,
579 ok(bError
, "bError = %u, expected TRUE\n", bError
);
581 /* These conditions must be verified iff the services database wasn't previously locked */
582 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
583 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
584 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
585 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
587 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
589 CloseServiceHandle(hScm
);
593 * Now, try to lock the database and check its lock status.
596 SetLastError(0xdeadbeef);
597 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
);
598 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
601 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
604 ok_err(ERROR_SUCCESS
);
606 /* Get the needed size */
607 SetLastError(0xdeadbeef);
608 bError
= QueryServiceLockStatusA(hScm
,
612 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
613 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
614 if (dwRequiredSize
== 0)
616 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
620 /* Allocate memory */
621 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
622 if (lpLockStatus
== NULL
)
624 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
628 /* Get the actual value */
629 SetLastError(0xdeadbeef);
630 bError
= QueryServiceLockStatusA(hScm
,
634 ok(bError
, "bError = %u, expected TRUE\n", bError
);
636 /* These conditions must be verified iff the services database wasn't previously locked */
637 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
638 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
639 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
640 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
642 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
646 * Try again, this time with the database locked.
649 SetLastError(0xdeadbeef);
650 hLock
= LockServiceDatabase(hScm
);
651 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
652 ok_err(ERROR_SUCCESS
);
654 Sleep(1000); /* Wait 1 second to let lpLockStatus->dwLockDuration increment */
656 /* Get the needed size */
657 SetLastError(0xdeadbeef);
658 bError
= QueryServiceLockStatusA(hScm
,
662 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
663 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
664 if (dwRequiredSize
== 0)
666 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
670 /* Allocate memory */
671 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
672 if (lpLockStatus
== NULL
)
674 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
678 /* Get the actual value */
679 SetLastError(0xdeadbeef);
680 bError
= QueryServiceLockStatusA(hScm
,
684 ok(bError
, "bError = %u, expected TRUE\n", bError
);
686 /* These conditions must be verified iff the services database is locked */
687 ok(lpLockStatus
->fIsLocked
!= 0, "lpLockStatus->fIsLocked = %lu, expected non-zero\n", lpLockStatus
->fIsLocked
);
688 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
689 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
!= 0, "*lpLockStatus->lpLockOwner = \"\\0\", expected non-zero\n");
690 ok(lpLockStatus
->dwLockDuration
!= 0, "lpLockStatus->dwLockDuration = %lu, expected non-zero\n", lpLockStatus
->dwLockDuration
);
692 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
696 * Last try, with the database again unlocked.
699 SetLastError(0xdeadbeef);
700 bError
= UnlockServiceDatabase(hLock
);
701 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
702 ok_err(ERROR_SUCCESS
);
705 /* Get the needed size */
706 SetLastError(0xdeadbeef);
707 bError
= QueryServiceLockStatusA(hScm
,
711 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
712 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
713 if (dwRequiredSize
== 0)
715 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
719 /* Allocate memory */
720 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
721 if (lpLockStatus
== NULL
)
723 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
727 /* Get the actual value */
728 SetLastError(0xdeadbeef);
729 bError
= QueryServiceLockStatusA(hScm
,
733 ok(bError
, "bError = %u, expected TRUE\n", bError
);
735 /* These conditions must be verified iff the services database is unlocked */
736 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
737 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
738 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
739 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
741 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
746 UnlockServiceDatabase(hLock
);
749 CloseServiceHandle(hScm
);
755 START_TEST(LockDatabase
)
757 Test_LockUnlockServiceDatabase();
758 Test_LockUnlockServiceDatabaseWithServiceStart();
759 Test_QueryLockStatusW();
760 Test_QueryLockStatusA();