Forward EnumDependentServicesA/W to services.exe.
Modified: trunk/reactos/lib/advapi32/service/scm.c
Modified: trunk/reactos/subsys/system/services/rpcserver.c
_____
Modified: trunk/reactos/lib/advapi32/service/scm.c
--- trunk/reactos/lib/advapi32/service/scm.c 2006-01-01 11:52:34 UTC
(rev 20507)
+++ trunk/reactos/lib/advapi32/service/scm.c 2006-01-01 12:00:13 UTC
(rev 20508)
@@ -408,8 +408,7 @@
*
* @implemented
*/
-SC_HANDLE
-STDCALL
+SC_HANDLE STDCALL
CreateServiceA(SC_HANDLE hSCManager,
LPCSTR lpServiceName,
LPCSTR lpDisplayName,
@@ -558,12 +557,12 @@
LPCWSTR lpPassword)
{
SC_HANDLE hService = NULL;
+ DWORD dwDependenciesLength = 0;
DWORD dwError;
- DWORD dwDependenciesLength = 0;
DWORD dwLength;
LPWSTR lpStr;
- DPRINT1("CreateServiceW() called\n");
+ DPRINT("CreateServiceW() called\n");
/* Calculate the Dependencies length*/
if (lpDependencies != NULL)
@@ -602,7 +601,7 @@
(unsigned int *)&hService);
if (dwError != ERROR_SUCCESS)
{
- DPRINT1("ScmrCreateServiceW() failed (Error %lu)\n", dwError);
+ DPRINT("ScmrCreateServiceW() failed (Error %lu)\n", dwError);
SetLastError(dwError);
return NULL;
}
@@ -642,31 +641,65 @@
/**********************************************************************
* EnumDependentServicesA
*
- * @unimplemented
+ * @implemented
*/
-BOOL
-STDCALL
-EnumDependentServicesA(
- SC_HANDLE hService,
- DWORD dwServiceState,
- LPENUM_SERVICE_STATUSA lpServices,
- DWORD cbBufSize,
- LPDWORD pcbBytesNeeded,
- LPDWORD lpServicesReturned)
+BOOL STDCALL
+EnumDependentServicesA(SC_HANDLE hService,
+ DWORD dwServiceState,
+ LPENUM_SERVICE_STATUSA lpServices,
+ DWORD cbBufSize,
+ LPDWORD pcbBytesNeeded,
+ LPDWORD lpServicesReturned)
{
- DPRINT1("EnumDependentServicesA is unimplemented\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ LPENUM_SERVICE_STATUSA lpStatusPtr;
+ DWORD dwError = ERROR_SUCCESS;
+ DWORD dwCount;
+
+ DPRINT("EnumServicesStatusA() called\n");
+
+ HandleBind();
+
+ dwError = ScmrEnumDependentServicesA(BindingHandle,
+ (unsigned int)hService,
+ dwServiceState,
+ (unsigned char *)lpServices,
+ cbBufSize,
+ pcbBytesNeeded,
+ lpServicesReturned);
+
+ lpStatusPtr = (LPENUM_SERVICE_STATUSA)lpServices;
+ for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
+ {
+ if (lpStatusPtr->lpServiceName)
+ lpStatusPtr->lpServiceName =
+ (LPSTR)((ULONG_PTR)lpServices +
(ULONG_PTR)lpStatusPtr->lpServiceName);
+
+ if (lpStatusPtr->lpDisplayName)
+ lpStatusPtr->lpDisplayName =
+ (LPSTR)((ULONG_PTR)lpServices +
(ULONG_PTR)lpStatusPtr->lpDisplayName);
+
+ lpStatusPtr++;
+ }
+
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT("ScmrEnumDependentServicesA() failed (Error %lu)\n",
dwError);
+ SetLastError(dwError);
+ return FALSE;
+ }
+
+ DPRINT("EnumDependentServicesA() done\n");
+
+ return TRUE;
}
/**********************************************************************
* EnumDependentServicesW
*
- * @unimplemented
+ * @implemented
*/
-BOOL
-STDCALL
+BOOL STDCALL
EnumDependentServicesW(SC_HANDLE hService,
DWORD dwServiceState,
LPENUM_SERVICE_STATUSW lpServices,
@@ -674,9 +707,46 @@
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned)
{
- DPRINT1("EnumDependentServicesW is unimplemented\n");
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ LPENUM_SERVICE_STATUSW lpStatusPtr;
+ DWORD dwError = ERROR_SUCCESS;
+ DWORD dwCount;
+
+ DPRINT("EnumServicesStatusW() called\n");
+
+ HandleBind();
+
+ dwError = ScmrEnumDependentServicesW(BindingHandle,
+ (unsigned int)hService,
+ dwServiceState,
+ (unsigned char *)lpServices,
+ cbBufSize,
+ pcbBytesNeeded,
+ lpServicesReturned);
+
+ lpStatusPtr = (LPENUM_SERVICE_STATUSW)lpServices;
+ for (dwCount = 0; dwCount < *lpServicesReturned; dwCount++)
+ {
+ if (lpStatusPtr->lpServiceName)
+ lpStatusPtr->lpServiceName =
+ (LPWSTR)((ULONG_PTR)lpServices +
(ULONG_PTR)lpStatusPtr->lpServiceName);
+
+ if (lpStatusPtr->lpDisplayName)
+ lpStatusPtr->lpDisplayName =
+ (LPWSTR)((ULONG_PTR)lpServices +
(ULONG_PTR)lpStatusPtr->lpDisplayName);
+
+ lpStatusPtr++;
+ }
+
+ if (dwError != ERROR_SUCCESS)
+ {
+ DPRINT("ScmrEnumDependentServicesW() failed (Error %lu)\n",
dwError);
+ SetLastError(dwError);
+ return FALSE;
+ }
+
+ DPRINT("EnumDependentServicesW() done\n");
+
+ return TRUE;
}
@@ -691,7 +761,7 @@
SC_HANDLE hSCManager,
DWORD dwServiceType,
DWORD dwServiceState,
- LPENUM_SERVICE_STATUSA lpServices,
+ LPENUM_SERVICE_STATUSW lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
@@ -758,7 +828,7 @@
return FALSE;
}
- DPRINT("ScmrEnumServicesStatusA() done\n");
+ DPRINT("EnumServicesStatusA() done\n");
return TRUE;
}
@@ -818,7 +888,7 @@
return FALSE;
}
- DPRINT("ScmrEnumServicesStatusW() done\n");
+ DPRINT("EnumServicesStatusW() done\n");
return TRUE;
}
@@ -882,7 +952,7 @@
return FALSE;
}
- DPRINT("ScmrEnumServicesStatusExA() done\n");
+ DPRINT("EnumServicesStatusExA() done\n");
return TRUE;
}
@@ -946,7 +1016,7 @@
return FALSE;
}
- DPRINT("ScmrEnumServicesStatusExW() done\n");
+ DPRINT("EnumServicesStatusExW() done\n");
return TRUE;
}
_____
Modified: trunk/reactos/subsys/system/services/rpcserver.c
--- trunk/reactos/subsys/system/services/rpcserver.c 2006-01-01
11:52:34 UTC (rev 20507)
+++ trunk/reactos/subsys/system/services/rpcserver.c 2006-01-01
12:00:13 UTC (rev 20508)
@@ -1252,6 +1252,8 @@
DWORD dwError = ERROR_SUCCESS;
DPRINT1("ScmrEnumDependentServicesW() called\n");
+ *pcbBytesNeeded = 0;
+ *lpServicesReturned = 0;
DPRINT1("ScmrEnumDependentServicesW() done (Error %lu)\n",
dwError);
@@ -1951,6 +1953,8 @@
unsigned long *lpServicesReturned)
{
DPRINT1("ScmrEnumDependentServicesA() is unimplemented\n");
+ *pcbBytesNeeded = 0;
+ *lpServicesReturned = 0;
return ERROR_CALL_NOT_IMPLEMENTED;
}