|
|
1.1 root 1: #ifndef STF_LITE
2:
3: #include <windows.h>
4: #include "setupapi.h"
5: #include "msdetect.h"
6: #include "msregdb.h"
7: #include "msshared.h"
8:
9: VOID NewFindFileUsingFileOpen(LPSTR szFile, LPSTR szBuf, INT cbBuf);
10:
11:
12: /* REVIEW -- Language differences are not considered!!! */
13: INT SharedFileNeedsCopying = 0;
14:
15: static char szWinIni[] = "WIN.INI";
16: static char szMsapps[] = "MSAPPS";
17:
18:
19:
20: // private to this file - needed in next api
21: /************************************************************************/
22: BOOL FixupOneMsappsEntry(LPSTR szKey, LPSTR szDef)
23: {
24: char szBuf[256];
25:
26: if (!DoesIniKeyExist(szWinIni, szMsapps, szKey)
27: || !GetIniKeyString(szWinIni, szMsapps, szKey, szBuf, 255)
28: || !FValidDir(szBuf))
29: {
30: lstrcpy(szBuf, szDef);
31: lstrcat(szBuf, szKey);
32: return(FCreateIniKeyValue(szWinIni, szMsapps, szKey, szBuf,
33: cmoOverwrite));
34: }
35:
36: return(TRUE);
37: }
38:
39:
40: /************************************************************************/
41: BOOL FixupWinIniMsappsSection(VOID)
42: {
43: static BOOL fMsappsNeedsFixing = TRUE;
44: char szBuf[256];
45: LPSTR sz;
46:
47: if (!fMsappsNeedsFixing)
48: return(TRUE);
49:
50: fMsappsNeedsFixing = FALSE;
51:
52: if (!DoesIniKeyExist(szWinIni, szMsapps, szMsapps)
53: || !GetIniKeyString(szWinIni, szMsapps, szMsapps, szBuf, 255)
54: || !FValidDir(szBuf))
55: {
56: GetWindowsDir(szBuf, 255 - lstrlen(szMsapps) - 2);
57: for (sz = szBuf; *(AnsiNext(sz)) != '\0'; sz = AnsiNext(sz))
58: ;
59: if (*sz != '\\')
60: lstrcat(sz, "\\");
61: lstrcat(sz, szMsapps);
62: if (!FCreateIniKeyValue(szWinIni, szMsapps, szMsapps, szBuf,
63: cmoOverwrite))
64: return(FALSE);
65: }
66:
67: if (!GetIniKeyString(szWinIni, szMsapps, szMsapps, szBuf, 255)
68: || !FValidDir(szBuf))
69: return(FALSE);
70: for (sz = szBuf; *(AnsiNext(sz)) != '\0'; sz = AnsiNext(sz))
71: ;
72: if (*sz != '\\')
73: lstrcat(sz, "\\");
74:
75: return(FixupOneMsappsEntry("CLIPART", szBuf)
76: && FixupOneMsappsEntry("EQUATION", szBuf)
77: && FixupOneMsappsEntry("GRPHFLT", szBuf)
78: && FixupOneMsappsEntry("MSDRAW", szBuf)
79: && FixupOneMsappsEntry("MSGRAPH", szBuf)
80: && FixupOneMsappsEntry("PROOF", szBuf)
81: && FixupOneMsappsEntry("TEXTCONV", szBuf)
82: && FixupOneMsappsEntry("WORDART", szBuf));
83: }
84:
85:
86: /************************************************************************/
87: BOOL DoesSharedFileNeedCopying(VOID)
88: {
89: return(SharedFileNeedsCopying != 0);
90: }
91:
92:
93: // returns: 1 if szVer1 > szVer2; 0 if equal; -1 if szVer1 < szVer2
94: /************************************************************************/
95: INT WCompareVersion(LPSTR szVer1, LPSTR szVer2)
96: {
97: INT i;
98:
99: if (*szVer1 == '\0')
100: if (*szVer2 == '\0')
101: return(0);
102: else
103: return(-1);
104:
105: if (*szVer2 == '\0')
106: return(1);
107:
108: for (i = 1; i <= 4; i++)
109: {
110: LONG piece1 = GetVersionNthField(szVer1, i);
111: LONG piece2 = GetVersionNthField(szVer2, i);
112:
113: if (piece1 > piece2)
114: return(1);
115: if (piece1 < piece2)
116: return(-1);
117: }
118:
119: return(0);
120: }
121:
122:
123: // private to this file - needed in next api
124: // NOTE - Win3.1 OpenFile() uses Task EXE/DLL's dir for searching!!
125: // also avoids OpenFile()'s check of CWD.
126: /************************************************************************/
127: VOID NewFindFileUsingFileOpen(LPSTR szFile, LPSTR szBuf, INT cbBuf)
128: {
129: CHAR szTmp[256];
130:
131: GetWindowsDir(szTmp, 255);
132: Assert(lstrlen(szTmp) + lstrlen(szFile) < 256);
133: lstrcat(szTmp, szFile);
134: if (!DoesFileExist(szTmp, femExists))
135: {
136: GetWindowsSysDir(szTmp, 255);
137: Assert(lstrlen(szTmp) + lstrlen(szFile) < 256);
138: lstrcat(szTmp, szFile);
139: if (!DoesFileExist(szTmp, femExists))
140: FindTargetOnEnvVar(szFile, "PATH", szTmp, 255);
141: }
142:
143: Assert(lstrlen(szTmp) < cbBuf);
144: lstrcpy(szBuf, szTmp);
145: }
146:
147:
148: // private to this file - needed in next api
149: /************************************************************************/
150: LPSTR FindSharedFileFromPath(LPSTR szField, LPSTR szVersion,
151: LPSTR szBuf, INT cbBuf)
152: {
153: CHAR szTmp[32];
154:
155: if (szBuf == NULL || cbBuf <= 0)
156: return(NULL);
157:
158: *szBuf = '\0';
159: if (lstrlen(szField) < cbBuf)
160: lstrcpy(szBuf, szField);
161: SharedFileNeedsCopying = 0;
162:
163: if (*szBuf != '\0' && !DoesFileExist(szBuf, femExists))
164: {
165: if (FValidPath(szBuf)
166: && FParsePathIntoPieces(szBuf, NULL, 0, NULL, 0, szTmp, 31))
167: NewFindFileUsingFileOpen(szTmp, szBuf, cbBuf);
168: else
169: *szBuf = '\0';
170: }
171:
172: if (*szBuf != '\0')
173: {
174: if (WCompareVersion(GetVersionOfFile(szBuf, szTmp, 31), szVersion) < 0)
175: {
176: if (IsFileWritable(szBuf))
177: SharedFileNeedsCopying = 1;
178: else
179: *szBuf = '\0';
180: }
181: }
182:
183: return((*szBuf == '\0') ? NULL : szBuf);
184: }
185:
186:
187: /************************************************************************/
188: LPSTR SearchForLocationForSharedFile(LPSTR szRegDbKey,
189: LPSTR szWinIniSect, LPSTR szWinIniKey, INT iWinIniField,
190: LPSTR szDefault, LPSTR szVersion, LPSTR szBuf, INT cbBuf)
191: {
192: CHAR szTmp[256];
193:
194: if (szBuf == NULL || cbBuf <= 0)
195: return(NULL);
196:
197: #ifdef REG_DB_ENABLED
198: if (*szRegDbKey != '\0')
199: {
200: GetRegKeyValue(szRegDbKey, szTmp, 255);
201: FindSharedFileFromPath(szTmp, szVersion, szBuf, cbBuf);
202: if (*szBuf != '\0')
203: return(szBuf);
204: }
205: #endif // REG_DB_ENABLED
206:
207: if (*szWinIniSect != '\0' && *szWinIniKey != '\0')
208: {
209: GetIniKeyString("WIN.INI", szWinIniSect, szWinIniKey, szTmp, 255);
210: if (*szTmp != '\0')
211: {
212: CHAR szField[256];
213:
214: GetNthFieldFromIniString(szTmp, iWinIniField, szField, 255);
215: FindSharedFileFromPath(szField, szVersion, szBuf, cbBuf);
216: if (*szBuf != '\0')
217: return(szBuf);
218: }
219: }
220:
221: *szBuf = '\0';
222: if (lstrlen(szDefault) < cbBuf)
223: lstrcpy(szBuf, szDefault);
224: SharedFileNeedsCopying = 1;
225:
226: if (DoesFileExist(szBuf, femExists)
227: && WCompareVersion(GetVersionOfFile(szBuf, szTmp, 255), szVersion)
228: >= 0)
229: SharedFileNeedsCopying = 0;
230:
231: return((*szBuf == '\0') ? NULL : szBuf);
232: }
233:
234:
235: /*
236: ** szInfSection: INF Section which contains shared app description line.
237: ** szInfKey: INF reference key which is for the shared app description
238: ** line.
239: ** szSubDir: Shared App WIN.INI key (such as PROOF, TEXTCONV, MSDRAW).
240: ** szRegDbKey: Registration DB key which might contain full path of an
241: ** existing copy of the Shared App.
242: ** szWinIniSect: WIN.INI section which might contain full path of an
243: ** existing copy of the Shared App (such as 'MS Proofing
244: ** Tools').
245: ** szWinIniKey: WIN.INI key which might reference the full path of an
246: ** existing copy of the Shared App (such as 'Spelling 1033,0').
247: ** iWinIniField: index of path in above WIN.INI value (such as '1' for speller,
248: ** '2' for dictionary).
249: ** szBuf: buffer to return full path of Shared App.
250: ** cbBuf: size of szBuf.
251: **
252: *************************************************************************/
253: LPSTR HandleSharedFile(LPSTR szInfSection, LPSTR szInfKey,
254: LPSTR szSubDir, LPSTR szRegDbKey, LPSTR szWinIniSect,
255: LPSTR szWinIniKey, INT iWinIniField, LPSTR szBuf, INT cbBuf)
256: {
257: CHAR szDefault[256];
258: CHAR szVersion[32];
259: LPSTR sz;
260:
261: FixupWinIniMsappsSection();
262:
263: if (!DoesIniKeyExist(szWinIni, szMsapps, szSubDir)
264: || !GetIniKeyString(szWinIni, szMsapps, szSubDir, szDefault, 255))
265: {
266: if (!DoesIniKeyExist(szWinIni, szMsapps, szMsapps)
267: || !GetIniKeyString(szWinIni, szMsapps, szMsapps, szDefault,
268: 255))
269: return(FALSE);
270:
271: for (sz = szDefault; *(AnsiNext(sz)) != '\0'; sz = AnsiNext(sz))
272: ;
273: if (*sz != '\\')
274: lstrcat(sz, "\\");
275:
276: lstrcat(sz, szSubDir);
277:
278: FCreateIniKeyValue(szWinIni, szMsapps, szSubDir, szDefault,
279: cmoOverwrite);
280: }
281:
282: for (sz = szDefault; *(AnsiNext(sz)) != '\0'; sz = AnsiNext(sz))
283: ;
284: if (*sz != '\\')
285: lstrcat(sz, "\\");
286:
287: while (*sz != '\0')
288: sz = AnsiNext(sz);
289:
290: /* Get file name from INF */
291: if (CbGetInfSectionKeyField(szInfSection, szInfKey, 1, sz,
292: 255 - lstrlen(szDefault)) == -1)
293: return(FALSE);
294:
295: /* Get file version from INF */
296: if (CbGetInfSectionKeyField(szInfSection, szInfKey, 19, szVersion, 31)
297: == -1)
298: return(FALSE);
299:
300: return(SearchForLocationForSharedFile(szRegDbKey, szWinIniSect,
301: szWinIniKey, iWinIniField, szDefault, szVersion, szBuf, cbBuf));
302: }
303: #endif /* !STF_LITE */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.