Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

697 lines
18 KiB

  1. #include "precomp.h"
  2. #pragma hdrstop
  3. /* File: misccm.c */
  4. /**************************************************************************/
  5. /* Install: Misc. commands.
  6. /**************************************************************************/
  7. extern HWND hwndFrame;
  8. extern USHORT APIENTRY DateFromSz(SZ);
  9. /*
  10. ** Purpose:
  11. ** Sets the given environment variable in the given file.
  12. ** Always creates the file or variable if necessary.
  13. ** Only sets the first occurance of the variable.
  14. ** Arguments:
  15. ** Valid command options:
  16. ** cmoVital
  17. ** cmoAppend
  18. ** cmoPrepend
  19. ** Returns:
  20. ** Returns fTrue if successful, fFalse otherwise.
  21. **
  22. **************************************************************************/
  23. BOOL APIENTRY FSetEnvVariableValue(SZ szFile,
  24. SZ szVar,
  25. SZ szValue,
  26. CMO cmo)
  27. {
  28. Unused(szFile);
  29. Unused(szVar);
  30. Unused(szValue);
  31. Unused(cmo);
  32. /*** REVIEW: STUB ***/
  33. Assert(fFalse);
  34. return(fFalse);
  35. }
  36. /*
  37. ** Purpose:
  38. ** Converts an array of long values into a list and stores in Symbol
  39. ** Table.
  40. ** Arguments:
  41. ** rgl: full array of longs to create a list out of.
  42. ** szSym: valid symbol name to store list value in.
  43. ** iMax: count of items in array.
  44. ** Returns:
  45. ** Returns fTrue if successful, fFalse otherwise.
  46. **
  47. **************************************************************************/
  48. BOOL APIENTRY FConvertAndStoreRglInSymTab(PLONG_STF rgl, SZ szSym,
  49. INT iMax)
  50. {
  51. RGSZ rgsz;
  52. INT il;
  53. SZ szList;
  54. while ((rgsz = (RGSZ)SAlloc((CB)((iMax + 1) * sizeof(SZ)))) == (RGSZ)NULL)
  55. if (!FHandleOOM(hwndFrame))
  56. return(fFalse);
  57. *(rgsz + iMax) = (SZ)NULL;
  58. for (il = iMax; il-- > 0; )
  59. {
  60. CHP rgch[35];
  61. _ltoa(*(rgl + il), rgch, 10);
  62. while ((*(rgsz + il) = SzDupl(rgch)) == (SZ)NULL)
  63. if (!FHandleOOM(hwndFrame))
  64. return(fFalse);
  65. }
  66. while ((szList = SzListValueFromRgsz(rgsz)) == (SZ)NULL)
  67. if (!FHandleOOM(hwndFrame))
  68. return(fFalse);
  69. EvalAssert(FFreeRgsz(rgsz));
  70. while (!FAddSymbolValueToSymTab(szSym, szList))
  71. if (!FHandleOOM(hwndFrame))
  72. return(fFalse);
  73. SFree(szList);
  74. return(fTrue);
  75. }
  76. /*
  77. ** Purpose:
  78. ** 'Detects' the Free disk space and cluster sizes on all valid drives.
  79. ** Arguments:
  80. ** szFreePerDisk: valid symbol to store list result in.
  81. ** szClusterBytesPerDisk: valid symbol to store list result in.
  82. ** szFreeTotal: valid symbol to store result in.
  83. ** Returns:
  84. ** Returns fTrue if successful, fFalse otherwise. If successful,
  85. ** it associates new values in the Symbol Table. These values are
  86. ** two lists of 26 long integers and one value.
  87. **
  88. **************************************************************************/
  89. BOOL APIENTRY FSetupGetCopyListCost(SZ szFreePerDisk,
  90. SZ szClusterBytesPerDisk,
  91. SZ szFreeTotal)
  92. {
  93. LONG rglFree[26];
  94. LONG rglClusters[26];
  95. LONG lTotal = 0L;
  96. INT il;
  97. CHP rgch[35];
  98. char DiskPath[4] = { 'x',':','\\','\0' };
  99. ChkArg(szFreePerDisk != (SZ)NULL && *szFreePerDisk != '\0', 1, fFalse);
  100. ChkArg(szClusterBytesPerDisk != (SZ)NULL
  101. && *szClusterBytesPerDisk != '\0', 2, fFalse);
  102. ChkArg(szFreeTotal != (SZ)NULL && *szFreeTotal != '\0', 3, fFalse);
  103. for (il=0; il<26; il++)
  104. {
  105. DWORD wDriveType;
  106. rglFree[il] = 0;
  107. rglClusters[il] = 4096;
  108. DiskPath[0] = (CHAR)((UCHAR)il + (UCHAR)'A');
  109. if ((wDriveType = GetDriveType(DiskPath)) == DRIVE_FIXED
  110. || wDriveType == DRIVE_REMOTE)
  111. {
  112. DWORD SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters;
  113. if(GetDiskFreeSpace(DiskPath,
  114. &SectorsPerCluster,
  115. &BytesPerSector,
  116. &FreeClusters,
  117. &TotalClusters))
  118. {
  119. rglClusters[il] = BytesPerSector * SectorsPerCluster;
  120. rglFree[il] = (DWORD)(UInt32x32To64(rglClusters[il], FreeClusters));
  121. lTotal += rglFree[il];
  122. }
  123. }
  124. }
  125. if (!FConvertAndStoreRglInSymTab((PLONG_STF)rglFree, szFreePerDisk, 26))
  126. return(fFalse);
  127. if (!FConvertAndStoreRglInSymTab((PLONG_STF)rglClusters,
  128. szClusterBytesPerDisk, 26))
  129. return(fFalse);
  130. _ltoa(lTotal, rgch, 10);
  131. while (!FAddSymbolValueToSymTab(szFreeTotal, rgch))
  132. if (!FHandleOOM(hwndFrame))
  133. return(fFalse);
  134. return(fTrue);
  135. }
  136. /*
  137. ** Purpose:
  138. ** Calculate the 'costs' to copy the current CopyList.
  139. ** Arguments:
  140. ** szTotalAdditionalNeeded: valid symbol to store result in.
  141. ** szTotalNeeded: valid symbol to store result in.
  142. ** szFreePerDisk: NULL or valid symbol to get values from.
  143. ** szClusterPerDisk: NULL or valid symbol to get values from.
  144. ** szTroublePairs: NULL or valid symbol to store result in.
  145. ** szNeededPerDisk: NULL or valid symbol to store result in.
  146. ** szExtraCosts: NULL or valid symbol to get values from.
  147. ** Returns:
  148. ** Returns fTrue if successful, fFalse otherwise. If successful,
  149. ** it associates new values with szSym in the Symbol Table.
  150. ** This
  151. ** value is a list of 27 long integers of the disk costs per drive.
  152. ** First one is total.
  153. **
  154. **************************************************************************/
  155. BOOL APIENTRY FGetCopyListCost(SZ szTotalAdditionalNeeded,
  156. SZ szFreeTotal,
  157. SZ szTotalNeeded,
  158. SZ szFreePerDisk,
  159. SZ szClusterPerDisk,
  160. SZ szTroublePairs,
  161. SZ szNeededPerDisk,
  162. SZ szExtraCosts)
  163. {
  164. LONG rglCosts[26];
  165. LONG rglFree[26];
  166. LONG rglClusters[26];
  167. LONG lTotal;
  168. LONG lTotalAddit;
  169. LONG lFreeTotal;
  170. RGSZ rgsz;
  171. PSZ psz;
  172. INT il;
  173. CHP rgchBuf[cchpFullPathBuf];
  174. SZ szList;
  175. PCLN pcln;
  176. BOOL fFirst;
  177. ChkArg(szTotalAdditionalNeeded != (SZ)NULL
  178. && *szTotalAdditionalNeeded != '\0', 1, fFalse);
  179. ChkArg(szFreeTotal != (SZ)NULL && *szFreeTotal != '\0', 2, fFalse);
  180. ChkArg(szTotalNeeded != (SZ)NULL && *szTotalNeeded != '\0', 3, fFalse);
  181. for (il = 26; il-- > 0; )
  182. {
  183. rglCosts[il] = 0L;
  184. rglFree[il] = 0L;
  185. rglClusters[il] = 4096L;
  186. }
  187. if (szFreePerDisk != (SZ)NULL
  188. && (szList = SzFindSymbolValueInSymTab(szFreePerDisk)) != (SZ)NULL)
  189. {
  190. while ((psz = rgsz = RgszFromSzListValue(szList)) == (RGSZ)NULL)
  191. if (!FHandleOOM(hwndFrame))
  192. return(fFalse);
  193. il = 0;
  194. while (*psz != (SZ)NULL && il < 26)
  195. {
  196. if ((lTotal = atol(*psz++)) > 0L)
  197. rglFree[il] = lTotal;
  198. il++;
  199. }
  200. EvalAssert(FFreeRgsz(rgsz));
  201. }
  202. if (szClusterPerDisk != (SZ)NULL
  203. && (szList = SzFindSymbolValueInSymTab(szClusterPerDisk)) !=
  204. (SZ)NULL)
  205. {
  206. while ((psz = rgsz = RgszFromSzListValue(szList)) == (RGSZ)NULL)
  207. if (!FHandleOOM(hwndFrame))
  208. return(fFalse);
  209. il = 0;
  210. while (*psz != (SZ)NULL && il < 26)
  211. {
  212. if ((lTotal = atol(*psz++)) > 15L)
  213. rglClusters[il] = lTotal;
  214. il++;
  215. }
  216. EvalAssert(FFreeRgsz(rgsz));
  217. }
  218. if (szExtraCosts != (SZ)NULL
  219. && (szList = SzFindSymbolValueInSymTab(szExtraCosts)) != (SZ)NULL)
  220. {
  221. while ((psz = rgsz = RgszFromSzListValue(szList)) == (RGSZ)NULL)
  222. if (!FHandleOOM(hwndFrame))
  223. return(fFalse);
  224. il = 0;
  225. while (*psz != (SZ)NULL && il < 26)
  226. {
  227. if ((lTotal = atol(*psz++)) > 0L)
  228. rglCosts[il] = lTotal;
  229. il++;
  230. }
  231. EvalAssert(FFreeRgsz(rgsz));
  232. }
  233. pcln = *(PpclnHeadList( pLocalInfPermInfo() ));
  234. while (pcln != (PCLN)NULL) {
  235. PFH pfh;
  236. POER poer = &(pcln->psfd->oer);
  237. LONG lcbSrc = poer->lSize;
  238. LONG lcbDest = 0L;
  239. LONG lcbC;
  240. CHP ch;
  241. EvalAssert(FBuildFullDstPath(rgchBuf, pcln->szDstDir, pcln->psfd, fFalse));
  242. ch = *rgchBuf;
  243. if ((pfh = PfhOpenFile(rgchBuf, ofmRead)) != (PFH)NULL){
  244. OWM owm;
  245. lcbDest = _filelength(pfh->iDosfh);
  246. if ((owm = poer->owm) & owmNever){
  247. lcbSrc = lcbDest = 0L;
  248. goto LCloseFile;
  249. }
  250. else if (owm & owmUnprotected) {
  251. if (YnrcFileReadOnly(rgchBuf) == ynrcYes){
  252. lcbSrc = lcbDest = 0L;
  253. goto LCloseFile;
  254. }
  255. }
  256. else if (owm & owmOlder) {
  257. if (YnrcNewerExistingFile(DateFromSz(poer->szDate), rgchBuf,
  258. poer->ulVerMS, poer->ulVerLS) == ynrcYes){
  259. lcbSrc = lcbDest = 0L;
  260. goto LCloseFile;
  261. }
  262. }
  263. if (poer->szBackup != (SZ)NULL
  264. && FBuildFullBakPath(rgchBuf, rgchBuf, pcln->psfd)
  265. && FValidPath(rgchBuf)
  266. && PfhOpenFile(rgchBuf, ofmExistRead) == (PFH)NULL)
  267. lcbDest = 0L;
  268. LCloseFile:
  269. EvalAssert(FCloseFile(pfh));
  270. }
  271. if (ch >= 'a' && ch <= 'z') {
  272. il = ch - 'a';
  273. }
  274. else if (ch >= 'A' && ch <= 'Z') {
  275. il = ch - 'A';
  276. }
  277. else {
  278. il = - 1;
  279. }
  280. //
  281. // Note that we are worrying about costs only on drives, no UNC path
  282. // costs are determined
  283. //
  284. if( il != -1 ) {
  285. /* round up with cluster size */
  286. lcbC = rglClusters[il];
  287. Assert(lcbC > 1L);
  288. lcbSrc = ((lcbSrc + lcbC - 1) / lcbC) * lcbC;
  289. lcbDest = ((lcbDest + lcbC - 1) / lcbC) * lcbC;
  290. rglCosts[il] += lcbSrc - lcbDest;
  291. /* REVIEW what we really want to determine is the max not the end */
  292. }
  293. pcln = pcln->pclnNext;
  294. }
  295. if (szTroublePairs != (SZ)NULL)
  296. {
  297. while ((szList = (SZ)SAlloc((CB)4096)) == (SZ)NULL)
  298. if (!FHandleOOM(hwndFrame))
  299. return(fFalse);
  300. EvalAssert(strcpy(szList, "{") == (LPSTR)szList);
  301. fFirst = fTrue;
  302. }
  303. lTotal = 0L;
  304. lTotalAddit = 0L;
  305. lFreeTotal = 0L;
  306. for (il = 0; il < 26; il++)
  307. {
  308. LONG lNeeded = rglCosts[il] - rglFree[il];
  309. if (rglCosts[il] != 0L)
  310. {
  311. lTotal += rglCosts[il];
  312. lFreeTotal += rglFree[il];
  313. }
  314. if (lNeeded > 0L)
  315. {
  316. lTotalAddit += lNeeded;
  317. if (szTroublePairs != (SZ)NULL)
  318. {
  319. if (!fFirst)
  320. EvalAssert(SzStrCat(szList, ",") == (LPSTR)szList);
  321. fFirst = fFalse;
  322. EvalAssert(SzStrCat(szList, "\"{\"\"") == (LPSTR)szList);
  323. rgchBuf[0] = (CHP)(il + 'A');
  324. rgchBuf[1] = ':';
  325. rgchBuf[2] = '\0';
  326. EvalAssert(SzStrCat(szList, rgchBuf) == (LPSTR)szList);
  327. EvalAssert(SzStrCat(szList, "\"\",\"\"") == (LPSTR)szList);
  328. _ltoa(lNeeded, rgchBuf, 10);
  329. EvalAssert(SzStrCat(szList, rgchBuf) == (LPSTR)szList);
  330. EvalAssert(SzStrCat(szList, "\"\"}\"") == (LPSTR)szList);
  331. }
  332. }
  333. }
  334. if (szTroublePairs != (SZ)NULL)
  335. {
  336. EvalAssert(SzStrCat(szList, "}") == (LPSTR)szList);
  337. while (!FAddSymbolValueToSymTab(szTroublePairs, szList))
  338. if (!FHandleOOM(hwndFrame))
  339. {
  340. SFree(szList);
  341. return(fFalse);
  342. }
  343. SFree(szList);
  344. }
  345. _ltoa(lTotalAddit, rgchBuf, 10);
  346. while (!FAddSymbolValueToSymTab(szTotalAdditionalNeeded, rgchBuf))
  347. if (!FHandleOOM(hwndFrame))
  348. return(fFalse);
  349. _ltoa(lFreeTotal, rgchBuf, 10);
  350. while (!FAddSymbolValueToSymTab(szFreeTotal, rgchBuf))
  351. if (!FHandleOOM(hwndFrame))
  352. return(fFalse);
  353. _ltoa(lTotal, rgchBuf, 10);
  354. while (!FAddSymbolValueToSymTab(szTotalNeeded, rgchBuf))
  355. if (!FHandleOOM(hwndFrame))
  356. return(fFalse);
  357. if (!FConvertAndStoreRglInSymTab((PLONG_STF)rglCosts, szNeededPerDisk, 26))
  358. return(fFalse);
  359. return(fTrue);
  360. }
  361. /*
  362. ** Purpose:
  363. ** Arguments:
  364. ** Returns:
  365. ** Returns non-NULL if successful, NULL otherwise.
  366. **
  367. **************************************************************************/
  368. SZ APIENTRY SzFindNthIniField(SZ szLine,INT iField)
  369. {
  370. ChkArg(szLine != (SZ)NULL, 1, (SZ)NULL);
  371. ChkArg(iField > 0, 2, (SZ)NULL);
  372. LSkipWhiteSpace:
  373. while (FWhiteSpaceChp(*szLine))
  374. szLine = SzNextChar(szLine);
  375. if (*szLine == '\0')
  376. return((SZ)NULL);
  377. if (iField-- <= 1)
  378. if (*szLine == ',')
  379. return((SZ)NULL);
  380. else
  381. return(szLine);
  382. while (*szLine != ',' && *szLine != '\0')
  383. szLine = SzNextChar(szLine);
  384. if (*szLine == ',')
  385. szLine = SzNextChar(szLine);
  386. goto LSkipWhiteSpace;
  387. }
  388. #define szIniKey (*rgszItem)
  389. #define szIniSect (*(rgszItem + 1))
  390. #define szIniValue (*(rgszItem + 2))
  391. #define szListFiles (*(rgszItem + 3))
  392. #define szFileIndex (*rgszFile)
  393. #define szFileName (*(rgszFile + 1))
  394. #define szSubDir (*(rgszFile + 2))
  395. #define szFileSym (*(rgszFile + 3))
  396. #define szPathSym (*(rgszFile + 4))
  397. #define cchpIniLineMax 511
  398. /*
  399. ** Purpose:
  400. ** Parses a shared app list to fill symbols with found paths.
  401. ** Arguments:
  402. ** szList: list of shared app structures to deal with.
  403. ** Returns:
  404. ** Returns fTrue if successful, fFalse otherwise.
  405. **
  406. **************************************************************************/
  407. BOOL APIENTRY FParseSharedAppList(SZ szList)
  408. {
  409. #ifdef UNUSED
  410. RGSZ rgsz = NULL;
  411. RGSZ rgszItem = NULL;
  412. RGSZ rgszFiles = NULL;
  413. RGSZ rgszFile = NULL;
  414. PSZ psz;
  415. CHP rgchWinDir[154]; /* SDK Reference Volume 1 page 4-229 */
  416. /* 144 + "/msapps/" + NULL + 1extra */
  417. unsigned cchpWinDir;
  418. ChkArg(szList != (SZ)NULL && FListValue(szList), 1, fFalse);
  419. EvalAssert( ((cchpWinDir = GetWindowsDirectory(rgchWinDir, 153)) != 0)
  420. && (cchpWinDir < 145)
  421. && (rgchWinDir[cchpWinDir] == (CHP)'\0'));
  422. if (rgchWinDir[cchpWinDir - 1] == '\\')
  423. {
  424. Assert(cchpWinDir == 3);
  425. rgchWinDir[--cchpWinDir] = '\0';
  426. }
  427. Assert(cchpWinDir + strlen("\\msapps\\") + 1 <= 153);
  428. EvalAssert(SzStrCat(rgchWinDir, "\\msapps\\") == (LPSTR)rgchWinDir);
  429. cchpWinDir += 8;
  430. while ((psz = rgsz = RgszFromSzListValue(szList)) == (RGSZ)NULL)
  431. if (!FHandleOOM(hwndFrame))
  432. goto LParseErrorExit;
  433. while (*psz != (SZ)NULL)
  434. {
  435. PSZ pszFile;
  436. CHP rgchIniLine[cchpIniLineMax + 1];
  437. ChkArg(FListValue(*psz), 1, fFalse);
  438. while ((rgszItem = RgszFromSzListValue(*psz)) == (RGSZ)NULL)
  439. if (!FHandleOOM(hwndFrame))
  440. goto LParseErrorExit;
  441. ChkArg(szIniKey != NULL && szIniSect != NULL && szIniValue != NULL
  442. && szListFiles != NULL && FListValue(szListFiles), 1, fFalse);
  443. EvalAssert(GetProfileString(szIniSect, szIniKey, "", rgchIniLine,
  444. cchpIniLineMax) != cchpIniLineMax);
  445. while ((rgszFiles = RgszFromSzListValue(szListFiles)) == (RGSZ)NULL)
  446. if (!FHandleOOM(hwndFrame))
  447. goto LParseErrorExit;
  448. pszFile = rgszFiles;
  449. while (*pszFile != (SZ)NULL)
  450. {
  451. CHP rgchPathBuf[256];
  452. SZ szField;
  453. ChkArg(FListValue(*pszFile), 1, fFalse);
  454. while ((rgszFile = RgszFromSzListValue(*pszFile)) == (RGSZ)NULL)
  455. if (!FHandleOOM(hwndFrame))
  456. goto LParseErrorExit;
  457. ChkArg(szFileIndex != NULL && szFileName != NULL && szSubDir != NULL
  458. && szFileSym != NULL && szPathSym != NULL, 1, fFalse);
  459. Assert(cchpWinDir + strlen(szSubDir) + 2 <= 240);
  460. EvalAssert(strcpy(rgchPathBuf,rgchWinDir) == (LPSTR)rgchPathBuf);
  461. EvalAssert(SzStrCat(rgchPathBuf, szSubDir) == (LPSTR)rgchPathBuf);
  462. if ((szField = SzFindNthIniField(rgchIniLine, atoi(szFileIndex)))
  463. != (SZ)NULL)
  464. {
  465. SZ szEndOfField = szField;
  466. CHP chpSav;
  467. while (*szEndOfField != ',' && *szEndOfField != '\0')
  468. szEndOfField = SzNextChar(szEndOfField);
  469. chpSav = *szEndOfField;
  470. *szEndOfField = '\0';
  471. if (FValidPath(szField)
  472. && PfhOpenFile(szField, ofmExistRead) != (PFH)NULL)
  473. {
  474. SZ szSlash = (SZ)NULL;
  475. *szEndOfField = chpSav;
  476. szEndOfField = szField;
  477. while (*szEndOfField != ',' && *szEndOfField != '\0')
  478. {
  479. if (*szEndOfField == '\\')
  480. szSlash = szEndOfField;
  481. szEndOfField = SzNextChar(szEndOfField);
  482. }
  483. Assert(szSlash != (SZ)NULL && *szSlash == '\\');
  484. chpSav = *(szEndOfField = szSlash);
  485. *szEndOfField = '\0';
  486. Assert(strlen(szField) + 2 <= 240);
  487. EvalAssert(strcpy(rgchPathBuf, szField) ==
  488. (LPSTR)rgchPathBuf);
  489. }
  490. *szEndOfField = chpSav;
  491. }
  492. if (rgchPathBuf[strlen(rgchPathBuf)] != '\\')
  493. EvalAssert(SzStrCat(rgchPathBuf, "\\") == (LPSTR)rgchPathBuf);
  494. while (!FAddSymbolValueToSymTab(szPathSym, rgchPathBuf))
  495. if (!FHandleOOM(hwndFrame))
  496. goto LParseErrorExit;
  497. Assert(strlen(rgchPathBuf) + strlen(szFileName) + 1 <= 256);
  498. EvalAssert(SzStrCat(rgchPathBuf, szFileName) == (LPSTR)rgchPathBuf);
  499. while (!FAddSymbolValueToSymTab(szFileSym, rgchPathBuf))
  500. if (!FHandleOOM(hwndFrame))
  501. goto LParseErrorExit;
  502. EvalAssert(FFreeRgsz(rgszFile));
  503. rgszFile = NULL;
  504. pszFile++;
  505. }
  506. EvalAssert(FFreeRgsz(rgszFiles));
  507. rgszFiles = NULL;
  508. EvalAssert(FFreeRgsz(rgszItem));
  509. rgszItem = NULL;
  510. psz++;
  511. }
  512. EvalAssert(FFreeRgsz(rgsz));
  513. rgsz = NULL;
  514. return(fTrue);
  515. LParseErrorExit:
  516. EvalAssert(rgsz == NULL || FFreeRgsz(rgsz));
  517. EvalAssert(rgszFile == NULL || FFreeRgsz(rgszFile));
  518. EvalAssert(rgszFiles == NULL || FFreeRgsz(rgszFiles));
  519. EvalAssert(rgszItem == NULL || FFreeRgsz(rgszItem));
  520. #endif /* UNUSED */
  521. Unused(szList);
  522. return(fFalse);
  523. }
  524. /*
  525. ** Purpose:
  526. ** Installs relevant lines from a shared app list into the WIN.INI.
  527. ** Arguments:
  528. ** szList: list of shared app structures to deal with.
  529. ** Returns:
  530. ** Returns fTrue if successful, fFalse otherwise.
  531. **
  532. **************************************************************************/
  533. BOOL APIENTRY FInstallSharedAppList(SZ szList)
  534. {
  535. #ifdef UNUSED
  536. RGSZ rgsz = NULL;
  537. RGSZ rgszItem = NULL;
  538. PSZ psz;
  539. ChkArg(szList != (SZ)NULL && FListValue(szList), 1, fFalse);
  540. while ((psz = rgsz = RgszFromSzListValue(szList)) == (RGSZ)NULL)
  541. if (!FHandleOOM(hwndFrame))
  542. goto LInstallErrorExit;
  543. while (*psz != (SZ)NULL)
  544. {
  545. SZ szNewLine;
  546. ChkArg(FListValue(*psz), 1, fFalse);
  547. while ((rgszItem = RgszFromSzListValue(*psz)) == (RGSZ)NULL)
  548. if (!FHandleOOM(hwndFrame))
  549. goto LInstallErrorExit;
  550. ChkArg(szIniKey != NULL && szIniSect != NULL && szIniValue != NULL
  551. && szListFiles != NULL && FListValue(szListFiles), 1, fFalse);
  552. if ((szNewLine = SzProcessSzForSyms(hwndFrame, szIniValue)) == (SZ)NULL)
  553. goto LInstallErrorExit;
  554. if (!FCreateIniSection("WIN.INI", szIniSect, cmoVital)
  555. || !FCreateIniKeyValue("WIN.INI", szIniSect, szIniKey,
  556. szNewLine, cmoOverwrite | cmoVital))
  557. {
  558. SFree(szNewLine);
  559. goto LInstallErrorExit;
  560. }
  561. SFree(szNewLine);
  562. EvalAssert(FFreeRgsz(rgszItem));
  563. rgszItem = NULL;
  564. psz++;
  565. }
  566. EvalAssert(FFreeRgsz(rgsz));
  567. rgsz = NULL;
  568. return(fTrue);
  569. LInstallErrorExit:
  570. EvalAssert(rgsz == NULL || FFreeRgsz(rgsz));
  571. EvalAssert(rgszItem == NULL || FFreeRgsz(rgszItem));
  572. #endif /* UNUSED */
  573. Unused(szList);
  574. return(fFalse);
  575. }
  576. #undef szIniKey
  577. #undef szIniSect
  578. #undef szIniValue
  579. #undef szListFiles
  580. #undef szFileIndex
  581. #undef szFileName
  582. #undef szSubDir
  583. #undef szFileSym
  584. #undef szPathSym