10 #define WIN32_NO_STATUS
12 #define COM_NO_WINDOWS_H
19 #define NTOS_MODE_USER
20 #include <ndk/obfuncs.h>
21 #include <ndk/rtlfuncs.h>
22 #include <services/services.h>
25 typedef struct _SERVICE_GROUP
27 LIST_ENTRY GroupListEntry
;
31 BOOLEAN ServicesRunning
;
36 } SERVICE_GROUP
, *PSERVICE_GROUP
;
39 typedef struct _SERVICE_IMAGE
41 LIST_ENTRY ImageListEntry
;
42 DWORD dwImageRunCount
;
49 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
52 typedef struct _SERVICE
54 LIST_ENTRY ServiceListEntry
;
57 PSERVICE_GROUP lpGroup
;
58 PSERVICE_IMAGE lpImage
;
63 SERVICE_STATUS Status
;
70 PSECURITY_DESCRIPTOR lpSecurityDescriptor
;
72 BOOLEAN ServiceVisited
;
74 WCHAR szServiceName
[1];
78 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
80 typedef struct _START_LOCK
82 DWORD Tag
; /* Must be LOCK_TAG */
83 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
84 PSID LockOwnerSid
; /* It is NULL if the SCM aquired the lock */
85 } START_LOCK
, *PSTART_LOCK
;
88 /* VARIABLES ***************************************************************/
90 extern LIST_ENTRY ServiceListHead
;
91 extern LIST_ENTRY GroupListHead
;
92 extern LIST_ENTRY ImageListHead
;
93 extern BOOL ScmInitialize
;
94 extern BOOL ScmShutdown
;
97 /* FUNCTIONS ***************************************************************/
101 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
105 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
109 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
110 LPCWSTR lpDependencies
,
111 DWORD dwDependenciesLength
);
113 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
114 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
116 DWORD
ScmReadString(HKEY hServiceKey
,
121 ScmReadDependencies(HKEY hServiceKey
,
122 LPWSTR
*lpDependencies
,
123 DWORD
*lpdwDependenciesLength
);
128 BOOL
ScmGetControlSetValues(VOID
);
133 DWORD
ScmCreateServiceDatabase(VOID
);
134 VOID
ScmShutdownServiceDatabase(VOID
);
135 VOID
ScmGetBootAndSystemDriverState(VOID
);
136 VOID
ScmAutoStartServices(VOID
);
137 VOID
ScmAutoShutdownServices(VOID
);
138 DWORD
ScmStartService(PSERVICE Service
,
142 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
143 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
144 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
145 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
146 PSERVICE
*lpServiceRecord
);
147 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
148 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
150 DWORD
ScmControlService(PSERVICE Service
,
153 BOOL
ScmLockDatabaseExclusive(VOID
);
154 BOOL
ScmLockDatabaseShared(VOID
);
155 VOID
ScmUnlockDatabase(VOID
);
157 VOID
ScmInitNamedPipeCriticalSection(VOID
);
158 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
163 DWORD
ScmLoadDriver(PSERVICE lpService
);
164 DWORD
ScmUnloadDriver(PSERVICE lpService
);
165 DWORD
ScmControlDriver(PSERVICE lpService
,
167 LPSERVICE_STATUS lpServiceStatus
);
172 DWORD
ScmCreateGroupList(VOID
);
173 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
174 LPCWSTR lpGroupName
);
178 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
179 OUT LPSC_RPC_LOCK lpLock
);
180 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
181 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
182 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
187 VOID
ScmStartRpcServer(VOID
);
192 VOID
PrintString(LPCSTR fmt
, ...);
193 VOID
ScmLogError(DWORD dwEventId
,
196 VOID
ScmWaitForLsa(VOID
);
198 #endif /* _SERVICES_H */