7 #define WIN32_NO_STATUS
9 #define COM_NO_WINDOWS_H
16 #define NTOS_MODE_USER
17 #include <ndk/obfuncs.h>
18 #include <ndk/rtlfuncs.h>
19 #include <services/services.h>
22 typedef struct _SERVICE_GROUP
24 LIST_ENTRY GroupListEntry
;
28 BOOLEAN ServicesRunning
;
33 } SERVICE_GROUP
, *PSERVICE_GROUP
;
36 typedef struct _SERVICE_IMAGE
38 LIST_ENTRY ImageListEntry
;
39 DWORD dwImageRunCount
;
46 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
49 typedef struct _SERVICE
51 LIST_ENTRY ServiceListEntry
;
54 PSERVICE_GROUP lpGroup
;
55 PSERVICE_IMAGE lpImage
;
60 SERVICE_STATUS Status
;
67 PSECURITY_DESCRIPTOR lpSecurityDescriptor
;
69 BOOLEAN ServiceVisited
;
71 WCHAR szServiceName
[1];
75 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
77 typedef struct _START_LOCK
79 DWORD Tag
; /* Must be LOCK_TAG */
80 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
81 PSID LockOwnerSid
; /* It is NULL if the SCM aquired the lock */
82 } START_LOCK
, *PSTART_LOCK
;
85 /* VARIABLES ***************************************************************/
87 extern LIST_ENTRY ServiceListHead
;
88 extern LIST_ENTRY GroupListHead
;
89 extern LIST_ENTRY ImageListHead
;
90 extern BOOL ScmInitialize
;
91 extern BOOL ScmShutdown
;
94 /* FUNCTIONS ***************************************************************/
98 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
102 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
106 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
107 LPCWSTR lpDependencies
,
108 DWORD dwDependenciesLength
);
110 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
111 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
113 DWORD
ScmReadString(HKEY hServiceKey
,
118 ScmReadDependencies(HKEY hServiceKey
,
119 LPWSTR
*lpDependencies
,
120 DWORD
*lpdwDependenciesLength
);
125 BOOL
ScmGetControlSetValues(VOID
);
130 DWORD
ScmCreateServiceDatabase(VOID
);
131 VOID
ScmShutdownServiceDatabase(VOID
);
132 VOID
ScmGetBootAndSystemDriverState(VOID
);
133 VOID
ScmAutoStartServices(VOID
);
134 VOID
ScmAutoShutdownServices(VOID
);
135 DWORD
ScmStartService(PSERVICE Service
,
139 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
140 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
141 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
142 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
143 PSERVICE
*lpServiceRecord
);
144 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
145 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
147 DWORD
ScmControlService(PSERVICE Service
,
150 BOOL
ScmLockDatabaseExclusive(VOID
);
151 BOOL
ScmLockDatabaseShared(VOID
);
152 VOID
ScmUnlockDatabase(VOID
);
154 VOID
ScmInitNamedPipeCriticalSection(VOID
);
155 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
160 DWORD
ScmLoadDriver(PSERVICE lpService
);
161 DWORD
ScmUnloadDriver(PSERVICE lpService
);
162 DWORD
ScmControlDriver(PSERVICE lpService
,
164 LPSERVICE_STATUS lpServiceStatus
);
169 DWORD
ScmCreateGroupList(VOID
);
170 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
171 LPCWSTR lpGroupName
);
175 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
176 OUT LPSC_RPC_LOCK lpLock
);
177 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
178 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
179 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
184 VOID
ScmStartRpcServer(VOID
);
189 VOID
PrintString(LPCSTR fmt
, ...);
190 VOID
ScmLogError(DWORD dwEventId
,
193 VOID
ScmWaitForLsa(VOID
);