Utilizatorul
poate selecta oricare dintre iconitele din lista (fiecare asociata unei
ferestre deschise pe calculatorul gazda al serverului) si poate efectua
operatii asupra acelei ferestre.
Orice
fereastra din lista din partea dreapta poate fi selectata si poate fi
inchisa. Prin apasarea butonului “Kill process” este trimisa catre
server o cerere de inchidere a procesului care a creat fereastra selectata.
Dupa trimiterea cererii, clientul asteapta de la server rezultatul executarii
comenzii. Inchiderea procesului de pe calculatorul aflat la distanta
nu se reflecta imediat in lista de ferestre din ListView. Pentru a obtine
schimbarile aparute datorita inchiderii procesului selectat trebuie
downloadata din nou lista de ferestre deschise (prin aceasta operatie
vechea lista de procese va fi suprascrisa cu noua lista de ferestre)
si trebuie afisata aceasta.
Atentie
: inchiderea anumitor procese poate duce la oprirea functionarii corecte
a masinii pe care ruleaza serverul, sau chiar blocarea acesteia. In
momentul in care se doreste oprirea unui proces este bine sa se aiba
in vedere posibilele consecinte ale acestei actiuni.
Alta
modalitate de inchidere a unei ferestre este prin incercarea de inchidere
direct a acelei ferestre (fara a actiuna direct asupra procesului creator).
Acest lucru nu este posibil tot timpul, cea mai sigura metoda de a inchide
un proces fiind de a actiona direct asupra procesului creator. Totusi,
daca se doreste incercarea acestei metode se selecteaza o fereastra
din lista si se actioneaza butonul “Close prog”. Acesta va genera
trimiterea unei cereri de inchidere a ferestrei respective. Inchiderea
programului de pe calculatorul aflat la distanta nu se reflecta imediat
in lista de ferestre din ListView. Pentru a obtine schimbarile aparute
datorita inchiderii procesului selectat trebuie downloadata din nou
lista de ferestre deschise (prin aceasta operatie vechea lista de procese
va fi suprascrisa cu noua lista de ferestre) si trebuie afisata aceasta.
Obtinerea si vizualizarea informatiilor
despre ferestre :
Oprirea unui program/proces asociat
cu o fereastra :
Operatiile
de vizualizare si inchidere a unui program/proces asociat ferestrei
sunt cele mai importante dar nu sunt singurele disponibile utilizatorului.
In afara de acestea, utilizatorul are la dispozitie si urmatoarele operatii
:
- Schimbarea starii activat/dezactivat
a unei ferestre. In momentul in care o fereastra trece in starea de
dezactivare, aceasta nu mai primeste input de la utilizatorul sistemul
gazda pe care ruleaza serverul (inputul care vine de exemplu de la tastatura
sau de la mouse). Pentru a realiza trecerea in starea de dezactivare,
se selecteaza o fereastra din lista si se actioneaza butonul “Disable
window”. Acesta va genera trimiterea catre server a unei cereri de
dezactivare, alaturi de identificatorul ferestrei pentru care se doreste
dezactivarea. Pentru a activa o fereastra, se selecteaza o fereastra
din lista si se actioneaza butonul “Enable window”. Acesta va genera
trimiterea catre server a unei cereri de activare, alaturi de identificatorul
ferestrei pentru care se doreste activarea. Serverul va executa comanda
trimisa de client, fapt vizibil imediat pe masina gazda a serverului.
- Schimbarea starii de minimizare/vizualizare
a unei ferestre. O fereastra poate fi minimizata sau maximizata si cu
ajutorul acestei comenzi, aceasta poate trece intre cele doua stari.
Pentru a realiza trecerea in starea de minimizare, se selecteaza o fereastra
din lista si se actioneaza butonul “Minimize window”. Acesta va
genera trimiterea catre server a unei cereri de minimizare, alaturi
de identificatorul ferestrei pentru care se doreste minimizarea. Pentru
a afisa o fereastra, se selecteaza o fereastra din lista si se actioneaza
butonul “Show window”. Acesta va genera trimiterea catre server
a unei cereri de afisare, alaturi de identificatorul ferestrei pentru
care se doreste afisarea. Serverul va executa comanda trimisa de client,
fapt vizibil imediat pe masina gazda a serverului.
- Schimbarea numelui unei
ferestre. Fiecare fereastra are un titlu afisat in bara de sus. Acest
nume este chiar numele prin care este identificata fiecare fereastra
in ListView-ul din partea dreapta a ferestrei. El poate fi schimbat
printr-o comanda trimisa serverului. Pentru a realiza schimbare titlului,
se selecteaza o fereastra din lista, se scrie noul nume in casuta de
text din partea stanga-sus a ferestrei si se actioneaza butonul “Change
caption”. Acesta va genera trimiterea catre server a unei cereri de
schimbare a numelui, alaturi de identificatorul ferestrei pentru care
se doreste schimbarea numelui. Serverul va executa comanda trimisa de
client, fapt vizibil imediat pe masina gazda a serverului.
- Schimbarea formei ferestrei.
Aceasta facilitate este mai mult pentru a arata ca acest lucru este
posibil. Astfel, unei ferestre ii poate fi schimbata forma intr-un mod
arbitrat. Ca sa exemplific, in acest caz va capata o forma rotunda/ovala.
Pentru a schimba forma unei ferestre, se selecteaza o fereastra din
lista si se actioneaza butonul “Create round rgn”. Acesta va genera
trimiterea catre server a unei cereri de schimbare a formei ferestrei,
alaturi de identificatorul ferestrei pentru care se doreste modificarea
formei. Serverul va executa comanda trimisa de client, fapt vizibil
imediat pe masina gazda a serverului.
O
alta facilitate pusa la dispozitie de program este cautarea ferestrei
ce contine un anumit cuvant in titlu intre ferestrele deschise pe sistemul
gazda al serverului. Clientul afisaza lista de ferestre si informatii
despre ele in fereastra din partea dreapta. Pentru a cauta fereastra
care contine un anumit cuvant se scrie cuvantul dorit in casuta de text
de sub butonul “Search word” si se actioneaza butonul mentionat
anterior. Aceasta actiune va genera selectarea primei ferestre care
contine in titlu cuvantul scris in casuta de text.
Aceasta
facilitate este importanta in momentul in care sunt deschise multe ferestre
pe sistemul gazda si se doreste gasirea uneia in particular.
2.7
Optiunile disponibile din meniul de
distractie (fara o folosinta practica deosebita)
Acest
meniu ofera mai multe functii a caror importanta este scazuta, dar care
au fost implementate din dorinta de a arata ca se poate :
- Functia de trimitere a unui
mesaj catre utilizatorul sistemului pe care este instalat serverul.
In casuta de text aflata deasupra butonului “Send message” se poate
introduce un text arbitrar, care la apasarea butonului mentionat anterior
este trimis catre server, alaturi de o cerere a afisare intr-un message
box. Serverul proceseaza cererea si afisaza mesajul dorit intr-un message
box avand decat optiunea “ok”. Titlul message box-ului este “Mesaj
informativ” si va aparea in prim plan.
- Functia de inchidere a calculatorului
pe care ruleaza serverul. Calculatorul pe care ruleaza serverul poate
fi inchis de la distanta. Daca se doreste acest lucru, este necesar
decat sa se actioneze butonul “Shut down”. Rezulta trimiterea unei
cereri de oprire catre server. Acesta la randul sau proceseaza cererea
si apeleaza functia de sistem ce genereaza oprirea fortata a calculatorului.
Rezultatul acestei functii este oprirea calculatorului gazda al serverului,
deci implicit inchiderea serverului si intreruperea conexiunii. In concluzie,
folositi aceasta functionalitate doar daca nu mai aveti nevoie de calculatorul
aflat la distanta.
- Functia de inchidere/deschidere
a cd-rom/dvd-rom –ului. Clientul poate trimite serverului o comanda
care genereaza inchiderea sau deschiderea usitei cd-rom/dvd-rom –ului.
Pentru unitatile optice normale (cu motoras care actioneaza tavita de
suport), sunt disponibile ambele functii (deschidere si inchidere).
Pentru unitatile optice fara motoras de actionare a tavitei este disponibila
doar functia de deschidere, functia de inchidere neavand nici un rezultat
(deoarece necesita actionare manuala). Pentru a trimite aceste comenzi
se actioneaza butoanele “Open” si “Close” ; primul, dupa cum
sugereaza si numele, genereaza deschiderea usitei unitatii optice, iar
cel de-al doilea inchiderea usitei.
- Functii de manipulare a
mouse-ului :
- Functia de ascundere/afisare
a mouseului. Clientul poate trimite catre server o comanda care rezulta
in ascunderea mouse-ului utilizatorului. De asemenea exista si comanda
inversa, de afisare a mouse-ului. Pentru a genera comanda de ascundere
a mouse-ului se actioneaza butonul “Hide”. Va rezulta trimiterea
unui mesaj catre server continand comanda de ascundere. Serverul proceseaza
cererea si apeleaza o functie de sistem care are ca rezultat ascunderea
mouse-ului (adica mouse-ul nu mai este desenat pe ecran). Pentru a genera
comanda de afisare a mouse-ului se actioneaza butonul “Show”. Va
rezulta trimiterea unui mesaj catre server continand comanda de afisare.
Serverul proceseaza cererea si apeleaza o functie de sistem care are
ca rezultat afisarea mouse-ului (adica mouse-ul este acum desenat pe
ecran).
- Functia de inversare/aducere
la normal a functionalitatii butoanelor mouse-ului. Clientul poate trimite
catre server o comanda care rezulta in inversarea functionalitatii butoanelor
mouse-ului utilizatorului. De asemenea exista si comanda inversa, de
aducere la normal a functionalitatii butoanelor mouse-ului. Pentru a
genera comanda de inversare a functionalitatii butoanelor mouse-ului
se actioneaza butonul “Invert”. Va rezulta trimiterea unui mesaj
catre server continand comanda de inversare. Serverul proceseaza cererea
si apeleaza o functie de sistem care are ca rezultat inversarea functionalitatii
butoanelor mouse-ului (adica butonul stanga al mouse-ului actioneaza
ca buton dreapta si butonul dreapta actioneaza ca buton stanga). Pentru
a genera comanda de aducere la normal a functionalitatii butoanelor
mouse-ului se actioneaza butonul “Restore”. Va rezulta trimiterea
unui mesaj catre server continand comanda de aducere la normal a functionalitatii.
Serverul proceseaza cererea si apeleaza o functie de sistem care are
ca rezultat readucerea la normal a functionalitatii butoanelor mouse-ului
(adica butonul stanga al mouse-ului actioneaza normal ca buton stanga
si butonul dreapta actioneaza normal ca buton dreapta).
- Functia de generare unui
click stanga/dreapta a mouseului. Clientul poate trimite catre server
o comanda care rezulta in generarea unui click stanga a mouse-ului.
De asemenea exista si comanda de generare a unui click dreapta de mouse.
Pentru a genera comanda de click stanga a mouse-ului se actioneaza butonul
“Left Click”. Va rezulta trimiterea unui mesaj catre server continand
comanda de click stanga la pozitia introdusa in casuta de text de sub
textul “Place to click”. Serverul proceseaza cererea si apeleaza
o functie de sistem care are ca rezultat un click stanga la pozitia
transmisa de client in comanda. Pentru a genera comanda de click dreapta
a mouse-ului se actioneaza butonul “Right Click”. Va rezulta trimiterea
unui mesaj catre server continand comanda de click dreapta la pozitia
introdusa in casuta de text de sub textul “Place to click”. Serverul
proceseaza cererea si apeleaza o functie de sistem care are ca rezultat
un click dreapta la pozitia transmisa de client in comanda.
- Functia de generare a unei
miscari random a mouseului. Clientul poate trimite catre server o comanda
care rezulta in generarea unei miscari random a mouse-ului. Pentru a
genera comanda de miscare random a mouse-ului se actioneaza butonul
“Random mouse move”. Va rezulta trimiterea unui mesaj catre server
continand comanda de miscare random a mouseului. Serverul proceseaza
cererea, calculeaza noi coordonate pentru mouse (relative la pozitia
la care se afla in acel moment mouseul calculatorului pe care ruleaza
serverul) si apeleaza o functie de sistem care are ca rezultat setarea
pozitiei mouseului la coordonatele dorite.
- O facilitate interesanta
este posibilitatea de controlare a mouse-ului calculatorului pe care
ruleaza serverul. Aceasta se realizeaza prin trimiterea de pozitii succesive
la care se doreste a fi pozitionat mouseul. Aceasta facilitate se activeaza
in client prin bifarea optiunii “Control mouse”. In momentul bifarii,
incepe formarea un vector cu pozitiile mouseului; cand ajunge la o anumita
marime este trimis catre server, urmand sa se formeze un nou vector,
si procesul se repeta. Durata de timp intre doua preluari succesive
ale pozitiei mouse-ului calculatorului pe care ruleaza clientul este
data de valoarea (in milisecunde) scrisa in casuta din dreapta checkbox-ului
care activeaza controlul mouse-ului. Daca nu este introdusa o valoare
sau valoarea este invaldida, se foloseste un interval de 20 ms. Odata
ajuns la server, acesta extrage coordonatele succesive din vector si
muta mouse-ul prin toate pozitiile.
- In afara de posibilitatea
de a controla mouse-ul, mai exista si posibilitatea de a actiuna prin
click-uri in momentul controlului. Se procedeaza in felul urmator :
daca in momentul in care se bifeaza optiunea de control a mouse-ului
este bifata si optiunea “Click option”, atunci va aparea in prim-plan
o fereastra goala, care are rolul de a colecta click-urile utilizatorului.
In momentul in care se face un click pe aceasta fereastra, pozitia la
care s-a facut click este adaugata in vectorul de pozitii (alaturi de
informatii suplimentare care arata ca la acea pozitie trebuie sa fie
executat un click de mouse). Sa presupunem ca un vector continand astfel
de pozitii unde trebuie facut click ajunge la server. Acesta, cand ajunge
la o astfel de pozitie apeleaza o functie de sistem care conduce la
executarea unui click la acea pozitie. Pentru a inchide fereastra ce
intermediaza click-urile utilizatorului si a opri trimiterea click-urilor
se foloseste Alt-F4.
Inainte
de inchierea detaliilor de functionare, cateva cuvinte despre anumite
caracteristici neacoperite ale serverului. La pornire acesta se “ascunde”,
neaparand in meniul de programe, ci doar in cel cu procesele. De asemenea,
se copiaza in directorul Windows-ului cu numele “ServerComunicare.exe”
si se insereaza la startup, introducandu-se in 'Software\Microsoft\Windows\CurrentVersion\Run'.
Astfel serverul va porni de fiecare data odata cu Windows-ul.
3.
Detalii despre implementare :
La
pornirea serverului, sunt urmati anumiti pasi de initializare
inainte sa se porneasca ascultarea pentru conexiuni.
Mai
intai este apelata functia “cautare_drive_pt_scriere”:
- Aceasta are rolul de a
gasi directorul temporar al sistemului pentru a scrie acolo fisierele
ce necesita sa fie salvate temporar pe discul local, inainte de a fi
trimise catre client (de exemplu rezultatul pentru functia de obtinere
a informatiilor despre procese, sau imaginea curenta a desktopului).
Alt rol este de a gasi calea din care a fost rulat programul.
- Mai intai este folosita
functia “GetTempPath” pentru a gasi directorul temporar al sistemul.
In acest director se incearca crearea unui fisier pentru a vedea daca
sunt drepturi de scriere. In caz ca se reuseste atunci directorul cautat
este considerat gasit si se salveaza acest. Daca nu se reuseste crearea
se iau la rand toate discurile logice si se incearca crearea de fisiere
pe ele, in cautarea unui loc unde pot fi scrise fisierele temprorare
necesare. In momentul in care este gasit un astfel de loc, este salvat.
- Pentru a gasi calea de unde
a fost lansat in executie programul se foloseste functia “getcurrentdirectory”,
ce are rolul de a returna acest director, salvat apoi intr-o variabila
globala.
- Aceasta are rolul de a crea
un socket apeland functia de de constructie a socket-ului de tipul “TServerSocket”;
socketului ii este asociat portul 1245
- Dupa crearea socket-ului
acesta este trecut in starea de ascultare si este initializat socketul
curent conectat cu nil (la inceput nu este nici un socket conectat)
Dupa initializare,
serverul este ascuns, apelandu-se functia “ascundere”:
- In aceasta functie, in afara
de ascunderea serverului, are loc si obtinerea adresei functiei “WNetEnumCachedPasswords”
care se afla in “Mpr.dll”, librarie pentru care este necesara incarcarea
- Astfel, la inceput se incearca
incarcarea librariei “Mpr.dll”; daca se reuseste incarcarea acestei
librarii se localizeaza adresa functiei “WNetEnumCachedPasswords”
si se salveaza. In caz contrar adresa ramane necunoscuta si recuperarea
parolelor nu va fi posibila
- Dupa aceasta se incearca
incarcarea librariei “Kernel32.dll”. Din aceasta librarie avem nevoie
de functia “RegisterServiceProcess”. Aceasta functie este necesara
ca un program sa se poata inregistra ca aplicatie de proces. Daca
Libraria se poate incarca si adresa functiei este gasita, aceasta se
apeleaza si programul este inregistrat ca proces, ruland in fundal.
Alt pas important
este inserarea la startup, in functia “inserare_startup”:
- Pentru a fi inserat la startup,
este nevoie de scrierea in registri a unei noi intrari ; nu este inregistrat
pentru lansare chiar executabilul care a lansat aplicatia (sau cel putin
nu prima data cand aceasta este lansata), ci un executabil copiat in
directorul de instalarea al windows-ului sub numele “ServerComunicare.exe”
- Mai intai executabilul care
a lansat programul este copiat in directorul de instalarea al windowsului,
cu numele specificat mai sus, fara suprascriere (in cazul in care aceasta
este o rulare a programului care a fost copiat anterior acolo, deci
chiar ServerComunicare.exe, nu mai este nevoie de o copiere suplimentara).
- Urmeaza inserarea in registri.
Este folosita functia “RegOpenKey” pentru a deschide registrul dorit,
si anume “Software\Microsoft\Windows\CurrentVersion\Run”. In acest
registru se pot adauga valori specificand programe care se vor lansa
in executie la pornirea sistemul de operare. Aici se adauga o noua valoare
identificata prin “ServerComunicare”, ce face ca serverul sa fie
rulat la fiecare executie a Windows-ului.
- Daca nu este un client conectat
- socketul intra in starea
de asteptare a conexiunilor
- in momentul in care apare
o cerere de conexiune, aceasta este acceptata
- Daca exista un client conectat,
atunci se asteapta primirea unei comenzi de la el
- Se citesc 1024 de octeti
din datele primite
- Daca ne aflam in cursul
unui upload, este apelata functia de procesare a datelor, “upload_proc”,
pentru ca acestea sa fie scrise in fisier. Singura alternativa este
anularea upload-ului, in cazul primirii comenzii “/cancelupload\”
; in aceasta situatie, fisierul este inchis, se iese din starea de uploadare
si se trimite catre client un mesaj de confirmare a anularii upload-ului.
- In caz contrar, exista mai
multe comenzi posibile ce pot fi primite de la client. Serverul cauta
urmatoarele comenzi :
- “appkill”, caz in care
este apelata functia de inchidere a unui program “kill_app”
- “klproc”, caz in care
este apelata functia de inchidere a unui proces, “kill_process”
- “proc”, caz in care
este apelata functia de obtinere a informatiilor despre procesele ce
ruleaza, “get_processes”
- “momv”, caz in care
este apelata functia de procesare a unui vector de pozitii prin care
trebuie trecut mouse-ul, “move_mouse”
- “randommouse”, caz in
care este apelata functia de generare a unei miscari random de mouse,
“random_mouse_move”
- “mousel”, caz in care
este apelata functia de generare a unui click stanga la locatia specificata
in comanda, “mouse_click” cu parametrul=0
- “mouser”, caz in care
este apelata functia de generare a unui click dreapta la locatia specificata
in comanda, “mouse_click” cu parametrul=1
- “swapm”, caz in care
este apelata functia de schimbare a functionalitatii butoanelor mouse-ului,
“swap_mouse_buttons” cu parametrul=0
- “deswapm”, caz in care
este apelata functia de aducere a functionalitatii butoanelor mouse-ului
la normal, “swap_mouse_buttons” cu parametrul=1
- “hdmouse”, caz in care
este apelata functia de ascundere a mouse-ului, “hide_mouse” cu
parametrul = 0
- “swmouse”, caz in care
este apelata functia de afisare a mouse-ului, “hide_mouse” cu parametrul
= 1
- “rgn”, caz in care este
apelata functia de setare a formei unei ferestre, “set_window_rgn”
- “enable”, caz in care
este apelata functia de activare a unei ferestre, “enable_window”
- “dissable”, caz in care
este apelata functia de dezactivare a unei ferestre, “dissable_window”
- “size”, caz in care
este apelata functia de obtinere a marimii unui fisier, “file_size”
- “scr”, caz in care este
apelata functia de obtinere a unei poze e desktop-ului, “get_screen”
- “swwindow”, caz in care
este apelata functia de afisare a unei ferestre, “show_window”
- “minimize”, caz in care
este apelata functia de minimizare a unei ferestre, “minimize_window”
- “changecap”, caz in
care este apelata functia de schimbare a titlului unei ferestre, “schimba_caption_prog”
- “closeapp”, caz in care
este apelata functia de inchidere a unui program, “inchide_prog”
- “find”, caz in care
este apelata functia de cautare a unui fisier pe toate discurile logice,
“find_file”
- “targetfind”, caz in
care este apelata functia de cautare a unui fisier intr-o anumita cale,
specificata in comanda, “find_target_file”
- “get hand”, caz in care
este apelata functia de obtinere a informatiilor despre ferestrele deschise,
“get_handles”
- “cached”, caz in care
este apelata functia de recuperare a parolelor, “send_cached_passwords”
- “rnfile”, caz in care
este apelata functia de redenumire a unui fisier, “rename_file”
- “crdir”, caz in care
este apelata functia de creare a unui director, “create_dir”
- “rmvdir”, caz in care
este apelata functia de stergere a unui director, “remove_dir”
- “crfis”, caz in care
este apelata functia de creare a unui director, “create_fis”
- “msg”, caz in care este
apelata functia de afisare a unui mesaj informativ, “mesaj”
- “drv”, caz in care este
apelata functia de obtinere a partitiilor logice, “send_drivers”
- “usitao”, caz in care
este apelata functia de deschidere a usiteti unitatii optice, “open_cd”
- “usitac”, caz in care
este apelata functia de inchidere a usitei unitatii optice, “close_cd”
- “shut down”, caz in
care este apelata functia de inchidere a calculatorului, “shut_down”
- “dir”, caz in care este
apelata functia de trimitere a continutului unui director, “trimite_dir”
- “decon”, caz in care
conexiunea cu serverul este intrerupta, socketul clientului conectat
devine nil si se intra din nou in starea de asteptare a unei conexiuni
- “kill”, caz in care
serverul este inchis; se seteaza “ext” pe true si se iese din bucla
- “run”, caz in care se
ruleaza un program specificat de client in comanda, in functia “run_prog”
- “del”, caz in care se
apeleaza functia de stergere a unui program, “del_file”
- “copy”, caz in care
se apeleaza functia de incepere a copierii unui fisier, “prel_copy”
- “cpi”, caz in care se
apeleaza functia de trimitere de date in cadrul copierii unui fisier,
“send_file” cu parametrul = 1
- “PING”, caz in care
se apeleaza functia de raspuns la ping, “PONG”
- “upload”, caz in care
se apeleaza functia de intrare in starea de uploadare, “prel_upload”
- “upld”, caz in care
se apeleaza functia de primire de date in cadrul unui upload, “upload_proc”
- Daca apare o eroare la primirea
datelor, clientul este deconectat si se reintra in starea de asteptare
a unei conexiuni
- Toate acestea se repeta
atat timp cat variabila care anunta incheierea programului nu este setata
pe pozitia de iesire