5 /* INCLUDES ****************************************************************/
19 /* GLOBALS *****************************************************************/
21 #define MANAGER_TAG 0x72674D68 /* 'hMgr' */
22 #define SERVICE_TAG 0x63765368 /* 'hSvc' */
24 typedef struct _SCMGR_HANDLE
32 typedef struct _MANAGER_HANDLE
36 /* FIXME: Insert more data here */
38 WCHAR DatabaseName
[1];
39 } MANAGER_HANDLE
, *PMANAGER_HANDLE
;
42 typedef struct _SERVICE_HANDLE
47 PVOID DatabaseEntry
; /* FIXME */
49 /* FIXME: Insert more data here */
51 } SERVICE_HANDLE
, *PSERVICE_HANDLE
;
54 /* FUNCTIONS ***************************************************************/
57 ScmStartRpcServer(VOID
)
61 DPRINT("ScmStartRpcServer() called");
63 Status
= RpcServerUseProtseqEp(L
"ncacn_np",
67 if (Status
!= RPC_S_OK
)
69 DPRINT1("RpcServerUseProtseqEp() failed (Status %lx)\n", Status
);
73 Status
= RpcServerRegisterIf(svcctl_ServerIfHandle
,
76 if (Status
!= RPC_S_OK
)
78 DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
82 Status
= RpcServerListen(1, 20, TRUE
);
83 if (Status
!= RPC_S_OK
)
85 DPRINT1("RpcServerListen() failed (Status %lx)\n", Status
);
89 DPRINT("ScmStartRpcServer() done");
94 ScmCreateManagerHandle(LPWSTR lpDatabaseName
,
96 DWORD dwDesiredAccess
)
100 Ptr
= GlobalAlloc(GPTR
,
101 sizeof(MANAGER_HANDLE
) + wcslen(lpDatabaseName
) * sizeof(WCHAR
));
103 return ERROR_NOT_ENOUGH_MEMORY
;
105 Ptr
->Handle
.Tag
= MANAGER_TAG
;
106 Ptr
->Handle
.RefCount
= 1;
107 Ptr
->Handle
.DesiredAccess
= dwDesiredAccess
;
109 /* FIXME: initialize more data here */
111 wcscpy(Ptr
->DatabaseName
, lpDatabaseName
);
113 *Handle
= (SC_HANDLE
)Ptr
;
115 return ERROR_SUCCESS
;
120 ScmCreateServiceHandle(LPVOID lpDatabaseEntry
,
122 DWORD dwDesiredAccess
)
126 Ptr
= GlobalAlloc(GPTR
,
127 sizeof(SERVICE_HANDLE
));
129 return ERROR_NOT_ENOUGH_MEMORY
;
131 Ptr
->Handle
.Tag
= SERVICE_TAG
;
132 Ptr
->Handle
.RefCount
= 1;
133 Ptr
->Handle
.DesiredAccess
= dwDesiredAccess
;
135 /* FIXME: initialize more data here */
136 // Ptr->DatabaseEntry = lpDatabaseEntry;
138 *Handle
= (SC_HANDLE
)Ptr
;
140 return ERROR_SUCCESS
;
146 ScmrCloseServiceHandle(handle_t BindingHandle
,
147 unsigned int hScObject
)
149 PMANAGER_HANDLE hManager
;
151 DPRINT("ScmrCloseServiceHandle() called\n");
153 DPRINT("hScObject = %X\n", hScObject
);
156 return ERROR_INVALID_HANDLE
;
158 hManager
= (PMANAGER_HANDLE
)hScObject
;
159 if (hManager
->Handle
.Tag
== MANAGER_TAG
)
161 DPRINT("Found manager handle\n");
163 hManager
->Handle
.RefCount
--;
164 if (hManager
->Handle
.RefCount
== 0)
166 /* FIXME: add cleanup code */
168 GlobalFree(hManager
);
171 DPRINT("ScmrCloseServiceHandle() done\n");
172 return ERROR_SUCCESS
;
174 else if (hManager
->Handle
.Tag
== SERVICE_TAG
)
176 DPRINT("Found service handle\n");
178 hManager
->Handle
.RefCount
--;
179 if (hManager
->Handle
.RefCount
== 0)
181 /* FIXME: add cleanup code */
183 GlobalFree(hManager
);
186 DPRINT("ScmrCloseServiceHandle() done\n");
187 return ERROR_SUCCESS
;
190 DPRINT1("Invalid handle tag (Tag %lx)\n", hManager
->Handle
.Tag
);
192 return ERROR_INVALID_HANDLE
;
199 ScmrControlService(handle_t BindingHandle
,
200 unsigned int hService
,
201 unsigned long dwControl
,
202 LPSERVICE_STATUS lpServiceStatus
)
204 DPRINT("ScmrControlService() called\n");
207 lpServiceStatus
->dwServiceType
= 0x12345678;
208 lpServiceStatus
->dwCurrentState
= 0x98765432;
209 lpServiceStatus
->dwControlsAccepted
= 0xdeadbabe;
210 lpServiceStatus
->dwWin32ExitCode
= 0xbaadf00d;
211 lpServiceStatus
->dwServiceSpecificExitCode
= 0xdeadf00d;
212 lpServiceStatus
->dwCheckPoint
= 0xbaadbabe;
213 lpServiceStatus
->dwWaitHint
= 0x2468ACE1;
223 ScmrDeleteService(handle_t BindingHandle
,
224 unsigned int hService
)
226 DPRINT("ScmrDeleteService() called\n");
227 return ERROR_SUCCESS
;
232 ScmrOpenSCManagerA(handle_t BindingHandle
,
234 char *lpDatabaseName
,
235 unsigned long dwDesiredAccess
,
238 DPRINT("ScmrOpenSCManagerA() called\n");
239 return ERROR_SUCCESS
;
244 ScmrOpenSCManagerW(handle_t BindingHandle
,
245 wchar_t *lpMachineName
,
246 wchar_t *lpDatabaseName
,
247 unsigned long dwDesiredAccess
,
253 DPRINT("ScmrOpenSCManagerW() called\n");
254 DPRINT("lpMachineName = %p\n", lpMachineName
);
255 DPRINT("lpMachineName: %S\n", lpMachineName
);
256 DPRINT("lpDataBaseName = %p\n", lpDatabaseName
);
257 DPRINT("lpDataBaseName: %S\n", lpDatabaseName
);
258 DPRINT("dwDesiredAccess = %x\n", dwDesiredAccess
);
260 dwError
= ScmCreateManagerHandle(lpDatabaseName
,
263 if (dwError
!= ERROR_SUCCESS
)
265 DPRINT1("ScmCreateManagerHandle() failed (Error %lu)\n", dwError
);
269 *hScm
= (unsigned int)hHandle
;
270 DPRINT("*hScm = %x\n", *hScm
);
272 DPRINT("ScmrOpenSCManagerW() done\n");
274 return ERROR_SUCCESS
;
279 ScmrOpenServiceA(handle_t BindingHandle
,
280 unsigned int hSCManager
,
282 unsigned long dwDesiredAccess
,
283 unsigned int *hService
)
285 DPRINT("ScmrOpenServiceA() called\n");
291 ScmrOpenServiceW(handle_t BindingHandle
,
292 unsigned int hSCManager
,
293 wchar_t *lpServiceName
,
294 unsigned long dwDesiredAccess
,
295 unsigned int *hService
)
297 PMANAGER_HANDLE hManager
;
301 DPRINT("ScmrOpenServiceW() called\n");
302 DPRINT("hSCManager = %x\n", hSCManager
);
303 DPRINT("lpServiceName = %p\n", lpServiceName
);
304 DPRINT("lpServiceName: %S\n", lpServiceName
);
305 DPRINT("dwDesiredAccess = %x\n", dwDesiredAccess
);
307 hManager
= (PMANAGER_HANDLE
)hSCManager
;
308 if (hManager
->Handle
.Tag
!= MANAGER_TAG
)
310 DPRINT1("Invalid manager handle!\n");
311 return ERROR_INVALID_HANDLE
;
314 /* FIXME: Check desired access */
316 /* FIXME: Get service database entry */
318 /* Create a service handle */
319 dwError
= ScmCreateServiceHandle(NULL
,
322 if (dwError
!= ERROR_SUCCESS
)
324 DPRINT1("ScmCreateServiceHandle() failed (Error %lu)\n", dwError
);
328 *hService
= (unsigned int)hHandle
;
329 DPRINT("*hService = %x\n", *hService
);
331 DPRINT("ScmrOpenServiceW() done\n");
333 return ERROR_SUCCESS
;
338 void __RPC_FAR
* __RPC_USER
midl_user_allocate(size_t len
)
340 return GlobalAlloc(GPTR
, len
);
344 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)