Pentru
a micsora marimea serverului au extrase anumite functii din antete,
alaturi de implementare si incluse in sursa. Acestea sunt functii necesare
in interactiunea cu sistemul de fisiere, cum ar fi :
- “DirectoryExists” ->
aceasta primeste ca parametru calea unui director si returneaza o valoare
Boolean care indica existenta acestuia
- “LowerCase” -> aceasta
primeste ca parametru un string si returneaza stringul respectiv in
care toate literele sunt mici
- “GetCurrentDir” ->
returneaza un string cu directorul curent
- “FindClose” -> primeste
ca parametru un “TSearchRec” si inchide cautarea
- “FindFirst” ->
primeste ca parametrii o cale si atributele unui fisier dorit si are
ca iesire o variabila de tip TSearchRec in care intoarce rezultatele
cautarii; aceasta functie sa apeleaza doar pentru inceperea cautarii
- “FindNext” -> continua
o cautare inceputa cu “FindFirst”; primeste ca parametru o variabila
de tip TSearchRec in care returneaza urmatorul fisier gasit
- “CreateDir” -> primeste
ca parametru un string care reprezinta numele directorului care urmeaza
sa fie creat
- “RemoveDir” -> primeste
ca parametru un string ce reprezinta numele directorului pentru sters;
aceasta va esua daca directorul nu este gol
- “FileCreate” -> primeste
ca parametru nu string ce reprezinta numele fisierului care urmeaza
sa fie creat
- “FileClose” -> primeste
ca parametru un handle asociat cu fisierul care trebuie inchis
- “RenameFile” -> primeste
doi parametrii : unul cu numele vechi al fisierului, si unul cu noul
nume al fisierului
- “FileAge” -> primeste
ca parametru un string cu numele fisierului pentru care se doreste obtinerea
varstei si intoarce varsta fisierului
- “FileExists” -> aceasta
primeste ca parametru calea unui fisier si returneaza o valoare Boolean
care indica existenta acestuia
- “FileIsReadOnly” ->
aceasta primeste ca parametru calea unui fisier si returneaza o valoare
Boolean care indica daca este marcat ca “doar pentru citire”
- “FileSetReadOnly” ->
aceasta primeste ca parametru calea si numele unui fisier si o variabila
Boolean care se doreste a fi noua stare de readonly a fisierului returneaza
o valoarea Boolean care indica daca daca operatia a avut succes
Pentru
executarea multor functii este nevoie de asemenea de functii ajutatoare,
care cu toate ca nu joaca un rol major, au partea lor de importanta
:
- “doar_fis” -> primeste
ca parametru un string ce reprezinta cale+nume fisier si returneaza
doar numele fisierului ca string
- “win_dir” ->
- returneaza directorul in
care este instalat Windows
- pentru aceasta foloseste
functia “getwindowsdirectory”
- are grija ca stringul returnat
sa se termine mereu cu ‘\’
- “bts” ->
- Primeste ca parametru o
variabila de tip TBufferText si 2 variabile de tip longint care indica
indexul de inceput si indexul de sfarsit intre care literele vor fi
adunate intr-un string
- Returneaza un string format
din literele dintre cei 2 indecsi dati ca parametrii
- “stb” ->
- Primeste ca parametrii o
variabila de tip string si o variabila de tip TBufferText
- Returneaza in variabila
de tip TBufferText stringul separat in caractere
- “dir_sg” ->
- Primeste ca parametru un
string ce reprezinta cale+fisier
- Returneaza un string ce
reprezinta doar calea
Operatiile
principale ale serverului sunt executate de catre proceduri/functii
apelate din functia principala de interceptare a comenzilor primite
de la client. Acestea sunt :
- “open_cd” -> trimite
catre sistem comanda 'set cdaudio door open' , folosind functia de sistem
“mcisendstringA”
- “close_cd” -> trimite
catre sistem comanda 'set cdaudio door closed', folosind functia de
sistem “mcisendstringA”
- “shut_down” -> duce
la inchiderea sistemul pe care ruleaza serverul, folosind un apel al
functiei “exitwindowsex”, cu parametrul “EWX_SHUTDOWN”
- “trimite_dir” ->
- Functia se ocupa cu trimiterea
catre client a continutului unui director specificat in comanda
- Operatia de trimitere se
poate afla in 2 stari
- Daca se afla la primul apel
(in sensul in care nu este o operatie de listare de director deja pornita)
- Se schimba directorul curent
in cel specificat pentru listare si se obtine un identificator catre
acesta
- Se foloseste mai intai functia
“findfirst” pentru a incepe listarea tuturor elementelor din director
(alte directoare + fisiere)
- Urmeaza folosirea functiei
“findnext” pentru a lista totate elementele din director
- Numele directoarelor si
numele fisierelor sunt tinute in doua widestring-uri separate
- Dupa ce toate directoarele
si toate fisierele au fost obtinute, cele doua widestring-uri sunt concatenate,
folosind caracterul #10 ca despartitor
- Se apeleaza functia de trimitere
a datelor despre continutul directorului catre client
- Daca nu se afla la primul
apel (adica o operatie de listare este deja pornita si sunt date de
trimis catre client)
- Se apeleaza direct functia
de trimitere a datelor despre continutul directorului catre client
- “trimite_dir2” ->
- Dupa ce functia “trimite_dir”
aduna datele pentru trimis, aceasta functie le trimite efectiv catre
client
- Sunt tratate 3 situatii,
in functia de marimea datelor ramase pentru trimis :
- Daca marimea curenta este
mai mare decat 1019 caractere, atunci umple un buffer cu date pana la
1019 caractere, adauga antetul si trimite un pachet de 1024 de octeti
- Daca marimea curenta este
mai mica decat 1019 caractere, atunci pune datele ramase intr-un buffer,
adauga antetul si il trimite catre client.
- Daca nu mai sunt date de
trimis, atunci trimite catre client un mesaj in care specifica faptul
ca toate datele au fost trimise si operatia s-a incheiat
- “run_prog” ->
- Procedura se ocupa cu lansarea
in executie a unui executabil specificat in cadrul comenzii
- Extrage mai intai fisierul
pentru executat din bufferul comenzii si dupaia apeleaza functia de
sistem “shellexecuteA”, lansand in executie executabilul respectiv
- “del_file” ->
- Procedura se ocupa de stergerea
unui fisier de pe discul locala, calea si numele fiind precizate in
comanda
- Mai intai se extrag calea
si numele din comanda trimisa de catre client si se incearca stergerea
- Daca aceasta reuseste, este
trimis un mesaj de confirmare clientului, caruia ii este afisat un mesaj
informativ referitor la faptul ca operatia s-a terminat cu succes.
- Daca operatia nu reuseste
(de exemplu fisierul nu exista, nu sunt drepturi suficiete sau este
in uz), atunci clientului ii este trimis un mesaj informativ referitor
la faptul ca operatia nu a putut fi executata.
- Dupa aceasta testeaza cateva
cazuri particulare de fisiere, si anume acelea folosite pentru a stoca
intermediar datele unei operatii de obtinere de informatii, inainte
sa fie downloadate de catre client. Acestea sunt :
- “find.txt” -> folosit
pentru a stoca rezultatele unei operatii de cautare pe discul local
- “handles.txt” ->
folosit pentru a stoca informatiile obtinute despre ferestrele deschise
- “proc.dat” -> folosit
pentru a stoca informatiile obtinute despre procesele care ruleaza
- “graph.dat” -> folosit
pentru a stoca imaginea curenta a desktop-ului in cadrul unei cereri
de imagine
- Cand se doreste stergerea
fisierelor particulare de mai sus, acestea se cauta in directorul gasit
la inceput in care sunt stocate toate fisierele temporare si se incearca
stergerea loc.
- Daca aceasta reuseste, este
trimis un mesaj de confirmare clientului, caruia ii este afisat un mesaj
informativ referitor la faptul ca operatia s-a terminat cu succes.
- Daca operatia nu reuseste
(de exemplu fisierul nu exista, nu sunt drepturi suficiete sau este
in uz), atunci clientului ii este trimis un mesaj informativ referitor
la faptul ca operatia nu a putut fi executata.
- “PONG” ->
- Procedura se ocupa cu trimiterea
catre client a unui mesaj de raspuns pentru a semnala prezenta serverului
- Nu face decat sa formeze
un mesaj cu antetul “PONG” si sa-l trimita catre client
- “send_drivers” ->
- Pentru a naviga prin sistemul
de fisiere al sistemului gazda al serverului, clientul are nevoie sa
cunoasca literele asociate cu discurile logice de pe aceasta masina.
- Procedura se ocupa cu obtinerea
informatiilor despre literele asociate cu discurile logice de pe masina
pe care ruleaza si trimiterea lor catre client
- Mai intai se foloseste functia
de sistem “GetLogicalDriveStrings”. Aceasta obtine si returneaza
un vector de caractere reprezentand literele asociate pentru fiecare
drive logic.
- Urmeaza o triere a acestora,
nefiind oportuna trimiterea catre client si a literelor asociate cu
unitatile optice si dischetelor, putanda aparea erori la accesarea acestora.
- Dupa triere informatia este
stocata intr-un vector cu antetul “drv” si este trimisa catre client
- “mesaj” ->
- Procedura se ocupa cu afisarea
unui mesaj informati catre utilizatorul calculatorului pe care ruleaza,
textul fiind trimis de catre client in cadrul comenzii
- Mai intai este extras textul
care urmeaza sa formeze continutul text box-ului
- Vrem ca acest text box sa
fie afisat in prin plan, asa ca il vom crea ca fiind copilul ferestrei
care se afla in prim-plan la momentul crearii.
- Se obtine identificatorul
ferestrei din prim-plan folosind functia “getforegroundwindow”,
care returneaza handle-ul acesteia
- Se creeaza text box-ul cu
ajutorul functie de sistem “MessageBoxA” – functie declarata ca
fiind externa din “user32.Dll”
- “find_file” ->
- Procedura se ocupa cu lansarea
cautarii unui fisier pe toate discurile logice (prin apelarea functie
“find_file2” pentru fiecare dintre acesta) si trimiterea unui mesaj
informativ catre client la terminarea operatiei
- Mai intai extrage numele
fisierului care este cautat din comanda trimisa de client
- Urmeaza crearea fisierului
folosit pentru a stoca rezultatele cautarii, creare ce are loc in calea
folosita pentru stocarea fisierelor temporare
- Se foloseste “GetLogicalDriveStrings”
pentru a obtine un vector de caractere reprezentand literele asociate
pentru fiecare drive logic.
- Pentru fiecare litera care
nu este asociata cu o unitate optica este lansata in executie procedura
“find_file2”, care se ocupa de cautarea efectiva intr-o cale data
si in toate subdirectoarele acesteia
- Pe masura ce sunt gasite,
rezultatele sunt stocate in fisierul deschis anterior in aceasta functie.
Aceste fisier urmeaza sa fie downloadat de catre client ulterior, dupa
ce primeste notificarea terminarii operatiei de cautare.
- La terminarea executiei
cautarii pentru fiecare din discurile logice, mesajul de notificare
este trimis catre client. Mai intai un mesaj informativ ce va fi afisat
utilizatorului si apoi un mesaj care va declansa downloadarea fisierului
cu rezultate.
- “find_target_file” ->
- Procedura se ocupa cu lansarea
cautarii unui fisier intr-o anumita cale data de catre client in comanda
trimisa (prin apelarea functie “find_file2” pentru aceasta cale)
si trimiterea unui mesaj informativ catre client la terminarea operatiei
- Mai intai extrage numele
fisierului care este cautat si calea in care este cautat din comanda
trimisa de client
- Urmeaza crearea fisierului
folosit pentru a stoca rezultatele cautarii, creare ce are loc in calea
folosita pentru stocarea fisierelor temporare
- Pentru calea specificata
este lansata in executie procedura “find_file2”, care se ocupa de
cautarea efectiva intr-o cale data si in toate subdirectoarele acesteia
- Pe masura ce sunt gasite,
rezultatele sunt stocate in fisierul deschis anterior in aceasta functie.
Aceste fisier urmeaza sa fie downloadat de catre client ulterior, dupa
ce primeste notificarea terminarii operatiei de cautare.
- La terminarea executiei
cautarii pentru fiecare din discurile logice, mesajul de notificare
este trimis catre client. Mai intai un mesaj informativ ce va fi afisat
utilizatorului si apoi un mesaj care va declansa downloadarea fisierului
cu rezultate.
- “find_file2” ->
- Procedura se ocupa de cautarea
efectiva intr-o cale data si salvarea rezultatelor in fisierul deschis
anterior in functia “find_file”
- Se cauta in calea de pornire,
apoi se iau la rand toate subdirectoarele pana la cel mai adanc nivel
si se cauta si in acestea
- Pentru o cale se foloseste
functia “findfirst” pentru a gasi fisierele care corespund
cerintei clientului, urmand a se folosi “findnext” pentru a gasit
toate fisierele corespunzatoare
- In momentul in care un fisier
este gasit, rezultatul este salvat in fisier (calea si numele fisierului
gasit)
- Urmeaza o parcurgere a tuturor
directoarelor din aceasta cale. Acestea sunt adaugate intr-o coada simulata
printr-un vector, urmand sa fie verificate cand le vine randul
- In momentul in care coada
ajunge la 10000 de elemente, aceasta este “scurtata” prin mutarea
elementelor la stanga, peste cele deja folosite
- Mai intai este folosita
functia “findfirst” pentru a gasit primul director, care este adaugat
in coada. Dupa asta este folosita functia “findnext” pentru a gasit
toate celelalte directoare, acestea fiind la randul lor adaugate in
coada.
- “create_dir” ->
- Procedura se ocupa de crearea
unui nou director, al carui nume este dat de catre client in comanda
trimisa
- Primul lucru care se face
este sa se extraga numele directorului care se doreste creat; acesta
este trimis de catre client, alaturi de calea pentru creare
- Pentru creare se foloseste
functia “CreateDir”; aceasta primeste ca parametru calea+numele
si returneaza o variabila Boolean care indica daca acesta a fost sau
nu creat
- In functie succesul in insuccesul
in crearea directorului este trimis catre client un mesaj informativ
care ii indica acestuia ce s-a intamplat
- “remove_dir” ->
- Procedura se ocupa de stergerea
unui director, al carui nume este dat de catre client in comanda trimisa
- Primul lucru care se face
este sa se extraga numele directorului care se doreste sters; acesta
este trimis de catre client, alaturi de calea pentru stergere
- Pentru stergere se foloseste
functia “RemoveDir”; aceasta primeste ca parametru calea+numele
si returneaza o variabila Boolean care indica daca acesta a fost sau
nu sters; un director poate fi sters decat daca este gol in momentul
apelarii functiei
- In functie succesul in insuccesul
in crearea directorului este trimis catre client un mesaj informativ
care ii indica acestuia ce s-a intamplat
- “create_fis” ->
- Procedura se ocupa de crearea
unui nou fisier, al carui nume este dat de catre client in comanda trimisa
- Primul lucru care se face
este sa se extraga numele fisierului care se doreste creat; acesta este
trimis de catre client, alaturi de calea pentru creare
- Pentru creare se foloseste
functia “FileCreate”; aceasta primeste ca parametru calea+numele
si returneaza o variabila Boolean care indica daca acesta a fost sau
nu creat
- In functie succesul in insuccesul
in crearea fisierului, este trimis catre client un mesaj informativ
care ii indica acestuia ce s-a intamplat
- “rename_file” ->
- Procedura se ocupa de redenumirea
unui fisier, al carui nume este dat de catre client in comanda trimisa
- Primul lucru care se face
este sa se extraga numele fisierului care se doreste redenumit, alaturi
de noul nume; acestea sunt trimise de catre client, alaturi de calea
in care se afla
- Pentru creare se foloseste
functia “RenameFile”; aceasta primeste ca parametru calea+numele
vechi si noul nume si returneaza o variabila Boolean care indica daca
acesta a fost sau nu redenumit
- “send_cached_passwords”
->
- Procedura se ocupa de obtinerea
parolelor RAS si apelarea functiei de trimitere
- Trateaza trei cazuri :
- Daca operatia de obtinere
a parolelor nu a fost pornita, atunci
- Se verifica mai intai daca
s-a reusit obtinerea adresei functiei “WNetEnumCachedPasswords”,
necesara pentru obtinerea parolelor
- Pentru obtinerea parolelor
se apeleaza functia “WNetEnumCachedPasswords”; aceasta primeste
ca parametru o functie de callback, apelata pentru a-i fi pasate parolele
; apelul “WNetEnumCachedPasswords” poate esua daca nu este logat
nici un user, caz in care se trimite catre client un mesaj informativ
despre eroarea aparuta
- In cazul in care functia
reuseste dar nu se gaseste nici o parola, este trimis catre client un
mesaj informativ
- Daca este gasita cel putin
o parola este apelata functia de trimitere a acestora catre client
- Daca operatia de obtinere
a parolelor a fost deja pornita, atunci se apeleaza functia de trimitere
a acestora catre client
- Daca operatia de obtinere
a parolelor a fost deja pornita si au fost trimise toate parolele, se
trimite catre client un mesaj prin care este anuntat ca toate parolele
au fost trimise
- “expediaza_cached_passwords”
->
- Procedura se ocupa cu trimiterea
parolelor obtinute catre client, in pachete de maxim 1024 octeti (incluzand
antetul)
- Se iau inregistrarile la
rand si se incearca introducerea lor in mesajul pentru trimis (daca
mai este loc)
- Dupa umplerea mesajului
curent, acesta este trimis catre client
- Daca s-au trimis toate inregistrarile,
atunci acest lucru este semnalizat prin valoarea contorului, care devine
“-1”, urmanda ca urmatorul pachet sa semnalizeze terminarea procesului
- “AddPassword” ->
- Functia de callback apelata
de catre sistem pentru a-i fi pasate inregistrarile cu parolele utilizatorului
curent
- Din inregistrare sunt extrase
userul si parola si sunt inserate in vectorul de inregistrari extrase
care urmeaza sa fie procesat si trimis catre client
- “get_handles” ->
- Procedura se ocupa de obtinerea
informatiilor despre ferestrele deschise pe calculatorul gazda al serverului,
fisiere ce sunt salvate in fisierul “handlex.txt” din directorul
de stocare al fisierelor temporare, trimitand la sfarsit un mesaj de
catre client
- Mai intai este creat fisierul
“handles.txt”; in cazul in care exista si contine ceva, este suprascris
- Pentru a obtine identificatorii
ferestrelor este folosita functia de sistem “enumwindows”; aceasta
primeste ca parametru adresa unei functii folosite ca functi de callback;
functia de callback primeste informatiile despre identificatori.
- Dupa ce operatia de obtinere
a informatiilor este terminata, se trimite catre client un mesaj
informativ ce va fi afisat utilizatorului
- Ultimul mesaj trimis de
aceasta procedura indica clientului ca fisierul a fost downloadat si
se poate lansa cererea de downloadare
- “enum_windows”->
- Functia de callback a carei
adresa este daca functiei de sistem “enumwindows”
- Aceasta primeste handle-urile
ferestrelor, obtine informatiile despre ele si le salveaza
- Mai intai foloseste functia
“getparent” pentru a obtine identificatorul ferestrei parinte
- Se obtine apoi lungimea
textului ce reprezinta titlul ferestrei cu ajutorul functiei “getwindowtextlength”
- Cunoscand marimea, se foloseste
“getwindowtext” pentru a obtine textul ce reprezinta titlul
- Dupa ce toate datele despre
o fereastra sunt stranse, acestea sunt scrise in fisierul “handlex.txt”,
deschis anterior in procedura “get_handles”
- “inchide_prog” ->
- Procedura se ocupa de inchiderea
unui program , al carui handle este dat de catre client in comanda trimisa
- Primul lucru care se face
este sa se extraga handle-ul programului care se doreste inchis; acesta
este trimis de catre client
- Pentru inchidere se foloseste
functia “sendmessage”; aceasta primeste ca parametru handle-ul unui
program catre care se va trimite un mesaj dat ca parametru; pentru
aceasta situatie se trimite mesajul “WM_CLOSE” care cauzeaza inchiderea
- “schimba_caption_prog”
->
- Procedura se ocupa de schimbarea
numelui unei ferestre , al carui handle este dat de catre client in
comanda trimisa
- Primul lucru care se face
este sa se extraga handle-ul ferestrei al carei titlu trebuie schimbat
si noul titlu care trebuie pus; acestea sunt trimise de catre client
odata cu comanda
- Pentru schimbarea titlului
se foloseste functia “setwindowtext”; aceasta primeste ca parametru
handle-ul unui ferestre si noul titlu dorit pentru ea
- Titlul va reveni totusi
la valoarea initiala dupa un refresh
- “show_window” ->
- Procedura se ocupa de afisarea
in prim-plan a unei ferestre , al carui handle este dat de catre
client in comanda trimisa
- Primul lucru care se face
este sa se extraga handle-ul ferestrei; acesta este trimis de catre
client odata cu comanda
- Pentru a executa comanda
clientului sunt folosite succesiv mai multe functii de sistem :
- Mai intai “showwindow”,
careia ii sunt dati ca parametrii identificatorul ferestrei si “SW_SHOWMINIMIZED”,
cu rolul de a minimiza mai intai fereastra
- Urmeaza tot un apel catre
“showwindow”, careia ii sunt dati ca parametrii identificatorul
ferestrei si de data aceasta “SW_ SW_SHOWMAXIMIZED”, cu rolul de
a maximiza fereastra
- Ultimul apel este catre
functia de sistem “setforegroundwindow”, care primeste ca parametru
identificatorul ferestrei si are rolul de a seta fereastra din prim-plan
- “minimize_window” ->
- Procedura se ocupa minimizarea
unei ferestre , al carui handle este dat de catre client in comanda
trimisa
- Primul lucru care se face
este sa se extraga handle-ul ferestrei; acesta este trimis de catre
client odata cu comanda
- Pentru a minimiza fereastra
este folosita functia de sistem “closewindow”, care primeste ca
parametru identificatorul ferestrei pentru minimizat
- “get_screen” ->
- Procedura se ocupa de obtinerea
unei imagini a ecranului sistemului pe care ruleaza serverul
- Pentru a obtine un raport
favorabil marime/calitate imagine, sunt folosite fisiere jpeg pentru
a retine imaginea desktopului
- Pentru a crea un jpg este
nevoie de libraria “graph.dll”; aceasta trebuie plasata in directorul
de instalare al windows-ului, fiind cautata acolo de catre program
- Mai intai se incearca incarcarea
librariei folosind functia de sistem “loadlibraryex”
- Daca libraria nu este gasita,
imaginea nu este creata si este trimis catre client un mesaj care-l
informeaza de acest impediment
- Daca libraria este gasita
:
- Pentru crearea jpg-ului
este folosit un procent de compresie, care poate fi optinonal dat de
catre client
- Procesul de compresie este
extras din comanda trimisa de client; daca nu este un numar valid
sau este mai mic decat 1 sau mai mare decat 100, se foloseste valoarea
standard “20”
- Urmeaza obtinerea adresei
procesului “scrreal”; aceasta adresa este obtinuta folosind functia
de sistem “getprocaddress”
- Daca aceasta adresa este
gasita, este apelata functia de obtinere a imaginii ecranului, care
primeste ca parametrii procentul pentru compresie si calea+numele fisierului
in care aceasta imagine va fi stocata
- In cazul in care imaginea
este obtinuta cu succes si salvata in fisierul indicat, este trimis
catre server un mesaj care ii indica faptul ca procesul a luat sfarsit
si poate comanda downloadarea imaginii obtinute
- “send_file” ->
- Functie folosita pentru
trimiterea datelor dintr-un fisier catre client
- Mai intai citeste din fisier
1024 de octeti folosind functia “blockread” si apoi ii trimite catre
client
- Daca au fost cititi mai
putini de 1024 octeti, inseamna ca acesta a fost ultimul pachet din
fisier si este inchis
- “prel_copy” ->
- Procedura se ocupa de pregatirile
dinaintea inceperii trimiterii de date in cadrul unei operatii de copiere
a unui fisier
- Mai intai este extrasa calea+numele
fisierului pe care clientul doreste sa-l downloadeze
- Daca fisierul este unul
dintre cele folosite pentru stocarea intermediara a rezultatelor unei
operatii (‘find.txt’, ‘handles.txt’, ‘proc.dat’, ‘graph.jpg’),
atunci este adaugata calea catre ele, si anume calea folosita pentru
stocarea fisierelor intermediare calculata la pornirea serverului
- Urmeaza verificarea existentei
fisierului
- Daca acesta nu exista, se
trimite catre client un mesaj informativ prin care este anuntat de faptul
ca fisierul nu exista
- Daca acesta exista
- Mai intai se asigura faptul
ca fisierul nu este “readonly”; se obtine aceasta stare prin apelul
functiei “fileisreadonly”; in caz afirmativ, se apeleaza functia
“filesetreadonly” pentru a seta aceasta propietate la valoarea false
- Se apeleaza functia “findfirst”
avand ca parametru exact fisierul dorit; aceasta il va gasi intotdeauna,
avand in vedere ca existenta a fost testata anterior. Prin acest apel
se obtin informatii despre fisier.
- Se trimite catre client
un mesaj cu marimea fisierului dorit pentru downloadare, astfel incat
acesta sa stie cat mai are de primit si pentru a folosi bara de progres
a downloadarii
- Se deschide fisierul si
se apeleaza functia “send_file” pentru a incepe trimiterea datelor
catre client
- “prel_upload” ->
- Procedura se ocupa de pregatirile
dinaintea inceperii primirii de date in cadrul unei operatii de uploadare
a unui fisier
- Mai intai este extrasa calea+numele
fisierului pe care clientul doreste sa-l uploadeze
- Se incearca crearea fisierului
in calea specificata
- Se verifica apoi existenta
fisierului cu ajutorul functie “fileexists”
- Daca acesta nu exista inseamna
ca nu au fost drepturi suficiente pentru crearea acestuia si se trimite
catre client un mesaj informativ prin care este anuntat ca uploadarea
nu poate avea loc deoarece fisierul nu poate fi creat in calea specificata
- Daca acesta exista se trece
in starea de uploadare (in care toate datele primite vor fi scrise in
fisierul creat anterior) si se trimite catre client un mesaj prin care
este anuntat ca poate incepe trimiterea de date
- “upload_proc” ->
- Procedura apelata pentru
a primi si pentru a scrie datele primite de la un client in cadrul unei
operatii de uploadare
- Datele primite de la client
sunt scrise in fisierul deschis anterior de functia “prel_upload”
- Daca marimea primita pana
acum este mai mica decat marimea totala care trebuie primita, atunci
este trimis catre client un mesaj prin care este anuntat ca poate trimite
urmatorul pachet de date
- In cazul in care s-au primit
toate datele asteptate, fisierul pentru upload este inchis, se iese
din starea de uploadare si se pot primi alte date
- “file_size” ->
- Procedura apelata in momentul
in care serverul primeste o cerere de aflare a marimii unui fisier
- Mai intai extrage numele
fisierului primit ca parametru al comenzii
- Este apelata functia “findfirst”
pentru a gasit fisierul si informatiile despre el (acesta este cautat
exact in calea in care este plasat, fiind gasit de functie intotdeauna)
- Este extrasa marimea fiserului
si este calculata si marimea in KB
- De asemenea, este inclusa
si informatia despre starea flag-ului “readonly”
- Este trimis catre client
un pachet continand informatiile extrase anterior
- “enable_window” ->
- Procedura se ocupa activarea
unei ferestre , al carui handle este dat de catre client in comanda
trimisa
- Primul lucru care se face
este sa se extraga handle-ul ferestrei; acesta este trimis de catre
client odata cu comanda
- Pentru a activa fereastra
este folosita functia de sistem “enablewindow”, care primeste ca
parametrii identificatorul ferestrei pentru activat si daca sa o activeze
sau sa o activeze
- “dissable_window” ->
- Procedura se ocupa dezactivarea
unei ferestre , al carui handle este dat de catre client in comanda
trimisa
- Primul lucru care se face
este sa se extraga handle-ul ferestrei; acesta este trimis de catre
client odata cu comanda
- Pentru a dezactiva fereastra
este folosita functia de sistem “enablewindow”, care primeste ca
parametrii identificatorul ferestrei pentru activat si daca sa o activeze
sau sa o activeze
- “set_window_rgn” ->
- Procedura se ocupa setarea
formei unei ferestre , al carui handle este dat de catre client in comanda
trimisa
- Primul lucru care se face
este sa se extraga handle-ul ferestrei; acesta este trimis de catre
client odata cu comanda
- Se obtine forma curenta
a ferestrei folosind functia “getwindowrect”
- Aceasta forma este modificata
pentru a crea o regiune eliptica folosind functia “createellipticrgn”
- Regiunea eliptica creata
este aplicata ferestrei folosind functia “setwindowrgn”
- “hide_mouse” ->
- Procedura se ocupa afisarea/ascunderea
mouseului
- Daca parametrul apelului
indica ascunderea, atunci este apelata functia “showcursor” cu parametrul
“false”, indicand sistemului sa nu mai afiseze mouse-ul
- Daca parametrul apelului
indica afisarea, atunci este apelata functia “showcursor” cu parametrul
“true”, indicand sistemului sa afiseze mouse-ul
- “swap_mouse_buttons”
->
- Procedura se ocupa inversarea/resetarea
functionalitatii butoanelor mouseului
- Daca parametrul apelului
indica inversarea, atunci este apelata functia “swapmousebutton”
cu parametrul “true”, indicand sistemului sa interschimbe functionalitatea
butoanelor mouse-ului
- Daca parametrul apelului
indica resetarea, atunci este apelata functia “swapmousebutton”
cu parametrul “false”, indicand sistemului sa reseteze functionalitatea
butoanelor mouse-ului
- “mouse_click” ->
- Procedura se ocupa de actionarea
unui click stanga/dreapta la o anumita pozitie a mouse-ului, in functie
de parametrii comenzii
- Mai intai sunt extrase coordonatele
pe axa x si pe axa y la care trebuie efectuat click-ul
- Daca parametrul apelului
indica un click stanga, atunci :
- Este apelata mai intai functia
“setcursorpos” pentru a seta mouse-ul la pozitia specificata de
client
- Este apelata functia “mouse_event”
cu parametrul “MOUSEEVENTF_LEFTDOWN”, pentru a genera apasarea butonului
stanga al mouse-ului
- Este apelata functia “mouse_event”
cu parametrul “MOUSEEVENTF_LEFTUP”, pentru a genera eliberarea butonului
stanga al mouse-ului
- Daca parametrul apelului
indica un click dreapta, atunci :
- Este apelata functia “mouse_event”
cu parametrul “MOUSEEVENTF_RIGHTDOWN”, pentru a genera apasarea
butonului dreapta al mouse-ului
- Este apelata functia “mouse_event”
cu parametrul “MOUSEEVENTF_RIGHTUP”, pentru a genera eliberarea
butonului dreapta al mouse-ului
- “random_mouse_move”
->
- Procedura se ocupa de generarea
unei miscari “random” a mouse-ului
- Pentru a simula acest lucru
se apeleaza functia “mouse_event” cu parametrul “MOUSEEVENTF_MOVE”
si 100,100 pentru a genera mutarea pe axa x si y cu cate 100 de pixeli
- “move_mouse” ->
- Procedura se ocupa de miscarea
si evetual executarea de click-uri a mouse-ului pe ecranul calculatorului
gazda al serverului in cadrul unei operatii de controlare a mouse-ului
- Este parcurs tot vectorul
de mutari si click-uri :
- Mai intai este extrasa pozitia
unde se va muta mouse-ul (si eventula se va da click)
- Se pozitioneaza mouse-ul
la acea pozitie folosind functia “setcursorpos”
- Daca trebuie efectuat si
un click la acea pozitie :
- Este apelata functia “mouse_event”
cu parametrul “MOUSEEVENTF_LEFTDOWN”, pentru a genera apasarea butonului
stanga al mouse-ului
- Este apelata functia “mouse_event”
cu parametrul “MOUSEEVENTF_LEFTUP”, pentru a genera eliberarea butonului
stanga al mouse-ului
- “get_processes” ->
- Procedura se ocupa de obtinerea
informatiile despre procesele care ruleaza pe calculatorul gazda al
serverului, salvarea acestora intr-un fisier intermediar si trimiterea
catre server a unui mesaj care semnalizeaza sfarsitul taskului
- Functiile de sistem necesare
pentru a obtine aceste informatii se afla in libraria “kernel32.dll”.
Aceasta este incarcata la inceputul procedurii. Daca nu se reuseste,
executia procedurii nu mai continua.
- Din aceasta librarie sunt
folosite trei functii :
- “CreateToolhelp32Snapshot”
– aceasta functie creaza un snapshot al proceselor curente ce ruleaza
si returneaza un handle catre acest snapshot
- “Process32First” –
aceasta functie returneaza porneste iterarea unui snapshot si returneaza
prima inregistrare
- “Process32Next” –
aceasta functie continua iterarea si returneaza urmatoarea inregistrare
- Astfel mai intai se creeaza
un snapshot si se obtine un handle catre el, folosind “CreateToolhelp32Snapshot”
- Se creaza un fisier in care
se vor retine intermediar rezultatele obtinute, urmand ca acesta sa
fie downloadat de catre client
- Se foloseste functia “Process32First”
pentru a porni iterarea si a obtine prima inregistrare, ale carei informatii
despre nume, id si parinte sunt scrise in fisier
- Se foloseste functia “Process32Next”
pentru a lista toate celelalte inregistrari (mai sunt inregistrari cat
timp functia returneaza true), informatiile despre nume, id si parinte
fiind scrise in fisier
- La sfarsit este trimis catre
client un mesaj prin care este informat ca informatiile au fost obtinute
si salvate, iar acum poate emite cererea de downloadare a fisierului
cu rezultate
- “kill_process” ->
- Procedura este apelata cand
serverul primeste comanda de oprire a unui proces
- Mai intai extrage identificatorul
procesului pentru oprit, identificator ce vine odata cu comanda
- Este folosita functia “openprocess”
pentru a deschide procesul pentru terminare (prin specificarea parametrului
“PROCESS_TERMINATE”)
- Rezultatul functiei este
folosit in apelul functiei “terminateprocess”, pentru a termina
executia procesului
- “kill_app” ->
- Functia este folosita pentru
inchiderea procesului asociat cu o anumita fereastra, in comanda fiind
primit identificatorul ferestrei
- Mai intai extrage identificatorul
ferestrei din comanda primita
- Translateaza identificatorul
ferestrei in identificatorul procesului asociat folosind functia
“GetWindowThreadProcessID”
- Este folosita functia “openprocess”
pentru a deschide procesul pentru terminare (prin specificarea parametrului
“PROCESS_TERMINATE”)
- Rezultatul functiei este
folosit in apelul functiei “terminateprocess”, pentru a termina
executia procesului
4. Concluzii si dezvoltari
ulterioare
In
acest domeniu, alte programe (de exemplu “UltraVnc”), aduc facilitati
cum ar fi
- Controlul in real-time al
operatiilor de pe calculatorul aflat la distanta prin vizualizarea in
real-time a ecranului si controlul real-time a mouse-ului si tastaturii
- Folosirea unui sistem sofisticat
de codare a datelor schimbate intre client si server
- Posibilitatea de char intre
utilizatorii celor doua calculatoare conectate
- Autentificarea utilizatorilor
care doresc sa se conecteze la server
- Suport pentru monitoare
multiple
Programul
dezvoltat si prezentat in aceasta lucrare nu isi propune sa concureze
cu programele deja existente pe piata, acest lucru fiind practic imposibil
datorita volumului de munca si resurse umane aflate in spatele lor.
Totusi,
isi propune sa demonstreze conceptele de baza ale unui sistem de control
la distanta si sa ofere utilizatorului posibilitatea de a interactiona
cu sistemul gazda al serverului in cat mai multe feluri.
Spre
deosebire de programele comerciale, acesta pune la dispozitie un control
mai fin al resurselor sistemului :
- Manipularea identificatorilor
ferestrelor deschise cu multiple optiuni
- Vizualizarea si manipularea
proceselor
Starea
actuala a programului permite dezvoltari multiple, cum ar fi :
- Adaugarea unui sistem de
logare, astfel incat utilizatorii sa nu poata accesa fara aprobare serverul
si sistemul pe care ruleaza acesta
- Implementarea rularii diferitelor
operatii ale serverului pe mai multe threaduri
- Posibilitatea de a controla
in totalitate sistemul gazda al serverului, fiind nevoie de adaugarea
facilitatii de vizualizare in real-time a ecranului utilizatorului si
de controlul tastaturii
5. Bibliografie
[1] Andrew S. Tanenbaum – “Computer
Networks” , ISBN 0-13-066102-3
[2] Andrew S. Tanenbaum – “Modern
Operating Systems” , ISBN 0-13-031358-0
[3] Marco Cantu – “Mastering Delphi
6”, ISBN: 0782128742
[4] Rachele, Warren - “Learn
Object Pascal with Delphi” , ISBN: 1556227191
[5] www.freebyte.com/programming/delphi/
[6] www.festra.com/freetutor/ - tutoriale programare Delphi
[7] www.drbob42.com/ - informatii tehnice despre programarea in
Delphi
[8] forums.devshed.com/delphi-programming-90/
- forumuri de discutii despre programarea in Delphi
[9] www.tolderlund.eu/delphi/ - informatii si tutoriale Delphi
[10] www.delphi-central.com/