5 /* INCLUDES *****************************************************************/
12 /* FUNCTIONS *****************************************************************/
16 ScmOpenServiceKey(LPWSTR lpServiceName
,
20 HKEY hServicesKey
= NULL
;
25 dwError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
26 L
"System\\CurrentControlSet\\Services",
30 if (dwError
!= ERROR_SUCCESS
)
33 dwError
= RegOpenKeyExW(hServicesKey
,
39 RegCloseKey(hServicesKey
);
46 ScmCreateServiceKey(LPWSTR lpServiceName
,
50 HKEY hServicesKey
= NULL
;
56 dwError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
57 L
"System\\CurrentControlSet\\Services",
59 KEY_READ
| KEY_CREATE_SUB_KEY
,
61 if (dwError
!= ERROR_SUCCESS
)
64 dwError
= RegCreateKeyExW(hServicesKey
,
68 REG_OPTION_NON_VOLATILE
,
74 if ((dwError
== ERROR_SUCCESS
) &&
75 (dwDisposition
== REG_OPENED_EXISTING_KEY
))
79 dwError
= ERROR_SERVICE_EXISTS
;
83 RegCloseKey(hServicesKey
);
91 ScmWriteDependencies(HKEY hServiceKey
,
92 LPWSTR lpDependencies
,
93 DWORD dwDependenciesLength
)
95 DWORD dwError
= ERROR_SUCCESS
;
96 DWORD dwGroupLength
= 0;
97 DWORD dwServiceLength
= 0;
100 LPWSTR lpServiceDeps
;
104 if (*lpDependencies
== 0)
106 RegDeleteValue(hServiceKey
,
108 RegDeleteValue(hServiceKey
,
113 lpGroupDeps
= HeapAlloc(GetProcessHeap(),
115 (dwDependenciesLength
+ 2) * sizeof(WCHAR
));
116 if (lpGroupDeps
== NULL
)
117 return ERROR_NOT_ENOUGH_MEMORY
;
119 lpSrc
= lpDependencies
;
123 dwLength
= wcslen(lpSrc
);
124 if (*lpSrc
== SC_GROUP_IDENTIFIERW
)
127 dwGroupLength
+= dwLength
;
128 wcscpy(lpDst
, lpSrc
);
129 lpDst
= lpDst
+ dwLength
;
132 lpSrc
= lpSrc
+ dwLength
;
138 lpSrc
= lpDependencies
;
139 lpServiceDeps
= lpDst
;
142 dwLength
= wcslen(lpSrc
) + 1;
143 if (*lpSrc
!= SC_GROUP_IDENTIFIERW
)
145 dwServiceLength
+= dwLength
;
146 wcscpy(lpDst
, lpSrc
);
147 lpDst
= lpDst
+ dwLength
;
150 lpSrc
= lpSrc
+ dwLength
;
155 dwError
= RegSetValueExW(hServiceKey
,
160 dwGroupLength
* sizeof(WCHAR
));
162 if (dwError
== ERROR_SUCCESS
)
164 dwError
= RegSetValueExW(hServiceKey
,
168 (LPBYTE
)lpServiceDeps
,
169 dwServiceLength
* sizeof(WCHAR
));
172 HeapFree(GetProcessHeap(), 0, lpGroupDeps
);
180 ScmMarkServiceForDelete(PSERVICE pService
)
182 HKEY hServiceKey
= NULL
;
186 DPRINT("ScmMarkServiceForDelete() called\n");
188 dwError
= ScmOpenServiceKey(pService
->lpServiceName
,
191 if (dwError
!= ERROR_SUCCESS
)
194 dwError
= RegSetValueExW(hServiceKey
,
201 RegCloseKey(hServiceKey
);
208 ScmIsDeleteFlagSet(HKEY hServiceKey
)
213 DWORD dwSize
= sizeof(DWORD
);
215 dwError
= RegQueryValueExW(hServiceKey
,
222 return (dwError
== ERROR_SUCCESS
);
227 ScmReadString(HKEY hServiceKey
,
235 LPWSTR expanded
= NULL
;
241 dwError
= RegQueryValueExW(hServiceKey
,
247 if (dwError
!= ERROR_SUCCESS
)
250 ptr
= HeapAlloc(GetProcessHeap(), 0, dwSize
);
252 return ERROR_NOT_ENOUGH_MEMORY
;
254 dwError
= RegQueryValueExW(hServiceKey
,
260 if (dwError
!= ERROR_SUCCESS
)
263 if (dwType
== REG_EXPAND_SZ
)
265 /* Expand the value... */
266 dwSizeNeeded
= ExpandEnvironmentStringsW((LPCWSTR
)ptr
, NULL
, 0);
267 if (dwSizeNeeded
== 0)
269 dwError
= GetLastError();
272 expanded
= HeapAlloc(GetProcessHeap(), 0, dwSizeNeeded
);
273 if (dwSizeNeeded
< ExpandEnvironmentStringsW((LPCWSTR
)ptr
, expanded
, dwSizeNeeded
))
275 dwError
= GetLastError();
279 HeapFree(GetProcessHeap(), 0, ptr
);
280 dwError
= ERROR_SUCCESS
;
284 *lpValue
= (LPWSTR
)ptr
;
288 if (dwError
!= ERROR_SUCCESS
)
290 HeapFree(GetProcessHeap(), 0, ptr
);
291 HeapFree(GetProcessHeap(), 0, expanded
);