170 lines
4.1 KiB
C
170 lines
4.1 KiB
C
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
LockTest.c
|
|
|
|
Abstract:
|
|
|
|
This file contains tests of the Service Controller's lock APIs:
|
|
|
|
RLockServiceDatabase
|
|
RQueryServiceLockStatusW
|
|
RUnlockServiceDatabase
|
|
|
|
Author:
|
|
|
|
John Rogers (JohnRo) 15-Apr-1992
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
15-Apr-1992 JohnRo
|
|
Created.
|
|
21-Apr-1992 JohnRo
|
|
Split-out lock test functions.
|
|
|
|
--*/
|
|
|
|
|
|
//
|
|
// INCLUDES
|
|
//
|
|
|
|
#define UNICODE
|
|
|
|
#include <windows.h>
|
|
|
|
#include <assert.h> // assert().
|
|
#include <debugfmt.h> // FORMAT_ equates.
|
|
#include <winsvc.h>
|
|
#include <scdebug.h> // STATIC.
|
|
#include <sctest.h> // TRACE_MSG macros, UNEXPECTED_MSG(), etc.
|
|
#include <stdio.h> // printf()
|
|
|
|
|
|
#define BUF_SIZE 1024 // arbitrary
|
|
|
|
|
|
STATIC VOID
|
|
DumpLockStatus(
|
|
IN LPQUERY_SERVICE_LOCK_STATUS LockStatus
|
|
)
|
|
{
|
|
(VOID) printf( "Lock status:\n" );
|
|
|
|
(VOID) printf( " Locked: " FORMAT_LPSTR "\n",
|
|
(LockStatus->fIsLocked) ? "yes" : "no" );
|
|
|
|
(VOID) printf( " LockOwner: " FORMAT_LPWSTR "\n",
|
|
(LockStatus->lpLockOwner != NULL) ? LockStatus->lpLockOwner : L"NONE" );
|
|
|
|
(VOID) printf( " lock duration: " FORMAT_DWORD "\n",
|
|
LockStatus->dwLockDuration );
|
|
|
|
} // DumpLockStatus
|
|
|
|
STATIC VOID
|
|
GetAndDisplayLockStatus(
|
|
IN LPSTR Comment,
|
|
IN SC_HANDLE hScManager
|
|
)
|
|
{
|
|
BYTE buffer[BUF_SIZE];
|
|
LPQUERY_SERVICE_LOCK_STATUS lockStatus = (LPVOID) &buffer[0];
|
|
DWORD sizeNeed;
|
|
|
|
TRACE_MSG1( "calling QueryServiceLockStatus " FORMAT_LPSTR "...\n",
|
|
Comment );
|
|
|
|
if ( !QueryServiceLockStatus(hScManager, lockStatus, BUF_SIZE, &sizeNeed)) {
|
|
UNEXPECTED_MSG( "from QueryServiceLockStatus (default)",
|
|
GetLastError() );
|
|
assert( FALSE );
|
|
}
|
|
|
|
DumpLockStatus( lockStatus );
|
|
|
|
}
|
|
|
|
VOID
|
|
TestLocks(
|
|
VOID
|
|
)
|
|
{
|
|
SC_HANDLE hScManager = NULL;
|
|
SC_LOCK lock;
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
SetLastError( 149 );
|
|
(VOID) printf( "Force last error is " FORMAT_DWORD "\n", GetLastError() );
|
|
|
|
TRACE_MSG1( "handle (before anything) is " FORMAT_HEX_DWORD ".\n",
|
|
(DWORD) hScManager );
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
TRACE_MSG0( "calling OpenSCManagerW (default)...\n" );
|
|
|
|
hScManager = OpenSCManager(
|
|
NULL, // local machine.
|
|
NULL, // no database name.
|
|
GENERIC_ALL ); // desired access.
|
|
|
|
TRACE_MSG1( "back from OpenSCManagerW, handle is " FORMAT_HEX_DWORD ".\n",
|
|
(DWORD) hScManager );
|
|
|
|
if (hScManager == NULL) {
|
|
UNEXPECTED_MSG( "from OpenSCManagerW (default)", GetLastError() );
|
|
goto Cleanup;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
GetAndDisplayLockStatus( "default, empty", hScManager );
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
TRACE_MSG0( "calling LockServiceDatabase (default)...\n" );
|
|
|
|
lock = LockServiceDatabase( hScManager );
|
|
TRACE_MSG1( "Got back lock " FORMAT_HEX_DWORD ".\n", (DWORD) lock );
|
|
if (lock == NULL) {
|
|
UNEXPECTED_MSG( "from LockServiceDatabase (default)", GetLastError() );
|
|
goto Cleanup;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
GetAndDisplayLockStatus( "default, not empty", hScManager );
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
TRACE_MSG0( "calling UnlockServiceDatabase (default)...\n" );
|
|
|
|
if ( !UnlockServiceDatabase( lock ) ) {
|
|
UNEXPECTED_MSG( "from UnlockServiceDatabase (default)",
|
|
GetLastError() );
|
|
goto Cleanup;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
GetAndDisplayLockStatus( "default, empty again", hScManager );
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
|
|
|
|
Cleanup:
|
|
|
|
if (hScManager != NULL) {
|
|
TRACE_MSG0( "calling CloseServiceHandle...\n" );
|
|
|
|
if ( !CloseServiceHandle( hScManager ) ) {
|
|
UNEXPECTED_MSG( "from CloseServiceHandle", GetLastError() );
|
|
}
|
|
|
|
}
|
|
|
|
} // TestLocks
|