1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| char* Services::getServices(int i)
{
//variables
SC_HANDLE handleServices ;
DWORD dwrest, dwrsmhndl, dwSvrCount, bok;
DWORD dwBufSize;
LPENUM_SERVICE_STATUS_PROCESS pessp ;
LPQUERY_SERVICE_CONFIG pqsc ;
char * buffer;
//allocation mémoire
// : buffer 1024, pessp 3072, pqsc 4096, total = 8192
buffer = (char*) VirtualAlloc(0,20000,MEMDISPO,PAGE_READWRITE); //#define MEMDISPO (MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN)
pessp = (LPENUM_SERVICE_STATUS_PROCESS) (buffer + 1024); // 3 Ko dispo
pqsc = (LPQUERY_SERVICE_CONFIG) (buffer + 4096); // 4 Ko dispo
handleServices =OpenSCManager(0,0,SC_MANAGER_ENUMERATE_SERVICE);
if(!buffer)
{
perror("PROBLEME MEMOIRE");
}
if(!handleServices)
{
dwerror = GetLastError();
printf("Erreur handle de services : %s\n",dwerror);
}
//On récupère la valaur de 'dwrest' qui nous donne le nombre d'octets nécessaire
//pour contenir les entrée de services
EnumServicesStatusEx(
handleServices,
SC_ENUM_PROCESS_INFO,
SERVICE_WIN32,
SERVICE_STATE_ALL,
(BYTE*)NULL,
dwBufSize,
&dwrest,
&dwSvrCount,
NULL,
NULL);
if (dwrest< 0x01)
{
printf("EnumServicesStatusEx fail ?? \n");
}
dwBufSize = dwrest; //initialisation de la taille du BufSize; correspond à 'pcbBytesNeeded' au nombre d'octets nécessaires
cout<<"=====Test n° 1====="<<endl;
cout<<"Octets necessaires:["<<dwrest<<"]"<<endl;
cout<<"Taille du buffer:["<<dwBufSize<<"]"<<endl;
cout<<"Nombre de services :["<<dwSvrCount<<"]"<<endl;
//initialiser les variables
dwrsmhndl = 0;
dwSvrCount = 0;
dwerror = 0;
bok = EnumServicesStatusEx(handleServices,
SC_ENUM_PROCESS_INFO,
SERVICE_WIN32 | SERVICE_DRIVER,
SERVICE_STATE_ALL,
(BYTE*)pessp,
dwBufSize,
&dwrest,
&dwSvrCount,
&dwrsmhndl,
NULL);
//test affichage
cout<<"=====Test n° 2====="<<endl;
cout<<"Taille du buffer:"<<dwBufSize<<endl;
cout<<"Octets necessaires:"<<dwrest<<endl;
cout<<"Nombre de services :"<<dwSvrCount<<endl;
//test de la fonction 'EnumServicesStatusEx'
if(bok == 0)// la fonction retourne 0 en cas d'erreur
{
dwerror = GetLastError();
}
if((dwerror = GetLastError()) != ERROR_MORE_DATA)//si il n'y a pas assez d'espace
{
perror("ERROR_MORE_DATA");
}
if(!dwSvrCount)
{
perror("dwSvrCount");
}
for(unsigned int i=0;i<dwSvrCount;i++)
{
//lister les services [description][nom du service]
printf("Nom service [%d] : [%s][%s]\n",i,pessp[i].lpDisplayName,pessp[i].lpServiceName);
printf("---------------------------------\n");
}
CloseServiceHandle(handleServices);
return (char*)pessp[i].lpDisplayName ;
} |
Partager