I386.VMWareTools.Mod 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. MODULE VMWareTools; (** AUTHOR "thomas.frey@alumni.ethz.ch"; PURPOSE "Tools to integrate BB into VMWare"; *)
  2. (* Reference found on : http://chitchat.at.infoseek.co.jp/vmware/backdoor.html
  3. Thanks to Ken Kato for this documentation
  4. *)
  5. IMPORT
  6. SYSTEM, Strings, Modules, KernelLog, WMWindowManager, WMMessages, Texts, TextUtilities, HostClipboard, Kernel;
  7. TYPE
  8. MouseGrabber= OBJECT
  9. VAR
  10. timer : Kernel.Timer;
  11. alive : BOOLEAN;
  12. t : LONGINT;
  13. BEGIN {ACTIVE}
  14. NEW(timer);
  15. alive := TRUE;
  16. WHILE alive DO
  17. timer.Sleep(10);
  18. t := ReadMouse();
  19. END;
  20. END MouseGrabber;
  21. VAR
  22. manager : WMWindowManager.WindowManager;
  23. viewPort : WMWindowManager.ViewPort;
  24. w, h : LONGINT;
  25. hw : LONGINT;
  26. oldGUIBits : SET;
  27. mouseGrabber : MouseGrabber;
  28. textbuffer : Strings.String;
  29. PROCEDURE -ReadMouse() : LONGINT;
  30. CODE {SYSTEM.i386}
  31. PUSH ECX
  32. MOV EAX, 564D5868H
  33. MOV ECX, 4
  34. MOV DX, 5658H
  35. IN EAX, DX;
  36. POP ECX
  37. END ReadMouse;
  38. PROCEDURE -WriteMouse(pos : LONGINT);
  39. CODE {SYSTEM.i386}
  40. PUSH ECX
  41. MOV EAX, 564D5868H
  42. POP EBX
  43. MOV ECX, 5
  44. MOV DX, 5658H
  45. OUT DX, EAX;
  46. POP ECX
  47. END WriteMouse;
  48. PROCEDURE -SendLength(l : LONGINT);
  49. CODE {SYSTEM.i386}
  50. PUSH ECX
  51. MOV EAX, 564D5868H
  52. POP EBX
  53. MOV ECX, 8
  54. MOV DX, 5658H
  55. OUT DX, EAX;
  56. POP ECX
  57. END SendLength;
  58. PROCEDURE -Send4Chars(chars : LONGINT);
  59. CODE {SYSTEM.i386}
  60. PUSH ECX
  61. MOV EAX, 564D5868H
  62. POP EBX
  63. MOV ECX, 9
  64. MOV DX, 5658H
  65. OUT DX, EAX;
  66. POP ECX
  67. END Send4Chars;
  68. PROCEDURE -ReceiveLength() : LONGINT;
  69. CODE {SYSTEM.i386}
  70. PUSH ECX
  71. MOV EAX, 564D5868H
  72. MOV ECX, 6
  73. MOV DX, 5658H
  74. IN EAX, DX;
  75. POP ECX
  76. END ReceiveLength;
  77. PROCEDURE -Receive4Chars() : LONGINT;
  78. CODE {SYSTEM.i386}
  79. PUSH ECX
  80. MOV EAX, 564D5868H
  81. MOV ECX, 7
  82. MOV DX, 5658H
  83. IN EAX, DX
  84. POP ECX
  85. END Receive4Chars;
  86. PROCEDURE -GetVirtualHWVersion() : LONGINT;
  87. CODE {SYSTEM.i386}
  88. PUSH ECX
  89. MOV EAX, 564D5868H
  90. MOV ECX, 11H
  91. MOV DX, 5658H
  92. IN EAX, DX
  93. POP ECX
  94. END GetVirtualHWVersion;
  95. PROCEDURE -GetVMWareVersion() : LONGINT;
  96. CODE {SYSTEM.i386}
  97. PUSH ECX
  98. MOV EAX, 564D5868H
  99. MOV ECX, 0AH
  100. MOV DX, 5658H
  101. IN EAX, DX
  102. MOV EAX, ECX
  103. POP ECX
  104. END GetVMWareVersion;
  105. (*
  106. PROCEDURE -GetDeviceInformation(nrnr : LONGINT) : LONGINT;
  107. CODE {SYSTEM.i386}
  108. PUSH ECX
  109. MOV EAX, 564D5868H
  110. POP EBX
  111. MOV ECX, 0BH
  112. MOV DX, 5658H
  113. IN EAX, DX
  114. MOV EAX, EBX
  115. POP ECX
  116. END GetDeviceInformation;
  117. *)
  118. PROCEDURE -SetGUIOptions(options: SET);
  119. CODE {SYSTEM.i386}
  120. PUSH ECX
  121. MOV EAX, 564D5868H
  122. POP EBX
  123. MOV ECX, 0EX
  124. MOV DX, 5658H
  125. OUT DX, EAX;
  126. POP ECX
  127. END SetGUIOptions;
  128. PROCEDURE -GetGUIOptions(): SET;
  129. CODE {SYSTEM.i386}
  130. PUSH ECX
  131. MOV EAX, 564D5868H
  132. MOV ECX, 0DX
  133. MOV DX, 5658H
  134. IN EAX, DX;
  135. POP ECX
  136. END GetGUIOptions;
  137. PROCEDURE SetMousePos(x, y : LONGINT);
  138. VAR t : LONGINT;
  139. BEGIN
  140. WriteMouse(x * 10000H + y);
  141. t := ReadMouse(); (* readback seems to trigger the mouse exit routine *)
  142. END SetMousePos;
  143. (*
  144. PROCEDURE DevId; (* print one device ID... only works for 1 device like this*)
  145. VAR i, t : LONGINT; text : ARRAY 50 OF CHAR;
  146. BEGIN
  147. FOR i := 0 TO 9 DO
  148. t := GetDeviceInformation(i * 4);
  149. SYSTEM.PUT32(ADDRESSOF(text[0]) + i * 4, t);
  150. END;
  151. KernelLog.String(text);
  152. END DevId;
  153. *)
  154. PROCEDURE SetTextToClipBoard(CONST text : ARRAY OF CHAR);
  155. VAR l, t, i: LONGINT;
  156. BEGIN
  157. l := Strings.Length(text);
  158. SendLength(l);
  159. t := 0;
  160. FOR i := 0 TO (l - 1) DIV 4 DO
  161. t := SYSTEM.GET32(ADDRESSOF(text[i * 4]));
  162. Send4Chars(t);
  163. END;
  164. END SetTextToClipBoard;
  165. PROCEDURE GetTextFromClipBoard(VAR s : Strings.String);
  166. VAR l, t, i: LONGINT; f : ADDRESS;
  167. BEGIN
  168. l := ReceiveLength();
  169. IF (l > 0) & (l < 10000H) THEN
  170. NEW(s, l + 5);
  171. f := ADDRESSOF(s[0]);
  172. FOR i := 0 TO (l - 1) DIV 4 DO
  173. t := Receive4Chars();
  174. SYSTEM.PUT32(f + i * 4, t);
  175. END;
  176. END
  177. END GetTextFromClipBoard;
  178. (* Copy the content of the host system clipboard to the specified text *)
  179. PROCEDURE GetFromClipboard(text : Texts.Text);
  180. VAR s : Strings.String;
  181. BEGIN
  182. ASSERT((text # NIL) & (text.HasWriteLock()));
  183. GetTextFromClipBoard(s);
  184. IF (text.GetLength() > 0) THEN text.Delete(0, text.GetLength()); END;
  185. TextUtilities.StrToText(text, 0, s^);
  186. END GetFromClipboard;
  187. (* Copy the content of the specified text to the host system clipboard *)
  188. PROCEDURE PutToClipboard(text : Texts.Text);
  189. VAR buffer : Strings.String;
  190. BEGIN
  191. ASSERT((text # NIL) & (text.HasReadLock()));
  192. TextUtilities.TextToStr(text, buffer^);
  193. SetTextToClipBoard(buffer^);
  194. END PutToClipboard;
  195. PROCEDURE GetHostClipboard*;
  196. VAR s : Strings.String;
  197. BEGIN
  198. GetTextFromClipBoard(s);
  199. Texts.clipboard.AcquireWrite;
  200. IF Texts.clipboard.GetLength() > 0 THEN Texts.clipboard.Delete(0, Texts.clipboard.GetLength()) END;
  201. TextUtilities.StrToText(Texts.clipboard, 0, s^);
  202. Texts.clipboard.ReleaseWrite;
  203. KernelLog.String("Copied host clipboard context"); KernelLog.Ln;
  204. END GetHostClipboard;
  205. PROCEDURE ClipboardChanged(sender, data : ANY);
  206. BEGIN
  207. TextUtilities.TextToStr(Texts.clipboard, textbuffer^);
  208. SetTextToClipBoard(textbuffer^);
  209. END ClipboardChanged;
  210. (* This procedure is directly called by the window manager. It must be safe. *)
  211. PROCEDURE MessagePreview(VAR m : WMMessages.Message; VAR discard : BOOLEAN);
  212. BEGIN
  213. IF m.msgType = WMMessages.MsgPointer THEN
  214. SetMousePos(ENTIER((m.x - viewPort.range.l) * w / (viewPort.range.r - viewPort.range.l)) ,
  215. ENTIER((m.y - viewPort.range.t) * h / (viewPort.range.b - viewPort.range.t)));
  216. END
  217. END MessagePreview;
  218. PROCEDURE Install*;
  219. END Install;
  220. PROCEDURE Cleanup;
  221. BEGIN
  222. mouseGrabber.alive := FALSE;
  223. mouseGrabber.timer.Wakeup;
  224. SetGUIOptions({});
  225. (* removal must be done in all cases to avoid system freeze *)
  226. manager.RemoveMessagePreview(MessagePreview);
  227. Texts.clipboard.onTextChanged.Remove(ClipboardChanged);
  228. HostClipboard.SetHandlers(NIL, NIL);
  229. END Cleanup;
  230. BEGIN
  231. KernelLog.String("Bimbo-VMWare Tools Installed"); KernelLog.Ln;
  232. hw := GetVirtualHWVersion();
  233. KernelLog.String("VMVare Version : "); KernelLog.Int(GetVMWareVersion(), 0); KernelLog.Ln;
  234. KernelLog.String("Virtual Hardware Version : "); KernelLog.Int(hw, 0); KernelLog.Ln;
  235. KernelLog.String("VMWare GUI Bits :");
  236. oldGUIBits := GetGUIOptions();
  237. KernelLog.Bits(oldGUIBits, 0, 32); KernelLog.Ln;
  238. SetGUIOptions({0, 1, 2, 3, 4});
  239. NEW(textbuffer, 65536 + 5);
  240. (* register in clipboard *)
  241. Texts.clipboard.onTextChanged.Add(ClipboardChanged);
  242. (* register at host system clipboard interface *)
  243. HostClipboard.SetHandlers(GetFromClipboard, PutToClipboard);
  244. (* register in window manager *)
  245. manager := WMWindowManager.GetDefaultManager();
  246. viewPort := WMWindowManager.GetDefaultView();
  247. w := viewPort.width0;
  248. h := viewPort.height0;
  249. manager.InstallMessagePreview(MessagePreview);
  250. NEW(mouseGrabber);
  251. Modules.InstallTermHandler(Cleanup);
  252. END VMWareTools.
  253. VMWareTools.Install ~
  254. VMWareTools.GetHostClipboard ~
  255. SystemTools.Free VMWareTools ~