6 #define WIN32_NO_STATUS
10 #include <ndk/ntndk.h>
11 #include <services/services.h>
14 typedef struct _SERVICE_GROUP
16 LIST_ENTRY GroupListEntry
;
20 BOOLEAN ServicesRunning
;
25 } SERVICE_GROUP
, *PSERVICE_GROUP
;
28 typedef struct _SERVICE_IMAGE
30 DWORD dwServiceRefCount
; // Number of running services of this image
32 } SERVICE_IMAGE
, *PSERVICE_IMAGE
;
35 typedef struct _SERVICE
37 LIST_ENTRY ServiceListEntry
;
40 PSERVICE_GROUP lpGroup
;
41 PSERVICE_IMAGE lpImage
;
46 SERVICE_STATUS Status
;
53 PSECURITY_DESCRIPTOR lpSecurityDescriptor
;
55 BOOLEAN ServiceVisited
;
57 HANDLE ControlPipeHandle
;
61 WCHAR szServiceName
[1];
65 /* VARIABLES ***************************************************************/
67 extern LIST_ENTRY ServiceListHead
;
68 extern LIST_ENTRY GroupListHead
;
69 extern BOOL ScmShutdown
;
72 /* FUNCTIONS ***************************************************************/
76 DWORD
ScmOpenServiceKey(LPWSTR lpServiceName
,
80 DWORD
ScmCreateServiceKey(LPCWSTR lpServiceName
,
84 DWORD
ScmWriteDependencies(HKEY hServiceKey
,
85 LPWSTR lpDependencies
,
86 DWORD dwDependenciesLength
);
88 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
89 BOOL
ScmIsDeleteFlagSet(HKEY hServiceKey
);
91 DWORD
ScmReadString(HKEY hServiceKey
,
96 ScmReadDependencies(HKEY hServiceKey
,
97 LPWSTR
*lpDependencies
,
98 DWORD
*lpdwDependenciesLength
);
103 DWORD
ScmCreateServiceDatabase(VOID
);
104 VOID
ScmShutdownServiceDatabase(VOID
);
105 VOID
ScmGetBootAndSystemDriverState(VOID
);
106 VOID
ScmAutoStartServices(VOID
);
107 VOID
ScmAutoShutdownServices(VOID
);
108 DWORD
ScmStartService(PSERVICE Service
,
112 PSERVICE
ScmGetServiceEntryByName(LPCWSTR lpServiceName
);
113 PSERVICE
ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName
);
114 PSERVICE
ScmGetServiceEntryByResumeCount(DWORD dwResumeCount
);
115 DWORD
ScmCreateNewServiceRecord(LPCWSTR lpServiceName
,
116 PSERVICE
*lpServiceRecord
);
117 VOID
ScmDeleteServiceRecord(PSERVICE lpService
);
118 DWORD
ScmMarkServiceForDelete(PSERVICE pService
);
120 DWORD
ScmControlService(PSERVICE Service
,
123 BOOL
ScmLockDatabaseExclusive(VOID
);
124 BOOL
ScmLockDatabaseShared(VOID
);
125 VOID
ScmUnlockDatabase(VOID
);
127 VOID
ScmInitNamedPipeCriticalSection(VOID
);
128 VOID
ScmDeleteNamedPipeCriticalSection(VOID
);
133 DWORD
ScmLoadDriver(PSERVICE lpService
);
134 DWORD
ScmUnloadDriver(PSERVICE lpService
);
135 DWORD
ScmControlDriver(PSERVICE lpService
,
137 LPSERVICE_STATUS lpServiceStatus
);
142 DWORD
ScmCreateGroupList(VOID
);
143 DWORD
ScmSetServiceGroup(PSERVICE lpService
,
144 LPCWSTR lpGroupName
);
149 VOID
ScmStartRpcServer(VOID
);
154 VOID
PrintString(LPCSTR fmt
, ...);
155 VOID
ScmLogError(DWORD dwEventId
,