5 /* INCLUDES ****************************************************************/
14 /* GLOBALS *****************************************************************/
16 #define MANAGER_TAG 0x72674D68 /* 'hMgr' */
17 #define SERVICE_TAG 0x63765368 /* 'hSvc' */
19 typedef struct _SCMGR_HANDLE
27 typedef struct _MANAGER_HANDLE
31 /* FIXME: Insert more data here */
33 WCHAR DatabaseName
[1];
34 } MANAGER_HANDLE
, *PMANAGER_HANDLE
;
37 typedef struct _SERVICE_HANDLE
42 PSERVICE ServiceEntry
;
44 /* FIXME: Insert more data here */
46 } SERVICE_HANDLE
, *PSERVICE_HANDLE
;
49 #define SC_MANAGER_READ \
50 (STANDARD_RIGHTS_READ | \
51 SC_MANAGER_QUERY_LOCK_STATUS | \
52 SC_MANAGER_ENUMERATE_SERVICE)
54 #define SC_MANAGER_WRITE \
55 (STANDARD_RIGHTS_WRITE | \
56 SC_MANAGER_MODIFY_BOOT_CONFIG | \
57 SC_MANAGER_CREATE_SERVICE)
59 #define SC_MANAGER_EXECUTE \
60 (STANDARD_RIGHTS_EXECUTE | \
62 SC_MANAGER_ENUMERATE_SERVICE | \
63 SC_MANAGER_CONNECT | \
64 SC_MANAGER_CREATE_SERVICE)
67 #define SERVICE_READ \
68 (STANDARD_RIGHTS_READ | \
69 SERVICE_INTERROGATE | \
70 SERVICE_ENUMERATE_DEPENDENTS | \
71 SERVICE_QUERY_STATUS | \
74 #define SERVICE_WRITE \
75 (STANDARD_RIGHTS_WRITE | \
76 SERVICE_CHANGE_CONFIG)
78 #define SERVICE_EXECUTE \
79 (STANDARD_RIGHTS_EXECUTE | \
80 SERVICE_USER_DEFINED_CONTROL | \
81 SERVICE_PAUSE_CONTINUE | \
86 /* VARIABLES ***************************************************************/
88 static GENERIC_MAPPING
89 ScmManagerMapping
= {SC_MANAGER_READ
,
92 SC_MANAGER_ALL_ACCESS
};
94 static GENERIC_MAPPING
95 ScmServiceMapping
= {SERVICE_READ
,
98 SC_MANAGER_ALL_ACCESS
};
101 /* FUNCTIONS ***************************************************************/
104 ScmStartRpcServer(VOID
)
108 DPRINT("ScmStartRpcServer() called");
110 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
114 if (Status
!= RPC_S_OK
)
116 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
120 Status
= RpcServerRegisterIf(svcctl_ServerIfHandle
,
123 if (Status
!= RPC_S_OK
)
125 DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
129 Status
= RpcServerListen(1, 20, TRUE
);
130 if (Status
!= RPC_S_OK
)
132 DPRINT1("RpcServerListen() failed (Status %lx)\n", Status
);
136 DPRINT("ScmStartRpcServer() done");
141 ScmCreateManagerHandle(LPWSTR lpDatabaseName
,
146 if (lpDatabaseName
== NULL
)
147 lpDatabaseName
= SERVICES_ACTIVE_DATABASEW
;
149 Ptr
= HeapAlloc(GetProcessHeap(),
151 sizeof(MANAGER_HANDLE
) + wcslen(lpDatabaseName
) * sizeof(WCHAR
));
153 return ERROR_NOT_ENOUGH_MEMORY
;
155 Ptr
->Handle
.Tag
= MANAGER_TAG
;
156 Ptr
->Handle
.RefCount
= 1;
158 /* FIXME: initialize more data here */
160 wcscpy(Ptr
->DatabaseName
, lpDatabaseName
);
162 *Handle
= (SC_HANDLE
)Ptr
;
164 return ERROR_SUCCESS
;
169 ScmCreateServiceHandle(PSERVICE lpServiceEntry
,
174 Ptr
= HeapAlloc(GetProcessHeap(),
176 sizeof(SERVICE_HANDLE
));
178 return ERROR_NOT_ENOUGH_MEMORY
;
180 Ptr
->Handle
.Tag
= SERVICE_TAG
;
181 Ptr
->Handle
.RefCount
= 1;
183 /* FIXME: initialize more data here */
184 Ptr
->ServiceEntry
= lpServiceEntry
;
186 *Handle
= (SC_HANDLE
)Ptr
;
188 return ERROR_SUCCESS
;
193 ScmCheckAccess(SC_HANDLE Handle
,
194 DWORD dwDesiredAccess
)
196 PMANAGER_HANDLE hMgr
;
198 hMgr
= (PMANAGER_HANDLE
)Handle
;
199 if (hMgr
->Handle
.Tag
== MANAGER_TAG
)
201 RtlMapGenericMask(&dwDesiredAccess
,
204 hMgr
->Handle
.DesiredAccess
= dwDesiredAccess
;
206 return ERROR_SUCCESS
;
208 else if (hMgr
->Handle
.Tag
== SERVICE_TAG
)
210 RtlMapGenericMask(&dwDesiredAccess
,
213 hMgr
->Handle
.DesiredAccess
= dwDesiredAccess
;
215 return ERROR_SUCCESS
;
218 return ERROR_INVALID_HANDLE
;
224 ScmrCloseServiceHandle(handle_t BindingHandle
,
225 unsigned int hScObject
)
227 PMANAGER_HANDLE hManager
;
229 DPRINT("ScmrCloseServiceHandle() called\n");
231 DPRINT("hScObject = %X\n", hScObject
);
234 return ERROR_INVALID_HANDLE
;
236 hManager
= (PMANAGER_HANDLE
)hScObject
;
237 if (hManager
->Handle
.Tag
== MANAGER_TAG
)
239 DPRINT("Found manager handle\n");
241 hManager
->Handle
.RefCount
--;
242 if (hManager
->Handle
.RefCount
== 0)
244 /* FIXME: add cleanup code */
246 HeapFree(GetProcessHeap(), 0, hManager
);
249 DPRINT("ScmrCloseServiceHandle() done\n");
250 return ERROR_SUCCESS
;
252 else if (hManager
->Handle
.Tag
== SERVICE_TAG
)
254 DPRINT("Found service handle\n");
256 hManager
->Handle
.RefCount
--;
257 if (hManager
->Handle
.RefCount
== 0)
259 /* FIXME: add cleanup code */
261 HeapFree(GetProcessHeap(), 0, hManager
);
264 DPRINT("ScmrCloseServiceHandle() done\n");
265 return ERROR_SUCCESS
;
268 DPRINT1("Invalid handle tag (Tag %lx)\n", hManager
->Handle
.Tag
);
270 return ERROR_INVALID_HANDLE
;
276 ScmrControlService(handle_t BindingHandle
,
277 unsigned int hService
,
278 unsigned long dwControl
,
279 LPSERVICE_STATUS lpServiceStatus
)
281 PSERVICE_HANDLE hSvc
;
284 DPRINT1("ScmrControlService() called\n");
286 hSvc
= (PSERVICE_HANDLE
)hService
;
287 if (hSvc
->Handle
.Tag
!= SERVICE_TAG
)
289 DPRINT1("Invalid handle tag!\n");
290 return ERROR_INVALID_HANDLE
;
294 /* FIXME: Check access rights */
297 lpService
= hSvc
->ServiceEntry
;
298 if (lpService
== NULL
)
300 DPRINT1("lpService == NULL!\n");
301 return ERROR_INVALID_HANDLE
;
305 /* FIXME: Send control code to the service */
308 /* Return service status information */
309 RtlCopyMemory(lpServiceStatus
,
311 sizeof(SERVICE_STATUS
));
313 return ERROR_SUCCESS
;
319 ScmrDeleteService(handle_t BindingHandle
,
320 unsigned int hService
)
322 PSERVICE_HANDLE hSvc
;
326 DPRINT1("ScmrDeleteService() called\n");
328 hSvc
= (PSERVICE_HANDLE
)hService
;
329 if (hSvc
->Handle
.Tag
!= SERVICE_TAG
)
330 return ERROR_INVALID_HANDLE
;
332 if (!RtlAreAllAccessesGranted(hSvc
->Handle
.DesiredAccess
,
333 STANDARD_RIGHTS_REQUIRED
))
334 return ERROR_ACCESS_DENIED
;
336 lpService
= hSvc
->ServiceEntry
;
337 if (lpService
== NULL
)
339 DPRINT1("lpService == NULL!\n");
340 return ERROR_INVALID_HANDLE
;
343 /* FIXME: Acquire service database lock exclusively */
345 /* Mark service for delete */
346 dwError
= ScmMarkServiceForDelete(lpService
);
348 /* FIXME: Release service database lock */
350 DPRINT1("ScmrDeleteService() done\n");
358 ScmrLockServiceDatabase(handle_t BindingHandle
,
359 unsigned int hSCManager
,
362 PMANAGER_HANDLE hMgr
;
364 DPRINT("ScmrLockServiceDatabase() called\n");
368 hMgr
= (PMANAGER_HANDLE
)hSCManager
;
369 if (hMgr
->Handle
.Tag
!= MANAGER_TAG
)
370 return ERROR_INVALID_HANDLE
;
372 if (!RtlAreAllAccessesGranted(hMgr
->Handle
.DesiredAccess
,
374 return ERROR_ACCESS_DENIED
;
376 /* FIXME: Lock the database */
377 *hLock
= 0x12345678; /* Dummy! */
379 return ERROR_SUCCESS
;
385 ScmrQueryServiceObjectSecurity(handle_t BindingHandle
)
387 DPRINT1("ScmrQueryServiceSecurity() is unimplemented\n");
388 return ERROR_CALL_NOT_IMPLEMENTED
;
394 ScmrSetServiceObjectSecurity(handle_t BindingHandle
)
396 DPRINT1("ScmrSetServiceSecurity() is unimplemented\n");
397 return ERROR_CALL_NOT_IMPLEMENTED
;
403 ScmrQueryServiceStatus(handle_t BindingHandle
,
404 unsigned int hService
,
405 LPSERVICE_STATUS lpServiceStatus
)
407 PSERVICE_HANDLE hSvc
;
410 DPRINT("ScmrQueryServiceStatus() called\n");
412 hSvc
= (PSERVICE_HANDLE
)hService
;
413 if (hSvc
->Handle
.Tag
!= SERVICE_TAG
)
415 DPRINT1("Invalid handle tag!\n");
416 return ERROR_INVALID_HANDLE
;
419 if (!RtlAreAllAccessesGranted(hSvc
->Handle
.DesiredAccess
,
420 SERVICE_QUERY_STATUS
))
422 DPRINT1("Insufficient access rights! 0x%lx\n", hSvc
->Handle
.DesiredAccess
);
423 return ERROR_ACCESS_DENIED
;
426 lpService
= hSvc
->ServiceEntry
;
427 if (lpService
== NULL
)
429 DPRINT1("lpService == NULL!\n");
430 return ERROR_INVALID_HANDLE
;
433 /* Return service status information */
434 RtlCopyMemory(lpServiceStatus
,
436 sizeof(SERVICE_STATUS
));
438 return ERROR_SUCCESS
;
444 ScmrSetServiceStatus(handle_t BindingHandle
)
446 DPRINT1("ScmrSetServiceStatus() is unimplemented\n");
448 return ERROR_CALL_NOT_IMPLEMENTED
;
454 ScmrUnlockServiceDatabase(handle_t BindingHandle
,
457 DPRINT1("ScmrUnlockServiceDatabase() called\n");
459 return ERROR_SUCCESS
;
465 ScmrNotifyBootConfigStatus(handle_t BindingHandle
,
466 unsigned long BootAcceptable
)
468 DPRINT1("ScmrNotifyBootConfigStatus() called\n");
470 return ERROR_SUCCESS
;
476 ScmrChangeServiceConfigW(handle_t BiningHandle
,
477 unsigned int hService
,
478 unsigned long dwServiceType
,
479 unsigned long dwStartType
,
480 unsigned long dwErrorControl
,
481 wchar_t *lpBinaryPathName
,
482 wchar_t *lpLoadOrderGroup
,
483 unsigned long *lpdwTagId
, /* in, out, unique */
484 wchar_t *lpDependencies
,
485 unsigned long dwDependenciesLength
,
486 wchar_t *lpServiceStartName
,
488 unsigned long dwPasswordLength
,
489 wchar_t *lpDisplayName
)
491 DPRINT1("ScmrChangeServiceConfigW() called\n");
492 DPRINT1("dwServiceType = %lu\n", dwServiceType
);
493 DPRINT1("dwStartType = %lu\n", dwStartType
);
494 DPRINT1("dwErrorControl = %lu\n", dwErrorControl
);
495 DPRINT1("lpBinaryPathName = %S\n", lpBinaryPathName
);
496 DPRINT1("lpLoadOrderGroup = %S\n", lpLoadOrderGroup
);
497 DPRINT1("lpDisplayName = %S\n", lpDisplayName
);
499 return ERROR_SUCCESS
;
504 CreateServiceKey(LPWSTR lpServiceName
,
507 HKEY hServicesKey
= NULL
;
513 dwError
= RegOpenKeyExW(HKEY_LOCAL_MACHINE
,
514 L
"System\\CurrentControlSet\\Services",
518 if (dwError
!= ERROR_SUCCESS
)
521 dwError
= RegCreateKeyExW(hServicesKey
,
525 REG_OPTION_NON_VOLATILE
,
531 if ((dwError
== ERROR_SUCCESS
) &&
532 (dwDisposition
== REG_OPENED_EXISTING_KEY
))
536 dwError
= ERROR_SERVICE_EXISTS
;
540 RegCloseKey(hServicesKey
);
548 ScmrCreateServiceW(handle_t BindingHandle
,
549 unsigned int hSCManager
,
550 wchar_t *lpServiceName
,
551 wchar_t *lpDisplayName
,
552 unsigned long dwDesiredAccess
,
553 unsigned long dwServiceType
,
554 unsigned long dwStartType
,
555 unsigned long dwErrorControl
,
556 wchar_t *lpBinaryPathName
,
557 wchar_t *lpLoadOrderGroup
,
558 unsigned long *lpdwTagId
, /* in, out */
559 wchar_t *lpDependencies
,
560 unsigned long dwDependenciesLength
,
561 wchar_t *lpServiceStartName
,
563 unsigned long dwPasswordLength
,
564 unsigned int *hService
) /* out */
566 PMANAGER_HANDLE hManager
;
567 DWORD dwError
= ERROR_SUCCESS
;
568 PSERVICE lpService
= NULL
;
569 SC_HANDLE hServiceHandle
= NULL
;
570 LPWSTR lpImagePath
= NULL
;
571 HKEY hServiceKey
= NULL
;
573 DPRINT1("ScmrCreateServiceW() called\n");
574 DPRINT1("lpServiceName = %S\n", lpServiceName
);
575 DPRINT1("lpDisplayName = %S\n", lpDisplayName
);
576 DPRINT1("dwDesiredAccess = %lx\n", dwDesiredAccess
);
577 DPRINT1("dwServiceType = %lu\n", dwServiceType
);
578 DPRINT1("dwStartType = %lu\n", dwStartType
);
579 DPRINT1("dwErrorControl = %lu\n", dwErrorControl
);
580 DPRINT1("lpBinaryPathName = %S\n", lpBinaryPathName
);
581 DPRINT1("lpLoadOrderGroup = %S\n", lpLoadOrderGroup
);
583 hManager
= (PMANAGER_HANDLE
)hSCManager
;
584 if (hManager
->Handle
.Tag
!= MANAGER_TAG
)
586 DPRINT1("Invalid manager handle!\n");
587 return ERROR_INVALID_HANDLE
;
590 /* Check access rights */
591 if (!RtlAreAllAccessesGranted(hManager
->Handle
.DesiredAccess
,
592 SC_MANAGER_CREATE_SERVICE
))
594 DPRINT1("Insufficient access rights! 0x%lx\n",
595 hManager
->Handle
.DesiredAccess
);
596 return ERROR_ACCESS_DENIED
;
599 /* Fail if the service already exists! */
600 if (ScmGetServiceEntryByName(lpServiceName
) != NULL
)
601 return ERROR_SERVICE_EXISTS
;
603 if (dwServiceType
& SERVICE_DRIVER
)
605 /* FIXME: Adjust the image path */
606 lpImagePath
= HeapAlloc(GetProcessHeap(),
608 (wcslen(lpBinaryPathName
) + 1) * sizeof(WCHAR
));
609 if (lpImagePath
== NULL
)
611 dwError
= ERROR_NOT_ENOUGH_MEMORY
;
614 wcscpy(lpImagePath
, lpBinaryPathName
);
617 /* Allocate a new service entry */
618 dwError
= ScmCreateNewServiceRecord(lpServiceName
,
620 if (dwError
!= ERROR_SUCCESS
)
623 /* Fill the new service entry */
624 lpService
->Status
.dwServiceType
= dwServiceType
;
625 lpService
->dwStartType
= dwStartType
;
626 lpService
->dwErrorControl
= dwErrorControl
;
628 /* FIXME: set lpLoadOrderGroup, lpDependencies etc. */
631 /* Write service data to the registry */
632 /* Create the service key */
633 dwError
= CreateServiceKey(lpServiceName
, &hServiceKey
);
634 if (dwError
!= ERROR_SUCCESS
)
637 /* Set the display name */
638 if (lpDisplayName
!= NULL
&& *lpDisplayName
!= 0)
640 RegSetValueExW(hServiceKey
,
644 (LPBYTE
)lpDisplayName
,
645 (wcslen(lpDisplayName
) + 1) * sizeof(WCHAR
));
648 /* Set the service type */
649 dwError
= RegSetValueExW(hServiceKey
,
653 (LPBYTE
)&dwServiceType
,
655 if (dwError
!= ERROR_SUCCESS
)
658 /* Set the start value */
659 dwError
= RegSetValueExW(hServiceKey
,
663 (LPBYTE
)&dwStartType
,
665 if (dwError
!= ERROR_SUCCESS
)
668 /* Set the error control value */
669 dwError
= RegSetValueExW(hServiceKey
,
673 (LPBYTE
)&dwErrorControl
,
675 if (dwError
!= ERROR_SUCCESS
)
678 /* Set the image path */
679 if (dwServiceType
& SERVICE_WIN32
)
681 dwError
= RegSetValueExW(hServiceKey
,
685 (LPBYTE
)lpBinaryPathName
,
686 (wcslen(lpBinaryPathName
) + 1) * sizeof(WCHAR
));
687 if (dwError
!= ERROR_SUCCESS
)
690 else if (dwServiceType
& SERVICE_DRIVER
)
692 dwError
= RegSetValueExW(hServiceKey
,
697 (wcslen(lpImagePath
) + 1) *sizeof(WCHAR
));
698 if (dwError
!= ERROR_SUCCESS
)
702 /* Set the group name */
703 if (lpLoadOrderGroup
!= NULL
&& *lpLoadOrderGroup
!= 0)
705 dwError
= RegSetValueExW(hServiceKey
,
709 (LPBYTE
)lpLoadOrderGroup
,
710 (wcslen(lpLoadOrderGroup
) + 1) * sizeof(WCHAR
));
711 if (dwError
!= ERROR_SUCCESS
)
715 if (lpdwTagId
!= NULL
)
717 /* FIXME: Write tag */
720 /* Write dependencies */
721 if (lpDependencies
!= NULL
&& *lpDependencies
!= 0)
723 dwError
= ScmWriteDependencies(hServiceKey
,
725 dwDependenciesLength
);
726 if (dwError
!= ERROR_SUCCESS
)
730 if (lpPassword
!= NULL
)
732 /* FIXME: Write password */
735 dwError
= ScmCreateServiceHandle(lpService
,
737 if (dwError
!= ERROR_SUCCESS
)
740 dwError
= ScmCheckAccess(hServiceHandle
,
742 if (dwError
!= ERROR_SUCCESS
)
746 if (hServiceKey
!= NULL
)
747 RegCloseKey(hServiceKey
);
749 if (dwError
== ERROR_SUCCESS
)
751 DPRINT1("hService %lx\n", hServiceHandle
);
752 *hService
= (unsigned int)hServiceHandle
;
754 if (lpdwTagId
!= NULL
)
755 *lpdwTagId
= 0; /* FIXME */
759 if (hServiceHandle
!= NULL
)
761 /* Remove the service handle */
762 HeapFree(GetProcessHeap(), 0, hServiceHandle
);
765 if (lpService
!= NULL
)
767 /* FIXME: remove the service entry */
771 if (lpImagePath
!= NULL
)
772 HeapFree(GetProcessHeap(), 0, lpImagePath
);
774 DPRINT1("ScmrCreateServiceW() done (Error %lu)\n", dwError
);
782 ScmrOpenSCManagerW(handle_t BindingHandle
,
783 wchar_t *lpMachineName
,
784 wchar_t *lpDatabaseName
,
785 unsigned long dwDesiredAccess
,
791 DPRINT("ScmrOpenSCManagerW() called\n");
792 DPRINT("lpMachineName = %p\n", lpMachineName
);
793 DPRINT("lpMachineName: %S\n", lpMachineName
);
794 DPRINT("lpDataBaseName = %p\n", lpDatabaseName
);
795 DPRINT("lpDataBaseName: %S\n", lpDatabaseName
);
796 DPRINT("dwDesiredAccess = %x\n", dwDesiredAccess
);
798 dwError
= ScmCreateManagerHandle(lpDatabaseName
,
800 if (dwError
!= ERROR_SUCCESS
)
802 DPRINT1("ScmCreateManagerHandle() failed (Error %lu)\n", dwError
);
806 /* Check the desired access */
807 dwError
= ScmCheckAccess(hHandle
,
808 dwDesiredAccess
| SC_MANAGER_CONNECT
);
809 if (dwError
!= ERROR_SUCCESS
)
811 DPRINT1("ScmCheckAccess() failed (Error %lu)\n", dwError
);
812 HeapFree(GetProcessHeap(), 0, hHandle
);
816 *hScm
= (unsigned int)hHandle
;
817 DPRINT("*hScm = %x\n", *hScm
);
819 DPRINT("ScmrOpenSCManagerW() done\n");
821 return ERROR_SUCCESS
;
827 ScmrOpenServiceW(handle_t BindingHandle
,
828 unsigned int hSCManager
,
829 wchar_t *lpServiceName
,
830 unsigned long dwDesiredAccess
,
831 unsigned int *hService
)
834 PMANAGER_HANDLE hManager
;
838 DPRINT("ScmrOpenServiceW() called\n");
839 DPRINT("hSCManager = %x\n", hSCManager
);
840 DPRINT("lpServiceName = %p\n", lpServiceName
);
841 DPRINT("lpServiceName: %S\n", lpServiceName
);
842 DPRINT("dwDesiredAccess = %x\n", dwDesiredAccess
);
844 hManager
= (PMANAGER_HANDLE
)hSCManager
;
845 if (hManager
->Handle
.Tag
!= MANAGER_TAG
)
847 DPRINT1("Invalid manager handle!\n");
848 return ERROR_INVALID_HANDLE
;
851 /* FIXME: Lock the service list */
853 /* Get service database entry */
854 lpService
= ScmGetServiceEntryByName(lpServiceName
);
855 if (lpService
== NULL
)
857 DPRINT1("Could not find a service!\n");
858 return ERROR_SERVICE_DOES_NOT_EXIST
;
861 /* Create a service handle */
862 dwError
= ScmCreateServiceHandle(lpService
,
864 if (dwError
!= ERROR_SUCCESS
)
866 DPRINT1("ScmCreateServiceHandle() failed (Error %lu)\n", dwError
);
870 /* Check the desired access */
871 dwError
= ScmCheckAccess(hHandle
,
873 if (dwError
!= ERROR_SUCCESS
)
875 DPRINT1("ScmCheckAccess() failed (Error %lu)\n", dwError
);
876 HeapFree(GetProcessHeap(), 0, hHandle
);
880 *hService
= (unsigned int)hHandle
;
881 DPRINT("*hService = %x\n", *hService
);
883 DPRINT("ScmrOpenServiceW() done\n");
885 return ERROR_SUCCESS
;
892 ScmrOpenSCManagerA(handle_t BindingHandle
,
894 char *lpDatabaseName
,
895 unsigned long dwDesiredAccess
,
898 UNICODE_STRING MachineName
;
899 UNICODE_STRING DatabaseName
;
902 DPRINT("ScmrOpenSCManagerA() called\n");
905 RtlCreateUnicodeStringFromAsciiz(&MachineName
,
909 RtlCreateUnicodeStringFromAsciiz(&DatabaseName
,
912 dwError
= ScmrOpenSCManagerW(BindingHandle
,
913 lpMachineName
? MachineName
.Buffer
: NULL
,
914 lpDatabaseName
? DatabaseName
.Buffer
: NULL
,
919 RtlFreeUnicodeString(&MachineName
);
922 RtlFreeUnicodeString(&DatabaseName
);
930 ScmrOpenServiceA(handle_t BindingHandle
,
931 unsigned int hSCManager
,
933 unsigned long dwDesiredAccess
,
934 unsigned int *hService
)
936 UNICODE_STRING ServiceName
;
939 DPRINT("ScmrOpenServiceA() called\n");
941 RtlCreateUnicodeStringFromAsciiz(&ServiceName
,
944 dwError
= ScmrOpenServiceW(BindingHandle
,
950 RtlFreeUnicodeString(&ServiceName
);
957 void __RPC_FAR
* __RPC_USER
midl_user_allocate(size_t len
)
959 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
963 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
965 HeapFree(GetProcessHeap(), 0, ptr
);