Ovo je prva tema koju ja otvaram i verovatno ce se mnogi pitati zashto ovaku temu otvaram, neko
ce verovatno reci da sam zakasnio ovim ali do pre neki dan nisam imao internet ali nema veze.
Stvar je sledeca:
postoje mnogi programi koji u Win9x (95,98,98 Se, Me) nemogu raditi zbog biblioteke PSAPI.DLL
tj. Zbog jedne ili vishe funkcija koje se nalaze u ovom DLL-u. Ukoliko pokusate da iskopirate istu iz
NT-a ili XP-a u 9x a zatim pokrenete program(koji zahteva ovaj dll) izbacice greshku, to je zbog NTDLL.DLL
jer ovaj tip NTDLL koji zahteva PSAPI, pa sam ja jos pre 5-6 godina napravio moj PSAPI pa sam tako mnoge
programe koji koriste funkciju "EnumProcesses" uspeo naterati da rade pod Win9x. E sad sve bi to bilo lepo
ali neki programi koriste jos jednu ili vise funkcija iz ovog Dll-a Kao sto je "EnumProcessModules" napisem ja
i ovu funkciju ali sa jednim problemom u mojoj funkciji kao prvi argument mogu navesti "ProcessID" jer koristim
TOOLHELP funkcije a PSAPI zahteva "HANDLE" u XP-SP2 postoji funkcija GetProcessID koja na osnovu
Process HANDLE-a odredjuje ProcessID ali psto je ovo potrebno za Win9x u cijem kernelu ne postoji ta funkcija
smatram da bi se to moglo izvesti tako da kada program pozove "EnumProcesses" tada se negde u memoriji
procesa ostavi neki "Zapis" uz pomoc "WriteProcessMemory" velichine 4 byte-a a taj zapis bi trebao da bude broj HANDLE-a ali posto tu funkciju nikad nisam koristio zamolio bih vas za pomoc oko toga kako naci adresu gde
se moze upisati ovaj broj a da to ne srusi proces?.
A evo kako sam resio to za EnumProcesses
#include "tlhelp32.h"
BOOL WINAPI ProcessNext ( HANDLE hSnapshot, LPPROCESSENTRY32 lppe )
{
if (lppe->dwSize==NULL)
{
lppe->dwSize=sizeof (PROCESSENTRY32);
return Process32First( hSnapshot, lppe );
}
else
return Process32Next( hSnapshot, lppe );
}
BOOL EnumProcesses ( DWORD * lpidProcess, DWORD cb, DWORD * cbNeeded )
{
PROCESSENTRY32 pe; DWORD counter=0; bool first=true;
if ( cb <= 0 )
{
*cbNeeded=0;
//SetLastError (ERROR_INVALID_PARAMETER);
return FALSE;
}
HANDLE snp = CreateToolhelp32Snapshot
( TH32CS_SNAPPROCESS,0 );
pe.dwSize = 0;
while ( counter != cb )
{
if(!ProcessNext(snp,&pe))
{
//if ((counter+1)<cb)
//SetLastError (ERROR_CAN_NOT_COMPLETE);
CloseHandle(snp);
return TRUE;
}
lpidProcess[counter]=pe.th32ProcessID;
counter ++;
*cbNeeded=counter * sizeof(DWORD);
}
CloseHandle(snp);
return TRUE;
}