8 #define WIN32_NO_STATUS
13 #define NTOS_MODE_USER
14 #include <ndk/iofuncs.h>
15 #include <ndk/obfuncs.h>
16 #include <ndk/rtlfuncs.h>
17 #include <ndk/setypes.h>
18 #include <services/services.h>
21 typedef struct _SERVICE_GROUP
23 LIST_ENTRY GroupListEntry
;
27 BOOLEAN ServicesRunning
;
32 } SERVICE_GROUP
, *PSERVICE_GROUP
;
35 typedef struct _SERVICE_IMAGE
37 LIST_ENTRY ImageListEntry
;
38 DWORD dwImageRunCount
;
45 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
48 typedef struct _SERVICE
50 LIST_ENTRY ServiceListEntry
;
53 PSERVICE_GROUP lpGroup
;
54 PSERVICE_IMAGE lpImage
;
59 SERVICE_STATUS Status
;
66 PSECURITY_DESCRIPTOR lpSecurityDescriptor
;
68 BOOLEAN ServiceVisited
;
70 WCHAR szServiceName
[1];
74 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
76 typedef struct _START_LOCK
78 DWORD Tag
; /* Must be LOCK_TAG */
79 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
80 PSID LockOwnerSid
; /* It is NULL if the SCM aquired the lock */
81 } START_LOCK
, *PSTART_LOCK
;
84 /* VARIABLES ***************************************************************/
86 extern LIST_ENTRY ServiceListHead
;
87 extern LIST_ENTRY GroupListHead
;
88 extern LIST_ENTRY ImageListHead
;
89 extern BOOL ScmShutdown
;
92 /* FUNCTIONS ***************************************************************/
96 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
100 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
104 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
105 LPCWSTR lpDependencies
,
106 DWORD dwDependenciesLength
);
108 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
109 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
111 DWORD
ScmReadString(HKEY hServiceKey
,
116 ScmReadDependencies(HKEY hServiceKey
,
117 LPWSTR
*lpDependencies
,
118 DWORD
*lpdwDependenciesLength
);
123 BOOL
ScmGetControlSetValues(VOID
);
128 DWORD
ScmCreateServiceDatabase(VOID
);
129 VOID
ScmShutdownServiceDatabase(VOID
);
130 VOID
ScmGetBootAndSystemDriverState(VOID
);
131 VOID
ScmAutoStartServices(VOID
);
132 VOID
ScmAutoShutdownServices(VOID
);
133 DWORD
ScmStartService(PSERVICE Service
,
137 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
138 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
139 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
140 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
141 PSERVICE
*lpServiceRecord
);
142 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
143 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
145 DWORD
ScmControlService(PSERVICE Service
,
148 BOOL
ScmLockDatabaseExclusive(VOID
);
149 BOOL
ScmLockDatabaseShared(VOID
);
150 VOID
ScmUnlockDatabase(VOID
);
152 VOID
ScmInitNamedPipeCriticalSection(VOID
);
153 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
158 DWORD
ScmLoadDriver(PSERVICE lpService
);
159 DWORD
ScmUnloadDriver(PSERVICE lpService
);
160 DWORD
ScmControlDriver(PSERVICE lpService
,
162 LPSERVICE_STATUS lpServiceStatus
);
167 DWORD
ScmCreateGroupList(VOID
);
168 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
169 LPCWSTR lpGroupName
);
173 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
174 OUT LPSC_RPC_LOCK lpLock
);
175 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
176 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
177 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
182 VOID
ScmStartRpcServer(VOID
);
187 VOID
PrintString(LPCSTR fmt
, ...);
188 VOID
ScmLogError(DWORD dwEventId
,
191 VOID
ScmWaitForLsa(VOID
);