source: trunk/dll/init.c@ 1838

Last change on this file since 1838 was 1838, checked in by Gregg Young, 10 years ago

Serialize local hard drive scanning to reduce drive thrashing continue to scan all other drive types in separate threads. Ticket [561] Remove unneed SubbyScan code and improve suppression of blank lines and duplicate subdirectory name caused by running Stubby in worker threads.

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