implemented CreateServiceA
Modified: trunk/reactos/lib/advapi32/service/scm.c
_____
Modified: trunk/reactos/lib/advapi32/service/scm.c
--- trunk/reactos/lib/advapi32/service/scm.c 2005-11-17 13:01:29 UTC
(rev 19290)
+++ trunk/reactos/lib/advapi32/service/scm.c 2005-11-17 13:23:37 UTC
(rev 19291)
@@ -258,7 +258,7 @@
/**********************************************************************
* CreateServiceA
*
- * @unimplemented
+ * @implemented
*/
SC_HANDLE
STDCALL
@@ -277,8 +277,103 @@
LPCSTR lpServiceStartName,
LPCSTR lpPassword)
{
- DPRINT1("CreateServiceA is unimplemented, but returning
INVALID_HANDLE_VALUE instead of NULL\n");
- return INVALID_HANDLE_VALUE;
+ SC_HANDLE RetVal = NULL;
+ LPWSTR lpServiceNameW = NULL;
+ LPWSTR lpDisplayNameW = NULL;
+ LPWSTR lpBinaryPathNameW = NULL;
+ LPWSTR lpLoadOrderGroupW = NULL;
+ LPWSTR lpDependenciesW = NULL;
+ LPWSTR lpServiceStartNameW = NULL;
+ LPWSTR lpPasswordW = NULL;
+
+ int len = MultiByteToWideChar(CP_ACP, 0, lpServiceName, -1, NULL,
0);
+ lpServiceNameW = HeapAlloc(GetProcessHeap(), 0, len *
sizeof(WCHAR));
+ if (!lpServiceNameW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpServiceName, -1, lpServiceNameW,
len);
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpDisplayName, -1, NULL, 0);
+ lpDisplayNameW = HeapAlloc(GetProcessHeap(), 0, len *
sizeof(WCHAR));
+ if (!lpDisplayNameW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpDisplayName, -1, lpDisplayNameW,
len);
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpBinaryPathName, -1, NULL,
0);
+ lpBinaryPathNameW = HeapAlloc(GetProcessHeap(), 0, len *
sizeof(WCHAR));
+ if (!lpBinaryPathNameW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpDisplayName, -1,
lpBinaryPathNameW, len);
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpLoadOrderGroup, -1, NULL,
0);
+ lpLoadOrderGroupW = HeapAlloc(GetProcessHeap(), 0, len *
sizeof(WCHAR));
+ if (!lpLoadOrderGroupW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpLoadOrderGroup, -1,
lpLoadOrderGroupW, len);
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpDependencies, -1, NULL, 0);
+ lpDependenciesW = HeapAlloc(GetProcessHeap(), 0, len *
sizeof(WCHAR));
+ if (!lpDependenciesW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpDependencies, -1, lpDependenciesW,
len);
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpServiceStartName, -1, NULL,
0);
+ lpServiceStartName = HeapAlloc(GetProcessHeap(), 0, len *
sizeof(WCHAR));
+ if (!lpServiceStartNameW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpServiceStartName, -1,
lpServiceStartNameW, len);
+
+ len = MultiByteToWideChar(CP_ACP, 0, lpPassword, -1, NULL, 0);
+ lpPasswordW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!lpPasswordW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto cleanup;
+ }
+ MultiByteToWideChar(CP_ACP, 0, lpPassword, -1, lpPasswordW, len);
+
+ RetVal = CreateServiceW(hSCManager,
+ lpServiceNameW,
+ lpDisplayNameW,
+ dwDesiredAccess,
+ dwServiceType,
+ dwStartType,
+ dwErrorControl,
+ lpBinaryPathNameW,
+ lpLoadOrderGroupW,
+ lpdwTagId,
+ lpDependenciesW,
+ lpServiceStartNameW,
+ lpPasswordW);
+
+
+cleanup:
+ if (!lpServiceNameW) HeapFree(GetProcessHeap(), 0, lpServiceNameW);
+ if (!lpDisplayNameW) HeapFree(GetProcessHeap(), 0, lpDisplayNameW);
+ if (!lpBinaryPathNameW) HeapFree(GetProcessHeap(), 0,
lpBinaryPathNameW);
+ if (!lpLoadOrderGroupW) HeapFree(GetProcessHeap(), 0,
lpLoadOrderGroupW);
+ if (!lpDependenciesW) HeapFree(GetProcessHeap(), 0,
lpDependenciesW);
+ if (!lpServiceStartNameW) HeapFree(GetProcessHeap(), 0,
lpServiceStartNameW);
+ if (!lpPasswordW) HeapFree(GetProcessHeap(), 0, lpPasswordW);
+
+ return RetVal;
}