/****************************************************************************/ /* */ /* WFINIT.C - */ /* */ /* Windows File System Initialization Routines */ /* */ /****************************************************************************/ #include "winfile.h" #include "lfn.h" #include "winnet.h" #include "wnetcaps.h" // WNetGetCaps() #include "stdlib.h" typedef DWORD ( APIENTRY *EXTPROC)(HWND, WORD, LONG); typedef DWORD ( APIENTRY *UNDELPROC)(HWND, LPSTR); typedef VOID ( APIENTRY *FNPENAPP)(WORD, BOOL); VOID (APIENTRY *lpfnRegisterPenApp)(WORD, BOOL); CHAR szPenReg[] = "RegisterPenApp"; CHAR szHelv[] = "MS Shell Dlg"; // default font, status line font face name HBITMAP hbmSave; INT GetDriveOffset(register WORD wDrive); DWORD RGBToBGR(DWORD rgb); VOID BoilThatDustSpec(register CHAR *pStart, BOOL bLoadIt); VOID DoRunEquals(PINT pnCmdShow); VOID GetSavedWindow(LPSTR szBuf, PSAVE_WINDOW pwin); VOID GetSettings(VOID); VOID InitMenus(VOID); INT APIENTRY GetHeightFromPointsString( LPSTR szPoints ) { HDC hdc; INT height; hdc = GetDC(NULL); height = MulDiv(-atoi(szPoints), GetDeviceCaps(hdc, LOGPIXELSY), 72); ReleaseDC(NULL, hdc); return height; } VOID BiasMenu( HMENU hMenu, INT Bias ) { INT pos, id, count; HMENU hSubMenu; CHAR szMenuString[80]; ENTER("BiasMenu"); count = GetMenuItemCount(hMenu); if (count < 0) return; for (pos = 0; pos < count; pos++) { id = GetMenuItemID(hMenu, pos); if (id < 0) { // must be a popup, recurse and update all ID's here if (hSubMenu = GetSubMenu(hMenu, pos)) BiasMenu(hSubMenu, Bias); } else if (id) { // replace the item that was there with a new // one with the id adjusted GetMenuString(hMenu, (WORD)pos, szMenuString, sizeof(szMenuString), MF_BYPOSITION); DeleteMenu(hMenu, pos, MF_BYPOSITION); InsertMenu(hMenu, (WORD)pos, MF_BYPOSITION | MF_STRING, id + Bias, szMenuString); } } LEAVE("BiasMenu"); } VOID APIENTRY InitExtensions() { CHAR szBuf[300] = {0}; CHAR szPath[MAXPATHLEN]; LPSTR p; HANDLE hMod; FM_EXT_PROC fp; HMENU hMenu; INT iMax; HMENU hMenuFrame; HWND hwndActive; ENTER("InitExtensions"); hMenuFrame = GetMenu(hwndFrame); hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); if (hwndActive && GetWindowLong(hwndActive, GWL_STYLE) & WS_MAXIMIZE) iMax = 1; else iMax = 0; GetPrivateProfileString(szAddons, NULL, szNULL, szBuf, sizeof(szBuf), szTheINIFile); for (p = szBuf; *p && iNumExtensions < MAX_EXTENSIONS; p += lstrlen(p) + 1) { GetPrivateProfileString(szAddons, p, szNULL, szPath, sizeof(szPath), szTheINIFile); hMod = MLoadLibrary(szPath); if (hMod >= (HANDLE)32) { fp = (FM_EXT_PROC)GetProcAddress(hMod, "FMExtensionProc"); if (fp) { WORD bias; FMS_LOAD ls; bias = (WORD)((IDM_EXTENSIONS + iNumExtensions + 1)*100); ls.wMenuDelta = bias; if ((*fp)(hwndFrame, FMEVENT_LOAD, (LPARAM)&ls)) { if (ls.dwSize != sizeof(FMS_LOAD) || !ls.hMenu) goto LoadFail; hMenu = ls.hMenu; extensions[iNumExtensions].ExtProc = fp; extensions[iNumExtensions].Delta = bias; extensions[iNumExtensions].hModule = hMod; extensions[iNumExtensions].hMenu = hMenu; BiasMenu(hMenu, bias); InsertMenu(hMenuFrame, IDM_EXTENSIONS + iNumExtensions + iMax, MF_BYPOSITION | MF_POPUP, (UINT_PTR)hMenu, ls.szMenuName); iNumExtensions++; } } else { LoadFail: FreeLibrary(hMod); } } } LEAVE("InitExtensions"); } /*--------------------------------------------------------------------------*/ /* */ /* GetSettings() - */ /* */ /*--------------------------------------------------------------------------*/ VOID GetSettings() { CHAR szTemp[128] = {0}; INT size; ENTER("GetSettings"); /* Get the flags out of the INI file. */ bMinOnRun = GetPrivateProfileInt(szSettings, szMinOnRun, bMinOnRun, szTheINIFile); wTextAttribs = (WORD)GetPrivateProfileInt(szSettings, szLowerCase, wTextAttribs, szTheINIFile); bStatusBar = GetPrivateProfileInt(szSettings, szStatusBar, bStatusBar, szTheINIFile); bConfirmDelete = GetPrivateProfileInt(szSettings, szConfirmDelete, bConfirmDelete, szTheINIFile); bConfirmSubDel = GetPrivateProfileInt(szSettings, szConfirmSubDel, bConfirmSubDel, szTheINIFile); bConfirmReplace = GetPrivateProfileInt(szSettings, szConfirmReplace,bConfirmReplace,szTheINIFile); bConfirmMouse = GetPrivateProfileInt(szSettings, szConfirmMouse, bConfirmMouse, szTheINIFile); bConfirmFormat = GetPrivateProfileInt(szSettings, szConfirmFormat, bConfirmFormat, szTheINIFile); bSaveSettings = GetPrivateProfileInt(szSettings, szSaveSettings, bSaveSettings, szTheINIFile); // test font for now GetPrivateProfileString(szSettings, szSize, "8", szTemp, sizeof(szTemp), szTheINIFile); size = GetHeightFromPointsString(szTemp); GetPrivateProfileString(szSettings, szFace, szHelv, szTemp, sizeof(szTemp), szTheINIFile); hFont = CreateFont(size, 0, 0, 0, wTextAttribs & TA_BOLD ? 700 : 400, wTextAttribs & TA_ITALIC, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, szTemp); LEAVE("GetSettings"); } /*--------------------------------------------------------------------------*/ /* */ /* GetInternational() - */ /* */ /*--------------------------------------------------------------------------*/ VOID APIENTRY GetInternational() { ENTER("GetInternational"); GetProfileString(szInternational, "sShortDate", szShortDate, szShortDate, 11); AnsiUpper(szShortDate); GetProfileString(szInternational, "sTime", szTime, szTime, 2); GetProfileString(szInternational, "s1159", sz1159, sz1159, 9); GetProfileString(szInternational, "s2359", sz2359, sz2359, 9); GetProfileString(szInternational, "sThousand", szComma, szComma, sizeof(szComma)); iTime = GetProfileInt(szInternational, "iTime", iTime); iTLZero = GetProfileInt(szInternational, "iTLZero", iTLZero); LEAVE("GetInternational"); } /*--------------------------------------------------------------------------*/ /* */ /* BuildDocumentString() - */ /* */ /*--------------------------------------------------------------------------*/ /* Create a string which contains all of the extensions the user wants us to * display with document icons. This consists of any associated extensions * as well as any extensions listed in the "Documents=" WIN.INI line. */ VOID APIENTRY BuildDocumentString() { register LPSTR p; register INT len; INT lenDocs; CHAR szT[10]; INT i; HKEY hk; ENTER("BuildDocumentString"); len = 32; /* Get all of the "Documents=" stuff. */ szDocuments = (LPSTR)LocalAlloc(LPTR, len); if (!szDocuments) return; while ((lenDocs = GetProfileString(szWindows, "Documents", szNULL, szDocuments, len-1)) == len-1) { len += 32; { void *pv = (LPSTR)LocalReAlloc((HANDLE)szDocuments, len, LMEM_MOVEABLE); if (!pv) { LEAVE("BuildDocumentString"); return; } else szDocuments = pv; } } lstrcat(szDocuments, szBlank); lenDocs++; p = (LPSTR)(szDocuments + lenDocs); /* Read all of the [Extensions] keywords into 'szDocuments'. */ while ((INT)GetProfileString(szExtensions, NULL, szNULL, p, len-lenDocs) > (len-lenDocs-3)) { len += 32; { void *pv =(LPSTR)LocalReAlloc((HANDLE)szDocuments, len, LMEM_MOVEABLE); if (!pv) { LEAVE("BuildDocumentString"); return; } else { szDocuments = pv; } } p = (LPSTR)(szDocuments + lenDocs); } /* Step through each of the keywords in 'szDocuments' changing NULLS into * spaces until a double-NULL is found. */ p = szDocuments; while (*p) { /* Find the next NULL. */ while (*p) p++; /* Change it into a space. */ *p = ' '; p++; } if (RegOpenKey(HKEY_CLASSES_ROOT,szNULL,&hk) == ERROR_SUCCESS) { /* now enumerate the classes in the registration database and get all * those that are of the form *.ext */ for (i = 0; RegEnumKey(hk,(DWORD)i,szT,sizeof(szT)) == ERROR_SUCCESS; i++) { if (szT[0] != '.' || (szT[1] && szT[2] && szT[3] && szT[4])) { /* either the class does not start with . or it has a greater * than 3 byte extension... skip it. */ continue; } if (FindExtensionInList(szT+2,szDocuments)) { // don't add it if it's already there! continue; } len += 4; { void *pv = (PSTR)LocalReAlloc((HANDLE)szDocuments, len, LMEM_MOVEABLE); if (!pv) { break; } else { szDocuments = pv; } } lstrcat(szDocuments, szT+1); lstrcat(szDocuments, szBlank); } RegCloseKey(hk); } PRINT(BF_PARMTRACE, "OUT: szDocuments=%s", szDocuments); LEAVE("BuildDocumentString - ok"); return; } INT GetDriveOffset( register WORD wDrive ) { if (IsCDRomDrive(wDrive)) return dxDriveBitmap * 0; switch (IsNetDrive(wDrive)) { case 1: return dxDriveBitmap * 4; case 2: return dxDriveBitmap * 5; } if (IsRemovableDrive(wDrive)) return dxDriveBitmap * 1; if (IsRamDrive(wDrive)) return dxDriveBitmap * 3; return dxDriveBitmap * 2; } VOID APIENTRY InitDriveBitmaps() { INT nDrive; ENTER("InitDiskMenus"); // and now add all new ones for (nDrive=0; nDrive < cDrives; nDrive++) { // refresh/init this here as well rgiDrivesOffset[nDrive] = GetDriveOffset((WORD)rgiDrive[nDrive]); } LEAVE("InitDiskMenus"); } /*--------------------------------------------------------------------------*/ /* */ /* InitMenus() - */ /* */ /*--------------------------------------------------------------------------*/ VOID InitMenus() { WORD i; HMENU hMenu; OFSTRUCT os; INT iMax; CHAR szValue[MAXPATHLEN]; HWND hwndActive; ENTER("InitMenus"); hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L); if (hwndActive && GetWindowLong(hwndActive, GWL_STYLE) & WS_MAXIMIZE) iMax = 1; else iMax = 0; GetPrivateProfileString(szSettings, szUndelete, szNULL, szValue, sizeof(szValue), szTheINIFile); if (szValue[0]) { // create explicit filename to avoid searching the path GetSystemDirectory(os.szPathName, sizeof(os.szPathName)); AddBackslash(os.szPathName); lstrcat(os.szPathName, szValue); if (MOpenFile(os.szPathName, &os, OF_EXIST) > 0) { hModUndelete = MLoadLibrary(szValue); if (hModUndelete >= (HANDLE)32) { lpfpUndelete = (FM_UNDELETE_PROC)GetProcAddress(hModUndelete, "UndeleteFile"); if (lpfpUndelete) { hMenu = GetSubMenu(GetMenu(hwndFrame), IDM_FILE + iMax); LoadString(hAppInstance, IDS_UNDELETE, szValue, sizeof(szValue)); InsertMenu(hMenu, 4, MF_BYPOSITION | MF_STRING, IDM_UNDELETE, szValue); } } else { FreeLibrary(hModUndelete); } } } /* Init the Disk menu. */ hMenu = GetMenu(hwndFrame); if (nFloppies == 0) { EnableMenuItem(hMenu, IDM_DISKCOPY, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu, IDM_FORMAT, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu, IDM_SYSDISK, MF_BYCOMMAND | MF_GRAYED); } bNetAdmin = WNetGetCaps(WNNC_ADMIN) & WNNC_ADM_GETDIRECTORYTYPE; /* Should we enable the network items? */ i = (WORD)WNetGetCaps(WNNC_DIALOG); i = 0; bConnect = i & WNNC_DLG_ConnectDialog; // note, these should both bDisconnect = i & WNNC_DLG_DisconnectDialog; // be true or both false // use submenu because we are doing this by position hMenu = GetSubMenu(GetMenu(hwndFrame), IDM_DISK + iMax); if (i) InsertMenu(hMenu, 5, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); if (bConnect && bDisconnect) { // lanman style double connect/disconnect LoadString(hAppInstance, IDS_CONNECT, szValue, sizeof(szValue)); InsertMenu(hMenu, 6, MF_BYPOSITION | MF_STRING, IDM_CONNECT, szValue); LoadString(hAppInstance, IDS_DISCONNECT, szValue, sizeof(szValue)); InsertMenu(hMenu, 7, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT, szValue); } else if (WNetGetCaps(WNNC_CONNECTION)) { } hMenu = GetMenu(hwndFrame); if (bStatusBar) CheckMenuItem(hMenu, IDM_STATUSBAR, MF_BYCOMMAND | MF_CHECKED); if (bMinOnRun) CheckMenuItem(hMenu, IDM_MINONRUN, MF_BYCOMMAND | MF_CHECKED); if (bSaveSettings) CheckMenuItem(hMenu, IDM_SAVESETTINGS, MF_BYCOMMAND | MF_CHECKED); InitDriveBitmaps(); InitExtensions(); LEAVE("InitMenus"); } /*--------------------------------------------------------------------------*/ /* */ /* BoilThatDustSpec() - */ /* */ /*--------------------------------------------------------------------------*/ /* Parses the command line (if any) passed into WINFILE and exec's any tokens * it may contain. */ VOID BoilThatDustSpec( register CHAR *pStart, BOOL bLoadIt ) { register CHAR *pEnd; WORD ret; BOOL bFinished; ENTER("BoilThatDustSpec"); if (*pStart == TEXT('\0')) return; bFinished = FALSE; while (!bFinished) { pEnd = pStart; while ((*pEnd) && (*pEnd != ' ') && (*pEnd != ',')) pEnd = AnsiNext(pEnd); if (*pEnd == TEXT('\0')) bFinished = TRUE; else *pEnd = TEXT('\0'); ret = ExecProgram(pStart, szNULL, NULL, bLoadIt); if (ret) MyMessageBox(NULL, IDS_EXECERRTITLE, ret, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); pStart = pEnd+1; } LEAVE("BoilThatDustSpec"); } /*--------------------------------------------------------------------------*/ /* */ /* DoRunEquals() - */ /* */ /*--------------------------------------------------------------------------*/ /* Handle the "Run=" and "Load=" lines in WIN.INI. */ VOID DoRunEquals( PINT pnCmdShow ) { CHAR szBuffer[128] = {0}; /* "Load" apps before "Run"ning any. */ GetProfileString(szWindows, "Load", szNULL, szBuffer, 128); if (*szBuffer) BoilThatDustSpec(szBuffer, TRUE); GetProfileString(szWindows, "Run", szNULL, szBuffer, 128); if (*szBuffer) { BoilThatDustSpec(szBuffer, FALSE); *pnCmdShow = SW_SHOWMINNOACTIVE; } } // // BOOL APIENTRY LoadBitmaps() // // this routine loads DIB bitmaps, and "fixes up" their color tables // so that we get the desired result for the device we are on. // // this routine requires: // the DIB is a 16 color DIB authored with the standard windows colors // bright blue (00 00 FF) is converted to the background color! // light grey (C0 C0 C0) is replaced with the button face color // dark grey (80 80 80) is replaced with the button shadow color // // this means you can't have any of these colors in your bitmap // #define BACKGROUND 0x000000FF // bright blue #define BACKGROUNDSEL 0x00FF00FF // bright blue #define BUTTONFACE 0x00C0C0C0 // bright grey #define BUTTONSHADOW 0x00808080 // dark grey DWORD FlipColor( DWORD rgb ) { return RGB(GetBValue(rgb), GetGValue(rgb), GetRValue(rgb)); } BOOL APIENTRY LoadBitmaps() { HDC hdc; HANDLE h; DWORD *p; LPSTR lpBits; HANDLE hRes; LPBITMAPINFOHEADER lpBitmapInfo; INT numcolors; DWORD n; DWORD rgbSelected; DWORD rgbUnselected; PVOID pv; ENTER("LoadBitmaps"); rgbSelected = FlipColor(GetSysColor(COLOR_HIGHLIGHT)); rgbUnselected = FlipColor(GetSysColor(COLOR_WINDOW)); h = FindResource(hAppInstance, MAKEINTRESOURCE(BITMAPS), RT_BITMAP); if (!h) { return FALSE; } n = SizeofResource(hAppInstance, h); lpBitmapInfo = (LPBITMAPINFOHEADER)LocalAlloc(LPTR, n); if (!lpBitmapInfo) return FALSE; /* Load the bitmap and copy it to R/W memory */ hRes = LoadResource(hAppInstance, h); pv = (PVOID) LockResource(hRes); if (pv) memcpy( lpBitmapInfo, pv, n ); UnlockResource(hRes); FreeResource(hRes); p = (DWORD *)((LPSTR)(lpBitmapInfo) + lpBitmapInfo->biSize); /* Search for the Solid Blue entry and replace it with the current * background RGB. */ numcolors = 16; while (numcolors-- > 0) { if (*p == BACKGROUND) *p = rgbUnselected; else if (*p == BACKGROUNDSEL) *p = rgbSelected; else if (*p == BUTTONFACE) *p = FlipColor(GetSysColor(COLOR_BTNFACE)); else if (*p == BUTTONSHADOW) *p = FlipColor(GetSysColor(COLOR_BTNSHADOW)); p++; } /* Now create the DIB. */ /* First skip over the header structure */ lpBits = (LPSTR)(lpBitmapInfo + 1); /* Skip the color table entries, if any */ lpBits += (1 << (lpBitmapInfo->biBitCount)) * sizeof(RGBQUAD); /* Create a color bitmap compatible with the display device */ hdc = GetDC(NULL); if (hdcMem = CreateCompatibleDC(hdc)) { if (hbmBitmaps = CreateDIBitmap(hdc, lpBitmapInfo, (DWORD)CBM_INIT, lpBits, (LPBITMAPINFO)lpBitmapInfo, DIB_RGB_COLORS)) hbmSave = SelectObject(hdcMem, hbmBitmaps); } ReleaseDC(NULL, hdc); LEAVE("LoadBitmaps"); return TRUE; } // // void GetSavedWindow(LPSTR szBuf, PSAVE_WINDOW pwin) // // in: // szBuf buffer to parse out all the saved window stuff // if NULL pwin is filled with all defaults // out: // pwin this structure is filled with all fields from // szBuf. if any fields do not exist this is // initialized with the standard defaults // VOID GetSavedWindow( LPSTR szBuf, PSAVE_WINDOW pwin ) { PINT pint; INT count; ENTER("GetSavedWindow"); // defaults pwin->rc.right = pwin->rc.left = CW_USEDEFAULT; pwin->pt.x = pwin->pt.y = pwin->rc.top = pwin->rc.bottom = 0; pwin->sw = SW_SHOWNORMAL; pwin->sort = IDD_NAME; pwin->view = VIEW_NAMEONLY; pwin->attribs = ATTR_DEFAULT; pwin->split = 0; pwin->szDir[0] = 0; if (!szBuf) return; count = 0; pint = (PINT)&pwin->rc; // start by filling the rect while (*szBuf && count < 11) { *pint++ = atoi(szBuf); // advance to next field while (*szBuf && *szBuf != ',') szBuf++; while (*szBuf && *szBuf == ',') szBuf++; count++; } lstrcpy(pwin->szDir, szBuf); // this is the directory LEAVE("GetSavedWindow"); } // szDir (OEM) path to check for existance BOOL CheckDirExists( LPSTR szDir ) { BOOL bRet = FALSE; ENTER("CheckDirExists"); PRINT(BF_PARMTRACE, "szDir=%s", szDir); if (IsNetDrive((WORD)(DRIVEID(szDir))) == 2) return FALSE; if (IsValidDisk(DRIVEID(szDir))) bRet = !SheChangeDir(szDir); LEAVE("CheckDirExists"); return bRet; } // return the tree directory in szTreeDir BOOL APIENTRY CreateSavedWindows() { CHAR buf[MAXPATHLEN+7*7], key[10]; INT dir_num; HWND hwnd; SAVE_WINDOW win; INT iNumTrees; ENTER("CreateSavedWindows"); // make sure this thing exists so we don't hit drives that don't // exist any more dir_num = 1; iNumTrees = 0; do { wsprintf(key, szDirKeyFormat, dir_num++); GetPrivateProfileString(szSettings, key, szNULL, buf, sizeof(buf), szTheINIFile); if (*buf) { CHAR szDir[MAXPATHLEN]; GetSavedWindow(buf, &win); AnsiUpperBuff(win.szDir, 1); // clean off some junk so we // can do this test lstrcpy(szDir, win.szDir); StripFilespec(szDir); StripBackslash(szDir); FixAnsiPathForDos(szDir); if (!CheckDirExists(szDir)) continue; wNewView = (WORD)win.view; wNewSort = (WORD)win.sort; dwNewAttribs = win.attribs; hwnd = CreateTreeWindow(win.szDir, win.split); if (!hwnd) { LEAVE("CreateSavedWindows"); return FALSE; } iNumTrees++; // keep track of this for now... SetInternalWindowPos(hwnd, win.sw, &win.rc, &win.pt); } } while (*buf); // if nothing was saved create a tree for the current drive if (!iNumTrees) { //lstrcpy(buf, szOriginalDirPath); lstrcpy(buf, "\\"); // Don't use current filesystem directory lstrcat(buf, szStarDotStar); hwnd = CreateTreeWindow(buf, -1);// default to split window if (!hwnd) return FALSE; // ShowWindow(hwnd, SW_MAXIMIZE); iNumTrees++; } LEAVE("CreateSavedWindows - Ok"); return TRUE; } // void APIENTRY GetTextStuff(HDC hdc) // // this computues all the globals that are dependant on the // currently selected font // // in: // hdc DC with font selected into it // VOID APIENTRY GetTextStuff( HDC hdc ) { ENTER("GetTextStuff"); MGetTextExtent(hdc, "M", 1, &dxText, &dyText); MGetTextExtent(hdc, szEllipses, 3, &dxEllipses, NULL); // these are all dependant on the text metrics dxDrive = dxDriveBitmap + dxText + (4*dyBorderx2); dyDrive = max(dyDriveBitmap + (4*dyBorderx2), dyText); // dxFileName = dxFolder + (12*dxText); dyFileName = max(dyText, dyFolder); // + dyBorder; LEAVE("GetTextStuff"); } /*--------------------------------------------------------------------------*/ /* */ /* InitFileManager() - */ /* */ /*--------------------------------------------------------------------------*/ BOOL APIENTRY InitFileManager( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow ) { INT i; WORD ret; INT nHardDisk; HDC hdcScreen; CHAR szBuffer[128]; HCURSOR hcurArrow; WNDCLASS wndClass; SAVE_WINDOW win; HWND hwnd; HANDLE hOld; LPSTR lpT; TEXTMETRIC tm; CHAR szTemp[80]; ENTER("InitFileManager"); PRINT(BF_PARMTRACE, "lpCmdLine=%s", lpCmdLine); PRINT(BF_PARMTRACE, "nCmdShow=%d", IntToPtr(nCmdShow)); // ProfStart(); hAppInstance = hInstance; // Preserve this instance's module handle /* Set the Global DTA Address. This must be done before ExecProgram. */ DosGetDTAAddress(); if (*lpCmdLine) nCmdShow = SW_SHOWMINNOACTIVE; PRINT(BF_PARMTRACE, "lpCmdLine=%s", lpCmdLine); PRINT(BF_PARMTRACE, "nCmdShow=%d", IntToPtr(nCmdShow)); #ifdef LATER if (hPrevInstance) { // if we are already running bring up the other instance +++GetInstanceData - NOOP on 32BIT side+++(hPrevInstance, (NLPSTR)&hwndFrame, sizeof(HWND)); if (hwndFrame) { hwnd = GetLastActivePopup(hwndFrame); BringWindowToTop(hwndFrame); if (IsIconic(hwndFrame)) ShowWindow(hwndFrame, SW_RESTORE); else SetActiveWindow(hwnd); } LEAVE("InitFileManager"); return FALSE; } #else UNREFERENCED_PARAMETER(hPrevInstance); { HWND hwndT; BYTE szClass[20]; if (CreateEvent(NULL, TRUE, FALSE, szFrameClass) == NULL) { for (hwndT = GetWindow(GetDesktopWindow(), GW_CHILD); hwndT; hwndT = GetWindow(hwndT, GW_HWNDNEXT)) { if (GetClassName(hwndT, szClass, sizeof(szClass))) if (!lstrcmpi(szFrameClass, szClass)) { SetForegroundWindow(hwndT); if (IsIconic(hwndT)) ShowWindow(hwndT, SW_RESTORE); return FALSE; } } return FALSE; } } #endif SetErrorMode(1); // turn off critical error // if (lpfnRegisterPenApp = (FNPENAPP)GetProcAddress((HANDLE)GetSystemMetrics(SM_PENWINDOWS), szPenReg)) // (*lpfnRegisterPenApp)(1, TRUE); /* Remember the current directory. */ SheGetDir(0, szOriginalDirPath); if (!GetWindowsDirectory(szTheINIFile, sizeof(szTheINIFile))) { szTheINIFile[0] = '\0'; } AddBackslash(szTheINIFile); lstrcat(szTheINIFile, szINIFile); GetProfileString(szWindows, "Programs", szDefPrograms, szTemp, sizeof(szTemp)); szPrograms = (LPSTR)LocalAlloc(LPTR, lstrlen(szTemp)+1); if (!szPrograms) szPrograms = szNULL; else lstrcpy(szPrograms, szTemp); BuildDocumentString(); /* Deal with any RUN= or LOAD= lines in WIN.INI. */ if (*lpCmdLine) { // skip spaces while (*lpCmdLine == ' ') lpCmdLine++; for (lpT = lpCmdLine; *lpT; lpT = AnsiNext(lpT)) { if (*lpT == ' ') break; } if (*lpT == ' ') *lpT++ = 0; ret = ExecProgram(lpCmdLine, lpT, NULL, FALSE); if (ret) MyMessageBox(NULL, IDS_EXECERRTITLE, ret, MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL); else nCmdShow = SW_SHOWMINNOACTIVE; } /* Read WINFILE.INI and set the approriate variables. */ GetSettings(); /* Read the International constants out of WIN.INI. */ GetInternational(); dyBorder = GetSystemMetrics(SM_CYBORDER); dyBorderx2 = dyBorder * 2; dxFrame = GetSystemMetrics(SM_CXFRAME) - dyBorder; dxDriveBitmap = DRIVES_WIDTH; dyDriveBitmap = DRIVES_HEIGHT; dxFolder = FILES_WIDTH; dyFolder = FILES_HEIGHT; if (!LoadBitmaps()) return FALSE; hicoTree = LoadIcon(hAppInstance, MAKEINTRESOURCE(TREEICON)); hicoTreeDir = LoadIcon(hAppInstance, MAKEINTRESOURCE(TREEDIRICON)); hicoDir = LoadIcon(hAppInstance, MAKEINTRESOURCE(DIRICON)); chFirstDrive = (CHAR)((wTextAttribs & TA_LOWERCASE) ? 'a' : 'A'); // now build the parameters based on the font we will be using hdcScreen = GetDC(NULL); hOld = SelectObject(hdcScreen, hFont); GetTextStuff(hdcScreen); if (hOld) SelectObject(hdcScreen, hOld); dxClickRect = max(GetSystemMetrics(SM_CXDOUBLECLK) / 2, 2 * dxText); dyClickRect = max(GetSystemMetrics(SM_CYDOUBLECLK) / 2, dyText); hFontStatus = CreateFont(GetHeightFromPointsString("10"), 0, 0, 0, 400, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, szHelv); hOld = SelectObject(hdcScreen, hFontStatus); GetTextMetrics(hdcScreen, &tm); if (hOld) SelectObject(hdcScreen, hOld); dyStatus = tm.tmHeight + tm.tmExternalLeading + 7 * dyBorder; dxStatusField = GetDeviceCaps(hdcScreen, LOGPIXELSX) * 3; ReleaseDC(NULL, hdcScreen); cDrives = UpdateDriveList(); /* Create an array of INT 13h drive numbers (floppies only). */ nFloppies = 0; nHardDisk = 0x80; for (i=0; i < cDrives; i++) { if (IsRemovableDrive(rgiDrive[i])) { /* Avoid Phantom B: problems. */ if ((nFloppies == 1) && (i > 1)) nFloppies = 2; nFloppies++; } else { nHardDisk++; } } /* Load the accelerator table. */ hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(WFACCELTABLE)); LoadString(hInstance, IDS_DIRSREAD, szDirsRead, sizeof(szDirsRead)); LoadString(hInstance, IDS_BYTES, szBytes, sizeof(szBytes)); LoadString(hInstance, IDS_SBYTES, szSBytes, sizeof(szSBytes)); wDOSversion = DOS_320; wHelpMessage = RegisterWindowMessage("ShellHelp"); wBrowseMessage = RegisterWindowMessage("commdlg_help"); hhkMessageFilter = SetWindowsHook(WH_MSGFILTER, MessageFilter); hcurArrow = LoadCursor(NULL, IDC_ARROW); wndClass.lpszClassName = szFrameClass; wndClass.style = 0; wndClass.lpfnWndProc = FrameWndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(APPICON)); wndClass.hCursor = hcurArrow; wndClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1); // COLOR_WINDOW+1; wndClass.lpszMenuName = MAKEINTRESOURCE(FRAMEMENU); if (!RegisterClass(&wndClass)) { LEAVE("InitFileManager"); return FALSE; } wndClass.lpszClassName = szTreeClass; wndClass.style = CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc = TreeWndProc; // wndClass.cbClsExtra = 0; wndClass.cbWndExtra = sizeof(LONG) +// GWL_TYPE sizeof(LONG) +// wViewStyle GWL_VIEW sizeof(LONG) +// wSortStyle GWL_SORT sizeof(LONG) +// dwAttrStyle GWL_ATTRIBS sizeof(LONG) +// FSC flag GWL_FSCFLAG sizeof(PVOID) +// hwndLastFocus GWL_LASTFOCUS sizeof(LONG); // dxSplit GWL_SPLIT wndClass.hIcon = NULL; wndClass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(SPLITCURSOR)); wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wndClass.lpszMenuName = NULL; if (!RegisterClass(&wndClass)) { LEAVE("InitFileManager"); return FALSE; } wndClass.lpszClassName = szDrivesClass; wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = DrivesWndProc; wndClass.cbWndExtra = sizeof(LONG) +// GWL_CURDRIVEIND sizeof(LONG) +// GWL_CURDRIVEFOCUS sizeof(PVOID); // GWLP_LPSTRVOLUME wndClass.hCursor = hcurArrow; wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); if (!RegisterClass(&wndClass)) { LEAVE("InitFileManager"); return FALSE; } wndClass.lpszClassName = szTreeControlClass; wndClass.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc = TreeControlWndProc; wndClass.cbWndExtra = sizeof(LONG); // GWL_READLEVEL wndClass.hCursor = hcurArrow; wndClass.hbrBackground = NULL; if (!RegisterClass(&wndClass)) { LEAVE("InitFileManager"); return FALSE; } wndClass.lpszClassName = szDirClass; wndClass.style = CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc = DirWndProc; wndClass.cbWndExtra = sizeof(PVOID)+ // DTA data GWLP_HDTA sizeof(PVOID); // GWLP_TABARRAY wndClass.hIcon = NULL; wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); if (!RegisterClass(&wndClass)) { LEAVE("InitFileManager"); return FALSE; } wndClass.lpszClassName = szSearchClass; wndClass.style = 0; wndClass.lpfnWndProc = SearchWndProc; wndClass.cbWndExtra = sizeof(LONG) + // GWL_TYPE sizeof(LONG) + // wViewStyle GWL_VIEW sizeof(LONG) + // wSortStyle GWL_SORT sizeof(LONG) + // dwAttrStyle GWL_ATTRIBS sizeof(LONG) + // FSC flag GWL_FSCFLAG sizeof(PVOID) + // GWLP_HDTASEARCH sizeof(PVOID) + // GWLP_TABARRAYSEARCH sizeof(PVOID); // GWLP_LASTFOCUSSEARCH wndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(DIRICON)); wndClass.hbrBackground = NULL; if (!RegisterClass(&wndClass)) { LEAVE("InitFileManager"); return FALSE; } if (!LoadString(hInstance, IDS_WINFILE, szTitle, 32)) { LEAVE("InitFileManager"); return FALSE; } GetPrivateProfileString(szSettings, szWindow, szNULL, szBuffer, sizeof(szBuffer), szTheINIFile); GetSavedWindow(szBuffer, &win); if (!CreateWindowEx(0, szFrameClass, szTitle,WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, win.rc.left, win.rc.top, win.rc.right, win.rc.bottom, NULL, NULL, hInstance, NULL)) { LEAVE("InitFileManager - Frame class creation failure"); return FALSE; } InitMenus(); // after the window/menu has been created // support forced min or max if (nCmdShow == SW_SHOWNORMAL && win.sw == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWMAXIMIZED; ShowWindow(hwndFrame, nCmdShow); UpdateWindow(hwndFrame); LFNInit(); if (!CreateSavedWindows()) { LEAVE("InitFileManager"); return FALSE; } ShowWindow(hwndMDIClient, SW_NORMAL); // now refresh all tree windows (start background tree read) // // since the tree reads happen in the background the user can // change the Z order by activating windows once the read // starts. to avoid missing a window we must restart the // search through the MDI child list, checking to see if the // tree has been read yet (if there are any items in the // list box). if it has not been read yet we start the read hwnd = GetWindow(hwndMDIClient, GW_CHILD); while (hwnd) { HWND hwndTree; if ((hwndTree = HasTreeWindow(hwnd)) && (INT)SendMessage(GetDlgItem(hwndTree, IDCW_TREELISTBOX), LB_GETCOUNT, 0, 0L) == 0) { SendMessage(hwndTree, TC_SETDRIVE, MAKEWORD(FALSE, 0), 0L); hwnd = GetWindow(hwndMDIClient, GW_CHILD); } else { hwnd = GetWindow(hwnd, GW_HWNDNEXT); } } // ProfStop(); LEAVE("InitFileManager - OK"); return TRUE; } VOID APIENTRY DeleteBitmaps() { ENTER("DeleteBitmaps"); if (hdcMem) { SelectObject(hdcMem, hbmSave); if (hbmBitmaps) DeleteObject(hbmBitmaps); DeleteDC(hdcMem); } LEAVE("DeleteBitmaps"); } /*--------------------------------------------------------------------------*/ /* */ /* FreeFileManager() - */ /* */ /*--------------------------------------------------------------------------*/ VOID APIENTRY FreeFileManager() { ENTER("FreeFileManager"); if (lpfnRegisterPenApp) (*lpfnRegisterPenApp)(1, FALSE); DeleteBitmaps(); if (hFont) DeleteObject(hFont); if (hFontStatus) DeleteObject(hFontStatus); LEAVE("FreeFileManager"); }