FreeRDPWrapFSM.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. #ifndef _FREERDPWRAP_FSM_H__
  2. #define _FREERDPWRAP_FSM_H__
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "FreeRDPWrap_server_g.h"
  6. #include "FreeRDPWrap_msg_g.h"
  7. #include "RvcDevMnt.h"
  8. #include "SpWare.h"
  9. #include "RDPPipe.h"
  10. #include "RDPWInst.h"
  11. #include "FreeRDPErrorCode.h"
  12. #include "..\\mod_interactivecontrol\\interactivecontrol_client_g.h"
  13. using namespace InteractiveControl;
  14. using namespace FreeRDPWrap;
  15. #ifdef TWINKLE_LOCAL_DEBUG
  16. static void TwDbg(const char* format, ...)
  17. {
  18. va_list args;
  19. va_start(args, format);
  20. vDbg(format, args);
  21. }
  22. #define Dbg(fmt, ...) \
  23. TwDbg(fmt, ##__VA_ARGS__); \
  24. printf(fmt "\n", ##__VA_ARGS__)
  25. #endif
  26. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  27. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  28. #define IFCALLFAILED_LEAD_END(_cb, _uc) \
  29. do { \
  30. ec = (_cb); \
  31. if ( Error_Succeed != ec) {\
  32. dwUserCode = _uc;\
  33. goto Error; } } while (0)
  34. #define SAFE_CLOSE_HANDLE(hr) \
  35. do \
  36. { \
  37. if(hr != NULL && hr != INVALID_HANDLE_VALUE) { \
  38. CloseHandle(hr); \
  39. } \
  40. hr = NULL; \
  41. } while (false)
  42. #define CLIENET_USER "ClientUser"
  43. #define FREERDP_SVC_NAME "wFreeWrapSvc.exe"
  44. #define RVC_DRIV_INSTALL_DRI TEXT("\\RvcHIDFilter\\x32\\")
  45. #define RVC_DRIV_INSTALL_DRI64 TEXT("\\RvcHIDFilter\\x64\\")
  46. #define RVC_DRIV_INSTALL_EXE TEXT("\\RvcHIDFilter\\RvcDrvMgr.exe")
  47. #define RVC_DRIV_INSTALL_EXE64 TEXT("\\RvcHIDFilter\\RvcDrvMgr64.exe")
  48. //系统变量名称
  49. #define SYSVAR_FREERDPSTATUS "FreeRDPStatus"
  50. //实体其他异常导致启动失败,框架启动卡死
  51. #define FREERDPSTATUS_ERROR "E"
  52. //实体检测正常
  53. #define FREERDPSTATUS_SUCC "S"
  54. //实体启动中
  55. #define FREERDPSTATUS_BUSY "B"
  56. //单屏启动
  57. #define FREERDPSTATUS_INVALID_MONITOR "M"
  58. //暂未使用
  59. #define FREERDPSTATUS_UNKOWN "U"
  60. static const int fs_error = -1;
  61. static const int fs_succ = 0;
  62. static const int fs_busy = 1;
  63. static const int fs_invalid_monitor = 2;
  64. static const int fs_unknown = 3;
  65. static const int fs_single_user = 4;
  66. typedef enum _ShareMode {
  67. ClientIdle = 1,
  68. // 本地模式,客户经理屏共享会话
  69. AM2Client,
  70. // 本地模式,客户屏共享会话
  71. Client2AM,
  72. // 远程模式,客户屏共享会话
  73. Client2Seat,
  74. // 远程模式,坐席屏共享会话
  75. Seal2Client
  76. } ShareMode;
  77. struct MonitorInfo
  78. {
  79. BOOL bSet;
  80. BOOL bPrimary;
  81. CSimpleStringA deviceName;
  82. CSimpleStringA deviceID;
  83. CSimpleStringA deviceKey;
  84. MonitorInfo()
  85. :bSet(FALSE),bPrimary(FALSE)
  86. ,deviceName(true)
  87. ,deviceID(true)
  88. ,deviceKey(true){}
  89. };
  90. enum EvtType
  91. {
  92. USER_EVT_START = (EVT_USER + 1),
  93. USER_EVT_INVITE,
  94. USER_EVT_BE_INVITED,
  95. USER_EVT_CLOSE_SHARE,
  96. USER_EVT_CREATE_PROCESS,
  97. USER_EVT_CREATE_PROCESS_FINISHED,
  98. USER_EVT_ATTENDEE_DISCONNECT,
  99. USER_EVT_ATTENDEE_CONNECTED,
  100. USER_EVT_SHARE_HOST_DISCONNECT,
  101. USER_EVT_ATTENDEE_CONNECT_FAILED,
  102. USER_EVT_CONNECT_TO_HOST_FAILED,
  103. USER_EVT_CONNECT_TO_HOST_SUCC,
  104. USER_EVT_ON_VIEWER_DISCONNECTED,
  105. USER_EVT_INSTALL_DRIVE,
  106. USER_EVT_INSTALL_DRIVE_DONE,
  107. USER_EVT_INSTALL_KBD,
  108. USER_EVT_INSTALL_KBD_DONE,
  109. USER_EVT_INSTALL_MOU,
  110. USER_EVT_INSTALL_MOU_DONE,
  111. USER_EVT_AGENT_ASSIST,
  112. USER_EVT_AGENT_ASSIST_DONE,
  113. USER_EVT_QUIT,
  114. USER_EVT_DEPECRATED,
  115. };
  116. enum CopyDataEvent
  117. {
  118. CDEVENT_INVALIDE = 0,
  119. CDEVENT_HIDE_CURSOR,
  120. CDEVENT_SHOW_CURSOR,
  121. CDEVENT_MAX
  122. };
  123. #define SERVICE_SPECIFICED_NAME "Rvc2wFreeWrap"
  124. #define SERVICE_CONTROL_CREATEPROCESS 0x000000F0
  125. #define SVC_CREATE_PROCESS_VERSION_1 1
  126. typedef struct _SP_CREATE_PROCESS_INFO {
  127. USHORT usVersion;
  128. USHORT usValiSize;
  129. DWORD dwLastError;
  130. // 扩展 szCmdline 从 MAX_PATH 到 MAX_PATH*2 [6/17/2020 11:30 @Gifur]
  131. char szCmdline[MAX_PATH*2];
  132. // 裁剪 szUserName 从 MAX_PATH 到 32 [6/17/2020 11:30 @Gifur]
  133. char szUserName[32];
  134. PROCESS_INFORMATION pi;
  135. }SP_CREATE_PROCESS_INFO, *PSP_CREATE_PROCESS_INFO;
  136. //!!Start RDPWrap Install secion
  137. class CloseShareEvent : public FSMEvent
  138. {
  139. public:
  140. CloseShareEvent() : FSMEvent(USER_EVT_CLOSE_SHARE){}
  141. ~CloseShareEvent(){}
  142. SpReqAnsContext<FreeRDPWrapSrv_CloseRdpShare_Req, FreeRDPWrapSrv_CloseRdpShare_Ans>::Pointer m_ctx;
  143. virtual void OnUnhandled()
  144. {
  145. Dbg("USER_EVT_CLOSE_SHARE unhandled!");
  146. if(m_ctx != NULL)
  147. {
  148. m_ctx->Answer(Error_InvalidState);
  149. }
  150. }
  151. };
  152. class DriveInstallEvent : public FSMEvent
  153. {
  154. public:
  155. DriveInstallEvent()
  156. : FSMEvent(USER_EVT_INSTALL_DRIVE)
  157. , kbdRequired(FALSE)
  158. , mouRequired(FALSE)
  159. {}
  160. DriveInstallEvent(BOOL kbdReq, BOOL mouReq)
  161. : FSMEvent(USER_EVT_INSTALL_DRIVE)
  162. , kbdRequired(kbdReq)
  163. , mouRequired(mouReq)
  164. {}
  165. ~DriveInstallEvent(){}
  166. BOOL kbdRequired;
  167. BOOL mouRequired;
  168. virtual void OnUnhandled()
  169. {
  170. Dbg("USER_EVT_INSTALL_DRIVE unhandled!");
  171. }
  172. };
  173. class InviteEvent : public FSMEvent
  174. {
  175. public:
  176. InviteEvent() : FSMEvent(USER_EVT_INVITE){}
  177. ~InviteEvent(){}
  178. SpReqAnsContext<FreeRDPWrapSrv_InviteRdpShare_Req, FreeRDPWrapSrv_InviteRdpShare_Ans>::Pointer m_ctx;
  179. virtual void OnUnhandled()
  180. {
  181. Dbg("USER_EVT_INVITE unhandled!");
  182. if(m_ctx != NULL)
  183. {
  184. m_ctx->Answer(Error_InvalidState);
  185. }
  186. }
  187. };
  188. class AgentAssistantEvent : public FSMEvent
  189. {
  190. public:
  191. AgentAssistantEvent() : FSMEvent(USER_EVT_AGENT_ASSIST){}
  192. ~AgentAssistantEvent(){}
  193. SpReqAnsContext<FreeRDPWrapSrv_AgentAssistant_Req, FreeRDPWrapSrv_AgentAssistant_Ans>::Pointer m_ctx;
  194. virtual void OnUnhandled()
  195. {
  196. Dbg("USER_EVT_AGENT_ASSIST unhandled!");
  197. if(m_ctx != NULL)
  198. {
  199. m_ctx->Answer(Error_InvalidState);
  200. }
  201. }
  202. };
  203. class CreateProcessEvent : public FSMEvent
  204. {
  205. public:
  206. CreateProcessEvent() : FSMEvent(USER_EVT_CREATE_PROCESS){}
  207. ~CreateProcessEvent(){}
  208. SpReqAnsContext<FreeRDPWrapSrv_CreateProcessRunAs_Req, FreeRDPWrapSrv_CreateProcessRunAs_Ans>::Pointer m_ctx;
  209. virtual void OnUnhandled()
  210. {
  211. Dbg("USER_EVT_CREATE_PROCESS unhandled!");
  212. if(m_ctx != NULL)
  213. {
  214. m_ctx->Answer(Error_InvalidState);
  215. }
  216. }
  217. };
  218. //!!End RDPWrap Install secion
  219. class CFreeRDPWrapFSM : public FSMImpl<CFreeRDPWrapFSM>, public IFSMStateHooker
  220. {
  221. public:
  222. CFreeRDPWrapFSM(void);
  223. ~CFreeRDPWrapFSM(void);
  224. virtual ErrorCodeEnum OnInit();
  225. virtual ErrorCodeEnum OnExit();
  226. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  227. virtual void OnStateTrans(int iSrcState, int iDstState);
  228. enum {s0, s1, s2, s3, s4, s5};
  229. BEGIN_FSM_STATE(CFreeRDPWrapFSM)
  230. FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
  231. FSM_STATE_ENTRY(s1, "Sharing", s1_on_entry, s1_on_exit, s1_on_event)
  232. FSM_STATE_ENTRY(s2, "Viewing", s2_on_entry, s2_on_exit, s2_on_event)
  233. FSM_STATE_ENTRY(s3, "Failed", s3_on_entry, s3_on_exit, s3_on_event)
  234. FSM_STATE_ENTRY(s4, "Install", s4_on_entry, s4_on_exit, s4_on_event)
  235. FSM_STATE_ENTRY(s5, "Depecrate", s5_on_entry, s5_on_exit, s5_on_event)
  236. END_FSM_STATE()
  237. BEGIN_FSM_RULE(CFreeRDPWrapFSM, s0)
  238. FSM_RULE_ENTRY(s0, s1, USER_EVT_START, 0)
  239. FSM_RULE_ENTRY(s0, s1, USER_EVT_INVITE, 1)
  240. FSM_RULE_ENTRY(s0, s2, USER_EVT_INVITE, 2)
  241. FSM_RULE_ENTRY(s1, s0, USER_EVT_CLOSE_SHARE, 1)
  242. FSM_RULE_ENTRY(s2, s0, USER_EVT_CLOSE_SHARE, 1)
  243. FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_CONNECT_TO_HOST_FAILED)
  244. FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_CONNECT_TO_HOST_SUCC)
  245. FSM_RULE_ENTRY_ANY(s1, s3, USER_EVT_ATTENDEE_CONNECT_FAILED)
  246. FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_ATTENDEE_DISCONNECT)
  247. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_ATTENDEE_CONNECTED)
  248. FSM_RULE_ENTRY(s1, s3, USER_EVT_CLOSE_SHARE, 2)
  249. FSM_RULE_ENTRY(s2, s3, USER_EVT_CLOSE_SHARE, 2)
  250. FSM_RULE_ENTRY_ANY(s2, s0, USER_EVT_ON_VIEWER_DISCONNECTED)
  251. FSM_RULE_ENTRY(s0, s4, USER_EVT_INSTALL_DRIVE, 1)
  252. FSM_RULE_ENTRY(s4, s0, USER_EVT_INSTALL_DRIVE_DONE, 1)
  253. FSM_RULE_ENTRY(s0, s1, USER_EVT_AGENT_ASSIST, 1)
  254. FSM_RULE_ENTRY(s1, s0, USER_EVT_AGENT_ASSIST_DONE, 0)
  255. FSM_RULE_ENTRY_ANY(s0, s5, USER_EVT_DEPECRATED)
  256. END_FSM_RULE()
  257. virtual void s0_on_entry();
  258. virtual void s0_on_exit();
  259. virtual unsigned int s0_on_event(FSMEvent* e);
  260. virtual void s1_on_entry();
  261. virtual void s1_on_exit();
  262. virtual unsigned int s1_on_event(FSMEvent* e);
  263. virtual void s2_on_entry();
  264. virtual void s2_on_exit();
  265. virtual unsigned int s2_on_event(FSMEvent* e);
  266. virtual void s3_on_entry();
  267. virtual void s3_on_exit();
  268. virtual unsigned int s3_on_event(FSMEvent* e);
  269. virtual void s4_on_entry();
  270. virtual void s4_on_exit();
  271. virtual unsigned int s4_on_event(FSMEvent* e);
  272. virtual void s5_on_entry() {LOG_FUNCTION();}
  273. virtual void s5_on_exit() {}
  274. virtual unsigned int s5_on_event(FSMEvent* e);
  275. static UINT WINAPI MaintainFreeRDPRoutine(LPVOID param);
  276. //If returned INVALID_HANDLE_VALUE, dwProcessID = GetLastError();
  277. HANDLE CreateFreeRDPProc(DWORD &dwProcessID);
  278. void AttendeeDisconnect() {
  279. Dbg("USER_EVT_ATTENDEE_DISCONNECT happen!");
  280. this->PostEventFIFO(new FSMEvent(USER_EVT_ATTENDEE_DISCONNECT));
  281. }
  282. void AttendeeConnected() {
  283. Dbg("USER_EVT_ATTENDEE_CONNECTED happen!");
  284. this->PostEventFIFO(new FSMEvent(USER_EVT_ATTENDEE_CONNECTED));
  285. }
  286. void AttendConnectFailed() {
  287. Dbg("USER_EVT_ATTENDEE_CONNECT_FAILED happen!");
  288. this->PostEventFIFO(new FSMEvent(USER_EVT_ATTENDEE_CONNECT_FAILED));
  289. }
  290. void ConnectToHostFailed() {
  291. Dbg("USER_EVT_CONNECT_TO_HOST_FAILED happen!");
  292. this->PostEventFIFO(new FSMEvent(USER_EVT_CONNECT_TO_HOST_FAILED));
  293. }
  294. void ConnectToHostSucc() {
  295. Dbg("USER_EVT_CONNECT_TO_HOST_SUCC happen!");
  296. this->PostEventFIFO(new FSMEvent(USER_EVT_CONNECT_TO_HOST_SUCC));
  297. }
  298. void ViewerDisconnected() {
  299. Dbg("USER_EVT_ON_VIEWER_DISCONNECTED happen!");
  300. this->PostEventFIFO(new FSMEvent(USER_EVT_ON_VIEWER_DISCONNECTED));
  301. }
  302. void BroadMonitorNumChange(const int curAvailMonitorNums);
  303. void RequireInstallDrv(const BOOL& kbdReq, const BOOL& mouReq)
  304. {
  305. #ifndef TWINKLE_LOCAL_DEBUG
  306. if(GetCurrState()->id == s4) {
  307. Dbg("USER_EVT_INSTALL_DRIVE happen! in %s state", GetCurrState()->pszName);
  308. return;
  309. }
  310. Dbg("USER_EVT_INSTALL_DRIVE happen!");
  311. LogWarn(Severity_High, Error_InvalidState, 0,
  312. (LPCTSTR)CSimpleStringA::Format("Need to install driver for %s | %s.",
  313. kbdReq ? "keyboard" : "", mouReq ? "mouse" : ""));
  314. DriveInstallEvent* evt = new DriveInstallEvent(kbdReq, mouReq);
  315. this->PostEventFIFO(evt);
  316. #endif //TWINKLE_LOCAL_DEBUG
  317. }
  318. ErrorCodeEnum AgentAssistant(
  319. SpReqAnsContext<FreeRDPWrapSrv_AgentAssistant_Req,
  320. FreeRDPWrapSrv_AgentAssistant_Ans>::Pointer ctx);
  321. void SetFSMSickStatus(BOOL tellImmediately = TRUE) {
  322. m_ecSelfTest = Error_InvalidState;
  323. //TODO
  324. }
  325. void SetFSMRecoverStatus() {
  326. if(m_ecSelfTest != Error_Succeed) {
  327. m_ecSelfTest = Error_Succeed;
  328. }
  329. }
  330. void unitest_install_rdpwrap_component() {
  331. BOOL bWrapInstalled = FALSE;
  332. if( 0 == CheckRdpWrapInstall(bWrapInstalled)) {
  333. if(bWrapInstalled == FALSE) {
  334. auto rc = InstallRdpWrap();
  335. Dbg("install rdp component return : ", rc);
  336. }
  337. }
  338. }
  339. void unitest_unstall_rdpwrap_component() {
  340. BOOL bWrapInstalled = FALSE;
  341. if( 0 == CheckRdpWrapInstall(bWrapInstalled)) {
  342. if(bWrapInstalled == TRUE) {
  343. auto rc = UnstallRdpWrap();
  344. Dbg("unstall rdp component return : ", rc);
  345. }
  346. }
  347. }
  348. UINT UnitTest(LPCTSTR testTag);
  349. bool DetectPrimaryMonitors();
  350. private:
  351. BOOL IsWrapperNeedUpdate();
  352. BOOL TerminateFreeRDPRoutine();
  353. BOOL CreateInviteFileName(CHAR* strFileName, const DWORD bufLen);
  354. void InitEnvironmentValue();
  355. void SetSysVal(int nFlag);
  356. ErrorCodeEnum CreateClientUserAccount();
  357. ErrorCodeEnum GetClientUserPsw(bool bRuncfgInitialized, CSimpleStringA& plainPsw);
  358. inline bool RemoveClientUser();
  359. bool IsInvalidCipherPsw(const CSimpleStringA& strCipherPsw)
  360. {
  361. return (!strCipherPsw.IsNullOrEmpty() && strCipherPsw.GetLength() < 24);
  362. }
  363. bool Plain2EncodeCipherString(const char* newPasswd, CSimpleStringA& strEnCipherText);
  364. bool EncodeCipher2PlainString(const CSimpleStringA& strEnCipherText, CSimpleStringA& strPlainText);
  365. inline void BackupClientUserPsw(const CSimpleStringA& psw);
  366. inline void RetrieveClientUserPswFromBakup(CSimpleStringA& psw);
  367. ErrorCodeEnum RetrieveFreeRDPUserPassword(CSimpleStringA& strOutPassword);
  368. ErrorCodeEnum StoreFreeRDPUserPassword(const CSimpleStringA& strInPassword);
  369. ErrorCodeEnum TryChangeClientUserPswWithDefault();
  370. int GetRealtimeMonitorInfo(CAutoArray<MonitorInfo>& monitorArr);
  371. /*return 2 means succeed. 0: primary, 1: vice */
  372. int GetMonitorInfoFromRunCfg(CAutoArray<MonitorInfo>& monitorArr);
  373. BOOL IfDontActiveClientManagerDesk();
  374. public:
  375. friend struct CreateProcessTask;
  376. BOOL CreateShareSession(
  377. SpReqAnsContext<FreeRDPWrapSrv_InviteRdpShare_Req,
  378. FreeRDPWrapSrv_InviteRdpShare_Ans>::Pointer ctx);
  379. BOOL TerminateShareSession(
  380. SpReqAnsContext<FreeRDPWrapSrv_CloseRdpShare_Req,
  381. FreeRDPWrapSrv_CloseRdpShare_Ans>::Pointer ctx);
  382. BOOL ShowFreeRDPCursor(BOOL bShow = TRUE);
  383. ErrorCodeEnum UpdateAndChangeSrvStatus();
  384. BOOL ExecWaitWithExitCode(LPTSTR lpszCmdLine, DWORD& dwExitCode);
  385. BOOL ExecWaitWithResultContent(LPTSTR lpszCmdLine, CSimpleStringA& strResult);
  386. //ErrorCodeEnum CreateProcessRunAs(LPCTSTR lpcszCmdLine, LPCTSTR lpcszUserName);
  387. ErrorCodeEnum CreateProcessFromSrv(
  388. LPCTSTR lpcszCmdLine, LPCTSTR lpcszUserName, PROCESS_INFORMATION *ppi);
  389. ErrorCodeEnum CreateProcessFromSrvWait(
  390. LPCTSTR lpcszCmdLine, LPCTSTR lpcszUserName, PROCESS_INFORMATION *ppi);
  391. void SetSelfCheckCode(ErrorCodeEnum ec = Error_Succeed) {
  392. m_ecSelfTest = ec;
  393. }
  394. void SetBrocastEvent(bool bLock = true) {
  395. if(bLock) {
  396. SendWfreeWrapEvt(1);
  397. }
  398. }
  399. void SendWfreeWrapEvt(int evtType, int reserved1 = 0, int reserved2 = 0);
  400. void PromptInvalidMonitor() {
  401. //检测到显示器异常,请确保有且仅有2个显示屏处于可用状态!
  402. GetEntityBase()->GetFunction()->ShowFatalError("显示器异常,请确保有且仅有2个显示屏可用!");
  403. }
  404. ErrorCodeEnum CreateDeskShareProc(bool force = false);
  405. int CreateInstallDrvTask(const BOOL& kbdRequired, const BOOL& mouRequired);
  406. ErrorCodeEnum InstallFiltrDriver(DEVTYPE dt);
  407. void CheckCriticalThread();
  408. ErrorCodeEnum SetNumLockDefaultStatus();
  409. void SetNumLock(BOOL bState);
  410. void messageTest(BOOL on);
  411. private:
  412. CSimpleStringA m_strUserName;
  413. ErrorCodeEnum m_ecSelfTest;
  414. int m_nSrcState;
  415. HANDLE m_hFreeRDPProc;
  416. DWORD m_dwFreeRDPProcID;
  417. HANDLE hExitEvent;
  418. HANDLE m_hRDPMaintainThread;
  419. UINT m_dwRDPMaintainID;
  420. HANDLE m_hWarerThread;
  421. DWORD m_dwWarerThreadID;
  422. BOOL m_bInvited;
  423. BOOL m_bInterview;
  424. CSimpleStringA m_strInviteFileName;
  425. DWORD m_dwLockScreenMinu;
  426. DWORD m_dwWndThreadID;
  427. HANDLE m_hWndThread;
  428. //防止隔壁在请求服务执行进程时有其他请求冲进来
  429. HANDLE m_hSrvMutex;
  430. BOOL m_bAgentSituation;
  431. ShareMode m_eShareMode;
  432. BOOL m_bTestMode;
  433. UINT m_uMonitorNum;
  434. BOOL m_DeactiveClientManager;
  435. };
  436. struct CreateProcessTask : public ITaskSp
  437. {
  438. CFreeRDPWrapFSM* fsm;
  439. CreateProcessTask(CFreeRDPWrapFSM* f) : fsm(f) {}
  440. SpReqAnsContext<FreeRDPWrapSrv_CreateProcessRunAs_Req, FreeRDPWrapSrv_CreateProcessRunAs_Ans>::Pointer m_ctx;
  441. void Process()
  442. {
  443. //FSMEvent *e = new FSMEvent(USER_EVT_CREATE_PROCESS_FINISHED);
  444. ErrorCodeEnum ec = Error_Succeed;
  445. PROCESS_INFORMATION pi = {0};
  446. ec = fsm->CreateProcessFromSrvWait(
  447. m_ctx->Req.strCmdLine,
  448. m_ctx->Req.strUserName.IsNullOrEmpty() ?
  449. (LPCTSTR)fsm->m_strUserName
  450. : (LPCTSTR)m_ctx->Req.strUserName,
  451. &pi);
  452. if(ISSUCCEEDED(ec)) {
  453. m_ctx->Ans.reserved1 = 1;
  454. m_ctx->Ans.retCode = pi.dwProcessId;
  455. Dbg("fulfill retCode with pid: %d", m_ctx->Ans.retCode);
  456. }
  457. m_ctx->Answer(ec);
  458. }
  459. };
  460. struct DrvInstallTask : public ITaskSp
  461. {
  462. CFreeRDPWrapFSM* fsm;
  463. BOOL kbdRequired;
  464. BOOL mouRequired;
  465. DrvInstallTask(CFreeRDPWrapFSM* f): fsm(f), kbdRequired(FALSE), mouRequired(FALSE) {}
  466. void Process()
  467. {
  468. if(!fsm) return;
  469. if(kbdRequired) {
  470. if(fsm->InstallFiltrDriver(DEV_KEYBOARD) == Error_Succeed) {
  471. LogEvent(Severity_Low, Error_Succeed, "Install Keyboard driver succ.");
  472. }
  473. else {
  474. LogWarn(Severity_Middle, Error_RegistryFailed, ERROR_FREERDP_DRIVER_INSTALL_KEYBOARD_FAILED,
  475. "Install Keyboard Driver failed!");
  476. }
  477. if(mouRequired) {
  478. Sleep(1000);
  479. }
  480. }
  481. if(mouRequired) {
  482. if(fsm->InstallFiltrDriver(DEV_MOUSE) == Error_Succeed) {
  483. LogEvent(Severity_Low, Error_Succeed, "Install Mouse driver succ.");
  484. }
  485. else {
  486. LogWarn(Severity_Middle, Error_RegistryFailed, ERROR_FREERDP_DRIVER_INSTALL_MOUSE_FAILED,
  487. "Install Mouse Driver failed!");
  488. }
  489. }
  490. fsm->PostEventFIFO(new FSMEvent(USER_EVT_INSTALL_DRIVE_DONE));
  491. }
  492. };
  493. struct SpDeskShareCreateTask : public ITaskSp
  494. {
  495. CFreeRDPWrapFSM* fsm;
  496. bool m_force;
  497. SpDeskShareCreateTask(CFreeRDPWrapFSM* f) : fsm(f), m_force(false) {}
  498. SpDeskShareCreateTask(CFreeRDPWrapFSM* f, bool bForce) : fsm(f), m_force(bForce) {}
  499. void Process()
  500. {
  501. ErrorCodeEnum ec = Error_Param;
  502. if(fsm != NULL) {
  503. ec = fsm->CreateDeskShareProc(m_force);
  504. Dbg("Execute SpDeskShareCreateTask returned: %d", ec);
  505. }
  506. }
  507. };
  508. struct AgentAssistTask : public ITaskSp
  509. {
  510. CFreeRDPWrapFSM* fsm;
  511. AgentAssistTask(CFreeRDPWrapFSM* f) : fsm(f) {}
  512. SpReqAnsContext<FreeRDPWrapSrv_AgentAssistant_Req, FreeRDPWrapSrv_AgentAssistant_Ans>::Pointer m_ctx;
  513. void Process()
  514. {
  515. LOG_ASSERT(fsm != NULL);
  516. ErrorCodeEnum ec = Error_Param;
  517. ec = fsm->AgentAssistant(m_ctx);
  518. FSMEvent* evt = new FSMEvent(USER_EVT_AGENT_ASSIST_DONE);
  519. evt->param1 = ec == Error_Succeed ? 1 : 0;
  520. fsm->PostEventFIFO(evt);
  521. }
  522. };
  523. //////////////////////////////////////////////////////////////////////////
  524. struct HIDMaintainTask : public ITaskSp
  525. {
  526. CFreeRDPWrapFSM* fsm;
  527. HIDMaintainTask(CFreeRDPWrapFSM* f) : fsm(f) {}
  528. void Process() {
  529. LOG_ASSERT(fsm != NULL);
  530. DevMnt_SetReference(fsm);
  531. DevMnt_MainWndStartAndLoop(fsm);
  532. Dbg("DevMnt_MainWndStartAndLoop end !");
  533. //TODO:
  534. }
  535. };
  536. struct WarerMaintainTask : public ITaskSp
  537. {
  538. CFreeRDPWrapFSM* fsm;
  539. WarerMaintainTask(CFreeRDPWrapFSM* f) : fsm(f) {}
  540. void Process() {
  541. LOG_ASSERT(fsm != NULL);
  542. DevMnt_SetReference(fsm);
  543. RDPWarer_MainWndStartAndLoop(fsm);
  544. Dbg("RDPWarer_MainWndStartAndLoop end !");
  545. //TODO:
  546. }
  547. };
  548. class CInteractCtrlClient : public UIService_ClientBase
  549. {
  550. public:
  551. CInteractCtrlClient(CEntityBase* pEntity)
  552. :UIService_ClientBase(pEntity) {}
  553. };
  554. #endif //_FREERDPWRAP_FSM_H__