[ros-dev] [ros-diffs] [ekohl] 53201: [ADVAPI32] Fix EnumServicesStatusEx[A/W]: - If lpServices is NULL or cbBufSize is less than sizeof(ENUM_SERVICE_STATUS_PROCESS) pass a pointer to an internal status buffer to REnumSe...

Jérôme Gardou jerome.gardou at laposte.net
Sat Aug 13 11:30:51 UTC 2011


Passing [in] and [unique] to RQueryServiceonfigW is not a solution 
either. It was a quick and dirty hack to get things working.

I'm working on a proper solution right now, unless you already have 
something in your hat :-)

Le 13/08/2011 12:53, ekohl at svn.reactos.org a écrit :
> Author: ekohl
> Date: Sat Aug 13 10:53:15 2011
> New Revision: 53201
>
> URL: http://svn.reactos.org/svn/reactos?rev=53201&view=rev
> Log:
> [ADVAPI32]
> Fix EnumServicesStatusEx[A/W]:
> - If lpServices is NULL or cbBufSize is less than sizeof(ENUM_SERVICE_STATUS_PROCESS) pass a pointer to an internal status buffer to REnumServicesStatusExA/W. Adding 'in' and 'unique' attributes in the idl file is NOT an option because this is not compatible with Windows.
> - Check the InfoLevel.
>
> Modified:
>      trunk/reactos/dll/win32/advapi32/service/scm.c
>
> Modified: trunk/reactos/dll/win32/advapi32/service/scm.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service/scm.c?rev=53201&r1=53200&r2=53201&view=diff
> ==============================================================================
> --- trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] (original)
> +++ trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] Sat Aug 13 10:53:15 2011
> @@ -1150,7 +1150,9 @@
>                         LPDWORD lpResumeHandle,
>                         LPCSTR pszGroupName)
>   {
> +    ENUM_SERVICE_STATUS_PROCESSA ServiceStatus;
>       LPENUM_SERVICE_STATUS_PROCESSA lpStatusPtr;
> +    DWORD dwBufferSize;
>       DWORD dwError;
>       DWORD dwCount;
>
> @@ -1166,6 +1168,18 @@
>       {
>           SetLastError(ERROR_INVALID_HANDLE);
>           return FALSE;
> +    }
> +
> +    if (lpServices == NULL ||
> +        cbBufSize<  sizeof(ENUM_SERVICE_STATUS_PROCESSA))
> +    {
> +        lpStatusPtr =&ServiceStatus;
> +        dwBufferSize = sizeof(ENUM_SERVICE_STATUS_PROCESSA);
> +    }
> +    else
> +    {
> +        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSA)lpServices;
> +        dwBufferSize = cbBufSize;
>       }
>
>       RpcTryExcept
> @@ -1174,8 +1188,8 @@
>                                            InfoLevel,
>                                            dwServiceType,
>                                            dwServiceState,
> -                                         (LPBYTE)lpServices,
> -                                         cbBufSize,
> +                                         (LPBYTE)lpStatusPtr,
> +                                         dwBufferSize,
>                                            pcbBytesNeeded,
>                                            lpServicesReturned,
>                                            lpResumeHandle,
> @@ -1189,18 +1203,20 @@
>
>       if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
>       {
> -        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSA)lpServices;
> -        for (dwCount = 0; dwCount<  *lpServicesReturned; dwCount++)
> +        if (InfoLevel == SC_ENUM_PROCESS_INFO)
>           {
> -            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++;
> +            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++;
> +            }
>           }
>       }
>
> @@ -1234,11 +1250,31 @@
>                         LPDWORD lpResumeHandle,
>                         LPCWSTR pszGroupName)
>   {
> +    ENUM_SERVICE_STATUS_PROCESSW ServiceStatus;
>       LPENUM_SERVICE_STATUS_PROCESSW lpStatusPtr;
> +    DWORD dwBufferSize;
>       DWORD dwError;
>       DWORD dwCount;
>
>       TRACE("EnumServicesStatusExW() called\n");
> +
> +    if (InfoLevel != SC_ENUM_PROCESS_INFO)
> +    {
> +        SetLastError(ERROR_INVALID_LEVEL);
> +        return FALSE;
> +    }
> +
> +    if (lpServices == NULL ||
> +        cbBufSize<  sizeof(ENUM_SERVICE_STATUS_PROCESSW))
> +    {
> +        lpStatusPtr =&ServiceStatus;
> +        dwBufferSize = sizeof(ENUM_SERVICE_STATUS_PROCESSW);
> +    }
> +    else
> +    {
> +        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSW)lpServices;
> +        dwBufferSize = cbBufSize;
> +    }
>
>       RpcTryExcept
>       {
> @@ -1246,8 +1282,8 @@
>                                            InfoLevel,
>                                            dwServiceType,
>                                            dwServiceState,
> -                                         (LPBYTE)lpServices,
> -                                         cbBufSize,
> +                                         (LPBYTE)lpStatusPtr,
> +                                         dwBufferSize,
>                                            pcbBytesNeeded,
>                                            lpServicesReturned,
>                                            lpResumeHandle,
> @@ -1261,18 +1297,20 @@
>
>       if (dwError == ERROR_SUCCESS || dwError == ERROR_MORE_DATA)
>       {
> -        lpStatusPtr = (LPENUM_SERVICE_STATUS_PROCESSW)lpServices;
> -        for (dwCount = 0; dwCount<  *lpServicesReturned; dwCount++)
> +        if (InfoLevel == SC_ENUM_PROCESS_INFO)
>           {
> -            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++;
> +            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++;
> +            }
>           }
>       }
>
>
>




More information about the Ros-dev mailing list