#include <windows.h>
VOID ReconfigureSampleService(BOOL fDisable, LPSTR lpDesc)
{
SC_LOCK sclLock;
LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf;
SERVICE_DESCRIPTION sdBuf;
DWORD dwBytesNeeded, dwStartType;
// Need to acquire database lock before reconfiguring.
sclLock = LockServiceDatabase(schSCManager);
// If the database cannot be locked, report the details.
if (sclLock == NULL)
{
// Exit if the database is not locked by another process.
if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)
MyErrorExit("LockServiceDatabase");
// Allocate a buffer to get details about the lock.
lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc(
LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256);
if (lpqslsBuf == NULL)
MyErrorExit("LocalAlloc");
// Get and print the lock status information.
if (!QueryServiceLockStatus(
schSCManager,
lpqslsBuf,
sizeof(QUERY_SERVICE_LOCK_STATUS)+256,
&dwBytesNeeded) )
MyErrorExit("QueryServiceLockStatus");
if (lpqslsBuf->fIsLocked)
printf("Locked by: %s, duration: %d seconds\n",
lpqslsBuf->lpLockOwner,
lpqslsBuf->dwLockDuration);
else
printf("No longer locked\n");
LocalFree(lpqslsBuf);
MyErrorExit("Could not lock database");
}
// The database is locked, so it is safe to make changes.
// Open a
handle to the service.
schService = OpenService(
schSCManager, // SCManager database
"Sample_Srv", // name of service
SERVICE_CHANGE_CONFIG); // need CHANGE
access
if (schService == NULL)
MyErrorExit("OpenService");
dwStartType = (fDisable) ? SERVICE_DISABLED :
SERVICE_DEMAND_START;
// Make the changes.
if (! ChangeServiceConfig(
schService, //
handle of service
SERVICE_NO_CHANGE, // service type: no change
dwStartType, // change service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) ) // display name: no change
{
MyErrorExit("ChangeServiceConfig");
}
else
printf("ChangeServiceConfig SUCCESS\n");
sdBuf.lpDescription = lpDesc;
if( !ChangeServiceConfig2(
schService, //
handle to service
SERVICE_CONFIG_DESCRIPTION, // change: description
&sdBuf) ) // value: new description
{
MyErrorExit("ChangeServiceConfig2");
}
else
printf("ChangeServiceConfig2 SUCCESS\n");
// Release the database lock.
UnlockServiceDatabase(sclLock);
// Close the
handle to the service.
CloseServiceHandle(schService);
}