Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190/* * PROJECT: ReactOS Service Control Manager * LICENSE: GPL - See COPYING in the top level directory * FILE: base/system/services/lock.c * PURPOSE: User-side Services Start Serialization Lock functions * COPYRIGHT: Copyright 2012 Herm�s B�lusca */
/* INCLUDES *****************************************************************/
#include "services.h"
#include <time.h>
#define NDEBUG#include <debug.h>
/* GLOBALS *******************************************************************/
/* The unique user service start lock of the SCM */static PSTART_LOCK pServiceStartLock = NULL;
/* FUNCTIONS *****************************************************************/
/* * NOTE: IsServiceController is TRUE if locked by the * Service Control Manager, and FALSE otherwise. */DWORDScmAcquireServiceStartLock(IN BOOL IsServiceController, OUT LPSC_RPC_LOCK lpLock){ DWORD dwRequiredSize; DWORD dwError = ERROR_SUCCESS;
*lpLock = NULL;
/* Lock the service database exclusively */ ScmLockDatabaseExclusive();
if (pServiceStartLock != NULL) { dwError = ERROR_SERVICE_DATABASE_LOCKED; goto done; }
/* Allocate a new lock for the database */ dwRequiredSize = sizeof(START_LOCK);
if (!IsServiceController) { /* FIXME: dwRequiredSize += RtlLengthSid(UserSid <-- to be retrieved); */ }
pServiceStartLock = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwRequiredSize); if (pServiceStartLock == NULL) { dwError = ERROR_NOT_ENOUGH_MEMORY; goto done; }
pServiceStartLock->Tag = LOCK_TAG; pServiceStartLock->TimeWhenLocked = (DWORD)time(NULL);
/* FIXME: Retrieve the owner SID. Use IsServiceController. */ pServiceStartLock->LockOwnerSid = (PSID)NULL;
*lpLock = (LPSC_RPC_LOCK)pServiceStartLock;
done: /* Unlock the service database */ ScmUnlockDatabase();
return dwError;}
DWORDScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock){ PSTART_LOCK pStartLock; DWORD dwError = ERROR_SUCCESS;
if (lpLock == NULL) return ERROR_INVALID_SERVICE_LOCK;
pStartLock = (PSTART_LOCK)*lpLock;
if (pStartLock->Tag != LOCK_TAG) return ERROR_INVALID_SERVICE_LOCK;
/* Lock the service database exclusively */ ScmLockDatabaseExclusive();
/* Release the lock handle */ if ((pStartLock == pServiceStartLock) && (pServiceStartLock != NULL)) { HeapFree(GetProcessHeap(), 0, pServiceStartLock); pServiceStartLock = NULL; *lpLock = NULL;
dwError = ERROR_SUCCESS; } else { dwError = ERROR_INVALID_SERVICE_LOCK; }
/* Unlock the service database */ ScmUnlockDatabase();
return dwError;}
/* * Helper functions for RQueryServiceLockStatusW() and * RQueryServiceLockStatusA(). * We suppose that lpLockStatus points to a valid * well-sized buffer. */VOIDScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus){ /* Lock the service database shared */ ScmLockDatabaseShared();
if (pServiceStartLock != NULL) { lpLockStatus->fIsLocked = TRUE;
/* FIXME: Retrieve the owner name. */ lpLockStatus->lpLockOwner = NULL;
lpLockStatus->dwLockDuration = (DWORD)time(NULL) - pServiceStartLock->TimeWhenLocked; } else { lpLockStatus->fIsLocked = FALSE;
wcscpy((LPWSTR)(lpLockStatus + 1), L""); lpLockStatus->lpLockOwner = (LPWSTR)(ULONG_PTR)sizeof(QUERY_SERVICE_LOCK_STATUSW);
lpLockStatus->dwLockDuration = 0; }
/* Unlock the service database */ ScmUnlockDatabase();
return;}
VOIDScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus){ /* Lock the service database shared */ ScmLockDatabaseShared();
if (pServiceStartLock != NULL) { lpLockStatus->fIsLocked = TRUE;
/* FIXME: Retrieve the owner name. */ lpLockStatus->lpLockOwner = NULL;
lpLockStatus->dwLockDuration = (DWORD)time(NULL) - pServiceStartLock->TimeWhenLocked; } else { lpLockStatus->fIsLocked = FALSE;
strcpy((LPSTR)(lpLockStatus + 1), ""); lpLockStatus->lpLockOwner = (LPSTR)(ULONG_PTR)sizeof(QUERY_SERVICE_LOCK_STATUSA);
lpLockStatus->dwLockDuration = 0; }
/* Unlock the service database */ ScmUnlockDatabase();
return;}
/* EOF */