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
12 #define TESTING_SERVICE L"Spooler"
14 static void Test_LockUnlockServiceDatabase(void)
18 SC_HANDLE hScm
= NULL
;
21 /* First of all, try to lock / unlock the services database with invalid handles */
22 SetLastError(0xdeadbeef);
24 hLock
= LockServiceDatabase(hScm
);
25 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
26 ok_err(ERROR_INVALID_HANDLE
);
28 SetLastError(0xdeadbeef);
29 hScm
= (SC_HANDLE
)0xdeadbeef;
30 hLock
= LockServiceDatabase(hScm
);
31 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
32 ok_err(ERROR_INVALID_HANDLE
);
34 /** This test seems to make this application crash on Windows 7... I do not know why... **/
35 SetLastError(0xdeadbeef);
37 bError
= UnlockServiceDatabase(hLock
);
38 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
39 ok_err(ERROR_INVALID_SERVICE_LOCK
);
40 /*****************************************************************************************/
42 SetLastError(0xdeadbeef);
43 hLock
= (SC_LOCK
)0xdeadbeef;
44 bError
= UnlockServiceDatabase(hLock
);
45 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
46 ok_err(ERROR_INVALID_SERVICE_LOCK
);
49 /* Then, try to lock the services database without having rights */
50 SetLastError(0xdeadbeef);
51 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
52 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
55 skip("No service control manager; cannot proceed with LockUnlockServiceDatabase test\n");
58 ok_err(ERROR_SUCCESS
);
60 SetLastError(0xdeadbeef);
61 hLock
= LockServiceDatabase(hScm
);
62 ok(hLock
== NULL
, "hLock = 0x%p, expected 0\n", hLock
);
63 ok_err(ERROR_ACCESS_DENIED
);
66 UnlockServiceDatabase(hLock
);
67 CloseServiceHandle(hScm
);
69 /* Try to lock the services database with good rights */
70 SetLastError(0xdeadbeef);
71 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
);
72 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
75 skip("No service control manager; cannot proceed with LockUnlockServiceDatabase test\n");
78 ok_err(ERROR_SUCCESS
);
80 SetLastError(0xdeadbeef);
81 hLock
= LockServiceDatabase(hScm
);
82 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
83 ok_err(ERROR_SUCCESS
);
88 SetLastError(0xdeadbeef);
89 bError
= UnlockServiceDatabase(hLock
);
90 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
91 ok_err(ERROR_SUCCESS
);
97 CloseServiceHandle(hScm
);
102 static void Test_LockUnlockServiceDatabaseWithServiceStart(void)
106 SC_HANDLE hScm
= NULL
;
107 SC_HANDLE hSvc
= NULL
;
108 SC_LOCK hLock
= NULL
;
110 LPQUERY_SERVICE_CONFIGW lpConfig
= NULL
;
111 DWORD dwRequiredSize
= 0;
112 SERVICE_STATUS status
;
113 BOOL bWasRunning
= FALSE
;
114 DWORD dwOldStartType
= 0;
116 /* Open the services database */
117 SetLastError(0xdeadbeef);
118 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
);
119 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
122 skip("No service control manager; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n");
125 ok_err(ERROR_SUCCESS
);
127 /* Grab a handle to the testing service */
128 SetLastError(0xdeadbeef);
129 hSvc
= OpenServiceW(hScm
, TESTING_SERVICE
, SERVICE_START
| SERVICE_STOP
| SERVICE_CHANGE_CONFIG
| SERVICE_QUERY_CONFIG
| SERVICE_QUERY_STATUS
);
130 ok(hSvc
!= NULL
, "hSvc = 0x%p, expected non-null, error=0x%08lx\n", hSvc
, GetLastError());
133 skip("Cannot open a handle to service %S; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n", TESTING_SERVICE
);
136 ok_err(ERROR_SUCCESS
);
138 /* Lock the services database */
139 SetLastError(0xdeadbeef);
140 hLock
= LockServiceDatabase(hScm
);
141 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero, error=0x%08lx\n", hLock
, GetLastError());
144 skip("Cannot lock the services database; cannot proceed with LockUnlockServiceDatabaseWithServiceStart test\n");
147 ok_err(ERROR_SUCCESS
);
149 /* To proceed further, firstly attempt to stop the testing service */
150 QueryServiceConfigW(hSvc
, NULL
, 0, &dwRequiredSize
);
151 lpConfig
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
152 QueryServiceConfigW(hSvc
, lpConfig
, dwRequiredSize
, &dwRequiredSize
);
153 dwOldStartType
= lpConfig
->dwStartType
;
154 HeapFree(GetProcessHeap(), 0, lpConfig
);
155 if (dwOldStartType
== SERVICE_DISABLED
)
157 ChangeServiceConfigW(hSvc
,
159 SERVICE_DEMAND_START
,
169 QueryServiceStatus(hSvc
, &status
);
170 bWasRunning
= (status
.dwCurrentState
!= SERVICE_STOPPED
);
173 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
174 Sleep(1000); /* Wait 1 second for the service to stop */
177 /* Now try to start it (this test won't work under Windows Vista / 7 / 8) */
178 SetLastError(0xdeadbeef);
179 bError
= StartServiceW(hSvc
, 0, NULL
);
180 ok(bError
== FALSE
, "bError = %u, expected FALSE\n", bError
);
181 ok_err(ERROR_SERVICE_DATABASE_LOCKED
);
182 Sleep(1000); /* Wait 1 second for the service to start */
184 /* Stop the testing service */
185 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
186 Sleep(1000); /* Wait 1 second for the service to stop */
188 /* Now unlock the services database */
189 SetLastError(0xdeadbeef);
190 bError
= UnlockServiceDatabase(hLock
);
191 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
192 ok_err(ERROR_SUCCESS
);
194 /* Try to start again the service, this time the database unlocked */
195 SetLastError(0xdeadbeef);
196 bError
= StartServiceW(hSvc
, 0, NULL
);
197 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
198 ok_err(ERROR_SUCCESS
);
199 Sleep(1000); /* Wait 1 second for the service to start */
201 /* Stop the testing service */
202 ControlService(hSvc
, SERVICE_CONTROL_STOP
, &status
);
203 Sleep(1000); /* Wait 1 second for the service to stop */
205 /* Restore its original state */
208 StartServiceW(hSvc
, 0, NULL
);
211 if (dwOldStartType
== SERVICE_DISABLED
)
213 ChangeServiceConfigW(hSvc
,
229 CloseServiceHandle(hSvc
);
232 CloseServiceHandle(hScm
);
237 static void Test_QueryLockStatusW(void)
241 SC_HANDLE hScm
= NULL
;
242 SC_LOCK hLock
= NULL
;
243 LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
= NULL
;
244 DWORD dwRequiredSize
= 0;
246 /* Firstly try to get lock status with invalid handles */
247 SetLastError(0xdeadbeef);
248 bError
= QueryServiceLockStatusW(hScm
,
252 ok(bError
== FALSE
&& GetLastError() == ERROR_INVALID_HANDLE
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INVALID_HANDLE
);
253 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
255 /* Open the services database without having rights */
256 SetLastError(0xdeadbeef);
257 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_CONNECT
);
258 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
261 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
264 ok_err(ERROR_SUCCESS
);
266 /* Try to get lock status */
267 SetLastError(0xdeadbeef);
268 bError
= QueryServiceLockStatusW(hScm
,
272 ok(bError
== FALSE
&& GetLastError() == ERROR_ACCESS_DENIED
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_ACCESS_DENIED
);
273 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
275 CloseServiceHandle(hScm
);
279 * Query only the lock status.
282 SetLastError(0xdeadbeef);
283 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_QUERY_LOCK_STATUS
);
284 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
287 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
290 ok_err(ERROR_SUCCESS
);
292 /* Get the needed size */
293 SetLastError(0xdeadbeef);
294 bError
= QueryServiceLockStatusW(hScm
,
298 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
299 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
300 if (dwRequiredSize
== 0)
302 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
306 /* Allocate memory */
307 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
308 if (lpLockStatus
== NULL
)
310 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
314 /* Get the actual value */
315 SetLastError(0xdeadbeef);
316 bError
= QueryServiceLockStatusW(hScm
,
320 ok(bError
, "bError = %u, expected TRUE\n", bError
);
322 /* These conditions must be verified iff the services database wasn't previously locked */
323 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
324 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
325 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
326 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
328 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
330 CloseServiceHandle(hScm
);
334 * Now, try to lock the database and check its lock status.
337 SetLastError(0xdeadbeef);
338 hScm
= OpenSCManagerW(NULL
, NULL
, SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
);
339 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
342 skip("No service control manager; cannot proceed with QueryLockStatusW test\n");
345 ok_err(ERROR_SUCCESS
);
347 /* Get the needed size */
348 SetLastError(0xdeadbeef);
349 bError
= QueryServiceLockStatusW(hScm
,
353 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
354 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
355 if (dwRequiredSize
== 0)
357 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
361 /* Allocate memory */
362 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
363 if (lpLockStatus
== NULL
)
365 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
369 /* Get the actual value */
370 SetLastError(0xdeadbeef);
371 bError
= QueryServiceLockStatusW(hScm
,
375 ok(bError
, "bError = %u, expected TRUE\n", bError
);
377 /* These conditions must be verified iff the services database wasn't previously locked */
378 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
379 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
380 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
381 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
383 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
387 * Try again, this time with the database locked.
390 SetLastError(0xdeadbeef);
391 hLock
= LockServiceDatabase(hScm
);
392 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
393 ok_err(ERROR_SUCCESS
);
395 Sleep(1000); /* Wait 1 second to let lpLockStatus->dwLockDuration increment */
397 /* Get the needed size */
398 SetLastError(0xdeadbeef);
399 bError
= QueryServiceLockStatusW(hScm
,
403 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
404 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
405 if (dwRequiredSize
== 0)
407 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
411 /* Allocate memory */
412 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
413 if (lpLockStatus
== NULL
)
415 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
419 /* Get the actual value */
420 SetLastError(0xdeadbeef);
421 bError
= QueryServiceLockStatusW(hScm
,
425 ok(bError
, "bError = %u, expected TRUE\n", bError
);
427 /* These conditions must be verified iff the services database is locked */
428 ok(lpLockStatus
->fIsLocked
!= 0, "lpLockStatus->fIsLocked = %lu, expected non-zero\n", lpLockStatus
->fIsLocked
);
429 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
430 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
!= 0, "*lpLockStatus->lpLockOwner = \"\\0\", expected non-zero\n");
431 ok(lpLockStatus
->dwLockDuration
!= 0, "lpLockStatus->dwLockDuration = %lu, expected non-zero\n", lpLockStatus
->dwLockDuration
);
433 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
437 * Last try, with the database again unlocked.
440 SetLastError(0xdeadbeef);
441 bError
= UnlockServiceDatabase(hLock
);
442 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
443 ok_err(ERROR_SUCCESS
);
446 /* Get the needed size */
447 SetLastError(0xdeadbeef);
448 bError
= QueryServiceLockStatusW(hScm
,
452 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
453 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
454 if (dwRequiredSize
== 0)
456 skip("Required size is null; cannot proceed with QueryLockStatusW test\n");
460 /* Allocate memory */
461 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
462 if (lpLockStatus
== NULL
)
464 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
468 /* Get the actual value */
469 SetLastError(0xdeadbeef);
470 bError
= QueryServiceLockStatusW(hScm
,
474 ok(bError
, "bError = %u, expected TRUE\n", bError
);
476 /* These conditions must be verified iff the services database is unlocked */
477 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
478 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
479 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
480 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
482 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
487 UnlockServiceDatabase(hLock
);
490 CloseServiceHandle(hScm
);
495 static void Test_QueryLockStatusA(void)
499 SC_HANDLE hScm
= NULL
;
500 SC_LOCK hLock
= NULL
;
501 LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
= NULL
;
502 DWORD dwRequiredSize
= 0;
504 /* Firstly try to get lock status with invalid handles */
505 SetLastError(0xdeadbeef);
506 bError
= QueryServiceLockStatusA(hScm
,
510 ok(bError
== FALSE
&& GetLastError() == ERROR_INVALID_HANDLE
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INVALID_HANDLE
);
511 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
513 /* Open the services database without having rights */
514 SetLastError(0xdeadbeef);
515 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_CONNECT
);
516 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
519 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
522 ok_err(ERROR_SUCCESS
);
524 /* Try to get lock status */
525 SetLastError(0xdeadbeef);
526 bError
= QueryServiceLockStatusA(hScm
,
530 ok(bError
== FALSE
&& GetLastError() == ERROR_ACCESS_DENIED
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_ACCESS_DENIED
);
531 ok(dwRequiredSize
== 0, "dwRequiredSize is non-zero, expected zero\n");
533 CloseServiceHandle(hScm
);
537 * Query only the lock status.
540 SetLastError(0xdeadbeef);
541 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_QUERY_LOCK_STATUS
);
542 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
545 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
548 ok_err(ERROR_SUCCESS
);
550 /* Get the needed size */
551 SetLastError(0xdeadbeef);
552 bError
= QueryServiceLockStatusA(hScm
,
556 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
557 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
558 if (dwRequiredSize
== 0)
560 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
564 /* Allocate memory */
565 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
566 if (lpLockStatus
== NULL
)
568 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
572 /* Get the actual value */
573 SetLastError(0xdeadbeef);
574 bError
= QueryServiceLockStatusA(hScm
,
578 ok(bError
, "bError = %u, expected TRUE\n", bError
);
580 /* These conditions must be verified iff the services database wasn't previously locked */
581 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
582 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
583 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
584 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
586 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
588 CloseServiceHandle(hScm
);
592 * Now, try to lock the database and check its lock status.
595 SetLastError(0xdeadbeef);
596 hScm
= OpenSCManagerA(NULL
, NULL
, SC_MANAGER_LOCK
| SC_MANAGER_QUERY_LOCK_STATUS
);
597 ok(hScm
!= NULL
, "Failed to open service manager, error=0x%08lx\n", GetLastError());
600 skip("No service control manager; cannot proceed with QueryLockStatusA test\n");
603 ok_err(ERROR_SUCCESS
);
605 /* Get the needed size */
606 SetLastError(0xdeadbeef);
607 bError
= QueryServiceLockStatusA(hScm
,
611 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
612 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
613 if (dwRequiredSize
== 0)
615 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
619 /* Allocate memory */
620 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
621 if (lpLockStatus
== NULL
)
623 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
627 /* Get the actual value */
628 SetLastError(0xdeadbeef);
629 bError
= QueryServiceLockStatusA(hScm
,
633 ok(bError
, "bError = %u, expected TRUE\n", bError
);
635 /* These conditions must be verified iff the services database wasn't previously locked */
636 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
637 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
638 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
639 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
641 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
645 * Try again, this time with the database locked.
648 SetLastError(0xdeadbeef);
649 hLock
= LockServiceDatabase(hScm
);
650 ok(hLock
!= NULL
, "hLock = 0x%p, expected non-zero\n", hLock
);
651 ok_err(ERROR_SUCCESS
);
653 Sleep(1000); /* Wait 1 second to let lpLockStatus->dwLockDuration increment */
655 /* Get the needed size */
656 SetLastError(0xdeadbeef);
657 bError
= QueryServiceLockStatusA(hScm
,
661 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
662 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
663 if (dwRequiredSize
== 0)
665 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
669 /* Allocate memory */
670 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
671 if (lpLockStatus
== NULL
)
673 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
677 /* Get the actual value */
678 SetLastError(0xdeadbeef);
679 bError
= QueryServiceLockStatusA(hScm
,
683 ok(bError
, "bError = %u, expected TRUE\n", bError
);
685 /* These conditions must be verified iff the services database is locked */
686 ok(lpLockStatus
->fIsLocked
!= 0, "lpLockStatus->fIsLocked = %lu, expected non-zero\n", lpLockStatus
->fIsLocked
);
687 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
688 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
!= 0, "*lpLockStatus->lpLockOwner = \"\\0\", expected non-zero\n");
689 ok(lpLockStatus
->dwLockDuration
!= 0, "lpLockStatus->dwLockDuration = %lu, expected non-zero\n", lpLockStatus
->dwLockDuration
);
691 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
695 * Last try, with the database again unlocked.
698 SetLastError(0xdeadbeef);
699 bError
= UnlockServiceDatabase(hLock
);
700 ok(bError
== TRUE
, "bError = %u, expected TRUE\n", bError
);
701 ok_err(ERROR_SUCCESS
);
704 /* Get the needed size */
705 SetLastError(0xdeadbeef);
706 bError
= QueryServiceLockStatusA(hScm
,
710 ok(bError
== FALSE
&& GetLastError() == ERROR_INSUFFICIENT_BUFFER
, "(bError, GetLastError()) = (%u, 0x%08lx), expected (FALSE, 0x%08lx)\n", bError
, GetLastError(), (DWORD
)ERROR_INSUFFICIENT_BUFFER
);
711 ok(dwRequiredSize
!= 0, "dwRequiredSize is zero, expected non-zero\n");
712 if (dwRequiredSize
== 0)
714 skip("Required size is null; cannot proceed with QueryLockStatusA test\n");
718 /* Allocate memory */
719 lpLockStatus
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, dwRequiredSize
);
720 if (lpLockStatus
== NULL
)
722 skip("Cannot allocate %lu bytes of memory\n", dwRequiredSize
);
726 /* Get the actual value */
727 SetLastError(0xdeadbeef);
728 bError
= QueryServiceLockStatusA(hScm
,
732 ok(bError
, "bError = %u, expected TRUE\n", bError
);
734 /* These conditions must be verified iff the services database is unlocked */
735 ok(lpLockStatus
->fIsLocked
== 0, "lpLockStatus->fIsLocked = %lu, expected 0\n", lpLockStatus
->fIsLocked
);
736 ok(lpLockStatus
->lpLockOwner
!= NULL
, "lpLockStatus->lpLockOwner is null, expected non-null\n");
737 ok(lpLockStatus
->lpLockOwner
&& *lpLockStatus
->lpLockOwner
== 0, "*lpLockStatus->lpLockOwner != \"\\0\", expected \"\\0\"\n");
738 ok(lpLockStatus
->dwLockDuration
== 0, "lpLockStatus->dwLockDuration = %lu, expected 0\n", lpLockStatus
->dwLockDuration
);
740 HeapFree(GetProcessHeap(), 0, lpLockStatus
);
745 UnlockServiceDatabase(hLock
);
748 CloseServiceHandle(hScm
);
754 START_TEST(LockDatabase
)
756 Test_LockUnlockServiceDatabase();
757 Test_LockUnlockServiceDatabaseWithServiceStart();
758 Test_QueryLockStatusW();
759 Test_QueryLockStatusA();