VMWareTools.Mod 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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
  31. #IF I386 THEN
  32. MOV EAX, 564D5868H
  33. #IF COOP THEN
  34. MOV ESI, ECX
  35. #END
  36. MOV ECX, 4
  37. MOV DX, 5658H
  38. IN EAX, DX;
  39. #IF COOP THEN
  40. MOV ECX, ESI
  41. #END
  42. #ELSIF AMD64 THEN
  43. MOV EAX, 564D5868H
  44. MOV ECX, 4
  45. MOV DX, 5658H
  46. IN EAX, DX;
  47. #ELSE
  48. unimplemented
  49. #END
  50. END ReadMouse;
  51. PROCEDURE -WriteMouse(pos : LONGINT);
  52. CODE
  53. #IF I386 THEN
  54. MOV EAX, 564D5868H
  55. POP EBX
  56. #IF COOP THEN
  57. MOV ESI, ECX
  58. #END
  59. MOV ECX, 5
  60. MOV DX, 5658H
  61. OUT DX, EAX;
  62. #IF COOP THEN
  63. MOV ECX, ESI
  64. #END
  65. #ELSIF AMD64 THEN
  66. MOV EAX, 564D5868H
  67. #IF COOP THEN
  68. MOV RSI, RBX
  69. #END
  70. POP EBX
  71. MOV ECX, 5
  72. MOV DX, 5658H
  73. OUT DX, EAX;
  74. #IF COOP THEN
  75. MOV RBX, RSI
  76. #END
  77. #ELSE
  78. unimplemented
  79. #END
  80. END WriteMouse;
  81. PROCEDURE -SendLength(l : LONGINT);
  82. CODE
  83. #IF I386 THEN
  84. MOV EAX, 564D5868H
  85. POP EBX
  86. #IF COOP THEN
  87. MOV ESI, ECX
  88. #END
  89. MOV ECX, 8
  90. MOV DX, 5658H
  91. OUT DX, EAX;
  92. #IF COOP THEN
  93. MOV ECX, ESI
  94. #END
  95. #ELSIF AMD64 THEN
  96. MOV EAX, 564D5868H
  97. #IF COOP THEN
  98. MOV RSI, RBX
  99. #END
  100. POP EBX
  101. MOV ECX, 8
  102. MOV DX, 5658H
  103. OUT DX, EAX;
  104. #IF COOP THEN
  105. MOV RBX, RSI
  106. #END
  107. #ELSE
  108. unimplemented
  109. #END
  110. END SendLength;
  111. PROCEDURE -Send4Chars(chars : LONGINT);
  112. CODE
  113. #IF I386 THEN
  114. MOV EAX, 564D5868H
  115. POP EBX
  116. #IF COOP THEN
  117. MOV ESI, ECX
  118. #END
  119. MOV ECX, 9
  120. MOV DX, 5658H
  121. OUT DX, EAX;
  122. #IF COOP THEN
  123. MOV ECX, ESI
  124. #END
  125. #ELSIF AMD64 THEN
  126. MOV EAX, 564D5868H
  127. #IF COOP THEN
  128. MOV RSI, RBX
  129. #END
  130. POP EBX
  131. MOV ECX, 9
  132. MOV DX, 5658H
  133. OUT DX, EAX;
  134. #IF COOP THEN
  135. MOV RBX, RSI
  136. #END
  137. #ELSE
  138. unimplemented
  139. #END
  140. END Send4Chars;
  141. PROCEDURE -ReceiveLength() : LONGINT;
  142. CODE
  143. #IF I386 THEN
  144. MOV EAX, 564D5868H
  145. #IF COOP THEN
  146. MOV ESI, ECX
  147. #END
  148. MOV ECX, 6
  149. MOV DX, 5658H
  150. IN EAX, DX;
  151. #IF COOP THEN
  152. MOV ECX, ESI
  153. #END
  154. #ELSIF AMD64 THEN
  155. MOV EAX, 564D5868H
  156. MOV ECX, 6
  157. MOV DX, 5658H
  158. IN EAX, DX;
  159. #ELSE
  160. unimplemented
  161. #END
  162. END ReceiveLength;
  163. PROCEDURE -Receive4Chars() : LONGINT;
  164. CODE
  165. #IF I386 THEN
  166. MOV EAX, 564D5868H
  167. #IF COOP THEN
  168. MOV ESI, ECX
  169. #END
  170. MOV ECX, 7
  171. MOV DX, 5658H
  172. IN EAX, DX
  173. #IF COOP THEN
  174. MOV ECX, ESI
  175. #END
  176. #ELSIF AMD64 THEN
  177. MOV EAX, 564D5868H
  178. MOV ECX, 7
  179. MOV DX, 5658H
  180. IN EAX, DX
  181. #ELSE
  182. unimplemented
  183. #END
  184. END Receive4Chars;
  185. PROCEDURE -GetVirtualHWVersion() : LONGINT;
  186. CODE
  187. #IF I386 THEN
  188. MOV EAX, 564D5868H
  189. #IF COOP THEN
  190. MOV ESI, ECX
  191. #END
  192. MOV ECX, 11H
  193. MOV DX, 5658H
  194. IN EAX, DX
  195. #IF COOP THEN
  196. MOV ECX, ESI
  197. #END
  198. #ELSIF AMD64 THEN
  199. MOV EAX, 564D5868H
  200. MOV ECX, 11H
  201. MOV DX, 5658H
  202. IN EAX, DX
  203. #ELSE
  204. unimplemented
  205. #END
  206. END GetVirtualHWVersion;
  207. PROCEDURE -GetVMWareVersion() : LONGINT;
  208. CODE
  209. #IF I386 THEN
  210. MOV EAX, 564D5868H
  211. #IF COOP THEN
  212. MOV ESI, ECX
  213. #END
  214. MOV ECX, 0AH
  215. MOV DX, 5658H
  216. IN EAX, DX
  217. MOV EAX, ECX
  218. #IF COOP THEN
  219. MOV ECX, ESI
  220. #END
  221. #ELSIF AMD64 THEN
  222. MOV EAX, 564D5868H
  223. MOV ECX, 0AH
  224. MOV DX, 5658H
  225. IN EAX, DX
  226. MOV EAX, ECX
  227. #ELSE
  228. unimplemented
  229. #END
  230. END GetVMWareVersion;
  231. (*
  232. PROCEDURE -GetDeviceInformation(nrnr : LONGINT) : LONGINT;
  233. CODE
  234. #IF I386 THEN
  235. MOV EAX, 564D5868H
  236. POP EBX
  237. #IF COOP THEN
  238. MOV ESI, ECX
  239. #END
  240. MOV ECX, 0BH
  241. MOV DX, 5658H
  242. IN EAX, DX
  243. MOV EAX, EBX
  244. #IF COOP THEN
  245. MOV ECX, ESI
  246. #END
  247. #ELSIF AMD64 THEN
  248. MOV EAX, 564D5868H
  249. #IF COOP THEN
  250. MOV RSI, RBX
  251. #END
  252. POP EBX
  253. MOV ECX, 0BH
  254. MOV DX, 5658H
  255. IN EAX, DX
  256. MOV EAX, EBX
  257. #IF COOP THEN
  258. MOV RBX, RSI
  259. #END
  260. #ELSE
  261. unimplemented
  262. #END
  263. END GetDeviceInformation;
  264. *)
  265. PROCEDURE -SetGUIOptions(options: SET);
  266. CODE
  267. #IF I386 THEN
  268. MOV EAX, 564D5868H
  269. POP EBX
  270. #IF COOP THEN
  271. MOV ESI, ECX
  272. #END
  273. MOV ECX, 0EX
  274. MOV DX, 5658H
  275. OUT DX, EAX;
  276. #IF COOP THEN
  277. MOV ECX, ESI
  278. #END
  279. #ELSIF AMD64 THEN
  280. MOV EAX, 564D5868H
  281. #IF COOP THEN
  282. MOV RSI, RBX
  283. #END
  284. POP EBX
  285. MOV ECX, 0EX
  286. MOV DX, 5658H
  287. OUT DX, EAX;
  288. #IF COOP THEN
  289. MOV RBX, RSI
  290. #END
  291. #ELSE
  292. unimplemented
  293. #END
  294. END SetGUIOptions;
  295. PROCEDURE -GetGUIOptions(): SET;
  296. CODE
  297. #IF I386 THEN
  298. MOV EAX, 564D5868H
  299. #IF COOP THEN
  300. MOV ESI, ECX
  301. #END
  302. MOV ECX, 0DX
  303. MOV DX, 5658H
  304. IN EAX, DX;
  305. #IF COOP THEN
  306. MOV ECX, ESI
  307. #END
  308. #ELSIF AMD64 THEN
  309. MOV EAX, 564D5868H
  310. MOV ECX, 0DX
  311. MOV DX, 5658H
  312. IN EAX, DX;
  313. #ELSE
  314. unimplemented
  315. #END
  316. END GetGUIOptions;
  317. PROCEDURE SetMousePos(x, y : LONGINT);
  318. VAR t : LONGINT;
  319. BEGIN
  320. WriteMouse(x * 10000H + y);
  321. t := ReadMouse(); (* readback seems to trigger the mouse exit routine *)
  322. END SetMousePos;
  323. (*
  324. PROCEDURE DevId; (* print one device ID... only works for 1 device like this*)
  325. VAR i, t : LONGINT; text : ARRAY 50 OF CHAR;
  326. BEGIN
  327. FOR i := 0 TO 9 DO
  328. t := GetDeviceInformation(i * 4);
  329. SYSTEM.PUT32(ADDRESSOF(text[0]) + i * 4, t);
  330. END;
  331. KernelLog.String(text);
  332. END DevId;
  333. *)
  334. PROCEDURE SetTextToClipBoard(CONST text : ARRAY OF CHAR);
  335. VAR l, t, i: LONGINT;
  336. BEGIN
  337. l := Strings.Length(text);
  338. SendLength(l);
  339. t := 0;
  340. FOR i := 0 TO (l - 1) DIV 4 DO
  341. t := SYSTEM.GET32(ADDRESSOF(text[i * 4]));
  342. Send4Chars(t);
  343. END;
  344. END SetTextToClipBoard;
  345. PROCEDURE GetTextFromClipBoard(VAR s : Strings.String);
  346. VAR l, t, i: LONGINT; f : ADDRESS;
  347. BEGIN
  348. l := ReceiveLength();
  349. IF (l > 0) & (l < 10000H) THEN
  350. NEW(s, l + 5);
  351. f := ADDRESSOF(s[0]);
  352. FOR i := 0 TO (l - 1) DIV 4 DO
  353. t := Receive4Chars();
  354. SYSTEM.PUT32(f + i * 4, t);
  355. END;
  356. END
  357. END GetTextFromClipBoard;
  358. (* Copy the content of the host system clipboard to the specified text *)
  359. PROCEDURE GetFromClipboard(text : Texts.Text);
  360. VAR s : Strings.String;
  361. BEGIN
  362. ASSERT((text # NIL) & (text.HasWriteLock()));
  363. GetTextFromClipBoard(s);
  364. IF (text.GetLength() > 0) THEN text.Delete(0, text.GetLength()); END;
  365. TextUtilities.StrToText(text, 0, s^);
  366. END GetFromClipboard;
  367. (* Copy the content of the specified text to the host system clipboard *)
  368. PROCEDURE PutToClipboard(text : Texts.Text);
  369. VAR buffer : Strings.String;
  370. BEGIN
  371. ASSERT((text # NIL) & (text.HasReadLock()));
  372. TextUtilities.TextToStr(text, buffer^);
  373. SetTextToClipBoard(buffer^);
  374. END PutToClipboard;
  375. PROCEDURE GetHostClipboard*;
  376. VAR s : Strings.String;
  377. BEGIN
  378. GetTextFromClipBoard(s);
  379. Texts.clipboard.AcquireWrite;
  380. IF Texts.clipboard.GetLength() > 0 THEN Texts.clipboard.Delete(0, Texts.clipboard.GetLength()) END;
  381. TextUtilities.StrToText(Texts.clipboard, 0, s^);
  382. Texts.clipboard.ReleaseWrite;
  383. KernelLog.String("Copied host clipboard context"); KernelLog.Ln;
  384. END GetHostClipboard;
  385. PROCEDURE ClipboardChanged(sender, data : ANY);
  386. BEGIN
  387. TextUtilities.TextToStr(Texts.clipboard, textbuffer^);
  388. SetTextToClipBoard(textbuffer^);
  389. END ClipboardChanged;
  390. (* This procedure is directly called by the window manager. It must be safe. *)
  391. PROCEDURE MessagePreview(VAR m : WMMessages.Message; VAR discard : BOOLEAN);
  392. BEGIN
  393. IF m.msgType = WMMessages.MsgPointer THEN
  394. SetMousePos(ENTIER((m.x - viewPort.range.l) * w / (viewPort.range.r - viewPort.range.l)) ,
  395. ENTIER((m.y - viewPort.range.t) * h / (viewPort.range.b - viewPort.range.t)));
  396. END
  397. END MessagePreview;
  398. PROCEDURE Install*;
  399. END Install;
  400. PROCEDURE Cleanup;
  401. BEGIN
  402. mouseGrabber.alive := FALSE;
  403. mouseGrabber.timer.Wakeup;
  404. SetGUIOptions({});
  405. (* removal must be done in all cases to avoid system freeze *)
  406. manager.RemoveMessagePreview(MessagePreview);
  407. Texts.clipboard.onTextChanged.Remove(ClipboardChanged);
  408. HostClipboard.SetHandlers(NIL, NIL);
  409. END Cleanup;
  410. BEGIN
  411. KernelLog.String("Bimbo-VMWare Tools Installed"); KernelLog.Ln;
  412. hw := GetVirtualHWVersion();
  413. KernelLog.String("VMVare Version : "); KernelLog.Int(GetVMWareVersion(), 0); KernelLog.Ln;
  414. KernelLog.String("Virtual Hardware Version : "); KernelLog.Int(hw, 0); KernelLog.Ln;
  415. KernelLog.String("VMWare GUI Bits :");
  416. oldGUIBits := GetGUIOptions();
  417. KernelLog.Bits(oldGUIBits, 0, 32); KernelLog.Ln;
  418. SetGUIOptions({0, 1, 2, 3, 4});
  419. NEW(textbuffer, 65536 + 5);
  420. (* register in clipboard *)
  421. Texts.clipboard.onTextChanged.Add(ClipboardChanged);
  422. (* register at host system clipboard interface *)
  423. HostClipboard.SetHandlers(GetFromClipboard, PutToClipboard);
  424. (* register in window manager *)
  425. manager := WMWindowManager.GetDefaultManager();
  426. viewPort := WMWindowManager.GetDefaultView();
  427. w := viewPort.width0;
  428. h := viewPort.height0;
  429. manager.InstallMessagePreview(MessagePreview);
  430. NEW(mouseGrabber);
  431. Modules.InstallTermHandler(Cleanup);
  432. END VMWareTools.
  433. VMWareTools.Install ~
  434. VMWareTools.GetHostClipboard ~
  435. System.Free VMWareTools ~