Obtener todos los procesos activos y los servicios que están usando

Iniciado por el_doctor, 2 Septiembre 2013, 22:55 PM

0 Miembros y 1 Visitante están viendo este tema.

el_doctor

Hola Eternal retomando este tema tengo una consulta sabes si hay alguna manera de saber el nombre del dll que usa un servicio determinado, no he podido encontrar nada referente a esto por ejemplo para el svchost.exe este utiliza diversos servicios digamos el SessionEnv tenemos el nombre del servicio y el display name pero para saber el dll asociado a este servicio que para este servicio sería sessenv.dll hay alguna función que me permita saber el dll de este servicio?


Eternal Idol

No se, tal vez haya una funcion en la API de Windows, fijate:
Service Reference

Sino de acuerdo a:
http://en.wikipedia.org/wiki/Svchost

Services run in SvcHost are implemented as dynamically-linked libraries (DLLs). Such service's registry key must have a value named ServiceDll under the Parameters subkey, pointing to the respective service's DLL file.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

Hola Eternal Idol otra vez retomando el tema pues buscando en la documentación MSDN hay una función que sirve para mi cometido pero al ejecutar la función esta falla y no he podido encontrar donde está el error, se compila bien y todo pero no devuelve nada pongo el código si me haces el favor de darle una revisión puedas ver que he hecho mal.

Código (cpp) [Seleccionar]
hscManager = OpenSCManager(0, 0, SC_MANAGER_ENUMERATE_SERVICE);

while( EnumServicesStatusEx( hscManager, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, service, bufSize,
&bufSize, &numOfService, 0, 0) == 0 )
delete [] service, service = new BYTE[bufSize *= 2];

LPENUM_SERVICE_STATUS_PROCESS services = (LPENUM_SERVICE_STATUS_PROCESS) service;

for(int i = 0; i < numOfService; i++){

val.pid = services->ServiceStatusProcess.dwProcessId;
CopyString(services->lpServiceName, val.service, MAX_PATH);

GetServiceDisplayName (hscManager, services->lpServiceName, NULL, &buffer);
if (buffer)
{
lpDisplayName = new TCHAR[buffer +1];
ZeroMemory (lpDisplayName, buffer + 1);


if (GetServiceDisplayName (hscManager, services->lpServiceName, lpDisplayName, &buffer))
{
CopyString (lpDisplayName, displayName, MAX_PATH);
}
}

services++;

initialRunxes->push_back(val);
}


el problema es en la función GetServiceDisplayName que no me devuelve el valor de lpDisplayName nunca entra en el If lo que significa que esta fallando la función no se si he definido mal los parámetros o que pasa.

Eternal Idol

De base no tenes ninguna necesidad de hacer esto, en services->lpDisplayName ya tenes lo que buscas. En cuanto al problema en si tal vez se deba a que buffer no es 0 en el momento de la primera llamada, depuralo, fijate que devuelven las funciones y si no es el resultado correcto mira GetLastError.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

lo que sucede que lpDisplayName de la función GetServiceDisplayName me devuelve el path del servicio pero le concatena el nombre de la dll según la documentación

Eternal Idol

Supongo que lo diras por esto:
This parameter can specify a localized string using the following format:


En fin, en mi Windows 7 x64 TODOS los servicios tienen exactamente el mismo resultado llamando a GetServiceDisplayName o a EnumServicesStatusEx. Igual fijate que buffer tenga valor 0 siempre que llames para averiguar el tamaño ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_doctor

Ya lo solucione el problema estaba que no aumentaba en 1 el tamaño del buffer para el parámetro sólo en la asignación de lpDisplay pero bueno lo malo es que está función no me da el valor esperado tal como lo dijiste retorna el mismo valor que EnumServicesStatusEx  :-\