[ 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;
}
[ RF MasterX @ 10.05.2010. 20:53 ] @
Halo ima li koga?

Evo da preformulisem i pojednostavim pitanje.

Kako da u win9x na osnovu Process HANDLE -a dobijem ProcessID ?

Hvala.
[ kiklop74 @ 10.05.2010. 21:33 ] @
http://msdn.microsoft.com/en-us/library/ms683215%28VS.85%29.aspx
[ Mihajlo Cvetanović @ 10.05.2010. 21:53 ] @
Postoji rešenje ako je proces u pitanju potproces onog procesa iz kojeg se traži informacija (ako sam dobro shvatio ono što piše):

http://www.experts-exchange.co...s__Programming/Q_10073493.html

Na žalost ako nisi član onda ti direktan link ne vredi, nego unesi link u Gugl pa klikni na link koji ti Gugl da. Odgovori ljudi počinju negde od pola strane. Pronađi odgovor u kome je listing programa.

Drugo rešenje je obrnutim putem. Enumerišeš sve procese, čime dobijaš njihove ID-ve. Za svaki ID zoveš OpenProcess. Kad dođeš do svog hendla onda imaš i svoj process ID.
[ RF MasterX @ 11.05.2010. 11:30 ] @
Uh izgleda da ni iz drugog pokusaja nisam najbolje objasnio.

kiklop74 ovaj tvoj link ne radi. :-(

Mihajlo Cvetanović to mi je poznato ali ovde se radi o nechem drugom.
A sto se tiche linka MNOGO su skupi. :-(

Dakle moj dll treba da "imitira" PSAPI.DLL znachi kada aplikacija koja je pisana za NT ili XP "pozove" funkciju

EnumProcesses ona dobije ProcessID-ove svih procesa (ne podprocesa) i to sam reshio(Vidi prvu poruku).

Ali ta ista aplikacija poziva OpenProcess i tako dobija HANDLE e sad da bi dobila informacije o procesu

(listu modula i slichno) ona poziva EnumProcessModules u kojoj kao argument navodi processHandle evo
kako izgleda PSAPI-jeva funkcija:

Code:
BOOL WINAPI EnumProcessModules( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded );


a evo kako izgleda moja:
Code:
BOOL WINAPI EnumProcessModules( DWORD dProcessID, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded );


to je zato jer funkcija koju koristim da bi enumerisao module je CreateToolhelp32Snapshot

a ona izgleda ovako:
Code:
HANDLE
WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID );


Da rezimiramo, ja od aplikacije dobijam process HANDLE a treba mi ProcessID pa iz toga

dalje sledi da mi je potrebna funkcija koja je ekvivalent funkciji GetProcessID da bi preveo

iz proces HANDLE-a u ProcessID

a koja izgleda ovako:

Code:
DWORD GetProcessID ( HANDLE prHandle );


a poshto se ta funkcija nalzai jedino pocevshi od XP SP2 pa na gore

ja zato pitam dali se na neki nacin moze realizovati ta funkcija u Win9x

bez obzira na to koliko bi procedura bila slozena. A jednu od ideja

sam izneo u prvoj poruci. pa ako neko zna....

Hvala.

[ Mihajlo Cvetanović @ 11.05.2010. 11:50 ] @
Treba ti funkcija koja uzima HANDLE i vraća PID. Imaš funkciju koja uzima PID i vraća HANDLE. Istovremeno imaš funkciju kojom možeš da enumerišeš sve PID-ove. Moj predlog (poslednji pasus u prethodnom postu): enumeriši sve PID-ove, povadi sve njihove HANDLE-ove, i kad pronađeš svoj HANDLE onda automatski imaš i svoj PID.

Što se tiče experts-exchange, nije nikakav problem, sve im je vidljivo, samo moraš da ideš preko Gugla. EE je potpuno otvoren za Gugl i za sve koji dođu na EE preko Gugla. Jedino što moraš da odskroluješ na pola ekrana da bi video odgovore.
[ RF MasterX @ 11.05.2010. 12:10 ] @
No no, to nece ici probao sam a evo i zashto:

kada pzoves OpenProcess on vraca HANDLE ali svaki HANDLE je jedinstven pa tako
uporedjivanje HANDLE-ova nema svrhe.

a shto se tiche linka i gugla, potrazio sam i gugl mi izbacuje adresu ftp sajta:
ftp://ftp.ora.com/

Tu vidim ima "Mali Milion" Fajlova sa source code-om, pa mozda neshto iskopam tu.
samo treba dosta vremena za skidanje jer mi je konekcija samo 128kbps.

Hvala.
[ Mihajlo Cvetanović @ 11.05.2010. 13:30 ] @
Našao sam na CodeProject-u nešto interesantno. Ima neki članak, i komentar na članak u kome je kod za funkcionalnost koju tražiš na bilo kom Windowsu.

Članak sa komentarom je http://www.codeproject.com/KB/...tingProcessID.aspx?msg=2371043

Funkcija se zove GetProcessIdAnyWinVer
[ RF MasterX @ 11.05.2010. 14:55 ] @
!!! YES YES YES !!! Hvala puno Mihajlo upravo je to ono sto trazim.

Na pocetku sam i ja razmishljao da upotrebim RemoteThread ali mi se nije svidelo
zbog toga sto je to implementirano tek win98 i nisam bio siguran dali ce raditi.
ali dobro valjda se mora naci neki kompromis.

Hvala josh jednom

kada MYPSAPI.DLL bude gotov okacicu ga ovde ukoliko je to moguce jer sigurno
ce zatrebati jos nekom.
[ Mihajlo Cvetanović @ 11.05.2010. 15:10 ] @
I aim to please ;-)

E sad dolazimo do onog što je meni interesantno. Zašto podržavaš OS-eve pre Win2000, kad ih ni sam Microsoft više ne podržava? Da li je moguće da to još neko ozbiljno koristi (u smislu da mu ne stoji na mašini samo zbog sentimenta)?
[ RF MasterX @ 11.05.2010. 16:39 ] @
Dobro osecam se obaveznim da na ovo pitanje odgovorim, pa ovako recimo:

prekjuche si kupio novog Subaru-a ali bez Nitro-a, a juche se pojavio isti takav samo sa Nitro-om

i sad da'l ces ponovo kupiti novog subaru-a ili ces nabudziti starog ukoliko za to posteje mogucnosti?

a ako pitas mene sta radim u win98 epa evo sta sam radio do sada:

slusao muziku
gledao filmove i DVD i DivX
slusao radio
gledao tv
snimao muziku sa radia
snimao tv emisije koje su me se svidjale
citao elektronske knjige
igrao igre 2D i 3D
snimao diskove
projektovao elektronska kola (RF tehnika)
pisao programe
i koristio programe koje su drugi pisali
radio razne softverske i hardwerske experimente

a od sada cu moci i da shetam internetom jer mi telekom dao modem
koji ima drivere za win98.

sad sam trenutno u XP-u jer sam mislio da necu imati drivere za win98
a instalirao sam ga pre nego sto su dosli sa modemom.

E sad nemoj me pogreshno razumeti nisam ja protiv razvoja tehnike.

Ali ni Micro$oftu nije do korisnika njihivog sistema vec do korisnikovih novaca. zar ne?

Naravno svaki prosechan korisnik ce se zaleteti da uzme neki sistema u kome je sarenilo
na sve strane ane onaj koji izgleda klasichno, bez obzira na to sto on zeli da uradi sa novim
moze uraditi i sa starim i to sa mnogo manje ulaganja u hardwer.

Moram priznati da sam se 2002 i ja upecao na lep izgled XP-a ali sam urzo uvideo o cemu
se zapravo radi.

sa moje tachke gledista svi ti novi sistemi jesu dobri ali za Gamer-e i za internet provajdere
a za prosechne korisnike je sasvim dovoljan i win98 iako to mozda nekome izgleda smesno.

sve to sa novim sistemima me podseca na ono : imam avion al nema veze kupicu jos 10
iz ciste za***ancije.

I to prvo zato shto softwer nije kvarljiva roba, ne moze se naknadno pokvariti a cak i ako
ima neku greshku ona se moze ispraviti uz malo truda.

A jesi li video? covek napravio patch za win98 takav da 98 moze videti HDD i do nekoliko
10-ina TB. Isti taj napravio je patch za win98 da moze koristiti i do 3GB Ram memorije
i takodje napravio SDK(software development kit) uz pomoc koga je moguce pisanje
programa za win98 koji mogu iskoristiti svako jezgro u procesoru, a Micro$oft je
tvrdio da sve to nije moguce. Pa sad ti vidi kome ces da verujes.

mogu ti poslati za sve ovo link ako te to interesuje.

No ja se bas rasprichao vreme je da zavrsim.

Pozz.
[ Mihajlo Cvetanović @ 11.05.2010. 18:54 ] @
Ne treba link, hvala. Zanimljiv stav. Mada, mogao bi lepo da pređeš na neki Linux, pa ti čak ni taj Win98 ne bi trebao.
[ RF MasterX @ 16.05.2010. 17:38 ] @
EVO PSAPI-a

Verzija 1 i Verzija 2

Verzija 1 je stara nekoliko godina i ima samo jednu funkciju:
EnumProcesses

Verzija 2 je nova ima 2 funkcije:
EnumProcesses i EnumProcessModules

Samo ima jedna zachkoljica Verzija 2 za rad koristi biblioteku Remote.dll
koja se moze skinuti sa sledece adrese:

http://www.codeproject.com/KB/winsdk/Remote/remote_demo.zip

to je zato sto remote.dll poseduje funkciju _GetProcessId koja radi u
svim Win9x sistemima, remote.dll i mypsapi.dll treba kopirati u recimo:
C:\Windows\System
ukoliko je Windows instaliran na C:

nakon toga mypsapi.dll preimenovati u psapi.dll

U sledecoj verziji ce biti eliminisana potreba za remote.dll