4. Jak odpalic nowy watek ?
Najprosciej mozna to zrobic w ten sposob:
procedure WkurzajUsera;
begin
repeat beep;sleep(1000);until false;
end;
//i podczepiamy nasza procedurke jako watek
CreateThread(nil,0,@WkurzajUsera,nil,0,x);
(x:integer)
win32.hlp:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// address of thread security attributes
DWORD dwStackSize,
// initial thread stack size, in bytes
LPTHREAD_START_ROUTINE lpStartAddress,
// address of thread function
LPVOID lpParameter,
// argument for new thread
DWORD dwCreationFlags,
// creation flags
LPDWORD lpThreadId
// address of returned thread identifier
);
5. Jak czytac pamiec procesu ?
Aby moc przeczytac pamiec procesu nalezy miec jego uchwyt, pozniej ustawic go w tryb do odczytu
i podac miejsce gdzie maja trafic dane przeczytane z pamieci.
function ReadProcMem(var path,buf:PChar;length:integer):integer;
var ProcInf:TProcessInformation;
//tutaj otrzymamy identyfikatory procesu i watku glownego
StartInf:TStartupInfo;
//tutaj nieistotne
begin
fillchar(StartInf,sizeof(StartInf),0);
//ta struktuta nie bedzie uzywana
fillchar(Buf,length,0); //czyscimy bufor
Result:=0;
CreateProcess(path,nil,nil,nil,false,0,nil,nil,StartInf,ProcInf);
//tworzymy nowy proces
OpenProcess(PROCESS_VM_READ,false,ProcInf.dwProcessId);
//otwieramy go z flaga do odczytu
ReadProcessMemory(ProcInf.hProcess,nil,Buf,length,result);
//czytamy length bajtow z pamieci
TerminateProcess(ProcInf.hProcess,0);
//wykanczmy proces z flaga wyjscia 0
end;
13. Jak pisac programy sieciowe ?
Po szczegoly odsylam do komponentow na DSP [query:socket] i do literatury, tutaj przyblize kilka
funkcji pozwalajacych w najprostszy sposob wysylac i odbierac dane.
Najpierw musimy dysponowac gniazdkiem (socketem) przez ktore bedziemy mogli sie komunikowac,
kazde gniazdko okreslone jest 6 wspolczynnikami : port lokalny, port docelowy, adres lokalny,
adres docelowy, protokol (tcp lub udp, my zajmiemy sie tcp), aktywne / pasywne.
gniazdko w systemie widziane jest jako zwykla liczba typu integer, jest to w zasadzie uchwyt okna
istnieja 2 podstawowe funkcje ktore go zwracaja: socket i accept.
funkcja socket tworzy nowe gniazkdo, jej przykladowe uzycie:
SSOCK:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
uzycie accept jest troche bardziej zlozone, najpierw musimy miec zwykle gniazdko utworzone przez
socket, nastepnie przypisujemy temu gniazdku port lokalny i ustawiamy je w tryb sluchania funkcja listen,
funkcja accept uzywa 'sluchajacego' gniazdka do utworzenia calkowicie nowego polaczenia z komputerem
ktory laczy sie z nami (my jestesmy serverem a on klientem).
SSOCK,CSOCK:integer;
procedure make_listen_socket;
var
addr,taddr:tsockaddrin;
sock,size:integer;
begin
fillchar(addr,sizeof(addr),0);
fillchar(taddr,sizeof(taddr),0);
fillchar(maddr,sizeof(maddr),0);
SOCK:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
// jesli socket=-1 to blad!
addr.sin_family:=AF_INET;
addr.sin_addr.s_addr:=htonl(INADDR_ANY);
addr.sin_port:=htons(666); //przypisujemy gniazdku port lokalny
bind(SOCK,addr,sizeof(addr)); //jesli bind<>0 to blad !
listen(SOCK,5); //jesli listen<>0 to blad !
repeat
sleep(1000);
size:=sizeof(taddr);
CSOCK:=accept(SOCK,@taddr,@size);
until csock>0; //az ktos sie z nami polaczy
end;
function
connect_to_destination
(DESTINATION_HOST:string;DESTINATION_PORT:integer):integer;
var
addr:tsockaddrin;
he:phostent;
mode:integer;
begin
SSOCK:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
fillchar(addr,sizeof(addr),0);
addr.sin_family:=AF_INET;
addr.sin_addr.s_addr:=inet_addr(@DESTINATION_HOST[1]);
//moze byc pchar(DESTINATION_HOST)
addr.sin_port:=htons(DESTINATION_PORT);
he:=gethostbyname(@DESTINATION_HOST[1]);
//wywolujemy resolver
if he<>nil then move(he^.h_addr_list^^, addr.sin_addr.s_addr, he^.h_length)
result:=connect(SSOCK,addr,sizeof(addr));
end;
//ta funkcja wysle nam cos przez gniazdko
function say(gniazdko:integer;co:string):integer;
begin
result:=send(gniazdko,co[1],length(co),0);
end;
//ta funkcja odbierze nam cos przez gniazdko do bufora 'gdzie' ('ile' bajtow)
function hear(gniazdko:integer;var gdzie:string;ile:integer):integer;
begin
result:=recv(gniazdko,gdzie[1],ile,0);
end;