7 #define WIN32_NO_STATUS
10 #define NTOS_MODE_USER
11 #include <ndk/iofuncs.h>
12 #include <ndk/obfuncs.h>
13 #include <ndk/rtlfuncs.h>
14 #include <services/services.h>
18 typedef struct _SERVICE_GROUP
20 LIST_ENTRY GroupListEntry
;
24 BOOLEAN ServicesRunning
;
29 } SERVICE_GROUP
, *PSERVICE_GROUP
;
32 typedef struct _SERVICE_IMAGE
34 LIST_ENTRY ImageListEntry
;
35 DWORD dwImageRunCount
;
42 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
45 typedef struct _SERVICE
47 LIST_ENTRY ServiceListEntry
;
50 PSERVICE_GROUP lpGroup
;
51 PSERVICE_IMAGE lpImage
;
56 SERVICE_STATUS Status
;
63 PSECURITY_DESCRIPTOR lpSecurityDescriptor
;
65 BOOLEAN ServiceVisited
;
67 WCHAR szServiceName
[1];
71 #define LOCK_TAG 0x4C697041 /* 'ApiL' */
73 typedef struct _START_LOCK
75 DWORD Tag
; /* Must be LOCK_TAG */
76 DWORD TimeWhenLocked
; /* Number of seconds since 1970 */
77 PSID LockOwnerSid
; /* It is NULL if the SCM aquired the lock */
78 } START_LOCK
, *PSTART_LOCK
;
81 /* VARIABLES ***************************************************************/
83 extern LIST_ENTRY ServiceListHead
;
84 extern LIST_ENTRY GroupListHead
;
85 extern LIST_ENTRY ImageListHead
;
86 extern BOOL ScmShutdown
;
89 /* FUNCTIONS ***************************************************************/
93 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
97 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
101 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
102 LPCWSTR lpDependencies
,
103 DWORD dwDependenciesLength
);
105 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
106 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
108 DWORD
ScmReadString(HKEY hServiceKey
,
113 ScmReadDependencies(HKEY hServiceKey
,
114 LPWSTR
*lpDependencies
,
115 DWORD
*lpdwDependenciesLength
);
120 BOOL
ScmGetControlSetValues(VOID
);
125 DWORD
ScmCreateServiceDatabase(VOID
);
126 VOID
ScmShutdownServiceDatabase(VOID
);
127 VOID
ScmGetBootAndSystemDriverState(VOID
);
128 VOID
ScmAutoStartServices(VOID
);
129 VOID
ScmAutoShutdownServices(VOID
);
130 DWORD
ScmStartService(PSERVICE Service
,
134 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
135 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
136 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
137 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
138 PSERVICE
*lpServiceRecord
);
139 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
140 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
142 DWORD
ScmControlService(PSERVICE Service
,
145 BOOL
ScmLockDatabaseExclusive(VOID
);
146 BOOL
ScmLockDatabaseShared(VOID
);
147 VOID
ScmUnlockDatabase(VOID
);
149 VOID
ScmInitNamedPipeCriticalSection(VOID
);
150 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
155 DWORD
ScmLoadDriver(PSERVICE lpService
);
156 DWORD
ScmUnloadDriver(PSERVICE lpService
);
157 DWORD
ScmControlDriver(PSERVICE lpService
,
159 LPSERVICE_STATUS lpServiceStatus
);
164 DWORD
ScmCreateGroupList(VOID
);
165 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
166 LPCWSTR lpGroupName
);
170 DWORD
ScmAcquireServiceStartLock(IN BOOL IsServiceController
,
171 OUT LPSC_RPC_LOCK lpLock
);
172 DWORD
ScmReleaseServiceStartLock(IN OUT LPSC_RPC_LOCK lpLock
);
173 VOID
ScmQueryServiceLockStatusW(OUT LPQUERY_SERVICE_LOCK_STATUSW lpLockStatus
);
174 VOID
ScmQueryServiceLockStatusA(OUT LPQUERY_SERVICE_LOCK_STATUSA lpLockStatus
);
179 VOID
ScmStartRpcServer(VOID
);
184 VOID
PrintString(LPCSTR fmt
, ...);
185 VOID
ScmLogError(DWORD dwEventId
,
188 VOID
ScmWaitForLsa(VOID
);