source: trunk/dll/init.c@ 1402

Last change on this file since 1402 was 1402, checked in by Gregg Young, 17 years ago

Remove variable aurgs from docopy & unlinkf (not used); Move more strings to PCSZs and string table; Move PCSZs to compile time initialization; Fix hang on startup caused by a drive scan and a dircnr scan trying to update a drive in the tree at the same time (related to the "treeswitch options); Code cleanup mainly removal of old printfs, SayMsgs, DbgMsg and unneeded %s.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 63.8 KB
Line 
1
2/***********************************************************************
3
4 $Id: init.c 1402 2009-03-14 17:17:59Z gyoung $
5
6 Initialization
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2009 Steven H. Levine
10
11 11 Jun 02 SHL Add CheckVersion
12 11 Jun 03 SHL Add JFS and FAT32 support
13 25 Nov 03 SHL InitFM3DLL: correct strings error mesage
14 23 May 05 SHL Use datamin.h
15 26 May 05 SHL Comments
16 06 Jun 05 SHL indent -i2
17 06 Jun 05 SHL Rework FindSwapperDat for VAC3.65 compat
18 13 Jul 06 SHL Use Runtime_Error
19 13 Jul 06 SHL Sync with current style
20 29 Jul 06 SHL Use xfgets
21 22 Oct 06 GKY Add NDFS32 support
22 18 Feb 07 GKY Add ISOFS, RAMFS support
23 30 Mar 07 GKY Defined golbals for removing GetPString for window class names
24 21 Apr 07 GKY Find FM2Utils by path or utils directory eleminate fAddUtils global
25 15 Jun 07 SHL Make OpenWatcom compatible
26 23 Jun 07 GKY Fix WORPLACE_PROCESS enviroment check logic
27 28 Jun 07 SHL Rework WORKPLACE_PROCESS check to match reality
28 03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speed file loading)
29 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
30 13 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat
31 18 Aug 07 JBS Added code to read Details* keys from the INI file (Ticket 118)
32 19 Aug 07 SHL Ensure FilesToGet in valid range
33 21 Aug 07 GKY Make Subject column in dircnr sizable and movable from the rigth to the left pane
34 23 Aug 07 SHL InitFM3DLL: report INI file DosSetPathInfo error correctly
35 23 Aug 07 SHL Use BldFullPathName
36 25 Aug 07 SHL Work around DosSetPathInfo kernel defect
37 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
38 10 Nov 07 GKY Get thousands separator from country info for file sizes.
39 26 Nov 07 GKY Eliminate check of ext path on start up
40 17 Dec 07 GKY Make WPURLDEFAULTSETTINGS the fall back for ftp/httprun
41 13 Jan 08 GKY Get Subjectwidth/Subjectleft working in the collector.
42 12 Feb 08 SHL Compile OpenWatcom version into binary
43 29 Feb 08 GKY Changes to enable user settable command line length
44 29 Feb 08 GKY Refactor global command line variables to notebook.h
45 08 Mar 08 JBS Ticket 230: Replace prefixless INI keys for default directory containers with
46 keys using a "DirCnr." prefix
47 20 Apr 08 GKY Change default cmd line length to 1024 Ask once if user wants to reset it.
48 11 Jul 08 JBS Ticket 230: Simplified code and eliminated some local variables by incorporating
49 all the details view settings (both the global variables and those in the
50 DIRCNRDATA struct) into a new struct: DETAILS_SETTINGS.
51 16 JUL 08 GKY Use TMP directory for temp files
52 17 Jul 08 SHL Reduce code bulk in fUseTmp setup
53 19 Jul 08 GKY Use pFM2SaveDirectory, MakeTempName and move temp files to TMP subdirectory if (TMP).
54 20 Jul 08 JBS Ticket 114: Support user-selectable env. strings in Tree container.
55 20 Jul 08 GKY Add support to delete orphaned tmp directories without deleting tmp of other
56 running sessions
57 23 Aug 08 GKY Check that space on TMP & FM2 save drives exceed 5 GiB; Done to allow user setting of
58 minimum size in future
59 29 Nov 08 GKY Remove or replace with a mutex semaphore DosEnterCriSec where appropriate.
60 30 Nov 08 GKY Add the option of creating a subdirectory from the arcname
61 for the extract path to arc container.
62 10 Dec 08 SHL Integrate exception handler support
63 25 Dec 08 GKY Add code to allow write verify to be turned off on a per drive basis
64 28 Dec 08 GKY Check for LVM.EXE and remove Refresh removable media menu item as appropriate
65 28 Dec 08 GKY Rework partition submenu to gray out unavailable items (check for existence of files)
66 and have no default choice.
67 01 Jan 09 GKY Add option to rescan tree container on eject of removable media
68 03 Jan 09 GKY Avoid dbl scan of drive on startup by checking for first rescan drive.
69 03 Jan 09 GKY Check for system that is protectonly to gray out Dos/Win command lines and prevent
70 Dos/Win programs from being inserted into the execute dialog with message why.
71 11 Jan 09 GKY Move strings that shouldn't be translated (font names etc) compile time variables
72 03 Feb 09 SHL Switch to STRINGTABLE
73 07 Feb 09 GKY Move repeated strings to PCSZs.
74 07 Feb 09 GKY Add *DateFormat functions to format dates based on locale
75 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
76 08 Mar 09 GKY Additional strings move to PCSZs in init.c
77 08 Mar 09 GKY Removed variable aurguments from docopyf and unlinkf (not used)
78 14 Mar 09 GKY PCSZ strings moved to compile time initialization
79 14 Mar 09 GKY Prevent execution of UM_SHOWME while drive scan is occuring replaces check for
80 saved drive containers.
81
82***********************************************************************/
83
84#include <stdlib.h>
85#include <string.h>
86#include <share.h>
87#include <process.h> // getpid
88#include <time.h>
89#include <ctype.h>
90
91#define INCL_DOS
92#define INCL_WIN
93#define INCL_MMIOOS2
94#define INCL_GPI
95#define INCL_DOSERRORS
96#define INCL_LONGLONG
97#define INCL_DOSNLS
98#include <os2.h>
99#include <os2me.h>
100
101#define DEFINE_GLOBALS 1
102
103#include "fm3dll.h"
104#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
105#include "init.h"
106#include "mkdir.h" // Data declaration(s)
107#include "dircnrs.h" // Data declaration(s)
108#include "comp.h" // Data declaration(s)
109#include "cmdline.h" // Data declaration(s)
110#include "fm2cmd.h" // Data declaration(s)
111#include "printer.h" // Data declaration(s)
112#include "flesh.h" // Data declaration(s)
113#include "worker.h" // Data declaration(s)
114#include "filldir.h" // Data declaration(s)
115#include "defview.h" // Data declaration(s)
116#include "draglist.h" // Data declaration(s)
117#include "fm3dlg.h"
118#include "datamin.h"
119#include "tools.h"
120#include "fm3str.h"
121#include "version.h"
122#include "pathutil.h" // BldFullPathName
123#include "arccnrs.h" // ArcClientWndProc
124#include "errutil.h" // Dos_Error...
125#include "strutil.h" // GetPString
126#include "valid.h" // ArgDriveFlags
127#include "autoview.h" // AutoViewProc
128#include "mainwnd.h" // BubbleProc, ChildButtonProc, DriveBackProc,
129 // DriveProc, LEDProc, MainWndProc, StatusProc
130 // ToolBackProc
131#include "collect.h" // CollectorClientWndProc, CollectorTextProc
132#include "getnames.h" // CustomFileDlg
133#include "notify.h" // EndNote
134#include "valid.h" // FillInDriveFlags, IsValidDir
135#include "inis.h" // IniProc
136#include "viewer.h" // MLEEditorProc
137#include "mainwnd2.h" // MainWndProc2
138#include "notify.h" // NotifyWndProc
139#include "treecnr.h" // OpenButtonProc
140#include "seeall.h" // SeeAllWndProc, SeeStatusProc
141#include "timer.h" // StartTimer, StopTimer
142#include "treecnr.h" // TreeClientWndProc, TreeStatProc
143#include "newview.h" // ViewStatusProc, ViewWndProc
144#include "subj.h" // Subject
145#include "select.h" // UnHilite
146#include "dirs.h" // save_dir
147#include "copyf.h" // unlinkf
148#include "wrappers.h" // xDosSetPathInfo
149#include "misc.h" // HeapThread, LoadDetailsSwitches
150#include "notebook.h" // command line variables (editor etc)
151#include "strips.h" // bstrip
152#include "killproc.h" // GetDosPgmName
153#include "srchpath.h" // searchpath
154#include "fortify.h"
155#include "excputil.h" // xbeginthread
156#include "systemf.h" // runemf2
157
158#ifdef __IBMC__
159#pragma alloc_text(INIT,LibMain,InitFM3DLL,DeInitFM3DLL)
160#pragma alloc_text(INIT1,StartFM3)
161#endif
162
163extern int _CRT_init(void);
164extern void _CRT_term(void);
165
166#ifdef __WATCOMC__
167#define a(x) #x
168#define b(x) a(x)
169// Must be global to prevent warnings
170PSZ pszBuiltWith = "Built with OpenWatcom version " b(__WATCOMC__);
171#undef b
172#undef a
173#endif
174
175static VOID FindSwapperDat(VOID);
176
177// Data definitions
178static PSZ pszSrcFile = __FILE__;
179unsigned __MaxThreads = {48};
180
181#pragma data_seg(GLOBAL1)
182HMTX hmtxFM2Delete;
183HMTX hmtxFM2Globals;
184ULONG OS2ver[2];
185PFNWP PFNWPCnr;
186PFNWP PFNWPMLE;
187CHAR ThousandsSeparator[2];
188CHAR DateSeparator[2];
189CHAR TimeSeparator[2];
190ULONG ulTimeFmt;
191ULONG ulDateFmt;
192BOOL fInitialDriveScan;
193BOOL fAmAV2;
194BOOL fChangeTarget;
195BOOL fIniExisted;
196BOOL fLogFile;
197BOOL fProtectOnly;
198BOOL fReminimize;
199BOOL fWantFirstTimeInit;
200//BOOL fDrivetoSkip[26];
201HPOINTER hptrApp;
202HPOINTER hptrArc;
203HPOINTER hptrArrow;
204HPOINTER hptrArt;
205HPOINTER hptrBusy;
206HPOINTER hptrCDROM;
207HPOINTER hptrDrive;
208HPOINTER hptrEW;
209HPOINTER hptrFloppy;
210HPOINTER hptrNS;
211HPOINTER hptrRamdisk;
212HPOINTER hptrRemote;
213HPOINTER hptrRemovable;
214HPOINTER hptrVirtual;
215HPOINTER hptrZipstrm;
216CHAR *pFM2SaveDirectory;
217CHAR *pTmpDir;
218
219#pragma data_seg(GLOBAL2)
220PCSZ PCSZ_ARCHIVERBB2 = "ARCHIVER.BB2";
221PCSZ PCSZ_ASSOCDAT = "ASSOC.DAT";
222PCSZ PCSZ_CMDLINESDAT = "CMDLINES.DAT";
223PCSZ PCSZ_CMDMINIDAT = "CMDMINI.DAT";
224PCSZ PCSZ_COMMANDSDAT = "COMMANDS.DAT";
225PCSZ PCSZ_FILTERSDAT = "FILTERS.DAT";
226PCSZ PCSZ_GREPMASKDAT = "GREPMASK.DAT";
227PCSZ PCSZ_PATTERNSDAT = "PATTERNS.DAT";
228PCSZ PCSZ_RESOURCEDAT = "RESOURCE.DAT";
229PCSZ PCSZ_QUICKTLSDAT = "QUICKTLS.DAT";
230PCSZ PCSZ_FM3TOOLSDAT = "FM3TOOLS.DAT";
231PCSZ PCSZ_USERDIRSDAT = "USERDIRS.DAT";
232PCSZ PCSZ_FM2PLAYEXE = "FM2PLAY.EXE";
233PCSZ PCSZ_FM2PLAYTEMP = "$FM2PLAY.$$$";
234PCSZ PCSZ_LVMGUICMD = "LVMGUI.CMD";
235PCSZ PCSZ_DFSOS2EXE = "DFSOS2.EXE";
236PCSZ PCSZ_MINILVMEXE = "MINILVM.EXE";
237PCSZ PCSZ_FDISKPMEXE = "FDISKPM.EXE";
238PCSZ PCSZ_LVMEXE = "LVM.EXE";
239PCSZ PCSZ_ARCCNR = "ArcCnr";
240PCSZ PCSZ_COLLECTOR = "Collector";
241PCSZ PCSZ_DIRCNR = "DirCnr";
242PCSZ PCSZ_DIRSIZES = "DirSizes";
243PCSZ PCSZ_TOOLBAR = "ToolBar";
244PCSZ PCSZ_TREECNR = "TreeCnr";
245PCSZ PCSZ_SHUTDOWNSTATE = "FM2Shutdown";
246PCSZ PCSZ_FM2TEMPTEXT = "FM/2_Temp";
247PCSZ DRF_FM2ARCHIVE = "DRF_FM2ARCHIVE";
248PCSZ DRMDRFFM2ARC = "<DRM_FM2ARCMEMBER,DRF_FM2ARCHIVE>";
249PCSZ DRMDRFOS2FILE = "<DRM_OS2FILE,DRF_UNKNOWN>";
250PCSZ DRM_FM2ARCMEMBER = "DRM_FM2ARCMEMBER";
251PCSZ DRM_OS2FILE = "DRM_OS2FILE";
252PCSZ FM2Str = "FM/2";
253HMODULE FM3DllHandle;
254PCSZ FM3Folder = "<FM3_Folder>";
255PCSZ FNT_6HELVETICA = "6.Helvetica";
256PCSZ FNT_8HELVETICA = "8.Helvetica";
257PCSZ FNT_8HELVETICABOLD = "8.Helvetica.Bold";
258PCSZ FNT_10SYSTEMMONOTEXT = "10.System Monospaced";
259PCSZ FNT_10SYSTEMPROPORT = "10.System Proportional";
260PCSZ FNT_2SYSTEMVIO = "2.System VIO";
261PCSZ FNT_4SYSTEMVIO = "4.System VIO";
262PCSZ FNT_10SYSTEMVIO = "10.System VIO";
263PCSZ FNT_8TIMESNEWROMAN = "8.Times New Roman";
264CHAR HomePath[CCHMAXPATH];
265PCSZ LONGNAME = ".LONGNAME";
266CHAR *NullStr = "";
267PCSZ PCSZ_CM_ALLOCRECORD = "CM_ALLOCRECORD";
268PCSZ PCSZ_DOSCREATEMUTEXSEM = "DosCreateMutexSem";
269PCSZ PCSZ_DOSDUPHANDLE = "DosDupHandle";
270PCSZ PCSZ_DOSGETINFOBLOCKS = "DosGetInfoBlocks";
271PCSZ PCSZ_DOSQUERYPATHINFO = "DosQueryPathInfo";
272PCSZ PCSZ_DOSSEARCHPATH = "DosSearchPath";
273PCSZ PCSZ_DRGACCESSDRAGINFO = "DrgAccessDraginfo";
274PCSZ PCSZ_POSTMSG = "PostMsg";
275PCSZ PCSZ_WINCREATEWINDOW = "WinCreateWindow";
276PCSZ PCSZ_WINLOADACCELTABLE = "WinLoadAccelTable";
277PCSZ PCSZ_WINSETACCELTABLE = "WinSetAccelTable";
278PCSZ PCSZ_INIQUERYPRFTEXT = "PrfQueryProfile";
279PCSZ PCSZ_PRFOPENPROFILEFAILED = "PrfOpenProfile failed for %s";
280PCSZ PCSZ_PRFQUERYPROFILEDATA = "PrfQueryProfileData";
281PCSZ PCSZ_PRFQUERYPROFILESIZE = "PrfQueryProfileSize";
282PCSZ PCSZ_PRFQUERYPROFILESTRING = "PrfQueryProfileString";
283PCSZ PCSZ_FILLDIRQCURERRTEXT = "DosQCurDisk";
284PCSZ PCSZ_NODATA = "No Data";
285PCSZ PCSZ_STARDOTEXE = "*.EXE";
286PCSZ PCSZ_STARDOTINI = "*.INI";
287PCSZ PCSZ_STARDOTLST = "*.LST";
288PCSZ PCSZ_STARDOTPMD = "*.PMD";
289PCSZ PCSZ_STARDOTTXT = "*.TXT";
290PCSZ PCSZ_DOTEXE = ".EXE";
291PCSZ PCSZ_DOTCOM = ".COM";
292PCSZ PCSZ_DOTCMD = ".CMD";
293PCSZ PCSZ_DOTBTM = ".BTM";
294PCSZ PCSZ_DOTBAT = ".BAT";
295PCSZ PCSZ_DOTLST = ".LST";
296PCSZ PCSZ_DOTTLS = ".TLS";
297PCSZ PCSZ_DOTHLP = ".HLP";
298PCSZ PCSZ_DOTINF = ".INF";
299PCSZ PCSZ_DOTMP3 = ".MP3";
300PCSZ PCSZ_DOTOGG = ".OGG";
301PCSZ PCSZ_DOTFLAC = ".FLAC";
302PCSZ PCSZ_DOTJPEG = ".JPEG";
303PCSZ PCSZ_DOTJPG = ".JPG";
304PCSZ PCSZ_DOTICO = ".ICO";
305PCSZ PCSZ_DOTPTR = ".PTR";
306PCSZ PCSZ_DOTBB2 = ".BB2";
307PCSZ PCSZ_DOTBMP = ".BMP";
308PCSZ PCSZ_DOTCOMMENTS = ".COMMENTS";
309PCSZ PCSZ_PATH = "PATH";
310PCSZ PCSZ_LIBPATH = "LIBPATH";
311CHAR *pLibPathStrict = "SET LIBPATHSTRICT=TRUE";
312PCSZ PCSZ_WPURLDEFAULTSETTINGS = "WPURLDEFAULTSETTINGS";
313PCSZ Settings = "SETTINGS";
314PCSZ Details = "DETAILS";
315PCSZ PCSZ_TREE = "TREE";
316PCSZ PCSZ_ICON = "ICON";
317CHAR SwapperDat[CCHMAXPATH];
318PCSZ WC_OBJECTWINDOW = "WC_OBJECTWINDOW";
319PCSZ WC_BUBBLE = "WC_BUBBLE";
320PCSZ WC_TOOLBUTTONS = "WC_TOOLBUTTONS";
321PCSZ WC_DRIVEBUTTONS = "WC_DRIVEBUTTONS";
322PCSZ WC_DIRCONTAINER = "WC_DIRCONTAINER";
323PCSZ WC_DIRSTATUS = "WC_DIRSTATUS";
324PCSZ WC_TREECONTAINER = "WC_TREECONTAINER";
325PCSZ WC_TREEOPENBUTTON = "WC_TREEOPENBUTTON";
326PCSZ WC_TREESTATUS = "WC_TREESTATUS";
327PCSZ WC_MAINWND = "WC_MAINWND";
328PCSZ WC_MAINWND2 = "WC_MAINWND2";
329PCSZ WC_AUTOVIEW = "WC_AUTOVIEW";
330PCSZ WC_LED = "WC_LED";
331PCSZ WC_COLLECTOR = "WC_COLLECTOR";
332PCSZ WC_COLSTATUS = "WC_COLSTATUS";
333PCSZ WC_STATUS = "WC_STATUS";
334PCSZ WC_TOOLBACK = "WC_TOOLBACK";
335PCSZ WC_DRIVEBACK = "WC_DRIVEBACK";
336PCSZ WC_ARCCONTAINER = "WC_ARCCONTAINER";
337PCSZ WC_ARCSTATUS = "WC_ARCSTATUS";
338PCSZ WC_MLEEDITOR = "WC_MLEEDITOR";
339PCSZ WC_INIEDITOR = "WC_INIEDITOR";
340PCSZ WC_SEEALL = "WC_SEEALL";
341PCSZ WC_NEWVIEW = "WC_NEWVIEW";
342PCSZ WC_SEESTATUS = "WC_SEESTATUS";
343PCSZ WC_VIEWSTATUS = "WC_VIEWSTATUS";
344PCSZ WC_ERRORWND = "WC_ERRORWND";
345PCSZ WC_MINITIME = "WC_MINITIME";
346PCSZ WC_DATABAR = "WC_DATABAR";
347CHAR profile[CCHMAXPATH];
348ULONGLONG ullTmpSpaceNeeded;
349
350BOOL CheckFileHeader(CHAR *filespec, CHAR *signature, LONG offset);
351
352VOID FindSwapperDat(VOID)
353{
354 CHAR filename[] = "C:\\CONFIG.SYS";
355 CHAR input[8192];
356 CHAR *p;
357 CHAR *pp;
358 FILE *fp;
359 FILEFINDBUF3L ffb;
360 ULONG nm;
361 ULONG size = sizeof(SwapperDat);
362 HDIR hdir = HDIR_CREATE;
363 APIRET rc = 1;
364
365 *SwapperDat = 0;
366 // Check already known
367 PrfQueryProfileData(fmprof, FM3Str, "SwapperDat", SwapperDat, &size);
368 if (*SwapperDat) {
369 nm = 1;
370 rc = DosFindFirst(SwapperDat,
371 &hdir,
372 FILE_NORMAL | FILE_ARCHIVED |
373 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
374 &ffb, sizeof(ffb), &nm, FIL_STANDARDL);
375 if (rc && rc != ERROR_FILE_NOT_FOUND && rc != ERROR_PATH_NOT_FOUND) {
376 FILEFINDBUF3 ffb;
377 rc = DosFindFirst(SwapperDat,
378 &hdir,
379 FILE_NORMAL | FILE_ARCHIVED |
380 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
381 &ffb, sizeof(ffb), &nm, FIL_STANDARD);
382 fNoLargeFileSupport = TRUE;
383 }
384 if (!rc) {
385 DosFindClose(hdir);
386 fp = fopen(SwapperDat, "r");
387 if (fp) {
388 fclose(fp);
389 *SwapperDat = 0;
390 rc = 1; // Force config.sys scan
391 }
392 }
393 else
394 *SwapperDat = 0;
395 }
396 // If not defined in INI or INI wrong, scan config.sys for SWAPPATH statement
397 if (rc) {
398 if (DosQuerySysInfo(QSV_BOOT_DRIVE,
399 QSV_BOOT_DRIVE,
400 &nm,
401 sizeof(ULONG))) {
402 nm = 3; // Assume drive C:
403 }
404 *filename = (CHAR) nm + '@';
405 fp = xfsopen(filename, "r", SH_DENYNO, pszSrcFile, __LINE__);
406 if (fp) {
407 while (!feof(fp)) {
408 if (!xfgets(input, sizeof(input), fp, pszSrcFile, __LINE__))
409 break;
410 lstrip(input);
411 if (!strnicmp(input, "SWAPPATH", 8)) {
412 p = input + 8;
413 while (*p == ' ')
414 p++;
415 if (*p == '=') {
416 p++;
417 stripcr(p);
418 rstrip(p);
419 while (*p == ' ')
420 p++;
421 if (*p == '\"') {
422 p++;
423 pp = p;
424 while (*pp && *pp != '\"')
425 *pp += 1;
426 if (*pp)
427 *pp = 0;
428 }
429 else {
430 pp = strchr(p, ' ');
431 if (pp)
432 *pp = 0;
433 }
434 if (*p) {
435 strncpy(SwapperDat, p, CCHMAXPATH);
436 SwapperDat[CCHMAXPATH - 1] = 0;
437 BldFullPathName(SwapperDat, SwapperDat, "SWAPPER.DAT");
438 hdir = HDIR_CREATE;
439 nm = 1;
440 rc = DosFindFirst(SwapperDat,
441 &hdir,
442 FILE_NORMAL | FILE_ARCHIVED |
443 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
444 &ffb, sizeof(ffb), &nm, FIL_STANDARD);
445 if (rc){
446 FILEFINDBUF3 ffb;
447 rc = DosFindFirst(SwapperDat,
448 &hdir,
449 FILE_NORMAL | FILE_ARCHIVED |
450 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
451 &ffb, sizeof(ffb), &nm, FIL_STANDARD);
452 fNoLargeFileSupport = TRUE;
453 }
454 if (!rc) {
455 DosFindClose(hdir);
456 PrfWriteProfileString(fmprof,
457 FM3Str, "SwapperDat", SwapperDat);
458 }
459 else
460 *SwapperDat = 0;
461 break;
462 }
463 }
464 } // if SWAPPATH
465 } // while
466 fclose(fp);
467 }
468 }
469}
470
471#ifdef __WATCOMC__
472
473unsigned APIENTRY LibMain(unsigned hModule,
474 unsigned ulFlag)
475{
476 switch (ulFlag) {
477 case 0:
478 FM3DllHandle = hModule;
479
480 DosError(FERR_DISABLEHARDERR);
481 memset(&RGBBLACK, 0, sizeof(RGB2));
482 RGBGREY.bRed = RGBGREY.bGreen = RGBGREY.bBlue = (BYTE)204;
483 RGBGREY.fcOptions = 0;
484 FM3UL = *(ULONG *)FM3Str;
485 break;
486 case 1:
487 StopPrinting = 1;
488 if (fmprof)
489 PrfCloseProfile(fmprof);
490 DosError(FERR_ENABLEHARDERR);
491 break;
492 default:
493 return 0UL;
494 }
495 return 1UL;
496}
497
498#else // __IBMC__
499
500unsigned long _System _DLL_InitTerm(unsigned long hModule,
501 unsigned long ulFlag)
502{
503 switch (ulFlag) {
504 case 0:
505 if (_CRT_init() == -1)
506 return 0UL;
507 FM3DllHandle = hModule;
508
509 DosError(FERR_DISABLEHARDERR);
510 /* strings here to prevent multiple occurences in DLL */
511 FM2Str = "FM/2";
512 FM3Str = "FM/3";
513 NullStr = "";
514 Default = "DEFAULT";
515 Settings = "SETTINGS";
516 WPProgram = "WPProgram";
517 FM3Folder = "<FM3_Folder>";
518 FM3Tools = "<FM3_Tools>";
519 DRM_OS2FILE = "DRM_OS2FILE";
520 DRM_FM2ARCMEMBER = "DRM_FM2ARCMEMBER";
521 DRF_FM2ARCHIVE = "DRF_FM2ARCHIVE";
522 DRMDRFLIST = "<DRM_OS2FILE,DRF_UNKNOWN>,"
523 "<DRM_DISCARD,DRF_UNKNOWN>," "<DRM_PRINT,DRF_UNKNOWN>";
524 DRMDRFOS2FILE = "<DRM_OS2FILE,DRF_UNKNOWN>";
525 DRMDRFFM2ARC = "<DRM_FM2ARCMEMBER,DRF_FM2ARCHIVE>";
526 DRM_FM2INIRECORD = "DRM_FM2INIRECORD";
527 DRF_FM2INI = "DRF_FM2INI";
528 SUBJECT = ".SUBJECT";
529 LONGNAME = ".LONGNAME";
530 HPFS = "HPFS";
531 JFS = "JFS";
532 CDFS = "CDFS";
533 ISOFS = "ISOFS";
534 FAT32 = "FAT32";
535 HPFS386 = "HPFS386";
536 CBSIFS = "CBSIFS";
537 NDFS32 = "NDFS32";
538 RAMFS = "RAMFS";
539 NTFS = "NTFS";
540 PCSZ_ARCHIVERBB2 = "ARCHIVER.BB2";
541 PCSZ_ASSOCDAT = "ASSOC.DAT";
542 PCSZ_CMDLINESDAT = "CMDLINES.DAT";
543 PCSZ_CMDMINIDAT = "CMDMINI.DAT";
544 PCSZ_COMMANDSDAT = "COMMANDS.DAT";
545 PCSZ_FILTERSDAT = "FILTERS.DAT";
546 PCSZ_GREPMASKDAT = "GREPMASK.DAT";
547 PCSZ_PATTERNSDAT = "PATTERNS.DAT";
548 PCSZ_RESOURCEDAT = "RESOURCE.DAT";
549 PCSZ_QUICKTLSDAT = "QUICKTLS.DAT";
550 PCSZ_FM3TOOLSDAT = "FM3TOOLS.DAT";
551 PCSZ_USERDIRSDAT = "USERDIRS.DAT";
552 PCSZ_FM2PLAYEXE = "FM2PLAY.EXE";
553 PCSZ_FM2PLAYTEMP = "$FM2PLAY.$$$";
554 FNT_6HELVETICA = "6.Helvetica";
555 FNT_8HELVETICA = "8.Helvetica";
556 FNT_8HELVETICABOLD = "8.Helvetica.Bold";
557 FNT_10SYSTEMMONOTEXT = "10.System Monospaced";
558 FNT_10SYSTEMPROPORT = "10.System Proportional";
559 FNT_2SYSTEMVIO = "2.System VIO";
560 FNT_4SYSTEMVIO = "4.System VIO";
561 FNT_10SYSTEMVIO = "10.System VIO";
562 FNT_8TIMESNEWROMAN = "8.Times New Roman";
563 PCSZ_DOSCREATEMUTEXSEM = "DosCreateMutexSem";
564 PCSZ_DOSDUPHANDLE = "DosDupHandle";
565 PCSZ_DOSGETINFOBLOCKS = "DosGetInfoBlocks";
566 PCSZ_DOSQUERYPATHINFO = "DosQueryPathInfo";
567 PCSZ_DOSSEARCHPATH = "DosSearchPath";
568 PCSZ_WINCREATEWINDOW = "WinCreateWindow";
569 PCSZ_WINLOADACCELTABLE = "WinLoadAccelTable";
570 PCSZ_WINSETACCELTABLE = "WinSetAccelTable";
571 PCSZ_INIQUERYPRFTEXT = "PrfQueryProfile";
572 PCSZ_PRFQUERYPROFILEDATA = "PrfQueryProfileData";
573 PCSZ_PRFQUERYPROFILESIZE = "PrfQueryProfileSize";
574 PCSZ_PRFQUERYPROFILESTRING = "PrfQueryProfileString";
575 PCSZ_FILLDIRQCURERRTEXT = "DosQCurDisk";
576 PCSZ_NODATA = "No Data";
577 PCSZ_STARDOTEXE = "*.EXE";
578 PCSZ_STARDOTINI = "*.INI";
579 PCSZ_STARDOTLST = "*.LST";
580 PCSZ_STARDOTPMD = "*.PMD";
581 PCSZ_STARDOTTXT = "*.TXT";
582 PCSZ_DOTEXE = ".EXE";
583 PCSZ_DOTCOM = ".COM";
584 PCSZ_DOTCMD = ".CMD";
585 PCSZ_DOTBTM = ".BTM";
586 PCSZ_DOTBAT = ".BAT";
587 PCSZ_DOTLST = ".LST";
588 PCSZ_DOTTLS = ".TLS";
589 PCSZ_DOTHLP = ".HLP";
590 PCSZ_DOTINF = ".INF";
591 PCSZ_DOTMP3 = ".MP3";
592 PCSZ_DOTOGG = ".OGG";
593 PCSZ_DOTFLAC = ".FLAC";
594 PCSZ_DOTJPEG = ".JPEG";
595 PCSZ_DOTJPG = ".JPG";
596 PCSZ_DOTICO = ".ICO";
597 PCSZ_DOTPTR = ".PTR";
598 PCSZ_DOTBB2 = ".BB2";
599 PCSZ_DOTBMP = ".BMP";
600 PCSZ_DOTCOMMENTS = ".COMMENTS";
601 PCSZ_PATH = "PATH";
602 WC_OBJECTWINDOW = "WC_OBJECTWINDOW";
603 WC_BUBBLE = "WC_BUBBLE";
604 WC_TOOLBUTTONS = "WC_TOOLBUTTONS";
605 WC_DRIVEBUTTONS = "WC_DRIVEBUTTONS";
606 WC_DIRCONTAINER = "WC_DIRCONTAINER";
607 WC_DIRSTATUS = "WC_DIRSTATUS";
608 WC_TREECONTAINER = "WC_TREECONTAINER";
609 WC_TREEOPENBUTTON = "WC_TREEOPENBUTTON";
610 WC_TREESTATUS = "WC_TREESTATUS";
611 WC_MAINWND = "WC_MAINWND";
612 WC_MAINWND2 = "WC_MAINWND2";
613 WC_AUTOVIEW = "WC_AUTOVIEW";
614 WC_LED = "WC_LED";
615 WC_COLLECTOR = "WC_COLLECTOR";
616 WC_COLSTATUS = "WC_COLSTATUS";
617 WC_STATUS = "WC_STATUS";
618 WC_TOOLBACK = "WC_TOOLBACK";
619 WC_DRIVEBACK = "WC_DRIVEBACK";
620 WC_ARCCONTAINER = "WC_ARCCONTAINER";
621 WC_ARCSTATUS = "WC_ARCSTATUS";
622 WC_MLEEDITOR = "WC_MLEEDITOR";
623 WC_INIEDITOR = "WC_INIEDITOR";
624 WC_SEEALL = "WC_SEEALL";
625 WC_NEWVIEW = "WC_NEWVIEW";
626 WC_SEESTATUS = "WC_SEESTATUS";
627 WC_VIEWSTATUS = "WC_VIEWSTATUS";
628 WC_ERRORWND = "WC_ERRORWND";
629 WC_MINITIME = "WC_MINITIME";
630 WC_DATABAR = "WC_DATABAR";
631
632 /* end of strings */
633 memset(&RGBBLACK, 0, sizeof(RGB2));
634 RGBGREY.bRed = RGBGREY.bGreen = RGBGREY.bBlue = (BYTE)204;
635 RGBGREY.fcOptions = 0;
636 FM3UL = *(ULONG *)FM3Str;
637 break;
638 case 1:
639 StopPrinting = 1;
640 if (fmprof)
641 PrfCloseProfile(fmprof);
642 DosError(FERR_ENABLEHARDERR);
643 _CRT_term();
644 break;
645 default:
646 return 0UL;
647 }
648 return 1UL;
649}
650
651#endif // __IBMC__
652
653VOID APIENTRY DeInitFM3DLL(ULONG why)
654{
655 /* cleanup */
656 static CHAR s[CCHMAXPATH];
657 CHAR *enddir, szTempFile[CCHMAXPATH];
658 HDIR search_handle;
659 ULONG num_matches;
660 FILEFINDBUF3 ffb;
661
662 StopTimer();
663 StopPrinting = 1;
664
665 if (LogFileHandle)
666 fclose(LogFileHandle);
667
668 if (fmprof) {
669 PrfCloseProfile(fmprof);
670 fmprof = (HINI) 0;
671 if (fIniExisted) {
672 DosError(FERR_DISABLEHARDERR);
673 DosCopy("FM3.INI", "FM3INI.BAK", DCPY_EXISTING);
674 }
675 }
676
677 if (fToolsChanged)
678 save_tools(NULL);
679
680# ifdef __IBMC__
681 _fcloseall();
682# else // __WATCOMC__
683 fcloseall();
684# endif
685
686 save_dir(s);
687 if (s[strlen(s) - 1] != '\\')
688 strcat(s, "\\");
689 enddir = &s[strlen(s)];
690 if (*ArcTempRoot) {
691 strcat(s, ArcTempRoot);
692 strcat(s, "*");
693 search_handle = HDIR_CREATE;
694 num_matches = 1L;
695 if (!DosFindFirst(s,
696 &search_handle,
697 FILE_NORMAL | FILE_DIRECTORY |
698 FILE_SYSTEM | FILE_READONLY | FILE_HIDDEN |
699 FILE_ARCHIVED,
700 &ffb, sizeof(ffb), &num_matches, FIL_STANDARD)) {
701 do {
702 strcpy(enddir, ffb.achName);
703 if (ffb.attrFile & FILE_DIRECTORY) {
704 wipeallf("%s\\*", s);
705 DosDeleteDir(s);
706 }
707 else
708 unlinkf(s);
709 }
710 while (!DosFindNext(search_handle,
711 &ffb, sizeof(ffb), &num_matches));
712 DosFindClose(search_handle);
713 }
714 }
715 if (pTmpDir)
716 strcpy(s, pTmpDir);
717 else
718 strcpy(s, pFM2SaveDirectory);
719 if (s[strlen(s) - 1] != '\\')
720 strcat(s, "\\");
721 enddir = &s[strlen(s)];
722 strcat(s, "$FM2LI$T.");
723 strcat(s, "???");
724 search_handle = HDIR_CREATE;
725 num_matches = 1;
726 if (!DosFindFirst(s,
727 &search_handle,
728 FILE_NORMAL | FILE_DIRECTORY |
729 FILE_SYSTEM | FILE_READONLY | FILE_HIDDEN |
730 FILE_ARCHIVED,
731 &ffb, sizeof(ffb), &num_matches, FIL_STANDARD)) {
732 do {
733 if (!(ffb.attrFile & FILE_DIRECTORY)) {
734 strcpy(enddir, ffb.achName);
735 unlinkf(s);
736 }
737 }
738 while (!DosFindNext(search_handle,
739 &ffb, sizeof(ffb), &num_matches));
740 DosFindClose(search_handle);
741 }
742 BldFullPathName(szTempFile, pTmpDir, PCSZ_FM2PLAYTEMP);
743 DosForceDelete(szTempFile);
744 if (pTmpDir) {
745 wipeallf("%s\\*", pTmpDir);
746 DosDeleteDir(pTmpDir);
747 }
748 EndNote();
749 if (FM3ModHandle)
750 DosFreeModule(FM3ModHandle);
751
752 DosExitList(EXLST_REMOVE, DeInitFM3DLL);
753}
754
755BOOL InitFM3DLL(HAB hab, int argc, char **argv)
756{
757 /*
758 * this function should be called by any application using this DLL right
759 * after setting up a message queue
760 */
761
762 CLASSINFO clinfo;
763 APIRET rc;
764 APIRET rcl;
765 APIRET rcq;
766 PFN pfnResVersion;
767 ULONG RVMajor;
768 ULONG RVMinor;
769 ULONG ret;
770 FILESTATUS3 fs3;
771 PSZ env;
772 CHAR dllfile[CCHMAXPATH];
773 ULONG size;
774
775 strcpy(dllfile, "FM3RES");
776 env = getenv("FM3INI");
777 if (env) {
778 DosError(FERR_DISABLEHARDERR);
779 rc = DosQueryPathInfo(env, FIL_STANDARD, &fs3, sizeof(fs3));
780 if (!rc) {
781 if (fs3.attrFile & FILE_DIRECTORY) {
782 BldFullPathName(dllfile, env, "FM3RES"); // 23 Aug 07 SHL
783 DosError(FERR_DISABLEHARDERR);
784 if (DosQueryPathInfo(dllfile, FIL_STANDARD, &fs3, sizeof(fs3)))
785 strcpy(dllfile, "FM3RES");
786 }
787 }
788 }
789
790 rcl = DosLoadModule(NULL, 0, dllfile, &FM3ModHandle);
791 if (rcl) {
792 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
793 HWND_DESKTOP,
794 GetPString(IDS_ERRORTEXT), GetPString(IDS_FM3RESERROR1TEXT));
795 return FALSE;
796 }
797
798 rc = DosExitList(EXLST_ADD, DeInitFM3DLL);
799 if (rc) {
800 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
801 "DosExitList");
802 }
803
804 rcq = DosQueryProcAddr(FM3ModHandle, 1, "ResVersion", &pfnResVersion);
805 if (!rcq)
806 ret = pfnResVersion(&RVMajor, &RVMinor);
807 else {
808 ret = 0;
809 RVMajor = 0;
810 RVMinor = 0;
811 }
812
813 if (RVMajor < VERMAJOR || (RVMajor == VERMAJOR && RVMinor < VERMINOR)) {
814 saymsg(MB_ENTER,
815 HWND_DESKTOP,
816 GetPString(IDS_ERRORTEXT),
817 GetPString(IDS_FM3RESERROR2TEXT),
818 !rcq ?
819 GetPString(IDS_FM3RESERROR3TEXT) :
820 !rcl ?
821 GetPString(IDS_FM3RESERROR4TEXT) :
822 GetPString(IDS_FM3RESERROR5TEXT), RVMajor, RVMinor, rcl, rcq, ret);
823 return FALSE;
824 }
825
826 if (!*profile)
827 strcpy(profile, "FM3.INI");
828 mypid = getpid();
829 /* give default appname if none set by caller */
830 if (!*appname)
831 strcpy(appname, FM3Str);
832 /* save appname; may be reset below */
833 strcpy(realappname, appname);
834 if (!strcmp(appname, FM3Str))
835 DosSetMaxFH(100);
836 else if (!strcmp(appname, "VDir") ||
837 !strcmp(appname, "VTree") ||
838 !strcmp(appname, "VCollect") ||
839 !strcmp(appname, "SEEALL") || !strcmp(appname, "FM/4"))
840 DosSetMaxFH(60);
841 else
842 DosSetMaxFH(40);
843
844 if (DosQuerySysInfo(QSV_VERSION_MAJOR,
845 QSV_VERSION_MINOR,
846 OS2ver,
847 sizeof(OS2ver))) {
848 OS2ver[0] = 2;
849 OS2ver[1] = 1;
850 }
851
852 // set up default root names for temp file storage and archive goodies
853 env = getenv("TMP");
854 if (env == NULL)
855 env = getenv("TEMP");
856 if (env != NULL) {
857 DosError(FERR_DISABLEHARDERR);
858 rc = DosQueryPathInfo(env, FIL_STANDARD, &fs3, sizeof(fs3));
859 if (!rc) {
860 CHAR *enddir, *p, szTempName[CCHMAXPATH], temp[CCHMAXPATH];
861 FILEFINDBUF3 ffb;
862 HDIR search_handle;
863 ULONG num_matches, ul;
864
865 strcpy(szTempName, env);
866 if (szTempName[strlen(szTempName) - 1] != '\\')
867 strcat(szTempName, "\\");
868 enddir = &szTempName[strlen(szTempName)];
869 strcat(szTempName, "$FM2????.");
870 strcat(szTempName, "???");
871 search_handle = HDIR_CREATE;
872 num_matches = 1;
873 if (!DosFindFirst(szTempName,
874 &search_handle,
875 FILE_NORMAL | FILE_DIRECTORY |
876 FILE_SYSTEM | FILE_READONLY | FILE_HIDDEN |
877 FILE_ARCHIVED,
878 &ffb, sizeof(ffb), &num_matches, FIL_STANDARD)) {
879 do {
880 strcpy(enddir, ffb.achName);
881 p = strrchr(szTempName, '.');
882 if (p) {
883 p++;
884 ul = strtol(p, &p + 2, 16);
885 GetDosPgmName(ul, temp);
886 if (!strstr(temp, "FM/2") &&
887 !strstr(temp, "AV/2")) {
888 wipeallf("%s\\*", szTempName);
889 DosDeleteDir(szTempName);
890 }
891 }
892 }
893 while (!DosFindNext(search_handle,
894 &ffb, sizeof(ffb), &num_matches));
895 DosFindClose(search_handle);
896 }
897 if (fs3.attrFile & FILE_DIRECTORY) {
898 strcpy(szTempName, env);
899 MakeTempName(szTempName, NULL, 1);
900 rc = DosCreateDir(szTempName, 0);
901 if (!rc)
902 pTmpDir = xstrdup(szTempName, pszSrcFile, __LINE__); // if writable
903 }
904 }
905 }
906
907 //Save the FM2 save directory name. This is the location of the ini, dat files etc.
908 {
909 CHAR temp[CCHMAXPATH];
910 save_dir2(temp);
911 pFM2SaveDirectory = xstrdup(temp, pszSrcFile, __LINE__);
912 }
913 // Check free space on TMP and FM2 Save drives
914 {
915 ullTmpSpaceNeeded = 5120000;
916 if (pTmpDir && CheckDriveSpaceAvail(pTmpDir, ullTmpSpaceNeeded, 0) == 1) {
917 if (CheckDriveSpaceAvail(pFM2SaveDirectory, ullTmpSpaceNeeded, 0) == 0){
918 ret = saymsg(MB_YESNO,
919 HWND_DESKTOP,
920 NullStr,
921 GetPString(IDS_TMPDRIVESPACELIMITED),
922 pTmpDir);
923 if (ret == MBID_YES)
924 pTmpDir = pFM2SaveDirectory;
925 }
926 else
927 saymsg(MB_OK,
928 HWND_DESKTOP,
929 NullStr,
930 GetPString(IDS_SAVETMPDRIVESPACELIMITED),
931 pTmpDir,
932 pFM2SaveDirectory);
933 }
934 else if (CheckDriveSpaceAvail(pFM2SaveDirectory, ullTmpSpaceNeeded, 0) == 1)
935 saymsg(MB_OK,
936 HWND_DESKTOP,
937 NullStr,
938 GetPString(IDS_SAVEDRIVESPACELIMITED),
939 pFM2SaveDirectory);
940 }
941 BldFullPathName(ArcTempRoot, pTmpDir, fAmAV2 ? "$AV$ARC$" : "$FM$ARC$");
942
943 // initialize random number generator
944 srand(time(NULL) + clock());
945
946 priority_bumped();
947
948 /* _heapmin() is done in a separate thread -- start it */
949 if (xbeginthread(HeapThread,
950 32768,
951 MPVOID,
952 pszSrcFile,
953 __LINE__) == -1) {
954 return FALSE;
955 }
956
957 /* timer messages are sent from a separate thread -- start it */
958 if (!StartTimer()) {
959 Runtime_Error(pszSrcFile, __LINE__,
960 GetPString(IDS_COULDNTSTARTTHREADTEXT));
961 return FALSE;
962 }
963
964 /* Are we the workplace shell? */
965 env = getenv("WORKPLACE_PROCESS");
966 fWorkPlace = env != NULL &&
967 (stricmp(env, "YES") == 0 || atoi(env) == 1);
968
969 if ((!strchr(profile, '\\') && !strchr(profile, ':')) ||
970 !(fmprof = PrfOpenProfile((HAB)0, profile)))
971 {
972 /* figure out where to put INI file... */
973 CHAR inipath[CCHMAXPATH];
974
975 DosError(FERR_DISABLEHARDERR);
976 strcpy(HomePath, pFM2SaveDirectory);
977 DosError(FERR_DISABLEHARDERR);
978 memset(driveserial, -1, sizeof(driveserial));
979 *inipath = 0;
980 env = getenv("FM3INI");
981 if (env) {
982 strcpy(inipath, env);
983 DosError(FERR_DISABLEHARDERR);
984 rc = DosQueryPathInfo(inipath, FIL_STANDARD, &fs3, sizeof(fs3));
985 if (!rc) {
986 if (fs3.attrFile & FILE_DIRECTORY)
987 BldFullPathName(inipath, inipath, profile);
988 }
989 }
990 if (!env) {
991 env = searchpath(profile);
992 if (!env)
993 env = profile;
994 strcpy(inipath, env);
995 }
996
997 /* in some odd cases the INI file can get set to readonly status */
998 /* here we test it and reset the readonly bit if necessary */
999 if (!*inipath)
1000 strcpy(inipath, profile);
1001 DosError(FERR_DISABLEHARDERR);
1002 // fixme to check for backup if ini not found GKY 1-30-09
1003 rc = DosQueryPathInfo(inipath, FIL_STANDARD, &fs3, sizeof(fs3));
1004 if (rc) {
1005 if (rc == ERROR_FILE_NOT_FOUND)
1006 fWantFirstTimeInit = TRUE;
1007 }
1008 else { //Check the ini file header and restore from backup if corupted
1009 if (!CheckFileHeader(inipath, "\xff\xff\xff\xff\x14\x00\x00\x00", 0L)) {
1010 saymsg(MB_ENTER,HWND_DESKTOP, GetPString(IDS_DEBUG_STRING),
1011 GetPString(IDS_INIFAILURETEXT));
1012 DosCopy("FM3.INI", "FM3INI.BAD", DCPY_EXISTING);
1013 DosCopy("FM3INI.BAK", "FM3.INI", DCPY_EXISTING);
1014 if (!CheckFileHeader(inipath, "\xff\xff\xff\xff\x14\x00\x00\x00", 0L)) {
1015 DosCopy("FM3.INI", "FM3INI2.BAD", DCPY_EXISTING);
1016 fWantFirstTimeInit = TRUE;
1017 }
1018 }
1019 if (!fWantFirstTimeInit) {
1020 fIniExisted = TRUE;
1021 if (fs3.attrFile & (FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM)) {
1022 fs3.attrFile &= ~(FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM);
1023 rc = xDosSetPathInfo(inipath, FIL_STANDARD, &fs3, sizeof(fs3), 0);
1024 if (rc) {
1025 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1026 GetPString(IDS_INIREADONLYTEXT), inipath);
1027 }
1028 }
1029 }
1030 }
1031 fmprof = PrfOpenProfile((HAB)0, inipath);
1032 if (!fmprof) {
1033 strcpy(inipath, "FM3.INI");
1034 fmprof = PrfOpenProfile((HAB)0, inipath);
1035 }
1036
1037 // 10 Jan 08 SHL fixme to do first time if new ini
1038 // 10 Jan 08 SHL post UM_FIRSTTIME to main window
1039 if (!fmprof) {
1040 Win_Error(NULLHANDLE, NULLHANDLE, pszSrcFile, __LINE__,
1041 PCSZ_PRFOPENPROFILEFAILED, inipath);
1042 return FALSE;
1043 }
1044 }
1045
1046 ArgDriveFlags(argc, argv);
1047 FillInDriveFlags(NULL);
1048
1049 FindSwapperDat();
1050
1051 size = sizeof(BOOL);
1052 PrfQueryProfileData(fmprof,
1053 FM3Str,
1054 "SeparateParms",
1055 &fSeparateParms,
1056 &size);
1057 if (!fSeparateParms)
1058 strcpy(appname, FM3Str);
1059
1060 /* start help */
1061 memset(&hini, 0, sizeof(HELPINIT));
1062 hini.cb = sizeof(HELPINIT);
1063 hini.ulReturnCode = 0;
1064 hini.pszTutorialName = NULL;
1065 hini.phtHelpTable = (PHELPTABLE) MAKELONG(ID_HELPTABLE, 0xffff);
1066 hini.hmodAccelActionBarModule = (HMODULE) 0;
1067 hini.idAccelTable = 0;
1068 hini.idActionBar = 0;
1069 hini.pszHelpWindowTitle = (PSZ)GetPString(IDS_FM2HELPTITLETEXT);
1070 hini.fShowPanelId = CMIC_HIDE_PANEL_ID;
1071 hini.pszHelpLibraryName = "FM3.HLP";
1072 hwndHelp = WinCreateHelpInstance(hab, &hini);
1073 if (!hwndHelp) {
1074 static CHAR helppath[CCHMAXPATH]; // fixme to be local?
1075
1076 env = getenv("FM3INI");
1077 if (env) {
1078 strcpy(helppath, env);
1079 DosError(FERR_DISABLEHARDERR);
1080 rc = DosQueryPathInfo(helppath, FIL_STANDARD, &fs3, sizeof(fs3));
1081 if (!rc) {
1082 if (fs3.attrFile & FILE_DIRECTORY) {
1083 BldFullPathName(helppath, helppath, "FM3.HLP");
1084 hini.pszHelpLibraryName = helppath;
1085 hwndHelp = WinCreateHelpInstance(hab, &hini);
1086 }
1087 }
1088 }
1089 }
1090 if (!hwndHelp) {
1091 saymsg(MB_ENTER | MB_ICONEXCLAMATION,
1092 HWND_DESKTOP,
1093 GetPString(IDS_FM2TROUBLETEXT),
1094 GetPString(IDS_CANTLOADHELPTEXT),
1095 GetPString(IDS_NOHELPACCEPTTEXT));
1096 }
1097
1098 // a couple of default window procs so we don't have to look them up later
1099 if (WinQueryClassInfo(hab, WC_CONTAINER, &clinfo))
1100 PFNWPCnr = clinfo.pfnWindowProc;
1101 if (WinQueryClassInfo(hab, WC_FRAME, &clinfo))
1102 PFNWPFrame = clinfo.pfnWindowProc;
1103 if (WinQueryClassInfo(hab, WC_BUTTON, &clinfo))
1104 PFNWPButton = clinfo.pfnWindowProc;
1105 if (WinQueryClassInfo(hab, WC_STATIC, &clinfo))
1106 PFNWPStatic = clinfo.pfnWindowProc;
1107 if (WinQueryClassInfo(hab, WC_MLE, &clinfo))
1108 PFNWPMLE = clinfo.pfnWindowProc;
1109 if (!PFNWPCnr || !PFNWPFrame || !PFNWPButton || !PFNWPStatic || !PFNWPMLE) {
1110 Runtime_Error(pszSrcFile, __LINE__, "WinQueryClassInfo");
1111 return FALSE;
1112 }
1113
1114 /* register window classes we use */
1115 WinRegisterClass(hab,
1116 WC_MAINWND,
1117 MainWndProc,
1118 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 8);
1119 WinRegisterClass(hab,
1120 WC_MAINWND2,
1121 MainWndProc2,
1122 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 4);
1123 WinRegisterClass(hab,
1124 WC_TREECONTAINER,
1125 TreeClientWndProc,
1126 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
1127 WinRegisterClass(hab,
1128 WC_DIRCONTAINER,
1129 DirClientWndProc,
1130 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
1131 WinRegisterClass(hab,
1132 WC_COLLECTOR,
1133 CollectorClientWndProc,
1134 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
1135 WinRegisterClass(hab,
1136 WC_ARCCONTAINER,
1137 ArcClientWndProc,
1138 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
1139 WinRegisterClass(hab,
1140 WC_MLEEDITOR,
1141 MLEEditorProc,
1142 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
1143 WinRegisterClass(hab,
1144 WC_INIEDITOR,
1145 IniProc,
1146 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
1147 WinRegisterClass(hab,
1148 WC_TOOLBACK,
1149 ToolBackProc,
1150 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1151 sizeof(PVOID));
1152 WinRegisterClass(hab,
1153 WC_DRIVEBACK,
1154 DriveBackProc,
1155 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1156 sizeof(PVOID));
1157 WinRegisterClass(hab,
1158 WC_SEEALL,
1159 SeeAllWndProc,
1160 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID));
1161 WinRegisterClass(hab,
1162 WC_NEWVIEW,
1163 ViewWndProc,
1164 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID));
1165 WinRegisterClass(hab,
1166 WC_TOOLBUTTONS,
1167 ChildButtonProc,
1168 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1169 sizeof(PVOID));
1170 WinRegisterClass(hab,
1171 WC_DRIVEBUTTONS,
1172 DriveProc,
1173 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1174 sizeof(PVOID));
1175 WinRegisterClass(hab,
1176 WC_BUBBLE,
1177 BubbleProc,
1178 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1179 sizeof(ULONG) * 2);
1180 WinRegisterClass(hab,
1181 WC_STATUS,
1182 StatusProc,
1183 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1184 sizeof(ULONG));
1185 WinRegisterClass(hab,
1186 WC_DIRSTATUS,
1187 DirTextProc,
1188 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1189 sizeof(ULONG));
1190 WinRegisterClass(hab,
1191 WC_TREESTATUS,
1192 TreeStatProc,
1193 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1194 sizeof(ULONG));
1195 WinRegisterClass(hab,
1196 WC_ARCSTATUS,
1197 ArcTextProc,
1198 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1199 sizeof(ULONG));
1200 WinRegisterClass(hab,
1201 WC_COLSTATUS,
1202 CollectorTextProc,
1203 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1204 sizeof(ULONG));
1205 WinRegisterClass(hab,
1206 WC_SEESTATUS,
1207 SeeStatusProc,
1208 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1209 sizeof(ULONG));
1210 WinRegisterClass(hab,
1211 WC_VIEWSTATUS,
1212 ViewStatusProc,
1213 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1214 sizeof(ULONG));
1215 WinRegisterClass(hab,
1216 WC_ERRORWND,
1217 NotifyWndProc,
1218 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1219 sizeof(PVOID));
1220 WinRegisterClass(hab,
1221 WC_MINITIME,
1222 MiniTimeProc,
1223 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1224 sizeof(PVOID) * 2);
1225 WinRegisterClass(hab,
1226 WC_DATABAR,
1227 DataProc, CS_SIZEREDRAW, sizeof(PVOID));
1228 WinRegisterClass(hab,
1229 WC_TREEOPENBUTTON,
1230 OpenButtonProc,
1231 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1232 sizeof(PVOID));
1233 WinRegisterClass(hab,
1234 WC_AUTOVIEW,
1235 AutoViewProc,
1236 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1237 sizeof(PVOID));
1238 WinRegisterClass(hab,
1239 WC_LED,
1240 LEDProc,
1241 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1242 sizeof(PVOID));
1243
1244 if (DosCreateMutexSem(NULL, &hmtxFM2Globals, 0L, FALSE))
1245 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1246 PCSZ_DOSCREATEMUTEXSEM);
1247 if (DosCreateMutexSem(NULL, &hmtxFM2Delete, 0L, FALSE))
1248 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1249 PCSZ_DOSCREATEMUTEXSEM);
1250
1251 /*
1252 * set some defaults (note: everything else automatically initialized
1253 * to 0)
1254 */
1255 dsDirCnrDefault.detailssize = dsDirCnrDefault.detailsea = dsDirCnrDefault.detailslwdate =
1256 dsDirCnrDefault.detailslwtime = dsDirCnrDefault.detailsattr = dsDirCnrDefault.detailsicon =
1257 fAutoTile = fConfirmDelete = fLoadSubject = fUnHilite =
1258 fLoadLongnames = fToolbar = fSaveState = fGuessType = fToolbarHelp =
1259 fAutoAddDirs = fUseNewViewer = fDataToFore = fDataShowDrives =
1260 fSplitStatus = fDragndropDlg = fQuickArcFind = fKeepCmdLine =
1261 fMoreButtons = fDrivebar = fCollapseFirst = fSwitchTree =
1262 fSwitchTreeExpand = fNoSearch = fCustomFileDlg = fOtherHelp =
1263 fSaveMiniCmds = fUserComboBox = fFM2Deletes = fConfirmTarget =
1264 fShowTarget = fDrivebarHelp = fCheckMM = fInitialDriveScan =
1265 fEjectRemovableScan = fRScanLocal = TRUE;
1266 ulCnrType = CCS_EXTENDSEL;
1267 FilesToGet = FILESTOGET_MIN;
1268 MaxComLineStrg = MAXCOMLINESTRGDEFAULT;
1269 AutoviewHeight = 48;
1270 //strcpy(printer, "PRN");
1271 prnwidth = 80;
1272 prnlength = 66;
1273 prntmargin = 6;
1274 prnbmargin = 6;
1275 prnlmargin = 6;
1276 prnrmargin = 3;
1277 prnspacing = 1;
1278 prntabspaces = 8;
1279 CollectorsortFlags = sortFlags = SORT_DIRSFIRST;
1280 ullDATFileSpaceNeeded = 10000;
1281
1282 //Get default Country info
1283 {
1284 COUNTRYCODE Country = {0};
1285 ULONG ulInfoLen = 0;
1286 COUNTRYINFO CtryInfo = {0};
1287
1288 if (!DosQueryCtryInfo(sizeof(CtryInfo), &Country, &CtryInfo, &ulInfoLen)) {
1289 *ThousandsSeparator = CtryInfo.szThousandsSeparator[0];
1290 strcpy(DateSeparator, CtryInfo.szDateSeparator);
1291 strcpy(TimeSeparator, CtryInfo.szTimeSeparator);
1292 ulDateFmt = CtryInfo.fsDateFmt;
1293 ulTimeFmt = CtryInfo.fsTimeFmt;
1294 //DbgMsg(pszSrcFile, __LINE__, "Date Fmt %x", ulDateFmt);
1295 }
1296 else {
1297 strcpy(ThousandsSeparator, ",");
1298 strcpy(DateSeparator, "/");
1299 strcpy(TimeSeparator, ":");
1300 ulDateFmt = 0;
1301 ulTimeFmt = 0;
1302 }
1303 }
1304 { // Check for the existance of various partitioning tools to set up menu items
1305 CHAR *FullPath;
1306 ULONG ulAppType;
1307
1308 FullPath = searchapath(PCSZ_PATH, PCSZ_LVMGUICMD);
1309 if (*FullPath)
1310 fLVMGui = TRUE;
1311 if (!DosQueryAppType(PCSZ_DFSOS2EXE, &ulAppType))
1312 fDFSee = TRUE;
1313 if (!DosQueryAppType(PCSZ_MINILVMEXE, &ulAppType))
1314 fMiniLVM = TRUE;
1315 if (!DosQueryAppType(PCSZ_FDISKPMEXE, &ulAppType))
1316 fFDisk = TRUE;
1317 if (!DosQueryAppType(PCSZ_LVMEXE, &ulAppType))
1318 fLVM = TRUE;
1319
1320 // Check to see if we are running protect only
1321 if (!DosQueryAppType(GetCmdSpec(TRUE), &ulAppType)) {
1322 ret = runemf2(SEPARATE | WINDOWED | BACKGROUND | MINIMIZED,
1323 (HWND) 0, pszSrcFile, __LINE__, NULL, NULL,
1324 "%s /C exit", GetCmdSpec(TRUE));
1325 if (ret == ERROR_SMG_INVALID_PROGRAM_TYPE)
1326 fProtectOnly = TRUE;
1327 }
1328 else
1329 fProtectOnly = TRUE;
1330 }
1331
1332 // load preferences from profile (INI) file
1333 size = sizeof(ULONG);
1334 PrfQueryProfileData(fmprof, appname, "MaxComLineStrg", &MaxComLineStrg, &size);
1335 // Give user one chance to reset the default command line length to 1024 (4os2's unexpanded max)
1336 if (MaxComLineStrg == 2048) {
1337 BOOL MaxComLineChecked = FALSE;
1338
1339 size = sizeof(BOOL);
1340 PrfQueryProfileData(fmprof, appname, "MaxComLineChecked", &MaxComLineChecked, &size);
1341 if (!MaxComLineChecked) {
1342 ret = saymsg(MB_YESNO,
1343 HWND_DESKTOP,
1344 NullStr,
1345 GetPString(IDS_CHANGECMDLINELENGTHDEFAULT));
1346 if (ret == MBID_YES)
1347 MaxComLineStrg = 1024;
1348 MaxComLineChecked = TRUE;
1349 PrfWriteProfileData(fmprof, appname, "MaxComLineChecked", &MaxComLineChecked, sizeof(BOOL));
1350 }
1351 }
1352 if (MaxComLineStrg < CMDLNLNGTH_MIN)
1353 MaxComLineStrg = CMDLNLNGTH_MIN;
1354 else if (MaxComLineStrg > CMDLNLNGTH_MAX)
1355 MaxComLineStrg = CMDLNLNGTH_MAX;
1356 editor = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1357 if (!editor)
1358 return 0; //already complained
1359 viewer = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1360 if (!viewer)
1361 return 0; //already complained
1362 virus = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1363 if (!virus)
1364 return 0; //already complained
1365 compare = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1366 if (!compare)
1367 return 0; //already complained
1368 binview = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1369 if (!binview)
1370 return 0; //already complained
1371 bined = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1372 if (!bined)
1373 return 0; //already complained
1374 dircompare = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1375 if (!dircompare)
1376 return 0; //already complained
1377 ftprun = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1378 if (!ftprun)
1379 return 0; //already complained
1380 httprun = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1381 if (!httprun)
1382 return 0; //already complained
1383 mailrun = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1384 if (!mailrun)
1385 return 0; //already complained
1386 pszTreeEnvVarList = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1387 if (!pszTreeEnvVarList)
1388 return 0; //already complained
1389 size = sizeof(BOOL);
1390 PrfQueryProfileData(fmprof, appname, "ShowTarget", &fShowTarget, &size);
1391 size = sizeof(BOOL);
1392 PrfQueryProfileData(fmprof, appname, "CheckMM", &fCheckMM, &size);
1393 size = sizeof(BOOL);
1394 PrfQueryProfileData(fmprof, appname, "ChangeTarget", &fChangeTarget, &size);
1395 size = sizeof(BOOL);
1396 PrfQueryProfileData(fmprof, appname, "ConfirmTarget", &fConfirmTarget, &size);
1397 size = sizeof(BOOL);
1398 PrfQueryProfileData(fmprof, FM3Str, "CustomFileDlg", &fCustomFileDlg, &size);
1399 size = sizeof(BOOL);
1400 PrfQueryProfileData(fmprof, FM3Str, "SaveMiniCmds", &fSaveMiniCmds, &size);
1401 size = sizeof(BOOL);
1402 PrfQueryProfileData(fmprof, appname, "SaveBigCmds", &fSaveBigCmds, &size);
1403 size = sizeof(BOOL);
1404 PrfQueryProfileData(fmprof, appname, "NoFoldMenu", &fNoFoldMenu, &size);
1405 size = sizeof(BOOL);
1406 PrfQueryProfileData(fmprof, FM3Str, "ThreadNotes", &fThreadNotes, &size);
1407 size = sizeof(BOOL);
1408 PrfQueryProfileData(fmprof, FM3Str, "Prnpagenums", &prnpagenums, &size);
1409 size = sizeof(BOOL);
1410 PrfQueryProfileData(fmprof, FM3Str, "Prnalt", &prnalt, &size);
1411 size = sizeof(BOOL);
1412 PrfQueryProfileData(fmprof, FM3Str, "Prnformat", &prnformat, &size);
1413 size = sizeof(BOOL);
1414 PrfQueryProfileData(fmprof, FM3Str, "Prnformfeedbefore", &prnformfeedbefore, &size);
1415 size = sizeof(BOOL);
1416 PrfQueryProfileData(fmprof, FM3Str, "Prnformfeedafter",&prnformfeedafter, &size);
1417 size = sizeof(ULONG);
1418 PrfQueryProfileData(fmprof, FM3Str, "Prntabspaces", &prntabspaces, &size);
1419 size = sizeof(ULONG);
1420 PrfQueryProfileData(fmprof, FM3Str, "Prnwidth", &prnwidth, &size);
1421 size = sizeof(ULONG);
1422 PrfQueryProfileData(fmprof, FM3Str, "Prnlength", &prnlength, &size);
1423 size = sizeof(ULONG);
1424 PrfQueryProfileData(fmprof, FM3Str, "Prntmargin", &prntmargin, &size);
1425 size = sizeof(ULONG);
1426 PrfQueryProfileData(fmprof, FM3Str, "Prnbmargin", &prnbmargin, &size);
1427 size = sizeof(ULONG);
1428 PrfQueryProfileData(fmprof, FM3Str, "Prnlmargin", &prnlmargin, &size);
1429 size = sizeof(ULONG);
1430 PrfQueryProfileData(fmprof, FM3Str, "Prnrmargin", &prnrmargin, &size);
1431 size = sizeof(ULONG);
1432 PrfQueryProfileData(fmprof, FM3Str, "Prnspacing", &prnspacing, &size);
1433 size = sizeof(BOOL);
1434 PrfQueryProfileData(fmprof, FM3Str, "NoDead", &fNoDead, &size);
1435 size = sizeof(BOOL);
1436 PrfQueryProfileData(fmprof, FM3Str, "NoFinger", &fNoFinger, &size);
1437 size = sizeof(BOOL);
1438 PrfQueryProfileData(fmprof, FM3Str, "AlertBeepOff", &fAlertBeepOff, &size);
1439 size = sizeof(BOOL);
1440 PrfQueryProfileData(fmprof, FM3Str, "ErrorBeepOff", &fErrorBeepOff, &size);
1441 size = sizeof(BOOL);
1442 PrfQueryProfileData(fmprof, appname, "SwitchTree", &fSwitchTree, &size);
1443 size = sizeof(BOOL);
1444 PrfQueryProfileData(fmprof, appname, "SwitchTreeExpand", &fSwitchTreeExpand, &size);
1445 size = sizeof(BOOL);
1446 PrfQueryProfileData(fmprof, appname, "SwitchTreeOnFocus", &fSwitchTreeOnFocus, &size);
1447 size = sizeof(BOOL);
1448 PrfQueryProfileData(fmprof, appname, "CollapseFirst", &fCollapseFirst, &size);
1449 size = sizeof(BOOL);
1450 PrfQueryProfileData(fmprof, appname, "FilesInTree", &fFilesInTree, &size);
1451 size = sizeof(BOOL);
1452 PrfQueryProfileData(fmprof, FM3Str, "TopDir", &fTopDir, &size);
1453 size = sizeof(BOOL);
1454 PrfQueryProfileData(fmprof, FM3Str, "LookInDir", &fLookInDir, &size);
1455 PrfQueryProfileString(fmprof, appname, "DefArc", NULL, szDefArc, sizeof(szDefArc));
1456 size = sizeof(ULONG);
1457 PrfQueryProfileData(fmprof, FM3Str, "AutoviewHeight",
1458 &AutoviewHeight, &size);
1459 size = sizeof(BOOL);
1460 PrfQueryProfileData(fmprof, FM3Str, "KeepCmdLine", &fKeepCmdLine, &size);
1461 if (strcmp(realappname, "FM/4")) {
1462 size = sizeof(BOOL);
1463 PrfQueryProfileData(fmprof, FM3Str, "MoreButtons", &fMoreButtons, &size);
1464 size = sizeof(BOOL);
1465 PrfQueryProfileData(fmprof, FM3Str, "Drivebar", &fDrivebar, &size);
1466 }
1467 else
1468 fDrivebar = fMoreButtons = TRUE;
1469 size = sizeof(BOOL);
1470 PrfQueryProfileData(fmprof, appname, "NoSearch", &fNoSearch, &size);
1471 size = sizeof(BOOL);
1472 PrfQueryProfileData(fmprof, appname, "GuessType", &fGuessType, &size);
1473 size = sizeof(BOOL);
1474 PrfQueryProfileData(fmprof, appname, "ViewChild", &fViewChild, &size);
1475 size = sizeof(BOOL);
1476 PrfQueryProfileData(fmprof, appname, "ShowEnv", &fShowEnv, &size);
1477 PrfQueryProfileString(fmprof, appname, "TreeEnvVarList", "PATH;DPATH;LIBPATH;HELP;BOOKSHELF;",
1478 pszTreeEnvVarList, MaxComLineStrg);
1479 size = sizeof(BOOL);
1480 PrfQueryProfileData(fmprof, appname, "LeaveTree", &fLeaveTree, &size);
1481 size = sizeof(BOOL);
1482 PrfQueryProfileData(fmprof, FM3Str, "Comments", &fComments, &size);
1483 size = sizeof(ULONG);
1484 PrfQueryProfileData(fmprof, appname, "WS_ANIMATE", &fwsAnimate, &size);
1485 if (fwsAnimate)
1486 fwsAnimate = WS_ANIMATE;
1487 size = sizeof(BOOL);
1488 PrfQueryProfileData(fmprof, appname, "SelectedAlways", &fSelectedAlways, &size);
1489 size = sizeof(BOOL);
1490 PrfQueryProfileData(fmprof, FM3Str, "ToolbarHelp", &fToolbarHelp, &size);
1491 size = sizeof(BOOL);
1492 PrfQueryProfileData(fmprof, FM3Str, "OtherHelp", &fOtherHelp, &size);
1493 size = sizeof(BOOL);
1494 PrfQueryProfileData(fmprof, FM3Str, "DrivebarHelp", &fDrivebarHelp, &size);
1495 size = sizeof(BOOL);
1496 PrfQueryProfileData(fmprof, appname, "AutoAddDirs", &fAutoAddDirs, &size);
1497 size = sizeof(BOOL);
1498 PrfQueryProfileData(fmprof, appname, "AutoAddAllDirs", &fAutoAddAllDirs, &size);
1499 size = sizeof(BOOL);
1500 PrfQueryProfileData(fmprof, FM3Str, "UserListSwitches", &fUserListSwitches, &size);
1501 size = sizeof(BOOL);
1502 PrfQueryProfileData(fmprof, appname, "UseNewViewer", &fUseNewViewer, &size);
1503 size = sizeof(BOOL);
1504 PrfQueryProfileData(fmprof, appname, "DefaultDeletePerm", &fDefaultDeletePerm, &size);
1505 size = sizeof(BOOL);
1506 PrfQueryProfileData(fmprof, FM3Str, "ExternalINIs", &fExternalINIs, &size);
1507 size = sizeof(BOOL);
1508 PrfQueryProfileData(fmprof, FM3Str, "ExternalCollector", &fExternalCollector, &size);
1509 size = sizeof(BOOL);
1510 PrfQueryProfileData(fmprof, FM3Str, "ExternalArcboxes", &fExternalArcboxes, &size);
1511 size = sizeof(BOOL);
1512 PrfQueryProfileData(fmprof, FM3Str, "ExternalViewer", &fExternalViewer, &size);
1513 size = sizeof(BOOL);
1514 PrfQueryProfileData(fmprof, FM3Str, "UseQProcStat", &fUseQProcStat, &size);
1515 size = sizeof(BOOL);
1516 PrfQueryProfileData(fmprof, FM3Str, "UseQSysState", &fUseQSysState, &size);
1517 size = sizeof(BOOL);
1518 PrfQueryProfileData(fmprof, FM3Str, "DataMin", &fDataMin, &size);
1519 size = sizeof(BOOL);
1520 PrfQueryProfileData(fmprof, appname, "DataToFore", &fDataToFore, &size);
1521 size = sizeof(BOOL);
1522 PrfQueryProfileData(fmprof, appname, "DataShowDrives", &fDataShowDrives, &size);
1523 size = sizeof(BOOL);
1524 PrfQueryProfileData(fmprof, appname, "DataInclRemote", &fDataInclRemote, &size);
1525 size = sizeof(BOOL);
1526 PrfQueryProfileData(fmprof, FM3Str, "SplitStatus", &fSplitStatus, &size);
1527 size = sizeof(BOOL);
1528 PrfQueryProfileData(fmprof, appname, "FolderAfterExtract", &fFolderAfterExtract, &size);
1529 size = sizeof(BOOL);
1530 PrfQueryProfileData(fmprof, FM3Str, "DullDatabar", &fDullMin, &size);
1531 size = sizeof(BOOL);
1532 PrfQueryProfileData(fmprof, appname, "BlueLED", &fBlueLED, &size);
1533 size = sizeof(BOOL);
1534 PrfQueryProfileData(fmprof, appname, "ConfirmDelete", &fConfirmDelete, &size);
1535 /*size = sizeof(BOOL); Replaced by UM_SHOWME check 3/14/09 GKY
1536 PrfQueryProfileData(fmprof, FM3Str, "SaveState", &fSaveState, &size);
1537 if (fSaveState && (fSwitchTreeOnFocus || fSwitchTree) &&
1538 (!strcmp(realappname, FM3Str) || !strcmp(realappname, "FM/4"))) {
1539 CHAR szKey[STATE_NAME_MAX_BYTES + 80];
1540 CHAR szDir[CCHMAXPATH];
1541 ULONG drvNum;
1542
1543 if (!strcmp(realappname, "FM/4"))
1544 strcpy(szKey, "FM/4 Dir1");
1545 else
1546 sprintf(szKey, "%s.DirCnrDir.0", PCSZ_SHUTDOWNSTATE);
1547 size = sizeof(szDir);
1548 if (PrfQueryProfileData(fmprof, appname, szKey, szDir, &size)) {
1549 drvNum = toupper(*szDir) - 'A';
1550 fDrivetoSkip[drvNum] = TRUE;
1551 }
1552 } */
1553 size = sizeof(BOOL);
1554 PrfQueryProfileData(fmprof, appname, "SyncUpdates", &fSyncUpdates, &size);
1555 size = sizeof(BOOL);
1556 PrfQueryProfileData(fmprof, appname, "LoadSubject", &fLoadSubject, &size);
1557 size = sizeof(BOOL);
1558 PrfQueryProfileData(fmprof, appname, "UnHilite", &fUnHilite, &size);
1559 size = sizeof(BOOL);
1560 PrfQueryProfileData(fmprof, FM3Str, "TileBackwards", &fTileBackwards, &size);
1561 size = sizeof(BOOL);
1562 PrfQueryProfileData(fmprof, appname, "LoadLongname", &fLoadLongnames, &size);
1563 size = sizeof(BOOL);
1564 PrfQueryProfileData(fmprof, appname, "VerifyWrites", &fVerify, &size);
1565 DosSetVerify(fVerify);
1566 size = sizeof(BOOL);
1567 PrfQueryProfileData(fmprof, appname, "DontMoveMouse", &fDontMoveMouse, &size);
1568 size = sizeof(BOOL);
1569 PrfQueryProfileData(fmprof, appname, "NoIconsFiles", &fNoIconsFiles, &size);
1570 size = sizeof(BOOL);
1571 PrfQueryProfileData(fmprof, appname, "NoIconsDirs", &fNoIconsDirs, &size);
1572 size = sizeof(BOOL);
1573 PrfQueryProfileData(fmprof, appname, "ForceUpper", &fForceUpper, &size);
1574 size = sizeof(BOOL);
1575 PrfQueryProfileData(fmprof, appname, "ForceLower", &fForceLower, &size);
1576 size = sizeof(BOOL);
1577 PrfQueryProfileData(fmprof, FM3Str, "TextTools", &fTextTools, &size);
1578 size = sizeof(BOOL);
1579 PrfQueryProfileData(fmprof, FM3Str, "ToolTitles", &fToolTitles, &size);
1580 size = sizeof(BOOL);
1581 PrfQueryProfileData(fmprof, appname, "DoubleClickOpens", &fDCOpens, &size);
1582 size = sizeof(BOOL);
1583 PrfQueryProfileData(fmprof, appname, "LinkSetsIcon", &fLinkSetsIcon, &size);
1584 size = sizeof(INT);
1585 PrfQueryProfileData(fmprof, appname, "Sort", &sortFlags, &size);
1586 size = sizeof(INT);
1587 PrfQueryProfileData(fmprof, appname, "TreeSort", &TreesortFlags, &size);
1588 size = sizeof(INT);
1589 PrfQueryProfileData(fmprof, appname, "CollectorSort", &CollectorsortFlags, &size);
1590 PrfQueryProfileString(fmprof, appname, "Targetdir", NULL, targetdir, sizeof(targetdir));
1591 if (!IsValidDir(targetdir))
1592 *targetdir = 0;
1593 PrfQueryProfileString(fmprof, appname, "ExtractPath", NULL, extractpath, sizeof(extractpath));
1594 size = sizeof(BOOL);
1595 PrfQueryProfileData(fmprof, FM3Str, "FileNamePathCnr", &fFileNameCnrPath, &size);
1596 PrfQueryProfileString(fmprof, appname, "Printer", "PRN", printer, sizeof(printer));
1597 PrfQueryProfileString(fmprof, appname, "DirCompare", NULL, dircompare, MaxComLineStrg);
1598 PrfQueryProfileString(fmprof, appname, "Viewer", NULL, viewer, MaxComLineStrg);
1599 PrfQueryProfileString(fmprof, appname, "Editor", NULL, editor, MaxComLineStrg);
1600 PrfQueryProfileString(fmprof, appname, "BinView", NULL, binview, MaxComLineStrg);
1601 PrfQueryProfileString(fmprof, appname, "BinEd", NULL, bined, MaxComLineStrg);
1602 PrfQueryProfileString(fmprof, appname, "Compare", NULL, compare, MaxComLineStrg);
1603 PrfQueryProfileString(fmprof, appname, "Virus", NULL, virus, MaxComLineStrg);
1604 size = sizeof(BOOL);
1605 PrfQueryProfileData(fmprof, appname, "FtpRunWPSDefault", &fFtpRunWPSDefault, &size);
1606 PrfQueryProfileString(fmprof, appname, "FTPRun", NULL, ftprun, MaxComLineStrg);
1607 if (!*ftprun)
1608 fFtpRunWPSDefault = TRUE;
1609 size = sizeof(BOOL);
1610 PrfQueryProfileData(fmprof, appname, "HttpRunWPSDefault", &fHttpRunWPSDefault, &size);
1611 PrfQueryProfileString(fmprof, appname, "HTTPRun", NULL, httprun, MaxComLineStrg);
1612 if (!*httprun)
1613 fHttpRunWPSDefault = TRUE;
1614 PrfQueryProfileString(fmprof, appname, "MailRun", NULL, mailrun, MaxComLineStrg);
1615 PrfQueryProfileString(fmprof, appname, "FtpRunDir", NULL, ftprundir, sizeof(ftprundir));
1616 PrfQueryProfileString(fmprof, appname, "HttpRunDir", NULL, httprundir, sizeof(httprundir));
1617 PrfQueryProfileString(fmprof, appname, "MailRunDir", NULL, mailrundir, sizeof(mailrundir));
1618 PrfQueryProfileString(fmprof, appname, "LastToolbar", NULL, lasttoolbar, sizeof(lasttoolbar));
1619 size = sizeof(BOOL);
1620 PrfQueryProfileData(fmprof, appname, "LibPathStrictHttpRun", &fLibPathStrictHttpRun, &size);
1621 size = sizeof(BOOL);
1622 PrfQueryProfileData(fmprof, appname, "LibPathStrictFtpRun", &fLibPathStrictFtpRun, &size);
1623 size = sizeof(BOOL);
1624 PrfQueryProfileData(fmprof, appname, "LibPathStrictMailRun", &fLibPathStrictMailRun, &size);
1625 size = sizeof(BOOL);
1626 PrfQueryProfileData(fmprof, appname, "NoMailtoMailRun", &fNoMailtoMailRun, &size);
1627 size = sizeof(BOOL);
1628 PrfQueryProfileData(fmprof, appname, "FollowTree", &fFollowTree, &size);
1629 size = sizeof(BOOL);
1630 PrfQueryProfileData(fmprof, appname, "StartMaximized", &fStartMaximized, &size);
1631 if (!fStartMaximized) {
1632 size = sizeof(BOOL);
1633 PrfQueryProfileData(fmprof, appname, "StartMinimized", &fStartMinimized, &size);
1634 }
1635 size = sizeof(BOOL);
1636 PrfQueryProfileData(fmprof, appname, "DefaultCopy", &fCopyDefault, &size);
1637 size = sizeof(BOOL);
1638 PrfQueryProfileData(fmprof, appname, "IdleCopy", &fRealIdle, &size);
1639 size = sizeof(BOOL);
1640 PrfQueryProfileData(fmprof, appname, "ArcStuffVisible", &fArcStuffVisible, &size);
1641 size = sizeof(BOOL);
1642 PrfQueryProfileData(fmprof, FM3Str, "NoTreeGap", &fNoTreeGap, &size);
1643 size = sizeof(BOOL);
1644 PrfQueryProfileData(fmprof, FM3Str, "VTreeOpensWPS", &fVTreeOpensWPS, &size);
1645 size = sizeof(BOOL);
1646 PrfQueryProfileData(fmprof, appname, "RemoteBug", &fRemoteBug, &size);
1647 size = sizeof(BOOL);
1648 PrfQueryProfileData(fmprof, appname, "RScanLocal", &fRScanLocal, &size);
1649 size = sizeof(BOOL);
1650 PrfQueryProfileData(fmprof, appname, "RScanRemote", &fRScanRemote, &size);
1651 size = sizeof(BOOL);
1652 PrfQueryProfileData(fmprof, appname, "RScanVirtual", &fRScanVirtual, &size);
1653 size = sizeof(BOOL);
1654 PrfQueryProfileData(fmprof, appname, "RScanSlow", &fRScanSlow, &size);
1655 size = sizeof(BOOL);
1656 PrfQueryProfileData(fmprof, appname, "RScanNoWrite", &fRScanNoWrite, &size);
1657 size = sizeof(BOOL);
1658 PrfQueryProfileData(fmprof, appname, "EjectRemovableScan", &fEjectRemovableScan, &size);
1659 size = sizeof(BOOL);
1660 PrfQueryProfileData(fmprof, appname, "EjectCDScan", &fEjectCDScan, &size);
1661 size = sizeof(BOOL);
1662 PrfQueryProfileData(fmprof, appname, "EjectFlpyScan", &fEjectFlpyScan, &size);
1663 size = sizeof(BOOL);
1664 PrfQueryProfileData(fmprof, appname, "Drag&DropDlg", &fDragndropDlg, &size);
1665 size = sizeof(BOOL);
1666 PrfQueryProfileData(fmprof, FM3Str, "UserComboBox", &fUserComboBox, &size);
1667 size = sizeof(BOOL);
1668 PrfQueryProfileData(fmprof, FM3Str, "MinDirOnOpen", &fMinOnOpen, &size);
1669 size = sizeof(BOOL);
1670 PrfQueryProfileData(fmprof, appname, "QuickArcFind", &fQuickArcFind, &size);
1671 size = sizeof(BOOL);
1672 PrfQueryProfileData(fmprof, FM3Str, "NoRemovableScan", &fNoRemovableScan, &size);
1673 size = sizeof(ULONG);
1674 PrfQueryProfileData(fmprof, FM3Str, "NoBrokenNotify", &NoBrokenNotify, &size);
1675 size = sizeof(ULONG);
1676 PrfQueryProfileData(fmprof, appname, "ContainerType", &ulCnrType, &size);
1677 size = sizeof(ULONG);
1678 PrfQueryProfileData(fmprof, appname, "FilesToGet", &FilesToGet, &size);
1679 if (FilesToGet < FILESTOGET_MIN)
1680 FilesToGet = FILESTOGET_MIN;
1681 else if (FilesToGet > FILESTOGET_MAX)
1682 FilesToGet = FILESTOGET_MAX;
1683 size = sizeof(BOOL);
1684 PrfQueryProfileData(fmprof, FM3Str, "AutoView", &fAutoView, &size);
1685 size = sizeof(BOOL);
1686 PrfQueryProfileData(fmprof, FM3Str, "FM2Deletes", &fFM2Deletes, &size);
1687 size = sizeof(BOOL);
1688 PrfQueryProfileData(fmprof, FM3Str, "TrashCan", &fTrashCan, &size);
1689
1690 LoadDetailsSwitches(PCSZ_DIRCNR, &dsDirCnrDefault);
1691
1692 /* load pointers and icons we use */
1693 hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE);
1694 hptrBusy = WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE);
1695 hptrNS = WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZENS, FALSE);
1696 hptrEW = WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZEWE, FALSE);
1697 hptrFloppy = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FLOPPY_ICON);
1698 hptrDrive = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, DRIVE_ICON);
1699 hptrRemovable = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, REMOVABLE_ICON);
1700 hptrCDROM = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, CDROM_ICON);
1701 hptrFile = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_ICON);
1702 hptrDir = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, DIR_FRAME);
1703 hptrArc = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ARC_FRAME);
1704 hptrArt = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ART_ICON);
1705 hptrSystem = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_SYSTEM_ICON);
1706 hptrHidden = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_HIDDEN_ICON);
1707 hptrReadonly = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_READONLY_ICON);
1708 hptrLast = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, LASTITEM_ICON);
1709 hptrRemote = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, REMOTE_ICON);
1710 hptrVirtual = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, VIRTUAL_ICON);
1711 hptrRamdisk = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, RAMDISK_ICON);
1712 if (!fNoDead)
1713 hptrFinger = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FINGER_ICON);
1714 else
1715 hptrFinger = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FINGER2_ICON);
1716 hptrApp = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, APP_ICON);
1717 hptrDunno = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, DUNNO_ICON);
1718 hptrEnv = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ENV_ICON);
1719 hptrZipstrm = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ZIPSTREAM_ICON);
1720
1721 // set up color array used by seeall.c and newview.c color dialog
1722
1723 standardcolors[0] = CLR_WHITE;
1724 standardcolors[1] = CLR_BLACK;
1725 standardcolors[2] = CLR_BLUE;
1726 standardcolors[3] = CLR_RED;
1727 standardcolors[4] = CLR_PINK;
1728 standardcolors[5] = CLR_GREEN;
1729 standardcolors[6] = CLR_CYAN;
1730 standardcolors[7] = CLR_YELLOW;
1731 standardcolors[8] = CLR_DARKGRAY;
1732 standardcolors[9] = CLR_DARKBLUE;
1733 standardcolors[10] = CLR_DARKRED;
1734 standardcolors[11] = CLR_DARKPINK;
1735 standardcolors[12] = CLR_DARKGREEN;
1736 standardcolors[13] = CLR_DARKCYAN;
1737 standardcolors[14] = CLR_BROWN;
1738 standardcolors[15] = CLR_PALEGRAY;
1739
1740 return TRUE;
1741}
1742
1743HWND StartFM3(HAB hab, INT argc, CHAR ** argv)
1744{
1745 HWND hwndFrame;
1746 HWND hwndClient;
1747 UINT x;
1748 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
1749 FCF_SIZEBORDER | FCF_MINMAX |
1750 FCF_ACCELTABLE | FCF_MENU | FCF_ICON | FCF_TASKLIST | FCF_NOBYTEALIGN;
1751
1752 for (x = 1; x < argc; x++) {
1753 if (*argv[x] == '~' && !argv[x][1])
1754 fReminimize = TRUE;
1755 if (*argv[x] == '+' && !argv[x][1])
1756 fLogFile = TRUE;
1757 if (*argv[x] == '-') {
1758 if (!argv[x][1])
1759 fNoSaveState = TRUE;
1760 else
1761 strcpy(profile, &argv[x][1]);
1762 }
1763 }
1764
1765 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
1766 WS_VISIBLE,
1767 &FrameFlags,
1768 WC_MAINWND,
1769 NULL,
1770 WS_VISIBLE | WS_ANIMATE,
1771 FM3ModHandle, MAIN_FRAME, &hwndClient);
1772 if (hwndFrame) {
1773 WinSetWindowUShort(hwndFrame, QWS_ID, MAIN_FRAME);
1774 hwndMainMenu = WinWindowFromID(hwndFrame, FID_MENU);
1775 if (!WinRestoreWindowPos(FM2Str, "MainWindowPos", hwndFrame)) {
1776
1777 ULONG fl = SWP_MOVE | SWP_SIZE;
1778 RECTL rcl;
1779 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1780 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
1781
1782 WinQueryWindowRect(HWND_DESKTOP, &rcl);
1783 rcl.yBottom += icz;
1784 rcl.yTop -= bsz;
1785 rcl.xLeft += bsz;
1786 rcl.xRight -= bsz;
1787 WinSetWindowPos(hwndFrame,
1788 HWND_TOP,
1789 rcl.xLeft,
1790 rcl.yBottom,
1791 rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom, fl);
1792 }
1793 if (fLogFile)
1794 LogFileHandle = _fsopen("FM2.LOG", "a+", SH_DENYWR);
1795 if (hwndHelp)
1796 WinAssociateHelpInstance(hwndHelp, hwndFrame);
1797 PostMsg(hwndClient, UM_SETUP, MPFROMLONG(argc), MPFROMP(argv));
1798 }
1799 return hwndFrame;
1800}
1801
1802BOOL CheckFileHeader(CHAR *filespec, CHAR *signature, LONG offset)
1803{
1804 HFILE handle;
1805 ULONG action;
1806 ULONG len = strlen(signature);
1807 ULONG l;
1808 CHAR buffer[4096]; // 06 Oct 07 SHL Protect against NTFS defect
1809 BOOL ret = FALSE;
1810
1811 DosError(FERR_DISABLEHARDERR);
1812 if (DosOpen(filespec,
1813 &handle,
1814 &action,
1815 0,
1816 0,
1817 OPEN_ACTION_FAIL_IF_NEW |
1818 OPEN_ACTION_OPEN_IF_EXISTS,
1819 OPEN_FLAGS_FAIL_ON_ERROR |
1820 OPEN_FLAGS_NOINHERIT |
1821 OPEN_FLAGS_RANDOMSEQUENTIAL |
1822 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, 0))
1823 ret = FALSE;
1824 else {
1825 // Try signature match
1826 l = len;
1827 l = min(l, 79);
1828 if (!DosChgFilePtr(handle,
1829 abs(offset),
1830 (offset >= 0) ?
1831 FILE_BEGIN : FILE_END, &len)) {
1832 if (!DosRead(handle, buffer, l, &len) && len == l) {
1833 if (!memcmp(signature, buffer, l))
1834 ret = TRUE; // Matched
1835 }
1836 }
1837 }
1838 DosClose(handle); /* Either way, we're done for now */
1839 return ret; /* Return TRUE if matched */
1840}
1841
1842int CheckVersion(int vermajor, int verminor)
1843{
1844 int ok = 0;
1845
1846 // fixme to do useful check - was missing in base source
1847
1848#if 0
1849 if (vermajor && verminor) {
1850 *vermajor = VERMAJOR;
1851 *verminor = VERMINOR;
1852 ok = 1;
1853 }
1854#endif
1855
1856 ok = 1;
1857
1858 return ok;
1859}
1860
1861#ifdef __WATCOMC__
1862#pragma alloc_text(INIT,LibMain,InitFM3DLL,DeInitFM3DLL)
1863#pragma alloc_text(INIT1,StartFM3,FindSwapperDat)
1864#endif
Note: See TracBrowser for help on using the repository browser.