BranchDeviceFSM.cpp 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042
  1. #include "stdafx.h"
  2. #include "GetDevInfoHelper.h"
  3. #include "BranchDeviceFSM.h"
  4. #include <assert.h>
  5. //#define BRANCHDEBUG
  6. //#define SetLowPriority
  7. #define RestrictedTokens
  8. //#define CreateProcessWithLogon
  9. //#define DROP_MY_RIGHT
  10. #ifdef DROP_MY_RIGHT
  11. #include <WinSafer.h>
  12. #include <aclapi.h>
  13. #endif
  14. #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
  15. #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
  16. const int SMALL_RETVALUE_LEN = 128;
  17. const int DEFAULT_RETVALUE_LEN = 512;
  18. const int DEFAULT_TIMEOUT_MILLSEC = 15 * 1000;
  19. const int MAX_FAILEDCOUNT = 5;
  20. BOOLEAN SetPrivilege(HANDLE hToken, // access token handle
  21. LPCTSTR lpszPrivilege, // name of privilege to enable/disable
  22. BOOL bEnablePrivilege // to enable or disable privilege
  23. )
  24. {
  25. TOKEN_PRIVILEGES tp;
  26. LUID luid;
  27. if(hToken == INVALID_HANDLE_VALUE)
  28. {
  29. if (!OpenProcessToken(GetCurrentProcess(),
  30. TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  31. {
  32. LOG_TRACE("OpenProcessToken error: %u", GetLastError());
  33. return FALSE;
  34. }
  35. }
  36. if ( !LookupPrivilegeValue(
  37. NULL, // lookup privilege on local system
  38. lpszPrivilege, // privilege to lookup
  39. &luid ) ) // receives LUID of privilege
  40. {
  41. LOG_TRACE("LookupPrivilegeValue error: %u", GetLastError());
  42. return FALSE;
  43. }
  44. tp.PrivilegeCount = 1;
  45. tp.Privileges[0].Luid = luid;
  46. if (bEnablePrivilege)
  47. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  48. else
  49. tp.Privileges[0].Attributes = 0;
  50. // Enable the privilege or disable all privileges.
  51. if ( !AdjustTokenPrivileges(
  52. hToken,
  53. FALSE,
  54. &tp,
  55. sizeof(TOKEN_PRIVILEGES),
  56. (PTOKEN_PRIVILEGES) NULL,
  57. (PDWORD) NULL) )
  58. {
  59. LOG_TRACE("AdjustTokenPrivileges error: %u.", GetLastError());
  60. return FALSE;
  61. }
  62. if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
  63. {
  64. LOG_TRACE("The token does not have the specified privilege.");
  65. return FALSE;
  66. }
  67. return TRUE;
  68. }
  69. ///目录是否存在的检查:
  70. bool CheckFolderExist(LPCTSTR lpszDirName)
  71. {
  72. WIN32_FIND_DATA wfd;
  73. bool rValue = false;
  74. HANDLE hFind = FindFirstFile(lpszDirName, &wfd);
  75. if ((hFind != INVALID_HANDLE_VALUE)
  76. && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
  77. {
  78. rValue = true;
  79. }
  80. FindClose(hFind);
  81. return rValue;
  82. }
  83. #define MAX_PRINTF_MSG_LEN 512
  84. //outCovertParam must be MAX_PRINTF_MSG_LEN len.
  85. void CovertCmdParam(LPTSTR outCovertParam, LPCTSTR lpszParam)
  86. {
  87. char szSecurParam[20] = {0};
  88. memset(outCovertParam, 0, sizeof(char)*MAX_PRINTF_MSG_LEN);
  89. memset(szSecurParam, 0, sizeof(szSecurParam));
  90. int len = strlen(lpszParam);
  91. bool bCoverted = false;
  92. if(len > 0)
  93. {
  94. if(len > 6)
  95. {
  96. szSecurParam[0] = lpszParam[0];
  97. szSecurParam[1] = lpszParam[1];
  98. szSecurParam[2] = lpszParam[2];
  99. strcat_s(szSecurParam, "***");
  100. szSecurParam[6] = lpszParam[len-3];
  101. szSecurParam[7] = lpszParam[len-2];
  102. szSecurParam[8] = lpszParam[len-1];
  103. szSecurParam[9] = '\0';
  104. bCoverted = true;
  105. }
  106. else if(len > 2)
  107. {
  108. szSecurParam[0] = lpszParam[0];
  109. szSecurParam[1] = '*';
  110. szSecurParam[2] = lpszParam[len-1];
  111. szSecurParam[3] = '\0';
  112. bCoverted = true;
  113. }
  114. }
  115. if(!bCoverted)
  116. {
  117. sprintf_s(outCovertParam, MAX_PRINTF_MSG_LEN, "(%s)", lpszParam);
  118. }
  119. else
  120. {
  121. sprintf_s(outCovertParam, MAX_PRINTF_MSG_LEN, "(%s)(len#%d)", szSecurParam, len);
  122. }
  123. return;
  124. }
  125. CRITICAL_SECTION CBranchDeviceFSM::s_cs;
  126. ErrorCodeEnum CBranchDeviceFSM::OnInit()
  127. {
  128. LOG_FUNCTION();
  129. ErrorCodeEnum erroCode = Error_Succeed;
  130. Dbg("Josephus update in 2017-3-18");
  131. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  132. CSmartPointer<IConfigInfo> spRootConfig;
  133. erroCode = spEntityFunction->OpenConfig(Config_Root, spRootConfig);
  134. if(FAILURED(erroCode))
  135. {
  136. Dbg("Open Root.ini failed with 0x%08x", erroCode);
  137. return erroCode;
  138. }
  139. int nDevNum = 0;
  140. erroCode = spRootConfig->ReadConfigValueInt("Device.BranchDevice", "DevNum", nDevNum);
  141. if(FAILURED(erroCode)/* || nDevNum <= 0*/)
  142. {
  143. Dbg("unsuccessfully option: nDevNum(%d) ErrorCode(0x%08x) then return", nDevNum, erroCode);
  144. return Error_Param;
  145. }
  146. DWORD dwSpbranchPID = 0;
  147. int nFailCount = 0;
  148. while(m_pProcHelper->GetPIDByName("spbranch.exe", dwSpbranchPID))
  149. {
  150. Dbg("find previous survive spbranch.exe(%u) and try to kill it !", dwSpbranchPID);
  151. if(m_pProcHelper->DestoryProcess(dwSpbranchPID))
  152. {
  153. LogWarn(Severity_Middle, Error_Unexpect, 0,
  154. "find previous survive spbranch.exe and try to kill it succ !");
  155. }
  156. else
  157. {
  158. LogError(Severity_Middle, Error_Unexpect, 0,
  159. "find previous survive spbranch.exe and kill it failed !");
  160. if( ++nFailCount > MAX_FAILEDCOUNT)
  161. {
  162. Dbg("unsuccessful operations ecceeds %d times.", MAX_FAILEDCOUNT);
  163. return Error_Unexpect;
  164. }
  165. }
  166. Sleep(200);
  167. }
  168. Dbg("BranchDevice Count: %d", nDevNum);
  169. if(nDevNum <= 0)
  170. {
  171. Dbg("Cannot found any BranchDevice information, regard it as normal.");
  172. return Error_Succeed;
  173. }
  174. // --Josephus at 18:47:24 2017120
  175. //BOOL bPrivilege = CTWProcHelper::SetImpersonatePriv();
  176. //Dbg("SetImpersonatePriv returned %d.", bPrivilege);
  177. //if(FALSE /*Test exclude in job*/)
  178. if(m_pProcHelper != NULL && m_pProcHelper->Create(NULL, "SPRvc_BranceDeviceJob"))
  179. {
  180. m_bNeedJob = TRUE;
  181. }
  182. else
  183. {
  184. LogWarn(Severity_Middle, Error_Unexpect, 0, "Branch device Sandbox run failed !!!");
  185. return Error_Unexpect;
  186. }
  187. BOOL bRes = FALSE;
  188. if(m_bNeedJob)
  189. {
  190. m_hNotifyFinishedEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  191. if(m_hNotifyFinishedEvent == NULL || m_hNotifyFinishedEvent == INVALID_HANDLE_VALUE)
  192. {
  193. Dbg("Create event failed, GLE: %d.", GetLastError());
  194. UINT uExitCode = 0;
  195. m_pProcHelper->Terminate(uExitCode);
  196. LogWarn(Severity_Middle, Error_Unexpect, 0, "Branch device Sandbox run failed !!!");
  197. m_bNeedJob = FALSE;
  198. return Error_Unexpect;
  199. }
  200. else
  201. {
  202. m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
  203. JobNotifyTask* task = new JobNotifyTask(this);
  204. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  205. //LogWarn(Severity_Middle, Error_Unexpect, 0, "Branch device Sandbox not initialize !!!");
  206. bRes = JobInitialize();
  207. }
  208. }
  209. CSimpleStringA strDbgPath;
  210. spEntityFunction->GetPath("Dbg", strDbgPath);
  211. strDbgPath += "\\SpBranch";
  212. if(!CheckFolderExist(strDbgPath))
  213. {
  214. if (!CreateDirectory(strDbgPath, NULL))
  215. {
  216. Dbg("CreateDirectory(%s) failed (%d)", (LPCTSTR)strDbgPath, GetLastError());
  217. }
  218. else
  219. {
  220. Dbg("SetLowLabelToFile {%s}", (LPCTSTR)strDbgPath);
  221. CTWProcHelper::SetLowLabelToFile((LPCTSTR)strDbgPath);
  222. }
  223. }
  224. m_strSpBranchPath = strDbgPath;
  225. #ifdef BRANCHDEBUG
  226. CSimpleStringA strBinPath;
  227. spEntityFunction->GetPath("bin", strDebugPath);
  228. strBinPath += "\\LogFiles";
  229. CTWProcHelper::SetLowLabelToFile(strBinPath);
  230. #endif
  231. //CTWProcHelper::SearchTokenGroupsForSID();
  232. //if(CTWProcHelper::AddUserAccount())
  233. //{
  234. // Dbg("Add accout suc.");
  235. // CTWProcHelper::AddMemberToGroup();
  236. //}
  237. CAutoArray<CSimpleStringA> brDevNames;
  238. brDevNames.Init(nDevNum);
  239. CAutoArray<CSimpleStringA> brDevDllPaths;
  240. brDevDllPaths.Init(nDevNum);
  241. m_pDevHandles = (BranchDevHandle*)malloc(sizeof(BranchDevHandle) * nDevNum);
  242. if(m_pDevHandles == NULL)
  243. {
  244. Dbg("malloc memory for devHandls failed %d", GetLastError());
  245. return Error_Resource;
  246. }
  247. Dbg("after malloc DevHandles memory suc.");
  248. m_nDevNum = nDevNum;
  249. memset(m_pDevHandles, 0, sizeof(BranchDevHandle) * nDevNum);
  250. for(int idx=0; idx<nDevNum; ++idx)
  251. {
  252. m_pDevHandles[idx].nReserved = 0;
  253. CSimpleStringA csIndex = CSimpleStringA::Format("%d", idx+1);
  254. erroCode = spRootConfig->ReadConfigValue("Device.BranchDevice", (LPCTSTR)csIndex, brDevNames[idx]);
  255. if(ISSUCCEEDED(erroCode))
  256. {
  257. if(brDevNames[idx].GetLength() <= 0)
  258. {
  259. erroCode = Error_Unexpect;
  260. Dbg("Get value of key(%d) failed under BranchDevice in root.ini", idx);
  261. }
  262. else
  263. {
  264. erroCode = SpGetBrDevAdaptorPath(m_pEntity, brDevNames[idx], brDevDllPaths[idx]);
  265. if(ISSUCCEEDED(erroCode))
  266. {
  267. if(brDevDllPaths[idx].GetLength() <= 0)
  268. {
  269. erroCode = Error_Unexpect;
  270. Dbg("[%s] The Adapter dll path is invalide.");
  271. }
  272. else
  273. {
  274. Dbg("SN#%d...%s %s", idx+1, (LPCTSTR)brDevNames[idx], (LPCTSTR)brDevDllPaths[idx]);
  275. }
  276. }
  277. else
  278. {
  279. Dbg("SpGetBrDevAdaptorPath with param(%s) failed returned 0x%08x",
  280. (LPCTSTR)brDevNames[idx], erroCode);
  281. }
  282. }
  283. }
  284. if(FAILURED(erroCode))
  285. {
  286. m_pDevHandles[idx].nStatus = -1;
  287. sprintf_s(m_pDevHandles[idx].szInfo, "DevName or DllFilePath is invalide.");
  288. continue;
  289. }
  290. m_pDevHandles[idx].nStatus = 0;
  291. strcpy_s(m_pDevHandles[idx].szDevName, (LPCTSTR)brDevNames[idx]);
  292. strcpy_s(m_pDevHandles[idx].szDevDllPath, (LPCTSTR)brDevDllPaths[idx]);
  293. }
  294. m_pRWStr = (PRWStruct*)malloc(sizeof(PRWStruct)* nDevNum);
  295. if(m_pRWStr == NULL)
  296. {
  297. Dbg("malloc memory for RWStruct failed %d", GetLastError());
  298. free(m_pDevHandles);
  299. m_pDevHandles = NULL;
  300. return Error_Resource;
  301. }
  302. Dbg("after malloc RWStruct memory suc.");
  303. ZeroMemory(m_pRWStr, sizeof(PRWStruct) * nDevNum);
  304. for(int idx=0; idx<nDevNum; ++idx)
  305. {
  306. m_pRWStr[idx] = new RWStruct();
  307. if(m_pRWStr[idx] == NULL)
  308. {
  309. for(int innerIdx = 0; innerIdx < idx; innerIdx++)
  310. delete m_pRWStr[innerIdx];
  311. free(m_pDevHandles);
  312. m_pDevHandles = NULL;
  313. free(m_pRWStr);
  314. m_pRWStr = NULL;
  315. Dbg("New RWStruct point failed fatally !!");
  316. return Error_Resource;
  317. }
  318. }
  319. return Error_Succeed;
  320. }
  321. ErrorCodeEnum CBranchDeviceFSM::OnExit()
  322. {
  323. LOG_FUNCTION();
  324. ErrorCodeEnum erroCode = Error_Succeed;
  325. Cleanup();
  326. return erroCode;
  327. }
  328. void CBranchDeviceFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  329. {
  330. pTransactionContext->SendAnswer(Error_Succeed);
  331. BOOL bNeedNotify = TRUE;
  332. if(m_bNeedJob && m_eCurState != Error_NotInit)
  333. {
  334. for(int idx=0; idx<m_nDevNum; idx++)
  335. {
  336. if(m_pDevHandles[idx].nStatus != 0)
  337. {
  338. TCHAR szInfor[MAX_MSG_SIZE] = {0};
  339. sprintf_s(szInfor, "%s's invalid: %s(%d)",
  340. m_pDevHandles[idx].szDevName, m_pDevHandles[idx].szInfo, m_pDevHandles[idx].nStatus);
  341. LogWarn(Severity_Middle, Error_DevNotAvailable, 0, szInfor);
  342. if(m_pDevHandles[idx].nStatus == -2 || m_pDevHandles[idx].nStatus == -5/*necessary??*/)
  343. {
  344. if(RestartChildProcess(idx))
  345. {
  346. Sleep(1000);
  347. OpenSpecifiedDev(idx);
  348. }
  349. }
  350. else if(m_pDevHandles[idx].nStatus == -6 || m_pDevHandles[idx].nStatus == -4/*hardly*/)
  351. {
  352. OpenSpecifiedDev(idx);
  353. }
  354. else if(m_pDevHandles[idx].nStatus == -7)
  355. {
  356. if(RestartChildProcess(idx))
  357. {
  358. Sleep(1000);
  359. OpenSpecifiedDev(idx);
  360. bNeedNotify = FALSE;
  361. }
  362. }
  363. }
  364. if(m_pRWStr[idx] != NULL && m_pDevHandles[idx].nReserved == 1)
  365. {
  366. TCHAR szInfor[MAX_MSG_SIZE] = {0};
  367. sprintf_s(szInfor, "%s's process (PID = %u) is not in the Job !",
  368. m_pDevHandles[idx].szDevName, m_pRWStr[idx]->dwProcessID);
  369. LogWarn(Severity_Middle, Error_Unexpect, 0, szInfor);
  370. }
  371. }
  372. if(bNeedNotify)
  373. {
  374. PostQueuedCompletionStatus(m_hIOCP, 0, COMPKEY_STATUS, NULL);
  375. }
  376. }
  377. }
  378. void CBranchDeviceFSM::s0_on_entry()
  379. {
  380. LOG_FUNCTION();
  381. if(!m_bNeedJob)
  382. {
  383. PostEventFIFO(new FSMEvent(USER_EVT_CREATEPROCESS));
  384. }
  385. }
  386. void CBranchDeviceFSM::s0_on_exit()
  387. {
  388. }
  389. unsigned int CBranchDeviceFSM::s0_on_event(FSMEvent* e)
  390. {
  391. int nRet = 0;
  392. Dbg("s0_on_event: evtType(%d)", e->iEvt);
  393. if(e->iEvt == USER_EVT_JOBNOTIFYSTART || e->iEvt == USER_EVT_CREATEPROCESS)
  394. {
  395. e->SetHandled();
  396. CreateProcessTask* task = new CreateProcessTask(this);
  397. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  398. }
  399. else if(e->iEvt == USER_EVT_CREATEPROCESSFINISHED)
  400. {
  401. e->SetHandled();
  402. }
  403. return nRet;
  404. }
  405. void CBranchDeviceFSM::s1_on_entry()
  406. {
  407. LOG_FUNCTION();
  408. OpenDeviceTask* task = new OpenDeviceTask(this);
  409. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  410. }
  411. void CBranchDeviceFSM::s1_on_exit()
  412. {
  413. m_eCurState = Error_Succeed;
  414. }
  415. unsigned int CBranchDeviceFSM::s1_on_event(FSMEvent* e)
  416. {
  417. int nRet = 0;
  418. if(e->iEvt == USER_EVT_OPENFINISHED)
  419. {
  420. e->SetHandled();
  421. }
  422. return nRet;
  423. }
  424. void CBranchDeviceFSM::s2_on_entry()
  425. {
  426. LOG_FUNCTION();
  427. }
  428. void CBranchDeviceFSM::s2_on_exit()
  429. {
  430. }
  431. unsigned int CBranchDeviceFSM::s2_on_event(FSMEvent* e)
  432. {
  433. Dbg("s2_on_event: evtType(%d)", e->iEvt);
  434. int nRet = 0;
  435. if(e->iEvt == USER_EVT_CMD)
  436. {
  437. OperateCMDTask* task = new OperateCMDTask(this);
  438. OperateCMDEvent* evt = dynamic_cast<OperateCMDEvent*>(e);
  439. task->SetContext(evt->m_ctx);
  440. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  441. e->SetHandled();
  442. }
  443. else if(e->iEvt == USER_EVT_GETINFO)
  444. {
  445. GetInfoTask* task = new GetInfoTask(this);
  446. GetInfoEvent* evt = dynamic_cast<GetInfoEvent*>(e);
  447. task->SetContext(evt->m_ctx);
  448. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  449. e->SetHandled();
  450. }
  451. return nRet;
  452. }
  453. void CBranchDeviceFSM::s3_on_entry()
  454. {
  455. LOG_FUNCTION();
  456. }
  457. void CBranchDeviceFSM::s3_on_exit()
  458. {
  459. }
  460. unsigned int CBranchDeviceFSM::s3_on_event(FSMEvent* e)
  461. {
  462. int nRet = 0;
  463. return nRet;
  464. }
  465. ErrorCodeEnum CBranchDeviceFSM::OpenSpecifiedDev(int devSN)
  466. {
  467. ErrorCodeEnum erroCode = Error_Succeed;
  468. if(devSN < 0 || devSN >= m_nDevNum)
  469. {
  470. return Error_Param;
  471. }
  472. if(m_pDevHandles[devSN].nStatus == -1 || m_pDevHandles[devSN].nStatus == -2)
  473. {
  474. LOG_TRACE("[%s]DevOpen failed [devSN#%d][nStatus#%d][szInfo#%s]",
  475. m_pDevHandles[devSN].szDevName,
  476. devSN, m_pDevHandles[devSN].nStatus,
  477. m_pDevHandles[devSN].szInfo);
  478. return Error_DevCommFailed;
  479. }
  480. if(!m_pRWStr[devSN]->IsValidRW() || m_pDevHandles[devSN].nStatus == -5)
  481. {
  482. LOG_TRACE("[%s][devSN#%d] Invalid pipe or process for process exchange.",
  483. m_pDevHandles[devSN].szDevName, devSN);
  484. return Error_DevCommFailed;
  485. }
  486. //SpBranch_Command_Req rq;
  487. //rq.nCmdType = BRCMD_GETSTATE;
  488. //SpBranch_Command_Ans ans;
  489. //erroCode = ProcessExchange(devSN, rq, ans);
  490. //if(ISSUCCEEDED(erroCode) && ISSUCCEEDED(ans.dwErroCode))
  491. //{
  492. // DevThreadState eState = (DevThreadState)ans.nparam1;
  493. // if(eState >= State_LoadSucc)
  494. // {
  495. //
  496. // }
  497. // else
  498. // {
  499. // strcpy_s(m_pDevHandles[devSN].szInfo, (LPCTSTR)ans.ssparam1);
  500. // }
  501. //}
  502. //else if(ISSUCCEEDED(erroCode))
  503. //{
  504. // strcpy_s(m_pDevHandles[devSN].szInfo, (LPCTSTR)ans.desc);
  505. //}
  506. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  507. CSmartPointer<IConfigInfo> spRootConfig;
  508. CSmartPointer<IConfigInfo> spCentConfig;
  509. erroCode = spEntityFunction->OpenConfig(Config_Root, spRootConfig);
  510. if(!ISSUCCEEDED(erroCode))
  511. {
  512. m_pDevHandles[devSN].nStatus = -4;
  513. Dbg("Open root.ini for %s failed with 0x%08x", m_pDevHandles[devSN].szDevName, erroCode);
  514. strcpy_s(m_pDevHandles[devSN].szInfo, "Open root.ini failed");
  515. return erroCode;
  516. }
  517. erroCode = spEntityFunction->OpenConfig(Config_CenterSetting, spCentConfig);
  518. if(!ISSUCCEEDED(erroCode))
  519. {
  520. m_pDevHandles[devSN].nStatus = -4;
  521. Dbg("Open centersetting.ini for %s failed with 0x%08x", m_pDevHandles[devSN].szDevName, erroCode);
  522. strcpy_s(m_pDevHandles[devSN].szInfo, "Open centersetting.ini failed");
  523. return erroCode;
  524. }
  525. CSimpleStringA devStName = CSimpleStringA::Format("BranchDevice.%s", m_pDevHandles[devSN].szDevName);
  526. CSimpleStringA csOpenParams;
  527. CSimpleStringA csOpenParamsCenter;
  528. erroCode = spRootConfig->ReadConfigValue((LPCTSTR)devStName, "Params", csOpenParams);
  529. if(FAILURED(erroCode)/* || csOpenParams.GetLength() <= 0*/)
  530. {
  531. m_pDevHandles[devSN].nStatus = -4;
  532. Dbg("Get Open param1 for %s failed param(%s) erroCode(0x%x)",
  533. m_pDevHandles[devSN].szDevName, (LPCTSTR)csOpenParams, erroCode);
  534. strcpy_s(m_pDevHandles[devSN].szInfo, "Get open praram1 failed");
  535. return Error_Param;
  536. }
  537. erroCode = spCentConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),
  538. m_pDevHandles[devSN].szDevName, csOpenParamsCenter);
  539. if(FAILURED(erroCode)/* || csOpenParamsCenter.GetLength() <= 0*/)
  540. {
  541. m_pDevHandles[devSN].nStatus = -4;
  542. Dbg("Get Open param2 for %s failed param(%s) erroCode(0x%x)",
  543. m_pDevHandles[devSN].szDevName, (LPCTSTR)csOpenParamsCenter, erroCode);
  544. strcpy_s(m_pDevHandles[devSN].szInfo, "Get open praram2 failed");
  545. return Error_Param;
  546. }
  547. Dbg("Start to open %s.", m_pDevHandles[devSN].szDevName);
  548. EnterCriticalSection(&(m_pRWStr[devSN]->csExe));
  549. Dbg("Param1=%s", (LPCTSTR)csOpenParams);
  550. Dbg("Param2=%s", (LPCTSTR)csOpenParamsCenter);
  551. SpBranch_Command_Req rq;
  552. rq.nCmdType = BRCMD_OPENDEV;
  553. rq.ssparam1 = csOpenParams;
  554. rq.ssparam2 = csOpenParamsCenter;
  555. SpBranch_Command_Ans ans;
  556. erroCode = ProcessExchange(devSN, rq, ans);
  557. if(ISSUCCEEDED(erroCode) && ISSUCCEEDED(ans.dwErroCode))
  558. {
  559. Dbg("Open %s entity suc.", m_pDevHandles[devSN].szDevName);
  560. }
  561. else
  562. {
  563. m_pDevHandles[devSN].nStatus = -6;
  564. Dbg("Open %s entity failed returned [0x%08x][0x%08x]",
  565. m_pDevHandles[devSN].szDevName, erroCode, ans.dwErroCode);
  566. if(ISSUCCEEDED(erroCode))
  567. {
  568. if(ans.dwErroCode == Error_DevLoadFileFailed)
  569. {
  570. if(ans.nparam1 == (int)State_LoadFailed && ans.nparam2 != 0)
  571. {
  572. m_pDevHandles[devSN].nStatus = -7;
  573. }
  574. }
  575. Dbg("desc:%s", (LPCTSTR)ans.desc);
  576. strcpy_s(m_pDevHandles[devSN].szInfo, (LPCTSTR)ans.desc);
  577. }
  578. LeaveCriticalSection(&(m_pRWStr[devSN]->csExe));
  579. return Error_DevCommFailed;
  580. }
  581. strcpy_s(m_pDevHandles[devSN].szInfo, "Open device succ");
  582. m_pDevHandles[devSN].nStatus = 0;
  583. LeaveCriticalSection(&(m_pRWStr[devSN]->csExe));
  584. return Error_Succeed;
  585. }
  586. ErrorCodeEnum CBranchDeviceFSM::OpenDevs()
  587. {
  588. ErrorCodeEnum erroCode = Error_Succeed;
  589. for(int idx=0; idx<m_nDevNum; ++idx)
  590. {
  591. OpenSpecifiedDev(idx);
  592. Sleep(100);
  593. }
  594. return erroCode;
  595. }
  596. ErrorCodeEnum CBranchDeviceFSM::CreateAdapterLoadedProcesses()
  597. {
  598. ErrorCodeEnum erroCode = Error_Succeed;
  599. for(int idx=0; idx<m_nDevNum; ++idx)
  600. {
  601. if(m_pDevHandles[idx].nStatus == 0)
  602. {
  603. //Create DevAdapter Process
  604. if(!CreateSpecifiedProcess(idx))
  605. {
  606. Dbg("CreateChildProcess for %s failed, GLE = %u.",
  607. (LPCTSTR)m_pDevHandles[idx].szDevName, GetLastError());
  608. m_pDevHandles[idx].nStatus = -5;
  609. continue;
  610. }
  611. //strcpy_s(m_pDevHandles[idx].szInfo, "Create process succ");
  612. Dbg("CreateProcess for %s suc, PID = %u.",
  613. (LPCTSTR)m_pDevHandles[idx].szDevName, m_pRWStr[idx]->dwProcessID);
  614. }
  615. }
  616. return erroCode;
  617. }
  618. ErrorCodeEnum CBranchDeviceFSM::ReleaseDevs(bool bCloseDev)
  619. {
  620. ErrorCodeEnum erroCode = Error_Succeed;
  621. for(int idx=0; idx<m_nDevNum; ++idx)
  622. {
  623. ReleaseSpcfDev(idx, bCloseDev);
  624. Sleep(100);
  625. }
  626. return erroCode;
  627. }
  628. ErrorCodeEnum CBranchDeviceFSM::ReleaseSpcfDev(int devSN, bool bCloseDev)
  629. {
  630. ErrorCodeEnum erroCode = Error_Succeed;
  631. if(devSN < 0 || devSN >= m_nDevNum)
  632. {
  633. return Error_Param;
  634. }
  635. if(m_pDevHandles[devSN].nStatus == -1 || m_pDevHandles[devSN].nStatus == -2)
  636. {
  637. LOG_TRACE("[devSN#%d][devName#%s][nStatus#%d][szInfo#%s]",
  638. devSN, m_pDevHandles[devSN].szDevName, -1, m_pDevHandles[devSN].szInfo);
  639. return Error_DevCommFailed;
  640. }
  641. if(!m_pRWStr[devSN]->IsValidRW() || m_pDevHandles[devSN].nStatus == -5)
  642. {
  643. LOG_TRACE("[devSN#%d][devName#%s] Invalid pipe for process exchange.",
  644. devSN, m_pDevHandles[devSN].szDevName);
  645. return Error_DevCommFailed;
  646. }
  647. EnterCriticalSection(&(m_pRWStr[devSN]->csExe));
  648. SpBranch_Command_Req rq;
  649. rq.nCmdType = BRCMD_CLOSEDEV;
  650. SpBranch_Command_Ans ans;
  651. erroCode = ProcessExchange(devSN, rq, ans);
  652. if(ISSUCCEEDED(erroCode) && ISSUCCEEDED(ans.dwErroCode))
  653. {
  654. Dbg("Close %s entity succ.", m_pDevHandles[devSN].szDevName);
  655. }
  656. else
  657. {
  658. Dbg("DevClose for %s failed returned [0x%08x][0x%08x]",
  659. m_pDevHandles[devSN].szDevName, erroCode, ans.dwErroCode);
  660. if(ISSUCCEEDED(erroCode))
  661. {
  662. Dbg("desc: %s", (LPCTSTR)ans.desc);
  663. erroCode = (ErrorCodeEnum)ans.dwErroCode;
  664. }
  665. }
  666. LeaveCriticalSection(&(m_pRWStr[devSN]->csExe));
  667. return erroCode;
  668. }
  669. void CBranchDeviceFSM::HandleCMD(
  670. SpReqAnsContext<BranchDeviceService_OpCmd_Req, BranchDeviceService_OpCmd_Ans>::Pointer ctx)
  671. {
  672. LOG_FUNCTION();
  673. //important.
  674. int aimSN = ctx->Req.DevSN - 1;
  675. ErrorCodeEnum erroCode = Error_Succeed;
  676. if(aimSN < 0 || aimSN >= m_nDevNum)
  677. {
  678. ctx->Ans.retCode = -3;
  679. ctx->Ans.retValue = CSimpleStringA::Format("DevSN is invalid which %d is not in [1, %d]",
  680. ctx->Req.DevSN, m_nDevNum);
  681. LogWarn(Severity_Middle, Error_NoTarget, 0, (LPCTSTR)(ctx->Ans.retValue));
  682. ctx->Answer(Error_NoTarget);
  683. return;
  684. }
  685. if(m_pDevHandles[aimSN].nStatus < 0)
  686. {
  687. ctx->Ans.retCode = m_pDevHandles[aimSN].nStatus;
  688. ctx->Ans.retValue = m_pDevHandles[aimSN].szInfo;
  689. ctx->Answer(Error_InvalidState);
  690. LogWarn(Severity_Middle, Error_InvalidState, 0,
  691. CSimpleStringA::Format("%s is invalid: %s",
  692. m_pDevHandles[aimSN].szDevName,
  693. m_pDevHandles[aimSN].szInfo));
  694. return;
  695. }
  696. DWORD dwCurTickCount = GetTickCount();
  697. DWORD dwTimeoutMillsec = ctx->Req.uTimeoutMillsec;
  698. if(dwTimeoutMillsec == 0)
  699. dwTimeoutMillsec = DEFAULT_TIMEOUT_MILLSEC;
  700. BOOL bFlag = FALSE;
  701. while(TryEnterCriticalSection(&(m_pRWStr[aimSN]->csExe)) == FALSE)
  702. {
  703. if(!bFlag)
  704. {
  705. LogWarn(Severity_Low, Error_Unexpect, 0,
  706. "Last operation has not been finished yet, new request is arrived !!");
  707. bFlag = TRUE;
  708. }
  709. if(GetTickCount() > (dwTimeoutMillsec + dwCurTickCount))
  710. {
  711. ctx->Answer(Error_TimeOut);
  712. return;
  713. }
  714. }
  715. if(bFlag)
  716. {
  717. dwTimeoutMillsec = (GetTickCount() - dwCurTickCount);
  718. }
  719. SpBranch_Command_Req rq;
  720. SpBranch_Command_Ans ans;
  721. Dbg("Start to Invoke ExecuteCmd routine...timeout value %u.", dwTimeoutMillsec);
  722. rq.nCmdType = BRCMD_SENDCMD;
  723. rq.ssparam1 = ctx->Req.param;
  724. erroCode = ProcessExchange(aimSN, rq, ans, dwTimeoutMillsec);
  725. if(ISSUCCEEDED(erroCode) && ISSUCCEEDED(ans.dwErroCode))
  726. {
  727. char szPrintMsg[MAX_PRINTF_MSG_LEN] = {0};
  728. CovertCmdParam(szPrintMsg, (LPCTSTR)ctx->Req.param);
  729. Dbg("[param:%s] ExecuteCmd succ.", szPrintMsg);
  730. ctx->Ans.retCode = ans.nparam1;
  731. ctx->Ans.retValue = ans.ssparam1;
  732. ctx->Answer();
  733. }
  734. else
  735. {
  736. if(ISSUCCEEDED(erroCode))
  737. {
  738. ctx->Ans.retCode = ans.dwErroCode;
  739. ctx->Ans.retValue = ans.desc;
  740. Dbg("desc: %s", (LPCTSTR)ans.desc);
  741. ctx->Answer();
  742. }
  743. else
  744. {
  745. ctx->Answer(erroCode);
  746. }
  747. char szPrintMsg[MAX_PRINTF_MSG_LEN] = {0};
  748. CovertCmdParam(szPrintMsg, (LPCTSTR)ctx->Req.param);
  749. Dbg("ExecuteCmd%s failed returned [0x%08x][0x%08x]",
  750. szPrintMsg, erroCode, ans.dwErroCode);
  751. }
  752. LeaveCriticalSection(&(m_pRWStr[aimSN]->csExe));
  753. return;
  754. }
  755. UINT WINAPI CBranchDeviceFSM::DispatchThreadFunc(void* pArguments)
  756. {
  757. LOG_FUNCTION();
  758. CBranchDeviceFSM* fsm = (CBranchDeviceFSM*)pArguments;
  759. EnterCriticalSection(&CBranchDeviceFSM::s_cs);
  760. SpReqAnsContext<BranchDeviceService_OpCmd_Req, BranchDeviceService_OpCmd_Ans>::Pointer theContext = fsm->m_ctx;
  761. LeaveCriticalSection(&CBranchDeviceFSM::s_cs);
  762. fsm->HandleCMD(theContext);
  763. return 0;
  764. }
  765. void CBranchDeviceFSM::HandleGetInfo(SpReqAnsContext<BranchDeviceService_GetDevInfo_Req, BranchDeviceService_GetDevInfo_Ans>::Pointer ctx)
  766. {
  767. LOG_FUNCTION();
  768. //important.
  769. int aimSN = ctx->Req.DevSN - 1;
  770. ErrorCodeEnum erroCode = Error_Succeed;
  771. if(aimSN < 0 || aimSN >= m_nDevNum)
  772. {
  773. ctx->Answer(Error_NoTarget);
  774. CSimpleStringA csMsg = CSimpleStringA::Format("DevSN is invalid which %d is not in [1, %d]",
  775. ctx->Req.DevSN, m_nDevNum);
  776. LogWarn(Severity_Middle, Error_NoTarget, 0, (LPCTSTR)csMsg);
  777. Dbg("Invalid devSN %d, return previously.", aimSN + 1);
  778. return;
  779. }
  780. if(m_pDevHandles[aimSN].nStatus < 0)
  781. {
  782. ctx->Answer(Error_InvalidState);
  783. LogWarn(Severity_Middle, Error_InvalidState, 0,
  784. CSimpleStringA::Format("%s is invalid: %s",
  785. m_pDevHandles[aimSN].szDevName,
  786. m_pDevHandles[aimSN].szInfo));
  787. Dbg("[devSN#%d]'s status is invalid, (%d){%s}, return previously.",
  788. aimSN + 1, m_pDevHandles[aimSN].nStatus, m_pDevHandles[aimSN].szInfo);
  789. return;
  790. }
  791. EnterCriticalSection(&(m_pRWStr[aimSN]->csExe));
  792. SpBranch_Command_Req rq;
  793. SpBranch_Command_Ans ans;
  794. Dbg("Start to Invoke GetDevCategory routine.");
  795. rq.nCmdType = BRCMD_GETDEVINFO;
  796. erroCode = ProcessExchange(aimSN, rq, ans);
  797. if(ISSUCCEEDED(erroCode) && ISSUCCEEDED(ans.dwErroCode))
  798. {
  799. Dbg("[%s] GetDevCategory suc, start to set context.", m_pDevHandles[aimSN].szDevName);
  800. ctx->Ans.state = ans.nparam1;
  801. Dbg("szModel:%s", (LPCTSTR)ans.ssparam2);
  802. ctx->Ans.model = ans.ssparam2;
  803. Dbg("szVendor:%s", (LPCTSTR)ans.ssparam3);
  804. Dbg("szType:%s", (LPCTSTR)ans.ssparam1);
  805. ctx->Ans.type = ans.ssparam1;
  806. Dbg("version:%s", ans.ssparam4);
  807. ctx->Ans.version = ans.ssparam4;
  808. // info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  809. //ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  810. // info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  811. ctx->Answer(Error_Succeed);
  812. Dbg("[%s] finish setting context.", m_pDevHandles[aimSN].szDevName);
  813. }
  814. else
  815. {
  816. if(ISSUCCEEDED(erroCode))
  817. {
  818. ctx->Answer((ErrorCodeEnum)ans.dwErroCode);
  819. Dbg("desc: %s", (LPCTSTR)ans.desc);
  820. }
  821. else
  822. {
  823. ctx->Answer(erroCode);
  824. }
  825. Dbg("[%s] GetDevCategory failed, returned [0x%08x][0x%08x]",
  826. m_pDevHandles[aimSN].szDevName, erroCode, ans.dwErroCode);
  827. }
  828. LeaveCriticalSection(&(m_pRWStr[aimSN]->csExe));
  829. return;
  830. }
  831. BOOL CBranchDeviceFSM::JobInitialize()
  832. {
  833. LOG_FUNCTION();
  834. TCHAR szDes[256] = {0};
  835. const int MAX_MB_COMMITPERPROCESS = 256 * 1024 * 1024;
  836. const int MIN_MB_LIMIT_WORKINGSET = 1 * 1024 * 1024;
  837. const int MAX_MB_LIMIT_WORKINGSET = 256 * 1024 * 1024;
  838. const int DEFAULT_PROCESSES_COUNT = 5;
  839. //简单地通知作业CPU时间到期
  840. m_pProcHelper->SetEndOfJobInfo(JOB_OBJECT_POST_AT_END_OF_JOB);
  841. //关联完成端口
  842. m_pProcHelper->AssociateCompletionPort(m_hIOCP, COMPKEY_JOBOBJECT);
  843. // Set Basic and Extended Limits
  844. JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobeli = { 0 };
  845. jobeli.BasicLimitInformation.LimitFlags = 0;
  846. //允许在查询基本统计信息的时候更改作业的限额
  847. jobeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME;
  848. jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_PRIORITY_CLASS;
  849. jobeli.BasicLimitInformation.PriorityClass = IDLE_PRIORITY_CLASS;
  850. //jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_BREAKAWAY_OK;
  851. //jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK;
  852. // 当作业的最后一个句柄在关闭时,作业中的进程均会关闭
  853. //jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
  854. #ifndef BRANCHDEBUG
  855. // 进程在引发一个未处理的异常后,该进程会立即终止,不显示任何用户界面
  856. jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION;
  857. // 设置进程所能申请内存的限额
  858. jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_PROCESS_MEMORY;
  859. jobeli.ProcessMemoryLimit = MAX_MB_COMMITPERPROCESS;
  860. // 设置进程所能使用的工作集限额
  861. //jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_WORKINGSET;
  862. //jobeli.BasicLimitInformation.MinimumWorkingSetSize = MIN_MB_LIMIT_WORKINGSET;
  863. //jobeli.BasicLimitInformation.MaximumWorkingSetSize = MAX_MB_LIMIT_WORKINGSET;
  864. #endif
  865. // 设置允许的进程数
  866. jobeli.BasicLimitInformation.LimitFlags |= JOB_OBJECT_LIMIT_ACTIVE_PROCESS;
  867. jobeli.BasicLimitInformation.ActiveProcessLimit = DEFAULT_PROCESSES_COUNT;
  868. if(!(m_pProcHelper->SetExtendedLimitInfo(&jobeli)))
  869. {
  870. sprintf_s(szDes, "设置作业扩展限额失败,GLE = %d !", GetLastError());
  871. LogWarn(Severity_Middle, Error_Unexpect, 0, szDes);
  872. m_pProcHelper->PrintError("SetExtendedLimitInfo failed");
  873. return FALSE;
  874. }
  875. //////////////////////////////////////////////////////////////////////////
  876. // Set UI Restrictions
  877. DWORD jobuir = JOB_OBJECT_UILIMIT_NONE;
  878. //阻止进程注销、关机、重启或断开系统电源
  879. jobuir |= JOB_OBJECT_UILIMIT_EXITWINDOWS;
  880. //阻止进程使用作业外部创建的用户对象
  881. //jobuir |= JOB_OBJECT_UILIMIT_HANDLES;
  882. //阻止进程通过 SystemParametersInfo 更改系统参数
  883. jobuir |= JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS;
  884. //阻止进程对剪切板进行读取和清除
  885. jobuir |= JOB_OBJECT_UILIMIT_READCLIPBOARD;
  886. jobuir |= JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
  887. //阻止进程创建或切换桌面
  888. //jobuir |= JOB_OBJECT_UILIMIT_DESKTOP;
  889. //阻止线程更改显示设置
  890. //jobuir |= JOB_OBJECT_UILIMIT_DISPLAYSETTINGS;
  891. if(!(m_pProcHelper->SetBasicUIRestrictions(jobuir)))
  892. {
  893. sprintf_s(szDes, "设置作业UI限额失败,GLE = %d !", GetLastError());
  894. LogWarn(Severity_Middle, Error_Unexpect, 0, szDes);
  895. m_pProcHelper->PrintError("SetBasicUIRestrictions failed");
  896. return FALSE;
  897. }
  898. return TRUE;
  899. }
  900. void CBranchDeviceFSM::JobNotify()
  901. {
  902. BOOL bDone = FALSE;
  903. LogEvent(Severity_None, 0, "Start Job Notify listening......");
  904. char szMsg[512] = {0};
  905. while(!bDone)
  906. {
  907. DWORD dwJobObjMsg;
  908. //完成键值
  909. ULONG_PTR CompKey;
  910. //进程ID
  911. LPOVERLAPPED po;
  912. GetQueuedCompletionStatus(m_hIOCP, &dwJobObjMsg, &CompKey, &po, INFINITE);
  913. //Dbg("Test Test Test");
  914. // The app is shutting down, exit this thread
  915. bDone = (CompKey == COMPKEY_TERMINATE);
  916. if (CompKey == COMPKEY_JOBOBJECT)
  917. {
  918. switch (dwJobObjMsg)
  919. {
  920. case JOB_OBJECT_MSG_END_OF_JOB_TIME:
  921. {
  922. LogWarn(Severity_Middle, Error_TimeOut, 0, "Job time limit reached");
  923. }
  924. break;
  925. case JOB_OBJECT_MSG_END_OF_PROCESS_TIME:
  926. {
  927. TCHAR szProcessName[MAX_PATH];
  928. GetProcessName(PtrToUlong(po), szProcessName, MAX_PATH);
  929. sprintf_s(szMsg, "Job process %s (Id=%d) time limit reached", szProcessName, po);
  930. LogWarn(Severity_Middle, Error_TimeOut, 0, szMsg);
  931. }
  932. CompKey = COMPKEY_STATUS;
  933. break;
  934. case JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT:
  935. {
  936. LogWarn(Severity_Middle, Error_TimeOut, 0, "Too many active processes in job !");
  937. }
  938. break;
  939. case JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:
  940. {
  941. LogWarn(Severity_Middle, Error_NoTarget, 0, "Job contains no active processes.");
  942. }
  943. break;
  944. case JOB_OBJECT_MSG_NEW_PROCESS:
  945. {
  946. TCHAR szProcessName[MAX_PATH] = {0};
  947. GetProcessName(PtrToUlong(po), szProcessName, MAX_PATH);
  948. int aimIdx = -1;
  949. DWORD pid = PtrToUlong(po);
  950. for(int idx=0; idx<m_nDevNum; idx++)
  951. {
  952. if(m_pRWStr[idx]->dwProcessID == pid)
  953. {
  954. aimIdx = idx;
  955. break;
  956. }
  957. }
  958. if(aimIdx == -1)
  959. {
  960. sprintf_s(szMsg, "Unexpect process %s (Id=%d) in Job.", szProcessName, po);
  961. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  962. break;
  963. }
  964. m_pDevHandles[aimIdx].nReserved = 2;
  965. sprintf_s(m_pDevHandles[aimIdx].szInfo, "Put process in Job succ");
  966. sprintf_s(szMsg, "New process %s (Id=%d) in Job", szProcessName, po);
  967. LogEvent(Severity_Middle, 0, szMsg);
  968. }
  969. break;
  970. case JOB_OBJECT_MSG_EXIT_PROCESS:
  971. {
  972. TCHAR szProcessName[MAX_PATH] = {0};
  973. GetProcessName(PtrToUlong(po), szProcessName, MAX_PATH);
  974. Dbg("Process %s (Id=%d) terminated", szProcessName, po);
  975. int aimIdx = -1;
  976. DWORD pid = PtrToUlong(po);
  977. for(int idx=0; idx<m_nDevNum; idx++)
  978. {
  979. if(m_pRWStr[idx]->dwProcessID == pid)
  980. {
  981. aimIdx = idx;
  982. break;
  983. }
  984. }
  985. if(aimIdx == -1)
  986. {
  987. sprintf_s(szMsg, "Unexpect process %s (Id=%d) terminated.", szProcessName, po);
  988. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  989. break;
  990. }
  991. sprintf_s(szMsg, "Process %s (Id=%d) terminated.", szProcessName, po);
  992. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  993. m_pDevHandles[aimIdx].nStatus = -2;
  994. m_pDevHandles[aimIdx].nReserved = 0;
  995. strcpy_s(m_pDevHandles[aimIdx].szInfo, DEFAULT_INFO_SIZE, "The process terminated");
  996. m_pRWStr[aimIdx]->Cleanup();
  997. }
  998. CompKey = COMPKEY_STATUS;
  999. break;
  1000. case JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:
  1001. //https://msdn.microsoft.com/en-us/library/windows/desktop/ms684141(v=vs.85).aspx
  1002. {
  1003. TCHAR szProcessName[MAX_PATH];
  1004. GetProcessName(PtrToUlong(po), szProcessName, MAX_PATH);
  1005. Dbg("Process %s (Id=%d) terminated abnormally", szProcessName, po);
  1006. int aimIdx = -1;
  1007. DWORD pid = PtrToUlong(po);
  1008. for(int idx=0; idx<m_nDevNum; idx++)
  1009. {
  1010. if(m_pRWStr[idx]->dwProcessID == pid)
  1011. {
  1012. aimIdx = idx;
  1013. break;
  1014. }
  1015. }
  1016. if(aimIdx == -1)
  1017. {
  1018. sprintf_s(szMsg, "Unexpect process %s (Id=%d) terminated abnormally.", szProcessName, po);
  1019. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  1020. break;
  1021. }
  1022. sprintf_s(szMsg, "Process %s (Id=%d) terminated abnormally !!", szProcessName, po);
  1023. LogError(Severity_Middle, Error_Unexpect, 0, szMsg);
  1024. m_pDevHandles[aimIdx].nStatus = -2;
  1025. m_pDevHandles[aimIdx].nReserved = 0;
  1026. strcpy_s(m_pDevHandles[aimIdx].szInfo, DEFAULT_INFO_SIZE, "The process terminated abnormally");
  1027. m_pRWStr[aimIdx]->Cleanup();
  1028. }
  1029. CompKey = COMPKEY_STATUS;
  1030. break;
  1031. case JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:
  1032. {
  1033. TCHAR szProcessName[MAX_PATH];
  1034. GetProcessName(PtrToUlong(po), szProcessName, MAX_PATH);
  1035. sprintf_s(szMsg, "Process (%s Id=%d) exceeded memory limit", szProcessName, po);
  1036. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  1037. }
  1038. CompKey = COMPKEY_STATUS;
  1039. break;
  1040. case JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:
  1041. {
  1042. TCHAR szProcessName[MAX_PATH];
  1043. GetProcessName(PtrToUlong(po), szProcessName, MAX_PATH);
  1044. sprintf_s(szMsg, "Process %s (Id=%d) exceeded job memory limit", szProcessName, po);
  1045. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  1046. }
  1047. CompKey = COMPKEY_STATUS;
  1048. break;
  1049. default:
  1050. Dbg("Unknown notification: %d", dwJobObjMsg);
  1051. break;
  1052. }
  1053. }
  1054. if (CompKey == COMPKEY_STATUS)
  1055. {
  1056. static UINT s_nStatusCount = 0;
  1057. Dbg("--> Status Update (%d)", ++s_nStatusCount);
  1058. // Show the basic accounting information
  1059. JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION jobai;
  1060. m_pProcHelper->QueryBaseAndIOInfo(&jobai);
  1061. Dbg(
  1062. "Total Time: User=%I64u, Kernel=%I64u "
  1063. "Period Time: User=%I64u, Kernel=%I64u",
  1064. jobai.BasicInfo.TotalUserTime.QuadPart, //已使用用户模式的CPU时间
  1065. jobai.BasicInfo.TotalKernelTime.QuadPart,//已使用内核模式的CPU时间
  1066. jobai.BasicInfo.ThisPeriodTotalUserTime.QuadPart,
  1067. jobai.BasicInfo.ThisPeriodTotalKernelTime.QuadPart);
  1068. Dbg(
  1069. "Page Faults=%u, Total Processes=%u, "
  1070. "Active Processes=%u, Terminated Processes=%u",
  1071. jobai.BasicInfo.TotalPageFaultCount, //进程产生的错误页面总数
  1072. jobai.BasicInfo.TotalProcesses, //曾经属于作业的所有进程数目
  1073. jobai.BasicInfo.ActiveProcesses, //属于作业的当前进程数目
  1074. jobai.BasicInfo.TotalTerminatedProcesses); //超过预定CPU时间限额而被杀死的进程数
  1075. // Show the I/O accounting information
  1076. Dbg(
  1077. "Reads=%I64u (%I64u bytes), " //读操作次数和传输的字节总数
  1078. "Write=%I64u (%I64u bytes), " //写操作次数和传输的字节总数
  1079. "Other=%I64u (%I64u bytes)", //非读写操作次数和传输的字节总数
  1080. jobai.IoInfo.ReadOperationCount, jobai.IoInfo.ReadTransferCount,
  1081. jobai.IoInfo.WriteOperationCount, jobai.IoInfo.WriteTransferCount,
  1082. jobai.IoInfo.OtherOperationCount, jobai.IoInfo.OtherTransferCount);
  1083. // Show the peak per-process and job memory usage
  1084. JOBOBJECT_EXTENDED_LIMIT_INFORMATION joeli;
  1085. m_pProcHelper->QueryExtendLimitInfo(&joeli);
  1086. Dbg(
  1087. "Peak memory used: Process=%I64u, Job=%I64u",
  1088. (__int64) joeli.PeakProcessMemoryUsed,
  1089. (__int64) joeli.PeakJobMemoryUsed);
  1090. // Show the set of Process IDs
  1091. DWORD dwNumProcesses = 80;
  1092. DWORD dwProcessIdList[80];
  1093. m_pProcHelper->QueryBasicProcessIdList(dwNumProcesses,
  1094. dwProcessIdList, &dwNumProcesses);
  1095. Dbg("The ProcessID with its belonged DevName: %s", (dwNumProcesses == 0) ? TEXT("(none)") : TEXT(""));
  1096. TCHAR szProcessName[MAX_PATH];
  1097. for (DWORD x = 0; x < dwNumProcesses; x++)
  1098. {
  1099. GetProcessName(dwProcessIdList[x], szProcessName, _countof(szProcessName));
  1100. Dbg(TEXT(" %d - %s"), dwProcessIdList[x], szProcessName);
  1101. }
  1102. }
  1103. }
  1104. SetEvent(m_hNotifyFinishedEvent);
  1105. LogEvent(Severity_None, Error_Succeed, "Job Notify listening done !");
  1106. return;
  1107. }
  1108. BOOL CBranchDeviceFSM::CreateSpecifiedProcess(int idx)
  1109. {
  1110. SECURITY_ATTRIBUTES sa;
  1111. sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  1112. sa.bInheritHandle = TRUE;
  1113. sa.lpSecurityDescriptor = NULL;
  1114. assert(m_pRWStr[idx] != NULL);
  1115. if(!CreatePipe(&(m_pRWStr[idx]->hParentRead), &(m_pRWStr[idx]->hChildWrite), &sa, 0))
  1116. {
  1117. Dbg("CreatePipe1 for %s failed, %d", (LPCTSTR)m_pDevHandles[idx].szDevName, GetLastError());
  1118. return FALSE;
  1119. }
  1120. if(!SetHandleInformation(m_pRWStr[idx]->hParentRead, HANDLE_FLAG_INHERIT, 0))
  1121. {
  1122. Dbg("SetHandleInformation for %s failed, %d.", (LPCTSTR)m_pDevHandles[idx].szDevName, GetLastError());
  1123. return FALSE;
  1124. }
  1125. if(!CreatePipe(&(m_pRWStr[idx]->hChildRead), &(m_pRWStr[idx]->hParentWrite), &sa, 0))
  1126. {
  1127. Dbg("CreatePipe2 for %s failed, %d.", (LPCTSTR)m_pDevHandles[idx].szDevName, GetLastError());
  1128. return FALSE;
  1129. }
  1130. if(!SetHandleInformation(m_pRWStr[idx]->hParentWrite, HANDLE_FLAG_INHERIT, 0))
  1131. {
  1132. Dbg("SetHandleInformation for %s failed, %d.", (LPCTSTR)m_pDevHandles[idx].szDevName, GetLastError());
  1133. return FALSE;
  1134. }
  1135. TCHAR szCmdLine[CMDLINE_SIZE] = {0};
  1136. //sprintf_s(szCmdLine, CMDLINE_SIZE, "spbranch %s %s",
  1137. // m_pDevHandles[idx].szDevDllPath, m_pDevHandles[idx].szDevName);
  1138. sprintf_s(szCmdLine, CMDLINE_SIZE, "spbranch %s %s %s",
  1139. m_pDevHandles[idx].szDevDllPath, m_pDevHandles[idx].szDevName, (LPCTSTR)m_strSpBranchPath);
  1140. Dbg("szCmdLine : {%s}", szCmdLine);
  1141. HANDLE hToken = NULL;
  1142. HANDLE hNewToken = NULL;
  1143. HANDLE hNewExToken = NULL;
  1144. // Integrity level SID
  1145. /************************************************************************/
  1146. /*
  1147. Name
  1148. S-1-16-4096
  1149. Low Mandatory Level
  1150. A low integrity process does not have write access to most areas
  1151. under the user’s local profile area of the file system or the registry under HKCU.
  1152. Low-integrity processes can write to and create subkeys under HKEY_CURRENT_USER\Software\AppDataLow
  1153. Low-integrity processes can write and create subfolders under %USER PROFILE%\AppData\LocalLow
  1154. S-1-16-8192
  1155. Medium Mandatory Level
  1156. S-1-16-12288
  1157. High Mandatory Level
  1158. S-1-16-16384
  1159. System Mandatory Level
  1160. /************************************************************************/
  1161. CHAR szIntegritySid[20] = "S-1-16-4096";
  1162. PSID pIntegritySid = NULL;
  1163. PSID pUserGroupSID = NULL;
  1164. PSID pAdminSID = NULL;
  1165. TOKEN_MANDATORY_LABEL tml = {0};
  1166. PROCESS_INFORMATION pi;
  1167. STARTUPINFO si;
  1168. BOOL bSuc = FALSE;
  1169. ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
  1170. ZeroMemory(&si, sizeof(STARTUPINFO));
  1171. si.cb = sizeof(STARTUPINFO);
  1172. GetStartupInfo(&si);
  1173. DWORD fdwCreate = 0;
  1174. si.hStdError = m_pRWStr[idx]->hChildWrite;
  1175. si.hStdOutput = m_pRWStr[idx]->hChildWrite;
  1176. si.hStdInput = m_pRWStr[idx]->hChildRead;
  1177. //重设标准输入,标准输出,标准错误句柄
  1178. si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  1179. si.wShowWindow = SW_HIDE;
  1180. fdwCreate = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW;
  1181. if(m_bNeedJob)
  1182. {
  1183. fdwCreate |= CREATE_SUSPENDED;
  1184. }
  1185. __try
  1186. {
  1187. //Dbg("Leave and CreateProcess with normal intergrity.");
  1188. //__leave;
  1189. #ifdef DROP_MY_RIGHT
  1190. Dbg("Using DROP_MY_RIGHT way !!!");
  1191. //SAFER_LEVELID_FULLYTRUSTED, SAFER_LEVELID_NORMALUSER, SAFER_LEVELID_CONSTRAINED, SAFER_LEVELID_UNTRUSTED
  1192. DWORD hSaferLevel = SAFER_LEVELID_NORMALUSER;
  1193. SAFER_LEVEL_HANDLE hAuthzLevel = NULL;
  1194. if (!SaferCreateLevel(SAFER_SCOPEID_USER,
  1195. hSaferLevel,
  1196. 0,
  1197. &hAuthzLevel, NULL))
  1198. {
  1199. __leave;
  1200. }
  1201. // Generate the restricted token we will use.
  1202. if (SaferComputeTokenFromLevel(
  1203. hAuthzLevel, // SAFER Level handle
  1204. NULL, // NULL is current thread token.
  1205. &hToken, // Target token
  1206. 0, // No flags
  1207. NULL))
  1208. {
  1209. if(!(bSuc = CreateProcessAsUser(hToken, NULL,
  1210. szCmdLine, // command line
  1211. NULL, // TODO: process security attributes
  1212. NULL, // TODO: primary thread security attributes
  1213. TRUE, // handles are inherited ??
  1214. fdwCreate, // creation flags
  1215. NULL, // use parent's environment
  1216. NULL, // use parent's current directory
  1217. &si, // STARTUPINFO pointer
  1218. &pi))) // receives PROCESS_INFORMATION
  1219. {
  1220. Dbg("CreateProcessAsUser in DropMyRights failed GLE=%u.", GetLastError());
  1221. }
  1222. }
  1223. else
  1224. {
  1225. Dbg("SaferComputeTokenFromLevel failed GLE=%u.", GetLastError());
  1226. }
  1227. if(hAuthzLevel)
  1228. {
  1229. SaferCloseLevel(hAuthzLevel);
  1230. }
  1231. #endif
  1232. if (!OpenProcessToken(GetCurrentProcess(),
  1233. //MAXIMUM_ALLOWED,
  1234. TOKEN_DUPLICATE |
  1235. TOKEN_ADJUST_DEFAULT |
  1236. TOKEN_QUERY |
  1237. TOKEN_ASSIGN_PRIMARY,
  1238. &hToken))
  1239. {
  1240. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1241. sprintf_s(szMsg, "OpenProcessToken failed, GLE = %u.", GetLastError());
  1242. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1243. __leave;
  1244. }
  1245. //!!!! TEST!!!!!
  1246. //CTWProcHelper::SetPrivilege(SE_CREATE_TOKEN_NAME, TRUE);
  1247. //CTWProcHelper::SetPrivilege(SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
  1248. //CTWProcHelper::SetPrivilege(SE_LOCK_MEMORY_NAME, TRUE);
  1249. //CTWProcHelper::SetPrivilege(SE_INCREASE_QUOTA_NAME, TRUE);
  1250. //CTWProcHelper::SetPrivilege(SE_UNSOLICITED_INPUT_NAME, TRUE);
  1251. //CTWProcHelper::SetPrivilege(SE_MACHINE_ACCOUNT_NAME, TRUE);
  1252. //CTWProcHelper::SetPrivilege(SE_TCB_NAME, TRUE);
  1253. //CTWProcHelper::SetPrivilege(SE_SECURITY_NAME, TRUE);
  1254. //CTWProcHelper::SetPrivilege(SE_TAKE_OWNERSHIP_NAME, TRUE);
  1255. //CTWProcHelper::SetPrivilege(SE_LOAD_DRIVER_NAME, TRUE);
  1256. //CTWProcHelper::SetPrivilege(SE_SYSTEM_PROFILE_NAME, TRUE);
  1257. //CTWProcHelper::SetPrivilege(SE_SYSTEMTIME_NAME, TRUE);
  1258. //CTWProcHelper::SetPrivilege(SE_PROF_SINGLE_PROCESS_NAME, TRUE);
  1259. //CTWProcHelper::SetPrivilege(SE_INC_BASE_PRIORITY_NAME, TRUE);
  1260. //CTWProcHelper::SetPrivilege(SE_CREATE_PAGEFILE_NAME, TRUE);
  1261. //CTWProcHelper::SetPrivilege(SE_CREATE_PERMANENT_NAME, TRUE);
  1262. //CTWProcHelper::SetPrivilege(SE_BACKUP_NAME, TRUE);
  1263. //CTWProcHelper::SetPrivilege(SE_RESTORE_NAME, TRUE);
  1264. //CTWProcHelper::SetPrivilege(SE_SHUTDOWN_NAME, TRUE);
  1265. //CTWProcHelper::SetPrivilege(SE_DEBUG_NAME, TRUE);
  1266. //CTWProcHelper::SetPrivilege(SE_AUDIT_NAME, TRUE);
  1267. //CTWProcHelper::SetPrivilege(SE_SYSTEM_ENVIRONMENT_NAME, TRUE);
  1268. //CTWProcHelper::SetPrivilege(SE_CHANGE_NOTIFY_NAME, TRUE);
  1269. //CTWProcHelper::SetPrivilege(SE_REMOTE_SHUTDOWN_NAME, TRUE);
  1270. //CTWProcHelper::SetPrivilege(SE_UNDOCK_NAME, TRUE);
  1271. //CTWProcHelper::SetPrivilege(SE_SYNC_AGENT_NAME, TRUE);
  1272. //CTWProcHelper::SetPrivilege(SE_ENABLE_DELEGATION_NAME, TRUE);
  1273. //CTWProcHelper::SetPrivilege(SE_MANAGE_VOLUME_NAME, TRUE);
  1274. //CTWProcHelper::SetPrivilege(SE_IMPERSONATE_NAME, TRUE);
  1275. //CTWProcHelper::SetPrivilege(SE_CREATE_GLOBAL_NAME, TRUE);
  1276. //CTWProcHelper::SetPrivilege(SE_TRUSTED_CREDMAN_ACCESS_NAME, TRUE);
  1277. //CTWProcHelper::SetPrivilege(SE_RELABEL_NAME, TRUE);
  1278. //CTWProcHelper::SetPrivilege(SE_INC_WORKING_SET_NAME, TRUE);
  1279. //CTWProcHelper::SetPrivilege(SE_TIME_ZONE_NAME, TRUE);
  1280. //CTWProcHelper::SetPrivilege(SE_CREATE_SYMBOLIC_LINK_NAME, TRUE);
  1281. #ifdef RestrictedTokens
  1282. Dbg("Using RestrictedTokens way !!!");
  1283. DWORD dwSize = 0;
  1284. DWORD dwTokenInfoLength = 0;
  1285. SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
  1286. SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
  1287. if(!AllocateAndInitializeSid(
  1288. &SIDAuthNT,
  1289. 0x2,
  1290. SECURITY_BUILTIN_DOMAIN_RID/*0×20*/,
  1291. DOMAIN_ALIAS_RID_USERS,
  1292. 0, 0, 0, 0, 0, 0,
  1293. &pUserGroupSID))
  1294. {
  1295. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1296. sprintf_s(szMsg, "AllocateAndInitializeSid for UserGroup Error %u", GetLastError());
  1297. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1298. __leave;
  1299. }
  1300. // Create a SID for the BUILTIN\Administrators group.
  1301. if(! AllocateAndInitializeSid( &SIDAuth, 2,
  1302. SECURITY_BUILTIN_DOMAIN_RID,
  1303. DOMAIN_ALIAS_RID_ADMINS,
  1304. 0, 0, 0, 0, 0, 0,
  1305. &pAdminSID) )
  1306. {
  1307. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1308. sprintf_s(szMsg, "AllocateAndInitializeSid for AdminGroup Error %u", GetLastError());
  1309. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1310. __leave;
  1311. }
  1312. SID_AND_ATTRIBUTES SidToDisable[1] = {0};
  1313. SidToDisable[0].Sid = pAdminSID;
  1314. SidToDisable[0].Attributes = 0;
  1315. PTOKEN_PRIVILEGES pTokenPrivileges = NULL;
  1316. PTOKEN_PRIVILEGES pTokenPrivilegesToDel = NULL;
  1317. if(!GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &dwSize))
  1318. {
  1319. if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)
  1320. {
  1321. pTokenPrivileges = (PTOKEN_PRIVILEGES)LocalAlloc(0, dwSize);
  1322. pTokenPrivilegesToDel = (PTOKEN_PRIVILEGES)LocalAlloc(0, dwSize);
  1323. if(pTokenPrivileges != NULL && pTokenPrivilegesToDel != NULL)
  1324. {
  1325. if(!GetTokenInformation(hToken, TokenPrivileges, pTokenPrivileges, dwSize, &dwSize))
  1326. {
  1327. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1328. sprintf_s(szMsg, "GetTokenInformation about TokenPrivileges failed GTE = %u.", GetLastError());
  1329. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1330. __leave;
  1331. }
  1332. }
  1333. else
  1334. {
  1335. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1336. sprintf_s(szMsg, "LocalAlloc for pTokenPrivileges failed GTE = %u.", GetLastError());
  1337. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1338. __leave;
  1339. }
  1340. }
  1341. }
  1342. LUID_AND_ATTRIBUTES *pTokenLUID = pTokenPrivileges->Privileges;
  1343. Dbg("CurrentToken's TokenPrivileges Count: %u", pTokenPrivileges->PrivilegeCount);
  1344. DWORD dwLuidCount = 0;
  1345. PLUID pPrivilegeLuid = NULL;
  1346. if(!CTWProcHelper::GetPrivilegeLUIDWithSID(pUserGroupSID, &pPrivilegeLuid, &dwLuidCount))
  1347. {
  1348. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1349. sprintf_s(szMsg, "GetPrivilegeLUIDWithSID failed GTE = %u.", GetLastError());
  1350. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1351. if(pPrivilegeLuid)
  1352. {
  1353. //HeapFree(GetProcessHeap(), 0, pPrivilegeLuid);
  1354. LocalFree(pPrivilegeLuid);
  1355. pPrivilegeLuid = NULL;
  1356. }
  1357. __leave;
  1358. }
  1359. Dbg("UserGroup's TokenPrivileges Count: %u", dwLuidCount);
  1360. DWORD dwDelPrivilegeCount = 0;
  1361. for(DWORD dwIdx=0; dwIdx<(pTokenPrivileges->PrivilegeCount); dwIdx++)
  1362. {
  1363. BOOL bFound = FALSE;
  1364. DWORD dwJdx = 0;
  1365. for(; dwJdx<dwLuidCount; dwJdx++)
  1366. {
  1367. //if(memcmp(&(pTokenLUID[dwIdx].Luid), &(pPrivilegeLuid[dwJdx]), sizeof(LUID)) == 0)
  1368. if((pTokenLUID[dwIdx].Luid.HighPart == pPrivilegeLuid[dwJdx].HighPart)
  1369. &&
  1370. (pTokenLUID[dwIdx].Luid.LowPart == pPrivilegeLuid[dwJdx].LowPart))
  1371. {
  1372. bFound = TRUE;
  1373. break;
  1374. }
  1375. }
  1376. if(!bFound)
  1377. {
  1378. char szPrivilegeName[MAX_PATH] = {0};
  1379. DWORD dwNameSize = MAX_PATH;
  1380. if(!LookupPrivilegeName(NULL, &(pTokenLUID[dwIdx].Luid), szPrivilegeName, &dwNameSize))
  1381. {
  1382. Dbg("LookupPrivilegeName failed GTE = %u.", GetLastError());
  1383. //Dbg("NoFound[%u]: i=%u, j=%u", dwDelPrivilegeCount, dwIdx, dwJdx);
  1384. }
  1385. //else
  1386. //{
  1387. // Dbg("NoFound[%u]: i=%u, j=%u -> %s", dwDelPrivilegeCount, dwIdx, dwJdx, szPrivilegeName);
  1388. //}
  1389. pTokenPrivilegesToDel->Privileges[dwDelPrivilegeCount++].Luid = pTokenLUID[dwIdx].Luid;
  1390. }
  1391. }
  1392. pTokenPrivilegesToDel->PrivilegeCount = dwDelPrivilegeCount;
  1393. Dbg("TokenPrivileges to delete Count: %u", dwDelPrivilegeCount);
  1394. if(pPrivilegeLuid)
  1395. {
  1396. //HeapFree(GetProcessHeap(), 0, pPrivilegeLuid);
  1397. LocalFree(pPrivilegeLuid);
  1398. pPrivilegeLuid = NULL;
  1399. }
  1400. if(!CreateRestrictedToken(hToken,
  1401. 0,
  1402. 1, SidToDisable,
  1403. //0, NULL,
  1404. dwDelPrivilegeCount, pTokenPrivilegesToDel->Privileges,
  1405. 0, NULL,
  1406. &hNewToken
  1407. ))
  1408. {
  1409. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1410. sprintf_s(szMsg, "CreateRestrictedToken failed GTE = %u.", GetLastError());
  1411. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1412. __leave;
  1413. }
  1414. #if 1
  1415. // Duplicate the primary token of the current process.
  1416. if (!DuplicateTokenEx(hNewToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation,
  1417. TokenPrimary, &hNewExToken))
  1418. {
  1419. Dbg("DuplicateTokenEx failed GTE = %u.", GetLastError());
  1420. hNewExToken = NULL;
  1421. //__leave;
  1422. }
  1423. else
  1424. {
  1425. if (ConvertStringSidToSid(szIntegritySid, &pIntegritySid))
  1426. {
  1427. tml.Label.Attributes = SE_GROUP_INTEGRITY;
  1428. tml.Label.Sid = pIntegritySid;
  1429. // Set the process integrity level
  1430. if (!SetTokenInformation(hNewExToken, TokenIntegrityLevel, &tml,
  1431. sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
  1432. {
  1433. Dbg("SetTokenInformation failed GTE = %u.", GetLastError());
  1434. //__leave;
  1435. }
  1436. else
  1437. {
  1438. CloseHandle(hNewToken);
  1439. hNewToken = hNewExToken;
  1440. hNewExToken = NULL;
  1441. Dbg("Assign Low Mandatory Level to New Token which used to CreateProcessAsUser.");
  1442. }
  1443. }
  1444. //TOKEN_MANDATORY_POLICY tmp;
  1445. //TOKEN_MANDATORY_POLICY_NO_WRITE_UP
  1446. // Cannot write to objects that have a greater mandatory integrity level.
  1447. // and has an integrity level that is the lesser of the parent-process integrity level
  1448. //and the executable-file integrity level.
  1449. //tmp.Policy = TOKEN_MANDATORY_POLICY_NO_WRITE_UP/*TOKEN_MANDATORY_POLICY_VALID_MASK*/;
  1450. //if(!SetTokenInformation(hNewExToken, TokenMandatoryPolicy, &tmp, sizeof(TOKEN_MANDATORY_POLICY)))
  1451. //{
  1452. // Dbg("SetTokenInformation failed GTE = %u.", GetLastError());
  1453. //__leave;
  1454. //}
  1455. }
  1456. #endif
  1457. if(!(bSuc = CreateProcessAsUser(hNewToken, NULL,
  1458. szCmdLine, // command line
  1459. NULL, // TODO: process security attributes
  1460. NULL, // TODO: primary thread security attributes
  1461. TRUE, // handles are inherited ??
  1462. fdwCreate, // creation flags
  1463. NULL, // use parent's environment
  1464. NULL, // use parent's current directory
  1465. &si, // STARTUPINFO pointer
  1466. &pi))) // receives PROCESS_INFORMATION
  1467. {
  1468. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1469. sprintf_s(szMsg, "CreateProcessAsUser failed GTE = %u.", GetLastError());
  1470. LogWarn(Severity_Middle, Error_NewProcess, 0, szMsg);
  1471. __leave;
  1472. }
  1473. if(pTokenPrivileges)
  1474. {
  1475. LocalFree(pTokenPrivileges);
  1476. }
  1477. if(pTokenPrivilegesToDel)
  1478. {
  1479. LocalFree(pTokenPrivilegesToDel);
  1480. }
  1481. //if(!CTWProcHelper::SetPrivilege(hToken, SE_TCB_NAME, TRUE))
  1482. //{
  1483. // Dbg("SetPrivilege(SE_TCB_NAME) failed GTE = %u.", GetLastError());
  1484. // __leave;
  1485. //}
  1486. //if(!CTWProcHelper::SetPrivilege(hToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE))
  1487. //{
  1488. // Dbg("SetPrivilege(SE_ASSIGNPRIMARYTOKEN_NAME) failed GTE = %u.", GetLastError());
  1489. // __leave;
  1490. //}
  1491. //else if(!CTWProcHelper::SetPrivilege(hToken, SE_INCREASE_QUOTA_NAME, TRUE))
  1492. //{
  1493. // Dbg("SetPrivilege(SE_INCREASE_QUOTA_NAME) failed GTE = %u.", GetLastError());
  1494. // __leave;
  1495. //}
  1496. //
  1497. //if(LogonUser("cmbzephyr", ".", "Cmb@1111",
  1498. // LOGON32_LOGON_NETWORK,
  1499. // LOGON32_PROVIDER_DEFAULT, &hNewToken))
  1500. //{
  1501. //You don't need to, nor should you be, impersonating the user token in order to
  1502. //launch a new process in the user's desktop.
  1503. //if (!ImpersonateLoggedOnUser(hNewToken))
  1504. //{
  1505. // Dbg("ImpersonateLoggedOnUser failed GTE = %u.", GetLastError());
  1506. // __leave;
  1507. //}
  1508. // if(!CreateRestrictedToken(hNewToken, DISABLE_MAX_PRIVILEGE, 0, NULL, 0, NULL, 0, NULL, &hNewExToken))
  1509. // {
  1510. // Dbg("CreateRestrictedToken failed GTE = %u.", GetLastError());
  1511. // __leave;
  1512. // }
  1513. // bSuc = CreateProcessAsUser(hNewExToken, NULL,
  1514. // szCmdLine, // command line
  1515. // NULL, // TODO: process security attributes
  1516. // NULL, // TODO: primary thread security attributes
  1517. // TRUE, // handles are inherited ??
  1518. // fdwCreate, // creation flags
  1519. // NULL, // use parent's environment
  1520. // NULL, // use parent's current directory
  1521. // &si, // STARTUPINFO pointer
  1522. // &pi); // receives PROCESS_INFORMATION
  1523. // if(!bSuc)
  1524. // {
  1525. // Dbg("CreateProcessAsUser failed GTE = %u.", GetLastError());
  1526. // }
  1527. //}
  1528. //else
  1529. //{
  1530. // Dbg("LogonUser failed GLE=%d.", GetLastError());
  1531. //}
  1532. //RevertToSelf();
  1533. #endif
  1534. #ifdef CreateProcessWithLogon
  1535. Dbg("Using CreateProcessWithLogon way !!!");
  1536. bSuc = StartInteractiveClientProcess("cmbzephyr", ".", "Cmb@1111",
  1537. szCmdLine, &si, fdwCreate, &(pi.dwProcessId));
  1538. if(bSuc)
  1539. {
  1540. Dbg("StartInteractiveClientProcess suc.");
  1541. }
  1542. else
  1543. {
  1544. Dbg("StartInteractiveClientProcess failed GLE=%d.", GetLastError());
  1545. }
  1546. __leave;
  1547. DWORD dwSize;
  1548. LPVOID lpvEnv;
  1549. WCHAR szUserProfile[256] = L"";
  1550. if(!LogonUser("cmbzephyr", ".", "Cmb@1111",
  1551. LOGON32_LOGON_NETWORK,
  1552. LOGON32_PROVIDER_DEFAULT, &hNewToken))
  1553. {
  1554. Dbg("LogonUser failed GLE=%d.", GetLastError());
  1555. __leave;
  1556. }
  1557. if (!CreateEnvironmentBlock(&lpvEnv, hNewToken, TRUE))
  1558. {
  1559. Dbg("CreateEnvironmentBlock failed GLE=%d.", GetLastError());
  1560. __leave;
  1561. }
  1562. dwSize = sizeof(szUserProfile)/sizeof(WCHAR);
  1563. if (!GetUserProfileDirectoryW(hToken, szUserProfile, &dwSize))
  1564. {
  1565. Dbg("GetUserProfileDirectory failed GLE=%d.", GetLastError());
  1566. __leave;
  1567. }
  1568. PWSTR pWideChars;
  1569. int nLenCmdline = strlen(szCmdLine);
  1570. int nLenWideChar = MultiByteToWideChar(CP_ACP, 0, szCmdLine, nLenCmdline, NULL, 0);
  1571. pWideChars = (PWSTR)HeapAlloc(GetProcessHeap(), 0, nLenWideChar*sizeof(wchar_t));
  1572. if(pWideChars == NULL)
  1573. {
  1574. Dbg("HeapAlloc failed GLE=%d.", GetLastError());
  1575. __leave;
  1576. }
  1577. MultiByteToWideChar(CP_ACP, 0, szCmdLine, nLenCmdline, pWideChars, nLenWideChar);
  1578. PROCESS_INFORMATION w_pi;
  1579. STARTUPINFOW w_si;
  1580. ZeroMemory(&w_pi, sizeof(PROCESS_INFORMATION));
  1581. ZeroMemory(&w_si, sizeof(STARTUPINFOW));
  1582. w_si.cb = sizeof(STARTUPINFOW);
  1583. GetStartupInfoW(&w_si);
  1584. w_si.hStdError = m_pRWStr[idx]->hChildWrite;
  1585. w_si.hStdOutput = m_pRWStr[idx]->hChildWrite;
  1586. w_si.hStdInput = m_pRWStr[idx]->hChildRead;
  1587. //重设标准输入,标准输出,标准错误句柄
  1588. w_si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  1589. w_si.wShowWindow = SW_HIDE;
  1590. w_si.lpDesktop = L"winsta0\\default";
  1591. fdwCreate = NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT;
  1592. if(m_bNeedJob)
  1593. {
  1594. fdwCreate |= CREATE_SUSPENDED;
  1595. }
  1596. if (!(bSuc = CreateProcessWithLogonW(L"cmbzephyr", L".", L"Cmb@1111",
  1597. LOGON_WITH_PROFILE, NULL, pWideChars,
  1598. /*CREATE_UNICODE_ENVIRONMENT*/fdwCreate, lpvEnv, szUserProfile,
  1599. &w_si, &pi)))
  1600. {
  1601. Dbg("CreateProcessWithLogonW failed GLE=%d.", GetLastError());
  1602. }
  1603. HeapFree(GetProcessHeap(), 0, pWideChars);
  1604. if (!DestroyEnvironmentBlock(lpvEnv))
  1605. {
  1606. Dbg("DestroyEnvironmentBlock failed GLE=%d.", GetLastError());
  1607. }
  1608. #endif
  1609. #ifdef SetLowPriority
  1610. Dbg("Using SetLowPriority way !!!");
  1611. if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
  1612. SecurityImpersonation, TokenPrimary, &hNewToken))
  1613. {
  1614. if (ConvertStringSidToSid(szIntegritySid, &pIntegritySid))
  1615. {
  1616. tml.Label.Attributes = SE_GROUP_INTEGRITY;
  1617. tml.Label.Sid = pIntegritySid;
  1618. // Set the process integrity level
  1619. if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &tml,
  1620. sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid)))
  1621. {
  1622. bSuc = CreateProcessAsUser(hNewToken, NULL,
  1623. szCmdLine, // command line
  1624. NULL, // TODO: process security attributes
  1625. NULL, // TODO: primary thread security attributes
  1626. TRUE, // handles are inherited ??
  1627. fdwCreate, // creation flags
  1628. NULL, // use parent's environment
  1629. NULL, // use parent's current directory
  1630. &si, // STARTUPINFO pointer
  1631. &pi); // receives PROCESS_INFORMATION
  1632. RevertToSelf();
  1633. }
  1634. }
  1635. }
  1636. #endif
  1637. }
  1638. __finally
  1639. {
  1640. if(pIntegritySid)
  1641. {
  1642. LocalFree(pIntegritySid);
  1643. }
  1644. if(pUserGroupSID)
  1645. {
  1646. LocalFree(pUserGroupSID);
  1647. }
  1648. if(pAdminSID)
  1649. {
  1650. LocalFree(pAdminSID);
  1651. }
  1652. //
  1653. // Close the access token.
  1654. //
  1655. if (hToken)
  1656. {
  1657. CloseHandle(hToken);
  1658. }
  1659. if(hNewToken)
  1660. {
  1661. CloseHandle(hNewToken);
  1662. }
  1663. if(hNewExToken)
  1664. {
  1665. CloseHandle(hNewExToken);
  1666. }
  1667. if(!bSuc)
  1668. {
  1669. LogWarn(Severity_Middle, Error_NewProcess, 0, "Retry to Create process in normal way.");
  1670. //Create process.
  1671. bSuc = CreateProcess(NULL,
  1672. szCmdLine, // command line
  1673. NULL, // TODO: process security attributes
  1674. NULL, // TODO: primary thread security attributes
  1675. TRUE, // handles are inherited ??
  1676. fdwCreate, // creation flags
  1677. NULL, // use parent's environment
  1678. NULL, // use parent's current directory
  1679. &si, // STARTUPINFO pointer
  1680. &pi); // receives PROCESS_INFORMATION
  1681. }
  1682. }
  1683. if(!bSuc)
  1684. {
  1685. return FALSE;
  1686. }
  1687. m_pRWStr[idx]->dwProcessID = pi.dwProcessId;
  1688. if(m_bNeedJob)
  1689. {
  1690. sprintf_s(m_pDevHandles[idx].szInfo, "Waitting JobNotify about being putted it in Job");
  1691. m_pDevHandles[idx].nReserved = 1;
  1692. if(!m_pProcHelper->AssignProcess(pi.hProcess))
  1693. {
  1694. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1695. sprintf_s(szMsg, "Add Process(id=%d) to Job failed, GLE = %u.",
  1696. pi.dwProcessId, GetLastError());
  1697. LogWarn(Severity_Middle, Error_Unexpect, 0, szMsg);
  1698. }
  1699. ResumeThread(pi.hThread);
  1700. }
  1701. else
  1702. {
  1703. sprintf_s(m_pDevHandles[idx].szInfo, "Create process succ");
  1704. }
  1705. // Close handle of process and its thread.
  1706. // Not necessary
  1707. CloseHandle(pi.hThread);
  1708. CloseHandle(pi.hProcess);
  1709. return TRUE;
  1710. }
  1711. ErrorCodeEnum CBranchDeviceFSM::ProcessExchange(int nIdentifier,
  1712. SpBranch_Command_Req& req, SpBranch_Command_Ans& ans, DWORD dwMillSec /*= 30000*/)
  1713. {
  1714. assert(nIdentifier >= 0 && nIdentifier < m_nDevNum);
  1715. ans.Init();
  1716. ErrorCodeEnum erroCode = Error_Unexpect;
  1717. BOOL bSuc = FALSE;
  1718. DWORD dwRead, dwWritten;
  1719. HANDLE hRead = m_pRWStr[nIdentifier]->hParentRead;
  1720. HANDLE hWrite = m_pRWStr[nIdentifier]->hParentWrite;
  1721. CAutoBuffer buf = SpObject2Buffer(req);
  1722. dwRead = buf.GetCount();
  1723. //https://msdn.microsoft.com/en-us/library/windows/desktop/aa365747%28v=vs.85%29.aspx
  1724. bSuc = WriteFile(hWrite, buf, dwRead, &dwWritten, NULL);
  1725. Dbg("[%s]WriteFile %ssuccessfully: should write(%d), actually written(%d).",
  1726. m_pDevHandles[nIdentifier].szDevName, (bSuc ? "" : "un"), dwRead, dwWritten);
  1727. if (!bSuc)
  1728. {
  1729. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1730. sprintf_s(szMsg, DEFAULT_MSG_SIZE, "WriteFile opertaion failed, GLE = %u.", GetLastError());
  1731. LogError(Severity_Middle, Error_IO, 0, szMsg);
  1732. return Error_IO;
  1733. }
  1734. Dbg("[%s]Write fininshed and start reading...", m_pDevHandles[nIdentifier].szDevName);
  1735. BYTE* btBuf = new BYTE[BUFSIZE];
  1736. if(btBuf == NULL)
  1737. {
  1738. Dbg("Create byte for reading failed GTL = %u.", GetLastError());
  1739. return Error_Resource;
  1740. }
  1741. DWORD dwTimeout = GetTickCount() + dwMillSec;
  1742. for(;;)
  1743. {
  1744. ZeroMemory(btBuf, BUFSIZE);
  1745. bSuc = PeekNamedPipe(hRead, btBuf, BUFSIZE, &dwRead, NULL, NULL);
  1746. if(!bSuc)
  1747. {
  1748. DWORD dwCode = GetLastError();
  1749. Dbg("PeekNamedPipe failed, GLE = %u.", dwCode);
  1750. if(dwCode == ERROR_INVALID_HANDLE)
  1751. {
  1752. //Custom add.
  1753. erroCode = Error_NotIntegrated;
  1754. }
  1755. break;
  1756. }
  1757. if(dwRead != 0)
  1758. {
  1759. Dbg("[%s] Receive response informaion contains %u bytes, and start to ReadFile.",
  1760. m_pDevHandles[nIdentifier].szDevName, dwRead);
  1761. bSuc = ReadFile(hRead, btBuf, dwRead, &dwRead, NULL);
  1762. if(!bSuc || dwRead == 0)
  1763. {
  1764. char szMsg[DEFAULT_MSG_SIZE] = {0};
  1765. sprintf_s(szMsg, "ReadFile opertaion failed (bSuc=%d)(dwRead=%d), GLE = %u.",
  1766. bSuc, dwRead, GetLastError());
  1767. LogError(Severity_Middle, Error_IO, 0, szMsg);
  1768. erroCode = Error_IO;
  1769. break;
  1770. }
  1771. buf.Clear();
  1772. buf.Attach(btBuf, dwRead);
  1773. SpBuffer2Object(buf, ans);
  1774. Dbg("[%s]Response status: EC=%u, Info: %s",
  1775. m_pDevHandles[nIdentifier].szDevName, ans.dwErroCode, (LPCTSTR)ans.desc);
  1776. return Error_Succeed;
  1777. }
  1778. if(GetTickCount() > dwTimeout)
  1779. {
  1780. Dbg("[%s]Response occurs Timeout !!!",
  1781. m_pDevHandles[nIdentifier].szDevName);
  1782. erroCode = Error_TimeOut;
  1783. break;
  1784. }
  1785. }
  1786. delete[] btBuf;
  1787. btBuf = NULL;
  1788. return erroCode;
  1789. }
  1790. BOOL CBranchDeviceFSM::RestartChildProcess(int idx)
  1791. {
  1792. if(idx < 0 || idx >= m_nDevNum)
  1793. {
  1794. return FALSE;
  1795. }
  1796. if(m_pRWStr[idx]->dwProcessID != 0)
  1797. {
  1798. if(m_pProcHelper->DestoryProcess(m_pRWStr[idx]->dwProcessID))
  1799. {
  1800. //TODO: Waiting the process terminate eventually.
  1801. Sleep(1000);
  1802. m_pRWStr[idx]->Cleanup();
  1803. }
  1804. }
  1805. m_pDevHandles[idx].nReserved = 0;
  1806. //Create DevAdapter Process
  1807. if(!CreateSpecifiedProcess(idx))
  1808. {
  1809. Dbg("CreateChildProcess for %s failed, GLE = %u.", m_pDevHandles[idx].szDevName, GetLastError());
  1810. m_pDevHandles[idx].nStatus = -5;
  1811. return FALSE;
  1812. }
  1813. Dbg("CreateProcess for %s succ, PID = %u.", m_pDevHandles[idx].szDevName, m_pRWStr[idx]->dwProcessID);
  1814. m_pDevHandles[idx].nStatus = 0;
  1815. return TRUE;
  1816. }