[ RF MasterX @ 06.05.2010. 14:34 ] @
Pozdrav svima. 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 Code: #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; } |