*/
#include <stdio.h>
+#include <time.h>
+
#define WIN32_NO_STATUS
-#include <windows.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winsvc.h>
+#include <netevent.h>
#define NTOS_MODE_USER
-#include <ndk/ntndk.h>
+#include <ndk/iofuncs.h>
+#include <ndk/obfuncs.h>
+#include <ndk/rtlfuncs.h>
+#include <ndk/setypes.h>
#include <services/services.h>
-
+#include <svcctl_s.h>
typedef struct _SERVICE_GROUP
{
typedef struct _SERVICE_IMAGE
{
- DWORD dwServiceRefCount; // Number of running services of this image
- DWORD Dummy;
+ LIST_ENTRY ImageListEntry;
+ DWORD dwImageRunCount;
+
+ HANDLE hControlPipe;
+ HANDLE hProcess;
+ DWORD dwProcessId;
+
+ WCHAR szImagePath[1];
} SERVICE_IMAGE, *PSERVICE_IMAGE;
BOOLEAN ServiceVisited;
- HANDLE ControlPipeHandle;
- ULONG ProcessId;
- ULONG ThreadId;
-
WCHAR szServiceName[1];
} SERVICE, *PSERVICE;
+#define LOCK_TAG 0x4C697041 /* 'ApiL' */
+
+typedef struct _START_LOCK
+{
+ DWORD Tag; /* Must be LOCK_TAG */
+ DWORD TimeWhenLocked; /* Number of seconds since 1970 */
+ PSID LockOwnerSid; /* It is NULL if the SCM aquired the lock */
+} START_LOCK, *PSTART_LOCK;
+
+
/* VARIABLES ***************************************************************/
extern LIST_ENTRY ServiceListHead;
extern LIST_ENTRY GroupListHead;
+extern LIST_ENTRY ImageListHead;
+extern BOOL ScmInitialize;
extern BOOL ScmShutdown;
PHKEY phKey);
DWORD ScmWriteDependencies(HKEY hServiceKey,
- LPWSTR lpDependencies,
+ LPCWSTR lpDependencies,
DWORD dwDependenciesLength);
DWORD ScmMarkServiceForDelete(PSERVICE pService);
BOOL ScmIsDeleteFlagSet(HKEY hServiceKey);
DWORD ScmReadString(HKEY hServiceKey,
- LPWSTR lpValueName,
+ LPCWSTR lpValueName,
LPWSTR *lpValue);
DWORD
DWORD *lpdwDependenciesLength);
+/* controlset.c */
+
+BOOL ScmGetControlSetValues(VOID);
+
+
/* database.c */
DWORD ScmCreateServiceDatabase(VOID);
BOOL ScmLockDatabaseShared(VOID);
VOID ScmUnlockDatabase(VOID);
+VOID ScmInitNamedPipeCriticalSection(VOID);
+VOID ScmDeleteNamedPipeCriticalSection(VOID);
+
/* driver.c */
LPCWSTR lpGroupName);
+/* lock.c */
+DWORD ScmAcquireServiceStartLock(IN BOOL IsServiceController,
+ OUT LPSC_RPC_LOCK lpLock);
+DWORD ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock);
+VOID ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus);
+VOID ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus);
+
+
/* rpcserver.c */
VOID ScmStartRpcServer(VOID);
/* services.c */
VOID PrintString(LPCSTR fmt, ...);
+VOID ScmLogError(DWORD dwEventId,
+ WORD wStrings,
+ LPCWSTR *lpStrings);
+VOID ScmWaitForLsa(VOID);
/* EOF */
-