2 * Win32 advapi functions
4 * Copyright 1995 Sven Verdoolaege
14 #include "debugtools.h"
16 DEFAULT_DEBUG_CHANNEL(advapi
)
18 /******************************************************************************
19 * EnumServicesStatus32A [ADVAPI32.38]
22 EnumServicesStatusA( SC_HANDLE hSCManager
, DWORD dwServiceType
,
23 DWORD dwServiceState
, LPENUM_SERVICE_STATUSA lpServices
,
24 DWORD cbBufSize
, LPDWORD pcbBytesNeeded
,
25 LPDWORD lpServicesReturned
, LPDWORD lpResumeHandle
)
26 { FIXME("%x type=%lx state=%lx %p %lx %p %p %p\n", hSCManager
,
27 dwServiceType
, dwServiceState
, lpServices
, cbBufSize
,
28 pcbBytesNeeded
, lpServicesReturned
, lpResumeHandle
);
29 SetLastError (ERROR_ACCESS_DENIED
);
33 /******************************************************************************
34 * StartServiceCtrlDispatcher32A [ADVAPI32.196]
37 StartServiceCtrlDispatcherA( LPSERVICE_TABLE_ENTRYA servent
)
38 { LPSERVICE_TABLE_ENTRYA ptr
= servent
;
40 while (ptr
->lpServiceName
)
41 { FIXME("%s at %p\n", ptr
->lpServiceName
, ptr
);
47 /******************************************************************************
48 * StartServiceCtrlDispatcher32W [ADVAPI32.197]
54 StartServiceCtrlDispatcherW( LPSERVICE_TABLE_ENTRYW servent
)
55 { LPSERVICE_TABLE_ENTRYW ptr
= servent
;
56 LPSERVICE_MAIN_FUNCTIONW fpMain
;
58 while (ptr
->lpServiceName
)
59 { FIXME("%s at %p): STUB.\n", debugstr_w(ptr
->lpServiceName
),ptr
);
60 fpMain
= ptr
->lpServiceProc
;
61 fpMain(0,NULL
); /* try to start the service */
67 /******************************************************************************
68 * RegisterServiceCtrlHandlerA [ADVAPI32.176]
70 SERVICE_STATUS_HANDLE WINAPI
71 RegisterServiceCtrlHandlerA( LPCSTR lpServiceName
,
72 LPHANDLER_FUNCTION lpfHandler
)
73 { FIXME("%s %p\n", lpServiceName
, lpfHandler
);
77 /******************************************************************************
78 * RegisterServiceCtrlHandlerW [ADVAPI32.177]
84 SERVICE_STATUS_HANDLE WINAPI
85 RegisterServiceCtrlHandlerW( LPCWSTR lpServiceName
,
86 LPHANDLER_FUNCTION lpfHandler
)
87 { FIXME("%s %p\n", debugstr_w(lpServiceName
), lpfHandler
);
91 /******************************************************************************
92 * SetServiceStatus [ADVAPI32.192]
99 SetServiceStatus( SERVICE_STATUS_HANDLE hService
, LPSERVICE_STATUS lpStatus
)
100 { FIXME("%lx %p\n",hService
, lpStatus
);
101 TRACE("\tType:%lx\n",lpStatus
->dwServiceType
);
102 TRACE("\tState:%lx\n",lpStatus
->dwCurrentState
);
103 TRACE("\tControlAccepted:%lx\n",lpStatus
->dwControlsAccepted
);
104 TRACE("\tExitCode:%lx\n",lpStatus
->dwWin32ExitCode
);
105 TRACE("\tServiceExitCode:%lx\n",lpStatus
->dwServiceSpecificExitCode
);
106 TRACE("\tCheckPoint:%lx\n",lpStatus
->dwCheckPoint
);
107 TRACE("\tWaitHint:%lx\n",lpStatus
->dwWaitHint
);
111 /******************************************************************************
112 * OpenSCManager32A [ADVAPI32.110]
115 OpenSCManagerA( LPCSTR lpMachineName
, LPCSTR lpDatabaseName
,
116 DWORD dwDesiredAccess
)
118 LPWSTR lpMachineNameW
= HEAP_strdupAtoW(GetProcessHeap(),0,lpMachineName
);
119 LPWSTR lpDatabaseNameW
= HEAP_strdupAtoW(GetProcessHeap(),0,lpDatabaseName
);
120 DWORD ret
= OpenSCManagerW(lpMachineNameW
,lpDatabaseNameW
,
122 HeapFree(GetProcessHeap(),0,lpDatabaseNameW
);
123 HeapFree(GetProcessHeap(),0,lpMachineNameW
);
127 /******************************************************************************
128 * OpenSCManager32W [ADVAPI32.111]
129 * Establishes a connection to the service control manager and opens database
132 * This should return a SC_HANDLE
135 * lpMachineName [I] Pointer to machine name string
136 * lpDatabaseName [I] Pointer to database name string
137 * dwDesiredAccess [I] Type of access
140 * Success: Handle to service control manager database
144 OpenSCManagerW( LPCWSTR lpMachineName
, LPCWSTR lpDatabaseName
,
145 DWORD dwDesiredAccess
)
150 TRACE("(%s,%s,0x%08lx)\n", debugstr_w(lpMachineName
),
151 debugstr_w(lpDatabaseName
), dwDesiredAccess
);
154 * FIXME: what is lpDatabaseName?
155 * It should be set to "SERVICES_ACTIVE_DATABASE" according to
156 * docs, but what if it isn't?
159 r
= RegConnectRegistryW(lpMachineName
,HKEY_LOCAL_MACHINE
,&hKey
);
160 if (r
!=ERROR_SUCCESS
)
163 TRACE("returning %x\n",hKey
);
169 /******************************************************************************
170 * AllocateLocallyUniqueId [ADVAPI32.12]
176 AllocateLocallyUniqueId( PLUID lpluid
)
178 lpluid
->s
.LowPart
= time(NULL
);
179 lpluid
->s
.HighPart
= 0;
184 /******************************************************************************
185 * ControlService [ADVAPI32.23]
186 * Sends a control code to a Win32-based service.
196 ControlService( SC_HANDLE hService
, DWORD dwControl
,
197 LPSERVICE_STATUS lpServiceStatus
)
199 FIXME("(%d,%ld,%p): stub\n",hService
,dwControl
,lpServiceStatus
);
204 /******************************************************************************
205 * CloseServiceHandle [ADVAPI32.22]
206 * Close handle to service or service control manager
209 * hSCObject [I] Handle to service or service control manager database
214 CloseServiceHandle( SC_HANDLE hSCObject
)
216 TRACE("(%x)\n", hSCObject
);
218 RegCloseKey(hSCObject
);
224 /******************************************************************************
225 * OpenService32A [ADVAPI32.112]
228 OpenServiceA( SC_HANDLE hSCManager
, LPCSTR lpServiceName
,
229 DWORD dwDesiredAccess
)
231 LPWSTR lpServiceNameW
= HEAP_strdupAtoW(GetProcessHeap(),0,lpServiceName
);
235 TRACE("Request for service %s\n",lpServiceName
);
238 ret
= OpenServiceW( hSCManager
, lpServiceNameW
, dwDesiredAccess
);
239 HeapFree(GetProcessHeap(),0,lpServiceNameW
);
244 /******************************************************************************
245 * OpenService32W [ADVAPI32.113]
246 * Opens a handle to an existing service
254 * Success: Handle to the service
258 OpenServiceW(SC_HANDLE hSCManager
, LPCWSTR lpServiceName
,
259 DWORD dwDesiredAccess
)
261 const char *str
= "System\\CurrentControlSet\\Services\\";
262 WCHAR lpServiceKey
[80]; /* FIXME: this should be dynamically allocated */
266 TRACE("(%d,%p,%ld)\n",hSCManager
, lpServiceName
,
269 lstrcpyAtoW(lpServiceKey
,str
);
270 lstrcatW(lpServiceKey
,lpServiceName
);
272 TRACE("Opening reg key %s\n", debugstr_w(lpServiceKey
));
274 /* FIXME: dwDesiredAccess may need some processing */
275 r
= RegOpenKeyExW(hSCManager
, lpServiceKey
, 0, dwDesiredAccess
, &hKey
);
276 if (r
!=ERROR_SUCCESS
)
279 TRACE("returning %x\n",hKey
);
285 /******************************************************************************
286 * CreateService32A [ADVAPI32.29]
289 CreateServiceA( DWORD hSCManager
, LPCSTR lpServiceName
,
290 LPCSTR lpDisplayName
, DWORD dwDesiredAccess
,
291 DWORD dwServiceType
, DWORD dwStartType
,
292 DWORD dwErrorControl
, LPCSTR lpBinaryPathName
,
293 LPCSTR lpLoadOrderGroup
, LPDWORD lpdwTagId
,
294 LPCSTR lpDependencies
, LPCSTR lpServiceStartName
,
297 FIXME("(%ld,%s,%s,...): stub\n",
298 hSCManager
, debugstr_a(lpServiceName
), debugstr_a(lpDisplayName
));
303 /******************************************************************************
304 * DeleteService [ADVAPI32.31]
307 * hService [I] Handle to service
313 DeleteService( SC_HANDLE hService
)
315 FIXME("(%d): stub\n",hService
);
320 /******************************************************************************
321 * StartService32A [ADVAPI32.195]
324 * How do we convert lpServiceArgVectors to use the 32W version?
327 StartServiceA( SC_HANDLE hService
, DWORD dwNumServiceArgs
,
328 LPCSTR
*lpServiceArgVectors
)
330 FIXME("(%d,%ld,%p): stub\n",hService
,dwNumServiceArgs
,lpServiceArgVectors
);
335 /******************************************************************************
336 * StartService32W [ADVAPI32.198]
340 * hService [I] Handle of service
341 * dwNumServiceArgs [I] Number of arguments
342 * lpServiceArgVectors [I] Address of array of argument string pointers
348 StartServiceW( SC_HANDLE hService
, DWORD dwNumServiceArgs
,
349 LPCWSTR
*lpServiceArgVectors
)
351 FIXME("(%d,%ld,%p): stub\n",hService
,dwNumServiceArgs
,
352 lpServiceArgVectors
);
356 /******************************************************************************
357 * QueryServiceStatus [ADVAPI32.123]
365 QueryServiceStatus( SC_HANDLE hService
, LPSERVICE_STATUS lpservicestatus
)
368 DWORD type
, val
, size
;
370 FIXME("(%x,%p) partial\n",hService
,lpservicestatus
);
372 /* read the service type from the registry */
374 r
= RegQueryValueExA(hService
, "Type", NULL
, &type
, (LPBYTE
)&val
, &size
);
377 ERR("invalid Type\n");
380 lpservicestatus
->dwServiceType
= val
;
382 /* FIXME: how are these determined or read from the registry? */
383 lpservicestatus
->dwCurrentState
= 0 /*SERVICE_STOPPED*/;
384 lpservicestatus
->dwControlsAccepted
= 0;
385 lpservicestatus
->dwWin32ExitCode
= NO_ERROR
;
386 lpservicestatus
->dwServiceSpecificExitCode
= 0;
387 lpservicestatus
->dwCheckPoint
= 0;
388 lpservicestatus
->dwWaitHint
= 0;