chkdsk.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 171k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //
  2. // chkdsk.c : Control Panel Applet for Windows Disk Manager
  3. //
  4. #include "shprv.h"
  5. #include <dskmaint.h>
  6. #include <prsht.h>
  7. #include <regstr.h>
  8. #include <winerror.h>
  9. #include <memory.h>
  10. #include "util.h"
  11. #include "format.h"
  12. #include <help.h>
  13. #ifdef FROSTING
  14. #ifndef REGSTR_PATH_SCANDSKW_SAGESET
  15. #define REGSTR_PATH_SCANDSKW_SAGESET "Software\Microsoft\Plus!\System Agent\SAGE\ScanDisk for Windows\Set%lu"
  16. #endif
  17. #ifndef REGSTR_PATH_CHECKDISKDRIVES
  18. #define REGSTR_PATH_CHECKDISKDRIVES   "DrivesToCheck"
  19. #endif
  20. #endif
  21. //#define DOSETUPCHK 1
  22. #ifdef DOSETUPCHK
  23. typedef DWORD (WINAPI *DMaint_CheckDriveSetupPROC)(UINT Drive, DWORD Options, DSKUTILCBPROC lpfnCallBack, LPARAM lRefData);
  24. #endif
  25. #define g_hInstance g_hinst
  26. static  char g_szNULL[] = "";   // c_szNull
  27. HIMAGELIST g_himlIconsSmall = NULL;
  28. int g_cxIcon;
  29. int g_cyIcon;
  30. HWND g_ChkWndPar = NULL;
  31. ATOM g_ChkWndClass = 0;
  32. static DWORD FORMATSEG ChkaIds[]={DLGCHK_START,   IDH_WINDISK_MAIN_START,
  33.   DLGCHK_CANCEL,  IDH_WINDISK_MAIN_CLOSE,
  34.   DLGCHK_PBAR,   0xFFFFFFFFL,
  35.   DLGCHK_STATTXT, 0xFFFFFFFFL,
  36.   DLGCHK_STATTXT2,0xFFFFFFFFL,
  37.   DLGCHK_ADVANCED,IDH_WINDISK_MAIN_ADVANCED,
  38.   DLGCHK_DRVLIST, IDH_WINDISK_MAIN_LIST,
  39.   DLGCHK_DOBAD,   IDH_WINDISK_MAIN_THOROUGH,
  40.   DLGCHK_BADOPT,  IDH_WINDISK_MAIN_OPTIONS,
  41.   DLGCHK_AUTOFIX, IDH_WINDISK_MAIN_AUTOFIX,
  42.   DLGCHK_NOBADB,  IDH_WINDISK_MAIN_STANDARD,
  43.   DLGCHK_DTXT1,   IDH_WINDISK_MAIN_STANDARD,
  44.   DLGCHK_DTXT2,   IDH_WINDISK_MAIN_THOROUGH,
  45.   IDC_ICON_1,     0xFFFFFFFFL,
  46.   IDC_TEXT,       IDH_WINDISK_MAIN_LIST,
  47.   IDC_GROUPBOX_1, IDH_COMM_GROUPBOX,
  48.   0,0};
  49. #ifdef OPK2
  50. static DWORD FORMATSEG ChkaIdsSage[]={DLGCHK_START,   IDH_OK,
  51.       DLGCHK_CANCEL,  IDH_CANCEL,
  52.       DLGCHK_PBAR,    0xFFFFFFFFL,
  53.       DLGCHK_STATTXT, 0xFFFFFFFFL,
  54.       DLGCHK_STATTXT2,0xFFFFFFFFL,
  55.       DLGCHK_ADVANCED,IDH_WINDISK_MAIN_ADVANCED,
  56.       DLGCHK_DRVLIST, IDH_WINDISK_MAIN_LIST,
  57.       DLGCHK_DOBAD,   IDH_WINDISK_MAIN_THOROUGH,
  58.       DLGCHK_BADOPT,  IDH_WINDISK_MAIN_OPTIONS,
  59.       DLGCHK_AUTOFIX, IDH_WINDISK_MAIN_AUTOFIX,
  60.       DLGCHK_NOBADB,  IDH_WINDISK_MAIN_STANDARD,
  61.       DLGCHK_DTXT1,   IDH_WINDISK_MAIN_STANDARD,
  62.       DLGCHK_DTXT2,   IDH_WINDISK_MAIN_THOROUGH,
  63.       IDC_ICON_1,     0xFFFFFFFFL,
  64.       IDC_TEXT,       IDH_WINDISK_MAIN_LIST,
  65.       IDC_GROUPBOX_1, IDH_COMM_GROUPBOX,
  66.       0,0};
  67. #endif
  68. static DWORD FORMATSEG ChkAdvaIds[]={DLGCHKADV_OK,  IDH_OK,
  69.      DLGCHKADV_CANCEL,  IDH_CANCEL,
  70.      DLGCHKADV_LSTF,  IDH_WINDISK_ADV_FREE,
  71.      DLGCHKADV_LSTMF,  IDH_WINDISK_ADV_CONVERT,
  72.      DLGCHKADV_XLDEL,  IDH_WINDISK_ADV_DELETE,
  73.      DLGCHKADV_XLCPY,  IDH_WINDISK_ADV_MAKE_COPIES,
  74.      DLGCHKADV_XLIGN,  IDH_WINDISK_ADV_IGNORE,
  75.      DLGCHKADV_CHKDT,  IDH_WINDISK_ADV_DATE_TIME,
  76.      DLGCHKADV_CHKNM,  IDH_WINDISK_ADV_FILENAME,
  77.      DLGCHKADV_CHKHST,  IDH_WINDISK_ADV_CHECK_HOST,
  78.      DLGCHKADV_REPALWAYS,IDH_WINDISK_ADV_ALWAYS,
  79.      DLGCHKADV_NOREP,  IDH_WINDISK_ADV_NEVER,
  80.      DLGCHKADV_REPIFERR, IDH_WINDISK_ADV_ONLY_IF_FOUND,
  81.      DLGCHKADV_LOGREP,  IDH_WINDISK_REPLACE_LOG,
  82.      DLGCHKADV_LOGAPPND, IDH_WINDISK_APPEND_LOG,
  83.      DLGCHKADV_NOLOG,  IDH_WINDISK_NO_LOG,
  84.      IDC_GROUPBOX_1,     IDH_COMM_GROUPBOX,
  85.      IDC_GROUPBOX_2,     IDH_COMM_GROUPBOX,
  86.      IDC_GROUPBOX_3,     IDH_COMM_GROUPBOX,
  87.      IDC_GROUPBOX_4,     IDH_COMM_GROUPBOX,
  88.      IDC_GROUPBOX_5,  IDH_COMM_GROUPBOX,
  89.      0,0};
  90. static DWORD FORMATSEG ChkSAOaIds[]={DLGCHKSAO_OK,  IDH_OK,
  91.      DLGCHKSAO_CANCEL,  IDH_CANCEL,
  92.      DLGCHKSAO_NOWRTTST, IDH_WINDISK_OPTIONS_NO_WRITE_TEST,
  93.      DLGCHKSAO_ALLHIDSYS,IDH_WINDISK_OPTIONS_NO_HID_SYS,
  94.      DLGCHKSAO_DOALL,  IDH_WINDISK_OPTIONS_SYS_AND_DATA,
  95.      DLGCHKSAO_NOSYS,  IDH_WINDISK_OPTIONS_DATA_ONLY,
  96.      DLGCHKSAO_NODATA,  IDH_WINDISK_OPTIONS_SYS_ONLY,
  97.      IDC_GROUPBOX_1,  IDH_COMM_GROUPBOX,
  98.      IDC_TEXT,          0xFFFFFFFFL,
  99.      0,0};
  100. DWORD WINAPI SHGetFileInfo(LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR * hfi, UINT cbFileInfo, UINT uFlags);
  101. // convert a file spec to make it look a bit better
  102. // if it is all upper case chars
  103. typedef struct _SHCHECKDISKINFO
  104. {
  105. DMAINTINFO sDMaint;
  106. LPMYCHKINFOSTRUCT lpMyChkInf;
  107. } SHCHECKDISKINFO, FAR *LPSHCHECKDISKINFO;
  108. #pragma optimize("lge",off)
  109. BOOL NEAR PASCAL SaveTimeInReg(HKEY hkRoot, LPCSTR pszSubKey,
  110.        LPCSTR pszValName, WORD ResultCode,
  111.        BOOL IsSysTime)
  112. {
  113.     DSKTLSYSTEMTIME systime;
  114.     BOOL     bRet;
  115.     HKEY     hk;
  116.     _asm {
  117. // Get the date information
  118. mov ah,2ah
  119. int 21h
  120. xor bx,bx
  121. mov systime.wYear,cx
  122. mov bl,dh
  123. mov systime.wMonth,bx
  124. mov bl,al
  125. mov systime.wDayOfWeek,bx
  126. mov bl,dl
  127. mov systime.wDay,bx
  128. // Get the time information
  129. mov ah,2ch
  130. int 21h
  131. xor bx,bx
  132. mov bl,ch
  133. mov systime.wHour,bx
  134. mov bl,cl
  135. mov systime.wMinute,bx
  136. mov bl,dh
  137. mov systime.wSecond,bx
  138. mov bl,dl
  139. mov systime.wMilliseconds,bx
  140.     }
  141.     systime.wResult = ResultCode;
  142.     // Convert from 1/100 second to 1/1000 second
  143.     systime.wMilliseconds *= 10;
  144.     if (RegCreateKey(hkRoot, pszSubKey, &hk) != ERROR_SUCCESS)
  145.     {
  146. return(FALSE);
  147.     }
  148.     if(IsSysTime)
  149.     {
  150. bRet = RegSetValueEx(hk, pszValName, 0, REG_BINARY,
  151.      (LPBYTE)&systime, (sizeof(systime) - 2)) == ERROR_SUCCESS;
  152.     } else {
  153. bRet = RegSetValueEx(hk, pszValName, 0, REG_BINARY,
  154.      (LPBYTE)&systime, sizeof(systime)) == ERROR_SUCCESS;
  155.     }
  156.     RegCloseKey(hk);
  157.     return(bRet);
  158. }
  159. //
  160. // Get the basic DBL/DRVSPACE info, in particular, what is the host drive
  161. // (return from function), and what is the extension of the volume CVF on
  162. // the host volume (returned in lpext).
  163. //
  164. WORD NEAR PASCAL GetCompInfo(UINT Drive, LPWORD lpext)
  165. {
  166.     WORD  HostDrive = 0xFFFF;
  167.     WORD  ext;
  168.     _asm {
  169. mov ax, 0x4A11
  170. xor bx, bx // 0 = check_version
  171. int 0x2F // Is DoubleSpace around?
  172. or ax, ax
  173. jnz notdouble // Nope.
  174. mov ax, 0x4A11 // DBLSPACE.BIN INT 2F number
  175. mov bx, 1 // 1 = GetDriveMap function
  176. mov dx, Drive
  177. int 0x2F // (bl AND 80h) == DS drive flag
  178. // (bl AND 7Fh) == host drive
  179. or ax, ax // Success?
  180. jnz notdouble // Nope.
  181. test bl, 0x80 // Is the drive compressed?
  182. jz notdouble //    NO
  183. // We have a DoubleSpace Drive, need to figure out host drive.
  184. //
  185. // This is tricky because of the manner in which DRV/DBLSPACE.BIN
  186. // keeps track of drives.
  187. //
  188. // For a swapped CVF, the current drive number of the host
  189. // drive is returned by the first GetDriveMap call.  But for
  190. // an unswapped CVF, we must make a second GetDriveMap call
  191. // on the "host" drive returned by the first call.  But, to
  192. // distinguish between swapped and unswapped CVFs, we must
  193. // make both of these calls.  So, we make them, and then check
  194. // the results.
  195. mov cl, bh
  196. xor ch, ch
  197. mov ext, cx  // Save the drive's extension
  198. and bl, 0x7F // bl = "host" drive number
  199. xor bh, bh
  200. mov HostDrive, bx // Save 1st host drive
  201. mov dl, bl // Set up for query of "host" drive
  202. mov ax, 0x4A11 // DBLSPACE.BIN INT 2F number
  203. mov bx, 1 // 1 = GetDriveMap function
  204. int 0x2F // (bl AND 7Fh) == 2nd host drive
  205. test bl, 80h  // Is the host a hard drive?
  206. jz gdiExit  // if so, it's the real host.
  207. and bx, 007Fh // Otherwise, this thing is swapped
  208. mov HostDrive, bx // with the host.
  209.       gdiExit:
  210.     }
  211.     *lpext = ext;
  212. notdouble:
  213.     return(HostDrive);
  214. }
  215. #pragma optimize("",on)
  216. BOOL NEAR SetDriveTitle(LPMYCHKINFOSTRUCT lpMyChkInf, HWND hwnd)
  217. {
  218.     int i;
  219.     PSTR        pMsgBuf;
  220.     LPSTR lpszReturn;
  221.     LPSTR lpszTemp;
  222. #ifdef FROSTING
  223.     if (lpMyChkInf->fSageSet)
  224.        return TRUE;
  225. #endif
  226. #define SZTEMPORARY 512
  227.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,sizeof(char) * SZTEMPORARY);
  228.     if (!pMsgBuf)
  229.         return FALSE;
  230.     
  231.     lpszTemp = (LPSTR)(pMsgBuf + (SZTEMPORARY/2));
  232.     lpszReturn = (LPSTR)pMsgBuf;
  233.     
  234.     // This dialog does not do the split drive title
  235.     if(lpMyChkInf->MyFixOpt & DLGCHK_RO)
  236.     {
  237.         i = IDS_CHKTIT3;
  238.     } else {
  239.         i = IDS_CHKTIT2;
  240.     }
  241.     LoadString(g_hInstance, i, lpszTemp, (SZTEMPORARY/2));
  242.     if((lpMyChkInf->IsSplitDrv) && (!(lpMyChkInf->DoingCompDrv)))
  243.     {
  244.         wsprintf(lpszReturn,lpszTemp,(LPSTR)lpMyChkInf->CompdriveNameStr);
  245.     } else {
  246.         wsprintf(lpszReturn,lpszTemp,(LPSTR)lpMyChkInf->lpwddi->driveNameStr);
  247.     }
  248.     
  249.     SetWindowText(hwnd,lpszReturn);
  250.     LocalFree((HANDLE)pMsgBuf);
  251.     return TRUE;
  252. }
  253. VOID NEAR SetStdChkTitle(LPMYCHKINFOSTRUCT lpMyChkInf, 
  254.  LPSTR lpszFormat,LPSTR lpszReturn,int cReturn)
  255. {
  256.     if((lpMyChkInf->IsSplitDrv) && (!(lpMyChkInf->DoingCompDrv)))
  257.     {
  258.         char szBuffer[128];
  259.         
  260. LoadString(g_hInstance, IDS_COMPDISKH, lpszReturn, cReturn);
  261. wsprintf((LPSTR)szBuffer,(LPSTR)lpszReturn,(LPSTR)lpMyChkInf->CompdriveNameStr);
  262. wsprintf((LPSTR)lpszReturn,(LPSTR)lpszFormat,(LPSTR)szBuffer);
  263.     } else {
  264. wsprintf((LPSTR)lpszReturn,(LPSTR)lpszFormat,
  265.                  (LPSTR)lpMyChkInf->lpwddi->driveNameStr);
  266.     }
  267. }
  268. #if 0 // unused
  269. WORD FAR  MyChkdskMessageBoxBuf(LPMYCHKINFOSTRUCT lpMyChkInf,
  270. LPSTR lpMsgBuf, WORD BoxStyle)
  271. {
  272.     PSTR       pMsgBuf;
  273.     WORD       j;
  274. #define SZTYPBUF11     120
  275. #define SZTITBUF11     120
  276. #define SZFMTBUF11     128
  277. #define TOTMSZ11       (SZTYPBUF11+SZTITBUF11+SZFMTBUF11)
  278. #define TypeBuf11 (&(pMsgBuf[0]))
  279. #define TitBuf11  (&(pMsgBuf[SZTYPBUF11]))
  280. #define FmtBuf11  (&(pMsgBuf[SZTYPBUF11+SZTITBUF11]))
  281.     if(lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND))
  282.     {
  283. switch(BoxStyle & MB_TYPEMASK)
  284. {
  285.     case MB_ABORTRETRYIGNORE:
  286. switch(BoxStyle & MB_DEFMASK)
  287. {
  288.     case MB_DEFBUTTON3:
  289. return(IDIGNORE);
  290. break;
  291.     case MB_DEFBUTTON2:
  292. return(IDRETRY);
  293. break;
  294.     case MB_DEFBUTTON1:
  295.     default:
  296. return(IDABORT);
  297. break;
  298. }
  299. break;
  300.     case MB_YESNOCANCEL:
  301. switch(BoxStyle & MB_DEFMASK)
  302. {
  303.     case MB_DEFBUTTON3:
  304. return(IDCANCEL);
  305. break;
  306.     case MB_DEFBUTTON2:
  307. return(IDNO);
  308. break;
  309.     case MB_DEFBUTTON1:
  310.     default:
  311. return(IDYES);
  312. break;
  313. }
  314. break;
  315.     case MB_YESNO:
  316. if((BoxStyle & MB_DEFMASK) == MB_DEFBUTTON1)
  317.     return(IDYES);
  318. else
  319.     return(IDNO);
  320. break;
  321.     case MB_RETRYCANCEL:
  322. if((BoxStyle & MB_DEFMASK) == MB_DEFBUTTON1)
  323.     return(IDRETRY);
  324. else
  325.     return(IDCANCEL);
  326. break;
  327.     case MB_OKCANCEL:
  328. if((BoxStyle & MB_DEFMASK) == MB_DEFBUTTON1)
  329.     return(IDOK);
  330. else
  331.     return(IDCANCEL);
  332. break;
  333.     case MB_OK:
  334.     default:
  335. return(IDOK);
  336. break;
  337. }
  338.     }
  339.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ11);
  340.     if(!pMsgBuf)
  341.     {
  342. // BUG BUG
  343. return(IDCANCEL);
  344.     }
  345.     LoadString(g_hInstance, IDS_DRIVETITLEC, FmtBuf11, SZFMTBUF11);
  346.     SetStdChkTitle(lpMyChkInf, FmtBuf11, TitBuf11, SZFMTBUF11);
  347.     j = MessageBox(lpMyChkInf->hProgDlgWnd,lpMsgBuf,TitBuf11,BoxStyle);
  348.     LocalFree((HANDLE)pMsgBuf);
  349.     return(j);
  350. }
  351. #endif
  352. WORD FAR  MyChkdskMessageBox(LPMYCHKINFOSTRUCT lpMyChkInf,
  353.      WORD MsgID, WORD BoxStyle)
  354. {
  355.     PSTR       pMsgBuf;
  356.     WORD       j;
  357. #define SZMSGBUF12     256
  358. #define SZTYPBUF12     120
  359. #define SZTITBUF12     120
  360. #define SZFMTBUF12     128
  361. #define TOTMSZ12       (SZMSGBUF12+SZTYPBUF12+SZTITBUF12+SZFMTBUF12)
  362. #define MsgBuf12  (&(pMsgBuf[0]))
  363. //#define TypeBuf12 (&(pMsgBuf[SZMSGBUF12]))
  364. #define TitBuf12  (&(pMsgBuf[SZMSGBUF12+SZTYPBUF12]))
  365. #define FmtBuf12  (&(pMsgBuf[SZMSGBUF12+SZTYPBUF12+SZTITBUF12]))
  366.     if(lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND))
  367.     {
  368. switch(BoxStyle & MB_TYPEMASK)
  369. {
  370.     case MB_ABORTRETRYIGNORE:
  371. switch(BoxStyle & MB_DEFMASK)
  372. {
  373.     case MB_DEFBUTTON3:
  374. return(IDIGNORE);
  375. break;
  376.     case MB_DEFBUTTON2:
  377. return(IDRETRY);
  378. break;
  379.     case MB_DEFBUTTON1:
  380.     default:
  381. return(IDABORT);
  382. break;
  383. }
  384. break;
  385.     case MB_YESNOCANCEL:
  386. switch(BoxStyle & MB_DEFMASK)
  387. {
  388.     case MB_DEFBUTTON3:
  389. return(IDCANCEL);
  390. break;
  391.     case MB_DEFBUTTON2:
  392. return(IDNO);
  393. break;
  394.     case MB_DEFBUTTON1:
  395.     default:
  396. return(IDYES);
  397. break;
  398. }
  399. break;
  400.     case MB_YESNO:
  401. if((BoxStyle & MB_DEFMASK) == MB_DEFBUTTON1)
  402.     return(IDYES);
  403. else
  404.     return(IDNO);
  405. break;
  406.     case MB_RETRYCANCEL:
  407. if((BoxStyle & MB_DEFMASK) == MB_DEFBUTTON1)
  408.     return(IDRETRY);
  409. else
  410.     return(IDCANCEL);
  411. break;
  412.     case MB_OKCANCEL:
  413. if((BoxStyle & MB_DEFMASK) == MB_DEFBUTTON1)
  414.     return(IDOK);
  415. else
  416.     return(IDCANCEL);
  417. break;
  418.     case MB_OK:
  419.     default:
  420. return(IDOK);
  421. break;
  422. }
  423.     }
  424.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ12);
  425.     if(!pMsgBuf)
  426.     {
  427. // BUG BUG
  428. return(IDCANCEL);
  429.     }
  430.     if((MsgID == IDS_CANTCHKALL) || (MsgID == IDS_NOSEL) || (MsgID == IDS_NOMEM2))
  431.     {
  432. LoadString(g_hInstance, IDS_CHKTIT, TitBuf12, SZTITBUF12);
  433.     } else {
  434. LoadString(g_hInstance, IDS_DRIVETITLEC, FmtBuf12, SZFMTBUF12);
  435.         
  436.         SetStdChkTitle(lpMyChkInf, FmtBuf12, TitBuf12, SZTITBUF12);
  437.     }
  438.     LoadString(g_hInstance, MsgID, MsgBuf12, SZMSGBUF12);
  439.     j = MessageBox(lpMyChkInf->hProgDlgWnd,MsgBuf12,TitBuf12,BoxStyle);
  440.     LocalFree((HANDLE)pMsgBuf);
  441.     return(j);
  442. }
  443. #ifdef FROSTING
  444. DWORD NEAR ChkFindHiddenDrives (VOID)
  445. {
  446.     HKEY   hKey;
  447.     DWORD  typ;
  448.     DWORD  sz;
  449.     DWORD  HiddenDrives = 0L;
  450.     char   RegKey[80];
  451.     lstrcpy(RegKey, REGSTR_PATH_POLICIES);
  452.     lstrcat(RegKey, "\Explorer");
  453.     if(RegOpenKey(HKEY_CURRENT_USER,RegKey,&hKey) == ERROR_SUCCESS)
  454.     {
  455. sz = sizeof(DWORD);
  456. if((RegQueryValueEx(hKey,"NoDrives",NULL,&typ,(LPBYTE)&HiddenDrives, &sz) != ERROR_SUCCESS) ||
  457.    (typ != REG_DWORD)  ||
  458.    (sz != 4L))
  459. {
  460.     HiddenDrives = 0L;
  461. }
  462. RegCloseKey(hKey);
  463.     }
  464.     return HiddenDrives;
  465. }
  466. DWORD NEAR ChkFindAllFixedDrives (VOID)
  467. {
  468.     DWORD FixedDrives = 0L;
  469.     DWORD HiddenDrives;
  470.     WORD  i;
  471.     HiddenDrives = ChkFindHiddenDrives();
  472.     for(i = 0; i < 26; i++)
  473.     {
  474. if(HiddenDrives & (0x00000001L << i))
  475.     continue;
  476. if((DriveType(i) == DRIVE_FIXED) || (DriveType(i) == DRIVE_RAMDRIVE))
  477. {
  478.     FixedDrives |= (0x00000001L << i);
  479. }
  480.     }
  481.     return FixedDrives;
  482. }
  483. BOOL NEAR ChkAreAllFixedDrivesSelected (DWORD DrivesToChk)
  484. {
  485.     DWORD FixedDrives;
  486.     WORD  i;
  487.     FixedDrives = ChkFindAllFixedDrives();
  488.     for(i = 0; i < 26; i++)
  489.     {
  490. if(FixedDrives & (0x00000001L << i))
  491. {
  492.     if(!(DrivesToChk & (0x00000001L << i)))
  493.         return FALSE;
  494. }
  495.     }
  496.     return TRUE;
  497. }
  498. #endif
  499. #ifndef cbMaxREGPATH
  500. #define cbMaxREGPATH     256
  501. #endif
  502. VOID NEAR GetChkRegOptions(LPMYCHKINFOSTRUCT lpMyChkInf)
  503. {
  504.     DWORD dwi;
  505.     DWORD typ;
  506.     DWORD sz;
  507.     HKEY  hKey;
  508. #ifdef FROSTING
  509.     char  keyname[ cbMaxREGPATH ];
  510.     LONG  rc;
  511. #endif
  512.     lpMyChkInf->RegOptions = MAKELONG((DLGCHK_NOBAD | DLGCHK_XLCPY   |
  513.        DLGCHK_INTER | DLGCHK_NOCHKDT |
  514.        DLGCHK_LSTMF | DLGCHK_REP),
  515.       0);
  516. #ifdef OPK2
  517. #ifdef FROSTING
  518.     if(lpMyChkInf->fSageSet)
  519. lpMyChkInf->RegOptions |= MAKELONG(0,DLGCHK_REPONLYERR);
  520. #endif
  521. #endif
  522.     lpMyChkInf->NoUnsupDrvs = 0L;
  523.     if(RegOpenKey(HKEY_CURRENT_USER,REGSTR_PATH_CHECKDISK,&hKey) == ERROR_SUCCESS)
  524.     {
  525. #ifndef FROSTING
  526.       sz = sizeof(DWORD);
  527.       if((RegQueryValueEx(hKey,REGSTR_PATH_CHECKDISKSET,NULL,&typ,(LPBYTE)&dwi, &sz) == ERROR_SUCCESS) &&
  528.  (typ == REG_BINARY)  &&
  529.  (sz == 4L))
  530.       {
  531.   lpMyChkInf->RegOptions = dwi;
  532.       }
  533. #endif
  534.       sz = sizeof(DWORD);
  535.       if((RegQueryValueEx(hKey,REGSTR_PATH_CHECKDISKUDRVS,NULL,&typ,(LPBYTE)&dwi, &sz) == ERROR_SUCCESS) &&
  536.  (typ == REG_BINARY)  &&
  537.  (sz == 4L))
  538.       {
  539.   lpMyChkInf->NoUnsupDrvs = dwi;
  540.       }
  541.       RegCloseKey(hKey);
  542.     }
  543. #ifdef FROSTING
  544.     if (lpMyChkInf->idxSettings == (DWORD)0xFFFFFFFF) {
  545. rc = RegOpenKey(HKEY_CURRENT_USER,REGSTR_PATH_CHECKDISK,&hKey);
  546.     } else {
  547. lpMyChkInf->DrivesToChk = 0L;
  548. wsprintf (keyname, REGSTR_PATH_SCANDSKW_SAGESET, lpMyChkInf->idxSettings);
  549. rc = RegOpenKey(HKEY_LOCAL_MACHINE,keyname,&hKey);
  550.     }
  551.     if(rc == ERROR_SUCCESS)
  552.     {
  553. sz = sizeof(DWORD);
  554. rc = RegQueryValueEx(hKey,REGSTR_PATH_CHECKDISKSET,NULL,
  555. &typ,(LPBYTE)&dwi, &sz);
  556. if((rc == ERROR_SUCCESS) && (typ == REG_BINARY)  && (sz == 4L))
  557. {
  558.     lpMyChkInf->RegOptions = dwi;
  559. }
  560. if(lpMyChkInf->idxSettings != (DWORD)0xFFFFFFFF)
  561. {
  562.     sz = sizeof(DWORD);
  563.     rc = RegQueryValueEx(hKey,REGSTR_PATH_CHECKDISKDRIVES,NULL,
  564.     &typ,(LPBYTE)&dwi, &sz);
  565.     if((rc == ERROR_SUCCESS) && (typ == REG_BINARY) && (sz == 4L))
  566.     {
  567. lpMyChkInf->DrivesToChk = dwi;
  568. if (lpMyChkInf->DrivesToChk & DTC_ALLFIXEDDRIVES)
  569. {
  570.     lpMyChkInf->DrivesToChk &= ~DTC_ALLFIXEDDRIVES;
  571.     lpMyChkInf->DrivesToChk |= ChkFindAllFixedDrives();
  572. }
  573.     }
  574. }
  575. RegCloseKey(hKey);
  576.     }
  577.     if((lpMyChkInf->idxSettings != (DWORD)0xFFFFFFFF) && (lpMyChkInf->DrivesToChk == 0L))
  578.     {
  579. lpMyChkInf->DrivesToChk = ChkFindAllFixedDrives();
  580.     }
  581. #endif
  582.     return;
  583. }
  584. #ifdef FROSTING
  585. VOID NEAR SetChkRegOptions(DWORD options, DWORD NoUnsupDrvs,
  586.    DWORD DrivesToChk, DWORD idxSettings)
  587. #else
  588. VOID NEAR SetChkRegOptions(DWORD options, DWORD NoUnsupDrvs)
  589. #endif
  590. {
  591.     HKEY  hKey;
  592. #ifndef FROSTING
  593.     if(RegOpenKey(HKEY_CURRENT_USER,REGSTR_PATH_CHECKDISK,&hKey) == ERROR_SUCCESS)
  594.     {
  595. SetIt:
  596.       RegSetValueEx(hKey,REGSTR_PATH_CHECKDISKSET,NULL,REG_BINARY,(LPBYTE)&options,sizeof(DWORD));
  597.       RegSetValueEx(hKey,REGSTR_PATH_CHECKDISKUDRVS,NULL,REG_BINARY,(LPBYTE)&NoUnsupDrvs,sizeof(DWORD));
  598.       RegCloseKey(hKey);
  599.     } else {
  600.       if(RegCreateKey(HKEY_CURRENT_USER,REGSTR_PATH_CHECKDISK,&hKey) == ERROR_SUCCESS)
  601.       {
  602.   goto SetIt;
  603.       }
  604.     }
  605. #else
  606.     char  keyname[ cbMaxREGPATH ];
  607.     LONG  rc;
  608.     rc = RegCreateKey(HKEY_CURRENT_USER,REGSTR_PATH_CHECKDISK,&hKey);
  609.     if(rc == ERROR_SUCCESS)
  610.     {
  611. RegSetValueEx(hKey,REGSTR_PATH_CHECKDISKUDRVS,NULL,
  612.       REG_BINARY,(LPBYTE)&NoUnsupDrvs,sizeof(DWORD));
  613. RegCloseKey(hKey);
  614.     }
  615.     if (idxSettings == (DWORD)0xFFFFFFFF) {
  616. rc = RegCreateKey(HKEY_CURRENT_USER,REGSTR_PATH_CHECKDISK,&hKey);
  617.     } else {
  618. wsprintf(keyname, REGSTR_PATH_SCANDSKW_SAGESET, idxSettings);
  619. rc = RegCreateKey(HKEY_LOCAL_MACHINE,keyname,&hKey);
  620.     }
  621.     if(rc == ERROR_SUCCESS)
  622.     {
  623. options &= ~(SHCHK_OPT_SAGESET | SHCHK_OPT_SAGERUN);
  624. RegSetValueEx(hKey,REGSTR_PATH_CHECKDISKSET,NULL,
  625.       REG_BINARY,(LPBYTE)&options,sizeof(DWORD));
  626. if (idxSettings != (DWORD)0xFFFFFFFF)
  627. {
  628.     if(ChkAreAllFixedDrivesSelected (DrivesToChk))
  629.         DrivesToChk |= DTC_ALLFIXEDDRIVES;
  630.     RegSetValueEx(hKey,REGSTR_PATH_CHECKDISKDRIVES,NULL,
  631.   REG_BINARY,(LPBYTE)&DrivesToChk,sizeof(DWORD));
  632. }
  633. RegCloseKey(hKey);
  634.     }
  635. #endif
  636.     return;
  637. }
  638. #define SZBUFA3       256
  639. #define SZBUFB3       256
  640. #define SZBUFC3       256
  641. #define SZBUFD3       256
  642. #define SZBUFE3       256
  643. #define TOTMSZ3       (SZBUFA3+SZBUFB3+SZBUFC3+SZBUFD3+SZBUFE3)
  644. #define bBuf1 (&(pMsgBuf[0]))
  645. #define bBuf2 (&(pMsgBuf[SZBUFA3]))
  646. #define bBuf3 (&(pMsgBuf[SZBUFA3+SZBUFB3]))
  647. #define bBuf4 (&(pMsgBuf[SZBUFA3+SZBUFB3+SZBUFC3]))
  648. #define bBuf5 (&(pMsgBuf[SZBUFA3+SZBUFB3+SZBUFC3+SZBUFD3]))
  649. LRESULT CALLBACK ChkCBProc(UINT msg, LPARAM lRefData, LPARAM lParam1,
  650.    LPARAM lParam2, LPARAM lParam3,
  651.    LPARAM lParam4, LPARAM lParam5)
  652. {
  653.     LPMYCHKINFOSTRUCT  lpMyChkInf;
  654.     DLGPROC        lpfnDlgProc;
  655.     DWORD        dwi;
  656.     BOOL        PMRet;
  657.     MSG         wmsg;
  658.     WORD        i;
  659.     WORD        j;
  660.     PSTR        pMsgBuf;
  661.     BYTE        LabBuf[20];
  662. #ifdef FROSTING
  663.     DWORD              LockWrtRestartMax;
  664. #endif
  665. #define SZBUFA4       128
  666. #define SZBUFB4       128
  667. #define SZBUFC4       512
  668. #define TOTMSZ4       (SZBUFC4+SZBUFA4+SZBUFB4)
  669. #define dBuf3 (&(pMsgBuf[0]))
  670. #define dBuf1 (&(pMsgBuf[SZBUFC4]))
  671. #define dBuf2 (&(pMsgBuf[SZBUFC4+SZBUFA4]))
  672.     lpMyChkInf   = (LPMYCHKINFOSTRUCT)lRefData;
  673.     lpMyChkInf->lpFixFDisp   = (LPFIXFATDISP)lParam1;
  674.     pMsgBuf   = 0;
  675.     lpMyChkInf->lParam1    = lParam1;
  676.     lpMyChkInf->lParam2    = lParam2;
  677.     lpMyChkInf->lParam3    = lParam3;
  678.     lpMyChkInf->lParam4    = lParam4;
  679.     lpMyChkInf->lParam5    = lParam5;
  680.     lpMyChkInf->IsFolder   = FALSE;
  681.     lpMyChkInf->IsRootFolder   = FALSE;
  682.     lpMyChkInf->UseAltDlgTxt   = FALSE;
  683.     lpMyChkInf->UseAltDefBut   = FALSE;
  684.     lpMyChkInf->CancelIsDefault   = FALSE;
  685.     lpMyChkInf->AltDefButIndx   = 0;
  686.     lpMyChkInf->UseAltCantFix   = FALSE;
  687.     lpMyChkInf->AltCantFixTstFlag = 0;
  688.     lpMyChkInf->AltCantFixHID   = 0xFFFFFFFFL;
  689.     lpMyChkInf->AltCantFixRepHID  = 0xFFFFFFFFL;
  690.     switch(msg)
  691.     {
  692. case DU_ERRORDETECTED:
  693.     SEAddToLogRCS(lpMyChkInf,IDL_CRLF,NULL);
  694.     if((LOWORD(lpMyChkInf->lParam2) != WRITEERROR) &&
  695.        (LOWORD(lpMyChkInf->lParam2) != READERROR)    )
  696.     {
  697. lpMyChkInf->RWRstsrtCnt   = 0;
  698.     }
  699.     switch(LOWORD(lpMyChkInf->lParam2)) {
  700. case ERRLOCKV: // This will get logged on engine return
  701.     return(0L);
  702.     break;
  703. case WRITEERROR:
  704.     if(HIWORD(lpMyChkInf->lParam2) & FILCOLL)
  705.     {
  706. //
  707. // We will handle this on DU_ERRORCORRECTED
  708. //
  709. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN);
  710. return(lpMyChkInf->FixRet);
  711.     }
  712.     if(HIWORD(lpMyChkInf->lParam3) == 21)
  713.     {
  714. lpMyChkInf->iErr = IERR_READERR1;
  715.     } else if(HIWORD(lpMyChkInf->lParam3) == 19) {
  716. lpMyChkInf->iErr = IERR_WRITEERR1;
  717.     } else {
  718. if(lpMyChkInf->lpwddi->TypeFlags & DT_DBLDISK)
  719. {
  720.     if((!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOCHKHST)) &&
  721.        (!(lpMyChkInf->MyFixOpt & (DLGCHK_NOBAD |
  722.   DLGCHK_NODATA |
  723.   DLGCHK_NOSYS)  ))    )
  724.     {
  725. lpMyChkInf->iErr = IERR_WRITEERR2;
  726. if(!(LOWORD(lpMyChkInf->lParam3) & RETRY))
  727. {
  728.     lpMyChkInf->RWRstsrtCnt++;
  729.     if(lpMyChkInf->RWRstsrtCnt > 1)
  730.     {
  731. goto DontRestrt1;
  732.     }
  733.     lpMyChkInf->FixRet = MAKELONG(0,ERETRETRY);
  734.     goto LogAutoErr;
  735. }
  736. DontRestrt1:
  737. ;
  738.     } else {
  739. if(HIWORD(lpMyChkInf->lParam2) & ERRDATA)
  740. {
  741.     lpMyChkInf->iErr = IERR_WRITEERR6;
  742. } else {
  743.     lpMyChkInf->iErr = IERR_WRITEERR5;
  744. }
  745.     }
  746. } else {
  747.     if(!(lpMyChkInf->MyFixOpt & (DLGCHK_NOBAD |
  748.  DLGCHK_NODATA |
  749.  DLGCHK_NOSYS) ))
  750.     {
  751. lpMyChkInf->iErr = IERR_WRITEERR2;
  752. if(!(LOWORD(lpMyChkInf->lParam3) & RETRY))
  753. {
  754.     lpMyChkInf->RWRstsrtCnt++;
  755.     if(lpMyChkInf->RWRstsrtCnt > 1)
  756.     {
  757. goto DontRestrt2;
  758.     }
  759.     lpMyChkInf->FixRet = MAKELONG(0,ERETRETRY);
  760.     goto LogAutoErr;
  761. }
  762. DontRestrt2:
  763. ;
  764.     } else {
  765. if(HIWORD(lpMyChkInf->lParam2) & ERRDATA)
  766. {
  767.     lpMyChkInf->iErr = IERR_WRITEERR4;
  768. } else {
  769.     lpMyChkInf->iErr = IERR_WRITEERR3;
  770. }
  771.     }
  772. }
  773.     }
  774.     goto DoNFErrFIgn;
  775.     break;
  776. case READERROR:
  777.     if(HIWORD(lpMyChkInf->lParam3) == 21)
  778.     {
  779. lpMyChkInf->iErr = IERR_READERR1;
  780.     } else {
  781. if(lpMyChkInf->lpwddi->TypeFlags & DT_DBLDISK)
  782. {
  783.     if((!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOCHKHST)) &&
  784.        (!(lpMyChkInf->MyFixOpt & (DLGCHK_NOBAD |
  785.   DLGCHK_NODATA |
  786.   DLGCHK_NOSYS)  ))    )
  787.     {
  788. lpMyChkInf->iErr = IERR_READERR2;
  789. if(!(LOWORD(lpMyChkInf->lParam3) & RETRY))
  790. {
  791.     lpMyChkInf->RWRstsrtCnt++;
  792.     if(lpMyChkInf->RWRstsrtCnt > 1)
  793.     {
  794. goto DontRestrt3;
  795.     }
  796.     lpMyChkInf->FixRet = MAKELONG(0,ERETRETRY);
  797.     goto LogAutoErr;
  798. }
  799. DontRestrt3:
  800. ;
  801.     } else {
  802. if(HIWORD(lpMyChkInf->lParam2) & ERRDATA)
  803. {
  804.     lpMyChkInf->iErr = IERR_READERR6;
  805. } else {
  806.     lpMyChkInf->iErr = IERR_READERR5;
  807. }
  808.     }
  809. } else {
  810.     if(!(lpMyChkInf->MyFixOpt & (DLGCHK_NOBAD |
  811.  DLGCHK_NODATA |
  812.  DLGCHK_NOSYS) ))
  813.     {
  814. lpMyChkInf->iErr = IERR_READERR2;
  815. if(!(LOWORD(lpMyChkInf->lParam3) & RETRY))
  816. {
  817.     lpMyChkInf->RWRstsrtCnt++;
  818.     if(lpMyChkInf->RWRstsrtCnt > 1)
  819.     {
  820. goto DontRestrt4;
  821.     }
  822.     lpMyChkInf->FixRet = MAKELONG(0,ERETRETRY);
  823.     goto LogAutoErr;
  824. }
  825. DontRestrt4:
  826. ;
  827.     } else {
  828. if(HIWORD(lpMyChkInf->lParam2) & ERRDATA)
  829. {
  830.     lpMyChkInf->iErr = IERR_READERR4;
  831. } else {
  832.     lpMyChkInf->iErr = IERR_READERR3;
  833. }
  834.     }
  835. }
  836.     }
  837.     goto DoNFErrFIgn;
  838.     break;
  839. case MEMORYERROR:
  840.     if(HIWORD(lpMyChkInf->lParam2) & LOCMEM)
  841.     {
  842. lpMyChkInf->UseAltDlgTxt = TRUE;
  843.     }
  844.     lpMyChkInf->iErr = IERR_ERRMEM;
  845. DoNFErrFIgn:
  846.     if(lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND))
  847.     {
  848. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN);
  849. goto LogAutoErr;
  850.     }
  851.     // This error is displayed even in non interactive
  852.     // mode.
  853.     goto DoNFErr;
  854.     break;
  855. case FATERRXLNK:
  856.     if(lpMyChkInf->MyFixOpt & DLGCHK_XLDEL)
  857.     {
  858. lpMyChkInf->UseAltDefBut = TRUE;
  859. lpMyChkInf->AltDefButIndx = 1;
  860.     } else if(!(lpMyChkInf->MyFixOpt & DLGCHK_XLCPY)) {
  861. lpMyChkInf->UseAltDefBut = TRUE;
  862. lpMyChkInf->AltDefButIndx = 5;
  863.     }
  864.     lpMyChkInf->iErr = IERR_FATXLNK;
  865. DoXLDlg:
  866.     lpfnDlgProc = SEXLDlgProc;
  867.     i = IDD_XL_DLG;
  868.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  869.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  870.     {
  871. if(lpMyChkInf->MyFixOpt & DLGCHK_XLCPY)
  872. {
  873.     lpMyChkInf->FixRet = MAKELONG(0,ERETMKCPY);
  874. } else if(lpMyChkInf->MyFixOpt & DLGCHK_XLDEL) {
  875.     lpMyChkInf->FixRet = MAKELONG(0,ERETDELALL);
  876. } else {
  877.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN);
  878. }
  879. goto LogAutoErr;
  880.     }
  881. DoErrDlg:
  882.     SEAddErrToLog(lpMyChkInf);
  883.     if(lpfnDlgProc == 0L)
  884.     {
  885. NoMem:
  886. SEAddToLogRCS(lpMyChkInf,IDL_NOMEMCAN,NULL);
  887. MyChkdskMessageBox(lpMyChkInf, IDS_NOMEM2,
  888.    MB_ICONINFORMATION | MB_OK);
  889. return(MAKELONG(0,ERETCAN));
  890.     }
  891.     i = DialogBoxParam(g_hInstance,
  892.        MAKEINTRESOURCE(i),
  893.        lpMyChkInf->hProgDlgWnd,
  894.        lpfnDlgProc,
  895.        (LPARAM)lpMyChkInf);
  896. #ifdef FROSTING
  897. DontDoErrDlg:
  898. #endif
  899.     if(pMsgBuf)
  900. LocalFree((HANDLE)pMsgBuf);
  901.     pMsgBuf = 0;
  902.     if(i == 0xFFFF)
  903.     {
  904. goto NoMem;
  905.     }
  906.     if(HIWORD(lpMyChkInf->FixRet) == RESTARTWITHCH)
  907.     {
  908. lpMyChkInf->DoCHRestart = TRUE;
  909. lpMyChkInf->FixRet = MAKELONG(0,ERETCAN);
  910.     }
  911.     if(HIWORD(lpMyChkInf->FixRet) == RESTARTWITHSA)
  912.     {
  913. lpMyChkInf->DoSARestart = TRUE;
  914. lpMyChkInf->FixRet = MAKELONG(0,ERETCAN);
  915.     }
  916. LogErrRet:
  917.     SEAddRetToLog(lpMyChkInf);
  918.     return(lpMyChkInf->FixRet);
  919.     break;
  920. case FATERRRESVAL:
  921.     if(lpMyChkInf->lParam3 != 0L)
  922.     {
  923. lpMyChkInf->UseAltDlgTxt = TRUE;
  924.     }
  925.     lpMyChkInf->iErr = IERR_FATRESVAL;
  926. DoNFErrFAfx:
  927.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  928.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  929.     {
  930. lpMyChkInf->FixRet = MAKELONG(0,ERETAFIX);
  931. goto LogAutoErr;
  932.     }
  933. DoNFErr:
  934.     lpfnDlgProc = SEDlgProc;
  935.     i = IDD_SE_DLG;
  936.     goto DoErrDlg;
  937.     break;
  938. case FATERRMISMAT:
  939.     lpMyChkInf->iErr = IERR_FATFMISMAT;
  940.     goto DoNFErrFAfx;
  941.     break;
  942. case FATERRLSTCLUS:
  943.     lpMyChkInf->rgdwArgs[0]=((LPFATLOSTCLUSERR)lpMyChkInf->lParam3)->LostClusCnt * lpMyChkInf->ChkDPms.drvprm.FatFS.SecPerClus * lpMyChkInf->ChkDPms.drvprm.FatFS.BytPerSec;
  944.     lpMyChkInf->rgdwArgs[1]=((LPFATLOSTCLUSERR)lpMyChkInf->lParam3)->LostClusChainCnt;
  945.     lpMyChkInf->MIrgdwArgs[0]=((LPFATLOSTCLUSERR)lpMyChkInf->lParam3)->LostClusCnt;
  946.     lpMyChkInf->MIrgdwArgs[1]=((LPFATLOSTCLUSERR)lpMyChkInf->lParam3)->LostClusChainCnt;
  947.     lpMyChkInf->iErr = IERR_FATLSTCLUS;
  948. DoLstErr:
  949.     if(lpMyChkInf->MyFixOpt & DLGCHK_LSTMF)
  950.     {
  951. lpMyChkInf->UseAltDefBut = TRUE;
  952. lpMyChkInf->AltDefButIndx = 1;
  953.     }
  954.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  955.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  956.     {
  957. if(lpMyChkInf->MyFixOpt & DLGCHK_LSTMF)
  958. {
  959.     lpMyChkInf->FixRet = MAKELONG(0,ERETMKFILS);
  960. } else {
  961.     lpMyChkInf->FixRet = MAKELONG(0,ERETFREE);
  962. }
  963. goto LogAutoErr;
  964.     }
  965.     goto DoNFErr;
  966.     break;
  967. case FATERRFILE:
  968.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->FileAttribute & 0x10)
  969.     {
  970. i = IDS_DIR;
  971. j = IDS_DIRS;
  972. lpMyChkInf->IsFolder = TRUE;
  973.     } else {
  974. i = IDS_FILEM;
  975. j = IDS_FILEMS;
  976.     }
  977.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  978.     if(!pMsgBuf)
  979.     {
  980. goto NoMem;
  981.     }
  982.     OemToAnsi((((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName),dBuf3);
  983.     LoadString(g_hInstance, i, dBuf1, SZBUFA4);
  984.     LoadString(g_hInstance, j, dBuf2, SZBUFB4);
  985.     lpMyChkInf->rgdwArgs[0]=(DWORD)(((LPFATFILEERR)(lpMyChkInf->lParam3))->lpDirName);
  986.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName == NULL)
  987. lpMyChkInf->rgdwArgs[1]=(DWORD)(LPSTR)dBuf3;
  988.     else
  989. lpMyChkInf->rgdwArgs[1]=(DWORD)(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName);
  990.     lpMyChkInf->rgdwArgs[2]=(DWORD)(LPSTR)dBuf1;
  991.     lpMyChkInf->rgdwArgs[3]=(DWORD)(LPSTR)dBuf3;
  992.     lpMyChkInf->rgdwArgs[4]=(DWORD)(LPSTR)dBuf2;
  993.     for(i = 0; i < MAXMULTSTRNGS; i++)
  994.     {
  995. lpMyChkInf->MErgdwArgs[i][0] = (DWORD)(LPSTR)dBuf2;
  996. lpMyChkInf->MErgdwArgs[i][1] = (DWORD)(LPSTR)dBuf1;
  997. lpMyChkInf->MErgdwArgs[i][2] = (DWORD)(LPSTR)dBuf3;
  998. if(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName == NULL)
  999.     lpMyChkInf->MErgdwArgs[i][3]=(DWORD)(LPSTR)dBuf3;
  1000. else
  1001.     lpMyChkInf->MErgdwArgs[i][3]=(DWORD)(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName);
  1002.     }
  1003.     i = 0;
  1004.     j = 0;
  1005.     if(HIWORD(lpMyChkInf->lParam2) & ERRINVNM)
  1006.     {
  1007. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_INVNM1;
  1008. i++;
  1009. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_INVNM2;
  1010. i++;
  1011. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_INVNM;
  1012. j++;
  1013.     }
  1014.     if(HIWORD(lpMyChkInf->lParam2) & ERRINVLFN)
  1015.     {
  1016. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_INVLFN1;
  1017. i++;
  1018. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_INVLFN2;
  1019. i++;
  1020. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_INVLFN;
  1021. j++;
  1022.     }
  1023.     if(HIWORD(lpMyChkInf->lParam2) & ERRLFNSTR)
  1024.     {
  1025. lpMyChkInf->UseAltDlgTxt = TRUE;
  1026. // we now have to go back and do ALT form of
  1027. // ERRINVNM and ERRINVLFN. NOTE that the LOG does
  1028. // not have an ALT form.
  1029. i = 0;
  1030. if(HIWORD(lpMyChkInf->lParam2) & ERRINVNM)
  1031. {
  1032.     lpMyChkInf->MltEStrings[i] = ALTISTR_FATERRFILE_INVNM1;
  1033.     i++;
  1034.     lpMyChkInf->MltEStrings[i] = ALTISTR_FATERRFILE_INVNM2;
  1035.     i++;
  1036. }
  1037. if(HIWORD(lpMyChkInf->lParam2) & ERRINVLFN)
  1038. {
  1039.     lpMyChkInf->MltEStrings[i] = ALTISTR_FATERRFILE_INVLFN1;
  1040.     i++;
  1041.     lpMyChkInf->MltEStrings[i] = ALTISTR_FATERRFILE_INVLFN2;
  1042.     i++;
  1043. }
  1044. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_LFNSTR1;
  1045. i++;
  1046. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_LFNSTR2;
  1047. i++;
  1048. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_LFNSTR;
  1049. j++;
  1050.     }
  1051.     if(HIWORD(lpMyChkInf->lParam2) & ERRLFNLEN)
  1052.     {
  1053. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_LFNLEN;
  1054. i++;
  1055. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_LFNLEN;
  1056. j++;
  1057.     }
  1058.     if(HIWORD(lpMyChkInf->lParam2) & ERRDEVNM)
  1059.     {
  1060. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DEVNM1;
  1061. i++;
  1062. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DEVNM2;
  1063. i++;
  1064. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_DEVNM;
  1065. j++;
  1066.     }
  1067.     if(HIWORD(lpMyChkInf->lParam2) & ERRSIZE)
  1068.     {
  1069. if(lpMyChkInf->IsFolder)
  1070. {
  1071. #ifdef OPK2
  1072.     if(HIWORD(lpMyChkInf->lParam2) & ERRCHNLEN)
  1073.     {
  1074. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZEDTB1;
  1075. i++;
  1076. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZEDTB2;
  1077. i++;
  1078. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_SIZETBD;
  1079. j++;
  1080.     } else {
  1081. #endif
  1082. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZED1;
  1083. i++;
  1084. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZED2;
  1085. i++;
  1086. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_SIZED;
  1087. j++;
  1088. #ifdef OPK2
  1089.     }
  1090. #endif
  1091. } else {
  1092. #ifdef OPK2
  1093.     if(HIWORD(lpMyChkInf->lParam2) & ERRCHNLEN)
  1094.     {
  1095. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZETB1;
  1096. i++;
  1097. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZETB2;
  1098. i++;
  1099. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_SIZETB;
  1100. j++;
  1101.     } else {
  1102. #endif
  1103. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZE1;
  1104. i++;
  1105. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_SIZE2;
  1106. i++;
  1107. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_SIZE;
  1108. j++;
  1109. #ifdef OPK2
  1110.     }
  1111. #endif
  1112. }
  1113.     }
  1114.     if(HIWORD(lpMyChkInf->lParam2) & ERRDTTM1)
  1115.     {
  1116. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DTTM11;
  1117. i++;
  1118. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DTTM12;
  1119. i++;
  1120. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_DTTM1;
  1121. j++;
  1122.     }
  1123.     if(HIWORD(lpMyChkInf->lParam2) & ERRDTTM2)
  1124.     {
  1125. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DTTM21;
  1126. i++;
  1127. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DTTM22;
  1128. i++;
  1129. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_DTTM2;
  1130. j++;
  1131.     }
  1132.     if(HIWORD(lpMyChkInf->lParam2) & ERRDTTM3)
  1133.     {
  1134. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DTTM31;
  1135. i++;
  1136. lpMyChkInf->MltEStrings[i] = ISTR_FATERRFILE_DTTM32;
  1137. i++;
  1138. lpMyChkInf->MltELogStrings[j] = IDL_FATERRFILE_DTTM3;
  1139. j++;
  1140.     }
  1141.     for(;i < MAXMULTSTRNGS;i++)
  1142. lpMyChkInf->MltEStrings[i] = 0;
  1143.     for(;j < MAXMULTSTRNGS;j++)
  1144. lpMyChkInf->MltELogStrings[j] = 0;
  1145.     lpMyChkInf->iErr = IERR_FATERRFILE;
  1146.     goto DoNFErrFAfx;
  1147.     break;
  1148. case FATERRCIRCC:
  1149.     lpMyChkInf->iErr = IERR_FATCIRCC;
  1150. DoFFErr:
  1151.     if(!pMsgBuf)
  1152.     {
  1153.        pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1154.        if(!pMsgBuf)
  1155.        {
  1156.    goto NoMem;
  1157.        }
  1158.     }
  1159.     OemToAnsi((((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName),dBuf3);
  1160.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->FileAttribute & 0x10)
  1161. lpMyChkInf->IsFolder = TRUE;
  1162.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName == NULL)
  1163. lpMyChkInf->rgdwArgs[0]=(DWORD)(LPSTR)dBuf3;
  1164.     else
  1165. lpMyChkInf->rgdwArgs[0]=(DWORD)(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName);
  1166.     lpMyChkInf->rgdwArgs[1]=(DWORD)(((LPFATFILEERR)lpMyChkInf->lParam3)->lpDirName);
  1167.     goto DoNFErrFAfx;
  1168.     break;
  1169. case FATERRINVCLUS:
  1170.     lpMyChkInf->iErr = IERR_FATINVCLUS;
  1171.     goto DoFFErr;
  1172.     break;
  1173. case FATERRVOLLAB:
  1174.     if(!(HIWORD(lpMyChkInf->lParam2) & ISFRST))
  1175.     {
  1176. lpMyChkInf->UseAltDlgTxt = TRUE;
  1177. i = j = 0;
  1178. while(((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName[i] != '')
  1179. {
  1180.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName[i] != '.')
  1181.     {
  1182. LabBuf[j] = ((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName[i];
  1183. j++;
  1184.     }
  1185.     i++;
  1186. }
  1187. LabBuf[j] = '';
  1188. OemToAnsi(LabBuf,LabBuf);
  1189.     } else {
  1190. OemToAnsi((((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName),LabBuf);
  1191.     }
  1192.     lpMyChkInf->rgdwArgs[0]=(DWORD)(LPSTR)LabBuf;
  1193.     lpMyChkInf->rgdwArgs[1]=(DWORD)(((LPFATFILEERR)(lpMyChkInf->lParam3))->lpDirName);
  1194.     lpMyChkInf->iErr = IERR_FATERRVOLLAB;
  1195.     goto DoNFErrFAfx;
  1196.     break;
  1197. case FATERRDIR:
  1198.     i = 0;
  1199.     j = 0;
  1200.     if(HIWORD(lpMyChkInf->lParam2) & ERRZRLEN)
  1201.     {
  1202. lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_ZRLEN;
  1203. i++;
  1204. lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_ZRLENC;
  1205. i++;
  1206. lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_ZRLEN;
  1207. j++;
  1208.     } else if(HIWORD(lpMyChkInf->lParam2) & ERRBAD) {
  1209. lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_BAD;
  1210. i++;
  1211. lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_BADC;
  1212. i++;
  1213. lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_BAD;
  1214. j++;
  1215.     } else {
  1216. if(HIWORD(lpMyChkInf->lParam2) & ERRPNOTD)
  1217. {
  1218.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_PNOTD;
  1219.     i++;
  1220.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_PNOTDC;
  1221.     i++;
  1222.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_PNOTD;
  1223.     j++;
  1224. }
  1225. if(HIWORD(lpMyChkInf->lParam2) & ERRBADENTS)
  1226. {
  1227.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_BDENTS;
  1228.     i++;
  1229.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_BDENTSC;
  1230.     i++;
  1231.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_BDENTS;
  1232.     j++;
  1233. }
  1234. if(HIWORD(lpMyChkInf->lParam2) & ERRDOTS)
  1235. {
  1236.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_DOTS;
  1237.     i++;
  1238.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_DOTS;
  1239.     j++;
  1240. }
  1241. if(HIWORD(lpMyChkInf->lParam2) & ERRDUPNM)
  1242. {
  1243.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_DUPNM;
  1244.     i++;
  1245.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_DUPNMC;
  1246.     i++;
  1247.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_DUPNM;
  1248.     j++;
  1249. }
  1250. // if(HIWORD(lpMyChkInf->lParam2) & ERRLFNSRT)
  1251. // {
  1252. // }
  1253. if(HIWORD(lpMyChkInf->lParam2) & ERRLOSTFILE)
  1254. {
  1255.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_LOSTFIL;
  1256.     i++;
  1257.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_LOSTFIL;
  1258.     j++;
  1259. }
  1260. if(HIWORD(lpMyChkInf->lParam2) & ERRLFNLST)
  1261. {
  1262.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRDIR_LFNLST;
  1263.     i++;
  1264.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRDIR_LFNLST;
  1265.     j++;
  1266. }
  1267.     }
  1268.     for(;i < MAXMULTSTRNGS;i++)
  1269. lpMyChkInf->MltEStrings[i] = 0;
  1270.     for(;j < MAXMULTSTRNGS;j++)
  1271. lpMyChkInf->MltELogStrings[j] = 0;
  1272.     lpMyChkInf->IsFolder = TRUE;
  1273.     if(((LPFATDIRERR)(lpMyChkInf->lParam3))->DirFirstCluster == 0xFFFFFFFF)
  1274.     {
  1275. lpMyChkInf->IsRootFolder = TRUE;
  1276.     }
  1277.     lpfnDlgProc = SEDlgProc;
  1278.     lpMyChkInf->rgdwArgs[0]=(DWORD)(((LPFATDIRERR)(lpMyChkInf->lParam3))->lpDirName);
  1279.     lpMyChkInf->iErr=IERR_FATERRDIR;
  1280.     goto DoNFErrFAfx;
  1281.     break;
  1282. #ifdef OPK2
  1283. case FATERRROOTDIR:
  1284.     i = 0;
  1285.     j = 0;
  1286.     if(HIWORD(lpMyChkInf->lParam2) & ERRINVFC)
  1287.     {
  1288. lpMyChkInf->UseAltDlgTxt = TRUE;
  1289. lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_INVFC;
  1290. i++;
  1291. lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_INVFC;
  1292. j++;
  1293. goto ChkLkly;
  1294.     } else if(HIWORD(lpMyChkInf->lParam2) & ERRPNOTD) {
  1295. lpMyChkInf->UseAltDlgTxt = TRUE;
  1296. lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_PNOTD;
  1297. i++;
  1298. lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_PNOTD;
  1299. j++;
  1300. ChkLkly:
  1301. if(lpMyChkInf->lParam3 == 0xFFFFFFFFL)
  1302. {
  1303.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_RECRT;
  1304.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_RECRT;
  1305. } else if(HIWORD(lpMyChkInf->lParam2) & ISLIKELYROOT) {
  1306.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_FND;
  1307.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_FND;
  1308. } else {
  1309.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_MBYFND;
  1310.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_MBYFND;
  1311. }
  1312. i++;
  1313. j++;
  1314.     } else {
  1315. if(HIWORD(lpMyChkInf->lParam2) & ERRINVC)
  1316. {
  1317.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_INVC;
  1318.     i++;
  1319.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_INVC;
  1320.     j++;
  1321. }
  1322. if(HIWORD(lpMyChkInf->lParam2) & ERRCIRCC)
  1323. {
  1324.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_CIRCC;
  1325.     i++;
  1326.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_CIRCC;
  1327.     j++;
  1328. }
  1329. if(HIWORD(lpMyChkInf->lParam2) & ERRTOOBIG)
  1330. {
  1331.     lpMyChkInf->MltEStrings[i] = ISTR_FATERRRTDIR_TOOBIG;
  1332.     i++;
  1333.     lpMyChkInf->MltELogStrings[j] = IDL_FATERRRTDIR_TOOBIG;
  1334.     j++;
  1335. }
  1336.     }
  1337.     for(;i < MAXMULTSTRNGS;i++)
  1338. lpMyChkInf->MltEStrings[i] = 0;
  1339.     for(;j < MAXMULTSTRNGS;j++)
  1340. lpMyChkInf->MltELogStrings[j] = 0;
  1341.     lpMyChkInf->IsFolder = TRUE;
  1342.     lpMyChkInf->IsRootFolder = TRUE;
  1343.     lpfnDlgProc = SEDlgProc;
  1344.     LabBuf[0] = LOBYTE(lpMyChkInf->lpwddi->iDrive) + 'A';
  1345.     LabBuf[1] = ':';
  1346.     LabBuf[2] = '\';
  1347.     LabBuf[3] = '';
  1348.     OemToAnsi(LabBuf,LabBuf);
  1349.     lpMyChkInf->rgdwArgs[0]=(DWORD)(LPSTR)LabBuf;
  1350.     lpMyChkInf->iErr=IERR_FATERRROOTDIR;
  1351.     goto DoNFErrFAfx;
  1352.     break;
  1353. case FATERRSHDSURF:
  1354.     lpMyChkInf->iErr = IERR_FATERRSHDSURF;
  1355.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  1356.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  1357.     {
  1358. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1359. goto LogAutoErr;
  1360.     }
  1361.     goto DoNFErr;
  1362.     break;
  1363. case FATERRBOOT:
  1364.     lpMyChkInf->iErr = IERR_FATERRBOOT;
  1365.     goto DoNFErrFAfx;
  1366.     break;
  1367. #endif
  1368. case FATERRMXPLEN:
  1369.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->FileAttribute & 0x10)
  1370.     {
  1371. lpMyChkInf->IsFolder = TRUE;
  1372. lpMyChkInf->UseAltDlgTxt = TRUE;
  1373.     }
  1374.     if(!pMsgBuf)
  1375.     {
  1376.        pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1377.        if(!pMsgBuf)
  1378.        {
  1379.    goto NoMem;
  1380.        }
  1381.     }
  1382.     OemToAnsi((LPSTR)(((LPFATFILEERR)lpMyChkInf->lParam3)->lParam3),dBuf3);
  1383.     lpMyChkInf->rgdwArgs[0]=(DWORD)(((LPFATFILEERR)lpMyChkInf->lParam3)->lParam2);
  1384.     lpMyChkInf->rgdwArgs[1]=(DWORD)(LPSTR)dBuf3;
  1385.     if(lpMyChkInf->lParam2 & MAKELONG(0,ERRRMWRN))
  1386.     {
  1387. lpMyChkInf->iErr=IERR_FATERRMXPLENS;
  1388. #ifdef FROSTING
  1389. if(lpMyChkInf->fSageRun)
  1390. {
  1391.     // ProbCnt is never incremented for these errors, if
  1392.     // the problem is ignored.  So there's no need to
  1393.     // increase SilentProbCnt.
  1394.     // lpMyChkInf->SilentProbCnt++; // ignore problem
  1395.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN);
  1396.     goto DontDoErrDlg;
  1397. }
  1398. #endif
  1399.     } else {
  1400. lpMyChkInf->iErr=IERR_FATERRMXPLENL;
  1401.     }
  1402.     goto DoNFErrFAfx;
  1403.     break;
  1404. case FATERRCDLIMIT:
  1405.     lpMyChkInf->IsFolder = TRUE;
  1406.     if(!pMsgBuf)
  1407.     {
  1408.        pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1409.        if(!pMsgBuf)
  1410.        {
  1411.    goto NoMem;
  1412.        }
  1413.     }
  1414.     OemToAnsi((((LPFATDIRERR)(lpMyChkInf->lParam3))->lpDirName),dBuf3);
  1415.     lpMyChkInf->rgdwArgs[0]=(DWORD)(LPSTR)dBuf3;
  1416.     lpMyChkInf->iErr=IERR_FATERRCDLIMIT;
  1417. #ifdef FROSTING
  1418.     if(lpMyChkInf->fSageRun)
  1419.     {
  1420. // ProbCnt is never incremented for these errors, if
  1421. // the problem is ignored.  So there's no need to
  1422. // increase SilentProbCnt.
  1423. // lpMyChkInf->SilentProbCnt++; // ignore problem
  1424. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN);
  1425. goto DontDoErrDlg;
  1426.     }
  1427. #endif
  1428.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  1429.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  1430.     {
  1431. if(HIWORD(lpMyChkInf->lParam2) & ERRRMWRN)
  1432. {
  1433.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN);
  1434. } else {
  1435.     lpMyChkInf->FixRet = MAKELONG(0,ERETMVDIR);
  1436. }
  1437. goto LogAutoErr;
  1438.     } else {
  1439. if(!(HIWORD(lpMyChkInf->lParam2) & ERRRMWRN))
  1440. {
  1441.     lpMyChkInf->UseAltDefBut = TRUE;
  1442.     lpMyChkInf->AltDefButIndx = 1;
  1443. }
  1444.     }
  1445.     goto DoNFErr;
  1446.     break;
  1447. #ifdef OPK2
  1448. case ERRISBAD2:
  1449.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1450.     if(!pMsgBuf)
  1451.     {
  1452. goto NoMem;
  1453.     }
  1454.     lpMyChkInf->iErr = IERR_ERRISBAD7;
  1455.     if(!(HIWORD(lpMyChkInf->lParam2) & ERRDATA))
  1456.     {
  1457. lpMyChkInf->UseAltDlgTxt = TRUE;
  1458. if(HIWORD(lpMyChkInf->lParam2) & ERRFBOOT)
  1459. {
  1460.     i = IDS_BOOT;
  1461. } else if(HIWORD(lpMyChkInf->lParam2) & ERRFAT) {
  1462.     i = IDS_FAT;
  1463. } else {
  1464.     i = IDS_ROOTD;
  1465. }
  1466. LoadString(g_hInstance, i, dBuf1, SZBUFA4);
  1467.     }
  1468.     lpMyChkInf->rgdwArgs[0] = lpMyChkInf->lParam3;
  1469.     lpMyChkInf->rgdwArgs[1] = lpMyChkInf->lParam5;
  1470.     lpMyChkInf->rgdwArgs[2] = (DWORD)(LPSTR)dBuf1;
  1471.     goto BadErr;
  1472.     break;
  1473. #endif
  1474. case ERRISBAD:
  1475.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1476.     if(!pMsgBuf)
  1477.     {
  1478. goto NoMem;
  1479.     }
  1480.     if((lpMyChkInf->lpwddi->TypeFlags & DT_DBLDISK) &&
  1481.        (lpMyChkInf->MyFixOpt2 & DLGCHK_NOCHKHST)      )
  1482.     {
  1483. if(HIWORD(lpMyChkInf->lParam2) & ERRDATA)
  1484. {
  1485.     lpMyChkInf->iErr = IERR_ERRISBAD2;
  1486. } else {
  1487.     lpMyChkInf->iErr = IERR_ERRISBAD1;
  1488. }
  1489.     } else {
  1490. if(!(HIWORD(lpMyChkInf->lParam2) & ERRDATA))
  1491. {
  1492.     lpMyChkInf->iErr = IERR_ERRISBAD3;
  1493. } else {
  1494.     if(lpMyChkInf->lpwddi->TypeFlags & DT_DBLDISK)
  1495.     {
  1496. lpMyChkInf->iErr = IERR_ERRISBAD4;
  1497.     } else {
  1498. lpMyChkInf->iErr = IERR_ERRISBAD5;
  1499.     }
  1500. }
  1501.     }
  1502.     if((HIWORD(lpMyChkInf->lParam2) & ERRDATA) &&
  1503.        (lpMyChkInf->lParam5 == 0L)  )
  1504.     {
  1505. lpMyChkInf->iErr = IERR_ERRISBAD6;
  1506.     } else if((HIWORD(lpMyChkInf->lParam2) & ERRDATA) &&
  1507.       (lpMyChkInf->lParam5 != 0L) ) {
  1508. if(HIWORD(lpMyChkInf->lParam2) & ISADIR)
  1509. {
  1510.     lpMyChkInf->IsFolder = TRUE;
  1511.     i = IDS_DIR;
  1512. } else {
  1513.     i = IDS_FILEM;
  1514. }
  1515. LoadString(g_hInstance, i, dBuf1, SZBUFA4);
  1516. if(HIWORD(lpMyChkInf->lParam2) & FULLDISK)
  1517. {
  1518.     lpMyChkInf->UseAltCantFix = TRUE;
  1519.     lpMyChkInf->AltCantFixTstFlag = FULLDISK;
  1520.     lpMyChkInf->AltCantFixHID = IDH_WASTE_FREEING_DISK_SPACE;
  1521.     lpMyChkInf->AltCantFixRepHID = IDH_WINDISK_ISBAD_NO_FREE_CLUSTER;
  1522. }
  1523.     } else if(!(HIWORD(lpMyChkInf->lParam2) & ERRDATA)) {
  1524. if(HIWORD(lpMyChkInf->lParam2) & ERRFBOOT)
  1525. {
  1526.     i = IDS_BOOT;
  1527. } else if(HIWORD(lpMyChkInf->lParam2) & ERRFAT) {
  1528.     i = IDS_FAT;
  1529. } else {
  1530.     i = IDS_ROOTD;
  1531. }
  1532. LoadString(g_hInstance, i, dBuf1, SZBUFA4);
  1533.     }
  1534.     lpMyChkInf->rgdwArgs[0] = lpMyChkInf->lParam3;
  1535.     lpMyChkInf->rgdwArgs[1] = lpMyChkInf->lParam5;
  1536.     lpMyChkInf->rgdwArgs[2] = (DWORD)(LPSTR)dBuf1;
  1537. BadErr:
  1538.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  1539.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  1540.     {
  1541. AutoBad:
  1542. if(!(HIWORD(lpMyChkInf->lParam2) & ERRDATA))
  1543. {
  1544.     // error in system area
  1545.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1546. }
  1547. if(!(HIWORD(lpMyChkInf->lParam2) & RECOV))
  1548. {
  1549.     // Bad sector is uncorrectable (unmovable file)
  1550.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1551. }
  1552. if(LOWORD(lpMyChkInf->lParam2) == ERRISNTBAD)
  1553. {
  1554.     // Do NOT clear bad marks
  1555.     // except under USER control
  1556.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1557. #ifdef OPK2
  1558. } else if(LOWORD(lpMyChkInf->lParam2) == ERRISBAD2) {
  1559.     lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1560. #endif
  1561. } else {
  1562.     lpMyChkInf->FixRet = MAKELONG(0,ERETMRKBAD);
  1563. }
  1564. LogAutoErr:
  1565. SEAddErrToLog(lpMyChkInf);
  1566. if(pMsgBuf)
  1567.     LocalFree((HANDLE)pMsgBuf);
  1568. pMsgBuf = 0;
  1569. goto LogErrRet;
  1570.     } else {
  1571. if((LOWORD(lpMyChkInf->lParam2) == ERRISNTBAD) &&
  1572.    (!(lpMyChkInf->MyFixOpt2 & DLGCHK_DOBADISNTBAD)))
  1573. {
  1574.     goto AutoBad;
  1575. }
  1576.     }
  1577.     goto DoNFErr;
  1578.     break;
  1579. case ERRISNTBAD:
  1580.     lpMyChkInf->rgdwArgs[0] = lpMyChkInf->lParam3;
  1581.     lpMyChkInf->iErr = IERR_ERRISNTBAD;
  1582.     goto BadErr;
  1583.     break;
  1584. case ERRCANTDEL:
  1585.     lpMyChkInf->rgdwArgs[0] = lpMyChkInf->lParam3;
  1586.     lpMyChkInf->iErr = IERR_ERRCANTDEL;
  1587. DoNFErrFIgn2Int:
  1588.     if((!(lpMyChkInf->MyFixOpt & DLGCHK_INTER)) ||
  1589.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  1590.     {
  1591. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1592. goto LogAutoErr;
  1593.     }
  1594.     goto DoNFErr;
  1595.     break;
  1596. case DDERRMOUNT:
  1597.     lpMyChkInf->CancelIsDefault = TRUE;
  1598.     lpMyChkInf->rgdwArgs[0]=(DWORD)(LPSTR)(lpMyChkInf->lpwddi->driveNameStr);
  1599.     lpMyChkInf->iErr = IERR_DDERRMOUNT;
  1600.     goto DoNFErrFIgn2Int;
  1601.     break;
  1602. case DDERRSIZE1:
  1603.     lpMyChkInf->iErr = IERR_DDERRSIZE1;
  1604. DoNFErrFIgn2:
  1605.     if(lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND))
  1606.     {
  1607. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1608. goto LogAutoErr;
  1609.     }
  1610.     // This error is displayed even in non interactive
  1611.     // mode.
  1612.     goto DoNFErr;
  1613.     break;
  1614. case DDERRFRAG:
  1615.     lpMyChkInf->iErr = IERR_DDERRFRAG;
  1616.     goto DoNFErrFIgn2;
  1617.     break;
  1618. case DDERRALIGN:
  1619.     lpMyChkInf->iErr = IERR_DDERRALIGN;
  1620.     goto DoNFErrFIgn2;
  1621.     break;
  1622. case DDERRNOXLCHK:
  1623.     lpMyChkInf->iErr = IERR_DDERRNOXLCHK;
  1624. #ifdef FROSTING
  1625.     if (lpMyChkInf->fSageRun)
  1626.     {
  1627. lpMyChkInf->SilentProbCnt++; // ignore problem
  1628. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1629. goto DontDoErrDlg;
  1630.     }
  1631. #endif
  1632.     goto DoNFErrFIgn2Int;
  1633.     break;
  1634. case DDERRUNSUP:
  1635.     lpMyChkInf->iErr = IERR_DDERRUNSUP;
  1636.     dwi = 0x00000001L << lpMyChkInf->lpwddi->iDrive;
  1637. #ifdef FROSTING
  1638.                     if (lpMyChkInf->fSageRun)
  1639.     {
  1640. lpMyChkInf->SilentProbCnt++; // ignore this problem
  1641. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1642. goto DontDoErrDlg;
  1643.     }
  1644. #endif
  1645.     if((lpMyChkInf->NoUnsupDrvs & dwi) ||
  1646.        (lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND)))
  1647.     {
  1648. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1649. goto LogAutoErr;
  1650.     }
  1651. #ifdef OPK2
  1652.     // Do not do this warning again if already done (restarts)
  1653.     if(lpMyChkInf->Done3PtyCompWrn)
  1654.     {
  1655. lpMyChkInf->FixRet = MAKELONG(0,ERETIGN2);
  1656. goto LogAutoErr;
  1657.     } else {
  1658. lpMyChkInf->Done3PtyCompWrn = TRUE;
  1659.     }
  1660. #endif
  1661.     // This error is displayed even in non interactive
  1662.     // mode.
  1663.     goto DoNFErr;
  1664.     break;
  1665. case DDERRCVFNM:
  1666.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1667.     if(!pMsgBuf)
  1668.     {
  1669. goto NoMem;
  1670.     }
  1671.     LoadString(g_hInstance, IDS_DBLSPACE, dBuf1, SZBUFA4);
  1672.     LoadString(g_hInstance, IDS_DRVSPACE, dBuf2, SZBUFB4);
  1673.     if(HIWORD(lpMyChkInf->lParam2) & CHNGTONEW)
  1674.     {
  1675. lpMyChkInf->rgdwArgs[0]=(DWORD)((LPSTR)dBuf2);
  1676. lpMyChkInf->rgdwArgs[1]=(DWORD)((LPSTR)dBuf1);
  1677.     } else {
  1678. lpMyChkInf->rgdwArgs[0]=(DWORD)((LPSTR)dBuf1);
  1679. lpMyChkInf->rgdwArgs[1]=(DWORD)((LPSTR)dBuf2);
  1680.     }
  1681.     lpMyChkInf->iErr = IERR_DDERRCVFNM;
  1682.     goto DoNFErrFAfx;
  1683.     break;
  1684. case DDERRSIG:
  1685.     lpMyChkInf->iErr = IERR_DDERRSIG;
  1686.     goto DoNFErrFAfx;
  1687.     break;
  1688. case DDERRBOOT:
  1689.     lpMyChkInf->iErr = IERR_DDERRBOOT;
  1690.     goto DoNFErrFAfx;
  1691.     break;
  1692. case DDERRMDBPB:
  1693.     lpMyChkInf->iErr = IERR_DDERRMDBPB;
  1694.     goto DoNFErrFAfx;
  1695.     break;
  1696. case DDERRSIZE2:
  1697.     if(lpMyChkInf->MyFixOpt2 & DLGCHK_NOCHKHST)
  1698.     {
  1699. lpMyChkInf->iErr = IERR_DDERRSIZE2A;
  1700.     } else {
  1701. lpMyChkInf->iErr = IERR_DDERRSIZE2B;
  1702.     }
  1703.     goto DoNFErrFAfx;
  1704.     break;
  1705. case DDERRMDFAT:
  1706.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1707.     if(!pMsgBuf)
  1708.     {
  1709. goto NoMem;
  1710.     }
  1711.     lpMyChkInf->rgdwArgs[0]=(DWORD)(((LPXLNKFILE)(lpMyChkInf->lParam3))->FileName);
  1712.     if(lpMyChkInf->rgdwArgs[0] == 0L)
  1713.     {
  1714. lpMyChkInf->UseAltDlgTxt = TRUE;
  1715.     } else {
  1716. if(((LPXLNKFILE)(lpMyChkInf->lParam3))->FileAttributes & 0x10)
  1717. {
  1718.     lpMyChkInf->IsFolder = TRUE;
  1719.     i = IDS_DIR;
  1720. } else {
  1721.     i = IDS_FILEM;
  1722. }
  1723. LoadString(g_hInstance, i, dBuf1, SZBUFA4);
  1724. lpMyChkInf->rgdwArgs[1]=(DWORD)(LPSTR)dBuf1;
  1725.     }
  1726.     lpMyChkInf->iErr = IERR_DDERRMDFAT;
  1727.     goto DoNFErrFAfx;
  1728.     break;
  1729. case DDERRLSTSQZ:
  1730.     lpMyChkInf->rgdwArgs[0]=MAKELONG(LOWORD(lpMyChkInf->lParam3),0);
  1731.     lpMyChkInf->iErr = IERR_DDERRLSTSQZ;
  1732.     goto DoLstErr;
  1733.     break;
  1734. case DDERRXLSQZ:
  1735.     lpMyChkInf->UseAltDlgTxt = TRUE;
  1736.     if(lpMyChkInf->MyFixOpt & DLGCHK_XLDEL)
  1737.     {
  1738. lpMyChkInf->UseAltDefBut = TRUE;
  1739. lpMyChkInf->AltDefButIndx = 1;
  1740.     } else if(!(lpMyChkInf->MyFixOpt & DLGCHK_XLCPY)) {
  1741. lpMyChkInf->UseAltDefBut = TRUE;
  1742. lpMyChkInf->AltDefButIndx = 2;
  1743.     }
  1744.     lpMyChkInf->iErr = IERR_DDERRXLSQZ;
  1745.     goto DoXLDlg;
  1746.     break;
  1747. default:
  1748.     SEAddToLogRCS(lpMyChkInf,IDL_ERUNKNO,NULL);
  1749.     return(0L);
  1750.     break;
  1751.     }
  1752.     break;
  1753. case DU_ERRORCORRECTED:
  1754.     if(LOWORD(lpMyChkInf->lParam4) == FULLCORR)
  1755.     {
  1756. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECFULLCORR);
  1757. goto DoYld;
  1758.     } else if(LOWORD(lpMyChkInf->lParam4) == CANTFIX) {
  1759. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECCANTFIX);
  1760. goto DoYld;
  1761.     } else if(LOWORD(lpMyChkInf->lParam4) == NOCORR) {
  1762. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECNOCORR);
  1763.     } else if(LOWORD(lpMyChkInf->lParam4) == PCORROK) {
  1764. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECPCORROK);
  1765.     } else if(LOWORD(lpMyChkInf->lParam4) == PCORRBAD) {
  1766. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECPCORRBAD);
  1767.     }
  1768.     if(HIWORD(lpMyChkInf->lParam4) & OTHERWRT)
  1769.     {
  1770. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECOTHERWRT);
  1771. if(lpMyChkInf->MyFixOpt & DLGCHK_INTER)
  1772. {
  1773.     lpMyChkInf->iErr = IERR_ECORROTHWRT;
  1774.     lpMyChkInf->AlrdyRestartWrn = TRUE;
  1775.     goto DoErr;
  1776. } else {
  1777.     goto DoYld;
  1778. }
  1779.     }
  1780.     if(HIWORD(lpMyChkInf->lParam4) & NOMEM)
  1781.     {
  1782. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECNOMEM);
  1783. lpMyChkInf->iErr = IERR_ECORRMEM;
  1784. goto DoErr;
  1785.     }
  1786.     if(HIWORD(lpMyChkInf->lParam4) & UNEXP)
  1787.     {
  1788. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECUNEXP);
  1789. lpMyChkInf->iErr = IERR_ECORRUNEXP;
  1790. goto DoErr;
  1791.     }
  1792.     switch(LOWORD(lpMyChkInf->lParam2)) {
  1793. case FATERRRESVAL:
  1794. case FATERRMISMAT:
  1795. case FATERRCIRCC:
  1796. case FATERRINVCLUS:
  1797.     if(HIWORD(lpMyChkInf->lParam4) & DISKERR)
  1798.     {
  1799. goto DskErr;
  1800.     }
  1801.     goto HmmmErr;
  1802.     break;
  1803. case FATERRCDLIMIT:
  1804. case FATERRMXPLEN:
  1805.     if(HIWORD(lpMyChkInf->lParam4) & DISKERR)
  1806.     {
  1807. goto DskErr;
  1808.     }
  1809.     if(HIWORD(lpMyChkInf->lParam4) & FILCRT)
  1810.     {
  1811. pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ4);
  1812. if(!pMsgBuf)
  1813. {
  1814.     goto NoMem2;
  1815. }
  1816. if(LOWORD(lpMyChkInf->lParam2) == FATERRMXPLEN)
  1817. {
  1818.     OemToAnsi((((LPFATFILEERR)lpMyChkInf->lParam3)->lpShortFileName),dBuf3);
  1819.     if(((LPXLNKFILE)(lpMyChkInf->lParam3))->FileAttributes & 0x10)
  1820.     {
  1821. lpMyChkInf->IsFolder = TRUE;
  1822. i = IDS_DIR;
  1823.     } else {
  1824. i = IDS_FILEM;
  1825.     }
  1826.     if(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName == NULL)
  1827. lpMyChkInf->rgdwArgs[1]=(DWORD)(LPSTR)dBuf3;
  1828.     else
  1829. lpMyChkInf->rgdwArgs[1]=(DWORD)(((LPFATFILEERR)lpMyChkInf->lParam3)->lpLFNFileName);
  1830. } else {
  1831.     lpMyChkInf->IsFolder = TRUE;
  1832.     i = IDS_DIR;
  1833.     lpMyChkInf->rgdwArgs[1]=((LPFATDIRERR)(lpMyChkInf->lParam3))->lParam2;
  1834. }
  1835. LoadString(g_hInstance, i, dBuf1, SZBUFA4);
  1836. lpMyChkInf->rgdwArgs[0]=(DWORD)(LPSTR)dBuf1;
  1837. if(HIWORD(lpMyChkInf->lParam4) & FILCOLL)
  1838. {
  1839.     SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECFILCOL);
  1840.     lpMyChkInf->iErr = IERR_ECORRFILCOL;
  1841. } else {
  1842.     SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECFILCRT);
  1843.     lpMyChkInf->iErr = IERR_ECORRFILCRT;
  1844. }
  1845.     } else {
  1846. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECUNEXP);
  1847. lpMyChkInf->iErr = IERR_ECORRUNEXP;
  1848.     }
  1849.     goto DoErr;
  1850.     break;
  1851. #ifdef OPK2
  1852. case FATERRROOTDIR:
  1853. #endif
  1854. case FATERRDIR:
  1855. case DDERRXLSQZ:
  1856. case FATERRXLNK:
  1857.     if(HIWORD(lpMyChkInf->lParam4) & CLUSALLO)
  1858.     {
  1859. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECCLUSA);
  1860. lpMyChkInf->iErr = IERR_ECORRCLUSA;
  1861. goto DoErr;
  1862.     } else if(HIWORD(lpMyChkInf->lParam4) & DISKERR) {
  1863. DskErr:
  1864. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECDISKE);
  1865. lpMyChkInf->iErr = IERR_ECORRDISK;
  1866. if(lpMyChkInf->MyFixOpt & (DLGCHK_NOBAD |
  1867.    DLGCHK_NODATA |
  1868.    DLGCHK_NOSYS)  )
  1869. {
  1870.     lpMyChkInf->UseAltDlgTxt = TRUE;
  1871. }
  1872. goto DoErr;
  1873.     }
  1874.     // NOTE FALL THROUGH
  1875. #ifdef OPK2
  1876. case FATERRBOOT:
  1877. #endif
  1878. case DDERRCVFNM:
  1879. case DDERRSIZE2:
  1880. case DDERRSIG:
  1881. case DDERRBOOT:
  1882. case DDERRMDBPB:
  1883. case DDERRMDFAT:
  1884. case DDERRLSTSQZ:
  1885. case FATERRVOLLAB:
  1886. case FATERRFILE:
  1887. case FATERRLSTCLUS:
  1888.     if(HIWORD(lpMyChkInf->lParam4) & DISKERR)
  1889.     {
  1890. goto DskErr;
  1891.     }
  1892.     if(HIWORD(lpMyChkInf->lParam4) & FILCRT)
  1893.     {
  1894. lpMyChkInf->UseAltDlgTxt = TRUE;
  1895. if(HIWORD(lpMyChkInf->lParam4) & FILCOLL)
  1896. {
  1897.     SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECFILCOL);
  1898.     lpMyChkInf->iErr = IERR_ECORRFILCOL;
  1899. } else {
  1900.     SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECFILCRT);
  1901.     lpMyChkInf->iErr = IERR_ECORRFILCRT;
  1902. }
  1903.     } else {
  1904. HmmmErr:
  1905. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECUNEXP);
  1906. lpMyChkInf->iErr = IERR_ECORRUNEXP;
  1907.     }
  1908. DoErr:
  1909.     if(lpMyChkInf->MyFixOpt2 & (DLGCHK_PROGONLY | DLGCHK_NOWND))
  1910.     {
  1911. if(pMsgBuf)
  1912.     LocalFree((HANDLE)pMsgBuf);
  1913. pMsgBuf = 0;
  1914. goto DoYld;
  1915.     }
  1916.     lpfnDlgProc = SEDlgProc;
  1917.     i = IDD_SE_DLG;
  1918.     i = DialogBoxParam(g_hInstance,
  1919.        MAKEINTRESOURCE(i),
  1920.        lpMyChkInf->hProgDlgWnd,
  1921.        lpfnDlgProc,
  1922.        (LPARAM)lpMyChkInf);
  1923.     if(pMsgBuf)
  1924. LocalFree((HANDLE)pMsgBuf);
  1925.     pMsgBuf = 0;
  1926.     if(i == 0xFFFF)
  1927.     {
  1928. NoMem2:
  1929. SEAddToLogRCS(lpMyChkInf,IDL_NOMEMCAN,NULL);
  1930. MyChkdskMessageBox(lpMyChkInf, IDS_NOMEM2,
  1931.    MB_ICONINFORMATION | MB_OK);
  1932. return(1L);
  1933.     }
  1934.     if(HIWORD(lpMyChkInf->FixRet) == ERETCAN)
  1935. return(1L);
  1936.     goto DoYld;
  1937.     break;
  1938. case ERRISBAD:
  1939. BadErr2:
  1940.     if(HIWORD(lpMyChkInf->lParam4) & CLUSALLO)
  1941.     {
  1942. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECCLUSA);
  1943. lpMyChkInf->iErr = IERR_ECORRCLUSA;
  1944. goto DoErr;
  1945.     } else if(HIWORD(lpMyChkInf->lParam4) & DISKERR) {
  1946. SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECDISKE);
  1947. lpMyChkInf->iErr = IERR_ECORRDISK;
  1948. lpMyChkInf->UseAltDlgTxt = TRUE;
  1949. goto DoErr;
  1950.     }
  1951.     goto DoYld;
  1952.     break;
  1953. case ERRISNTBAD:
  1954.     if(lpMyChkInf->MyFixOpt & DLGCHK_INTER)
  1955.     {
  1956. goto BadErr2;
  1957.     }
  1958.     goto DoYld;
  1959.     break;
  1960. case ERRCANTDEL: // These are all CANTFIX
  1961. case DDERRSIZE1:
  1962. case DDERRMOUNT:
  1963. case DDERRFRAG:
  1964. case DDERRALIGN:
  1965. case DDERRUNSUP:
  1966. case DDERRNOXLCHK:
  1967. #ifdef OPK2
  1968. case ERRISBAD2:
  1969. #endif
  1970.     SEAddToLogRCS(lpMyChkInf,IDL_ECPRE,IDL_ECCANTFIX);
  1971.     // Note fall through
  1972. #ifdef OPK2
  1973. case FATERRSHDSURF:
  1974. #endif
  1975. case ERRLOCKV:     // This will get logged on engine return
  1976. case MEMORYERROR:   // Rest are all "retry ignore or cancel"
  1977. case READERROR:
  1978. case WRITEERROR:
  1979.     goto DoYld;
  1980.     break;
  1981. default:
  1982.     return(0L);
  1983.     break;
  1984.     }
  1985.     goto DoYld;
  1986.     break;
  1987. case DU_OPCOMPLETE:
  1988.     lpMyChkInf->lpFixRep = (LPFATFIXREPORT)lpMyChkInf->lParam2;
  1989.     lpMyChkInf->OpCmpltRet = lpMyChkInf->lParam3;
  1990. #ifdef FROSTING
  1991.     if(lpMyChkInf->lpFixRep != 0L)
  1992.     {
  1993. if(lpMyChkInf->lpFixRep->ProbCnt >= lpMyChkInf->SilentProbCnt)
  1994.     lpMyChkInf->lpFixRep->ProbCnt -= lpMyChkInf->SilentProbCnt;
  1995. else
  1996.     lpMyChkInf->lpFixRep->ProbCnt = 0L;
  1997.     }
  1998.     lpMyChkInf->SilentProbCnt = 0; // Re-init to 0 for next drive
  1999. #endif
  2000.     switch(HIWORD(lpMyChkInf->OpCmpltRet))
  2001.     {
  2002. case ERR_FSUNCORRECTED:
  2003. case ERR_FSCORRECTED:
  2004. case NOERROR:
  2005.     if(lpMyChkInf->lpFixRep != 0L)
  2006.     {
  2007. if(lpMyChkInf->lpFixRep->ProbCnt == 0L)
  2008.     i = IDL_NOERROR;
  2009. else if(lpMyChkInf->MyFixOpt & DLGCHK_RO)
  2010.     i = IDL_NONEFIXED;
  2011. else if(lpMyChkInf->lpFixRep->ProbCnt == lpMyChkInf->lpFixRep->ProbFixedCnt)
  2012.     i = IDL_ALLFIXED;
  2013. else
  2014.     i = IDL_SOMEFIXED;
  2015. SEAddToLogRCS(lpMyChkInf,i,NULL);
  2016.     }
  2017.     break;
  2018. // case ERR_OSERR:
  2019. // case ERR_NOTWRITABLE:
  2020. // case ERR_NOTSUPPORTED:
  2021. // case ERR_INSUFMEM:
  2022. // case ERR_EXCLVIOLATION:
  2023. // case ERR_LOCKVIOLATION:
  2024. // case ERR_FSACTIVE:
  2025. // case ERR_FSERR:
  2026. // case ERR_BADOPTIONS:
  2027. // case OPCANCEL:
  2028. default:
  2029.     break;
  2030.     }
  2031.     if(!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOWND))
  2032.     {
  2033. SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+3, 0, 0L);
  2034.     }
  2035.     return(0L);
  2036.     break;
  2037. case DU_INITENGINE:
  2038.     if(!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOWND))
  2039.     {
  2040. SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+4, TRUE, 0L);
  2041.     }
  2042.     return(0L);
  2043.     break;
  2044. case DU_ENGINERESTART:
  2045. #ifdef FROSTING
  2046.     if(lpMyChkInf->fSageRun)
  2047. LockWrtRestartMax = CHKLOCKRESTARTLIM_SAGE;
  2048.     else
  2049. LockWrtRestartMax = CHKLOCKRESTARTLIM;
  2050. #else
  2051. #define LockWrtRestartMax CHKLOCKRESTARTLIM
  2052. #endif
  2053.     if((HIWORD(lpMyChkInf->lParam2) & OTHERWRT)  &&
  2054.        (lpMyChkInf->NoRstrtWarn == FALSE) &&
  2055.        (lpMyChkInf->lpFixFDisp->LockWrtRestartCnt >= LockWrtRestartMax) &&
  2056.        ((lpMyChkInf->lpFixFDisp->LockWrtRestartCnt % LockWrtRestartMax) == 0) )
  2057.     {
  2058. SEAddToLogRCS(lpMyChkInf,IDL_RSTLOCKLIM,NULL);
  2059. #ifdef FROSTING
  2060. if(lpMyChkInf->fSageRun) // If /SAGERUN, just cancel.
  2061. {
  2062.     lpMyChkInf->ChkCancelBool = TRUE;
  2063.     lpMyChkInf->fShouldRerun = TRUE;
  2064.     return(1L);
  2065. }
  2066. #endif
  2067. switch(MyChkdskMessageBox(lpMyChkInf, IDS_LOCKRSTART,
  2068.   MB_ICONQUESTION | MB_YESNOCANCEL))
  2069. {
  2070.     case IDNO:
  2071. lpMyChkInf->NoRstrtWarn = TRUE;
  2072. break;
  2073.     case IDCANCEL:
  2074. lpMyChkInf->ChkCancelBool = TRUE;
  2075. return(1L);
  2076. break;
  2077.     case IDYES:
  2078.     default:
  2079. break;
  2080. }
  2081.     }
  2082.     if((HIWORD(lpMyChkInf->lParam2) & UNFIXEDERRS) &&
  2083.        (HIWORD(lpMyChkInf->lParam2) & OTHERWRT)    &&
  2084.        (!lpMyChkInf->AlrdyRestartWrn)      )
  2085.     {
  2086. SEAddToLogRCS(lpMyChkInf,IDL_RSTUNFERR,NULL);
  2087. #ifdef FROSTING
  2088. if(!lpMyChkInf->fSageRun)
  2089. {
  2090. #endif
  2091.     switch(MyChkdskMessageBox(lpMyChkInf, IDS_ERRRSTART,
  2092.       MB_ICONQUESTION | MB_OKCANCEL))
  2093.     {
  2094. case IDCANCEL:
  2095.     lpMyChkInf->ChkCancelBool = TRUE;
  2096.     return(1L);
  2097.     break;
  2098. case IDOK:
  2099. default:
  2100.     break;
  2101.     }
  2102. #ifdef FROSTING
  2103. }
  2104. #endif
  2105.     }
  2106.     lpMyChkInf->AlrdyRestartWrn = FALSE;
  2107. #ifdef OPK2
  2108.     if(HIWORD(lpMyChkInf->lParam2) & DOSURFAN)
  2109.     {
  2110. lpMyChkInf->MyFixOpt &= ~DLGCHK_NOBAD;
  2111. SendMessage(GetDlgItem(lpMyChkInf->hProgDlgWnd,DLGCHK_NOBADB),BM_SETCHECK,0,0);
  2112. SendMessage(GetDlgItem(lpMyChkInf->hProgDlgWnd,DLGCHK_DOBAD),BM_SETCHECK,1,0);
  2113. UpdateWindow(GetDlgItem(lpMyChkInf->hProgDlgWnd,DLGCHK_NOBADB));
  2114. UpdateWindow(GetDlgItem(lpMyChkInf->hProgDlgWnd,DLGCHK_DOBAD));
  2115.     }
  2116. #endif
  2117.     // NOTE FALL THROUGH
  2118. case DU_YIELD:
  2119. case DU_ENGINESTART:
  2120. case DU_OPUPDATE:
  2121.     if(lpMyChkInf->ChkIsActive)
  2122.     {
  2123. lpMyChkInf->lpFixFDisp->Options &= ~FDO_LOWPRIORITY;
  2124.     } else {
  2125. lpMyChkInf->lpFixFDisp->Options |= FDO_LOWPRIORITY;
  2126.     }
  2127.     if((lpMyChkInf->hTimer == 0)  &&
  2128.        (!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOWND)) &&
  2129.        (lpMyChkInf->hProgDlgWnd != 0)     )
  2130.     {
  2131. lpMyChkInf->hTimer = SetTimer(lpMyChkInf->hProgDlgWnd,1,500,NULL);
  2132.     }
  2133.     if(!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOWND))
  2134.     {
  2135. SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+4, TRUE, 0L);
  2136.     }
  2137. DoYld:
  2138. #ifdef OPK2
  2139.     if(!(lpMyChkInf->MyFixOpt2 & DLGCHK_NOWND))
  2140.     {
  2141. SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+5, 0, 0L);
  2142.     }
  2143. DoYld2:
  2144. #endif
  2145. #define YLDCNTDIVH  25L
  2146. #define YLDCNTDIVL  50L
  2147.     lpMyChkInf->YldCnt++;
  2148.     if(lpMyChkInf->MyFixOpt2 & DLGCHK_NOWND)
  2149.     {
  2150. Yield();
  2151.     } else {
  2152. if(lpMyChkInf->hTimer != 0)
  2153. {
  2154.     if(lpMyChkInf->ChkIsActive)
  2155.     {
  2156. if((lpMyChkInf->YldCnt % YLDCNTDIVH) == 0)
  2157. {
  2158.     goto DoWait;
  2159. }
  2160.     } else {
  2161. if((lpMyChkInf->YldCnt % YLDCNTDIVL) == 0)
  2162. {
  2163. DoWait:
  2164.     WaitMessage();
  2165. }
  2166.     }
  2167. }
  2168. PMRet = PeekMessage((LPMSG)&wmsg, NULL, 0, 0, PM_REMOVE);
  2169. if(PMRet)
  2170. {
  2171.     if(lpMyChkInf->ChkIsActive &&
  2172.        (wmsg.message == WM_KEYDOWN))
  2173.     {
  2174. //
  2175. // Because this Message Loop is not USERS dialog
  2176. //  message loop we must do all the keyboard API
  2177. //  mapping ourselves. Mouse works OK.
  2178. //
  2179. // Only thing that's enabled is the CANCEL button,
  2180. //  so all of ESC RETURN and SPACE will cancel.
  2181. //
  2182. if((wmsg.wParam == VK_ESCAPE) ||
  2183.    (wmsg.wParam == VK_SPACE)  ||
  2184.    (wmsg.wParam == VK_RETURN)  )
  2185. {
  2186.     lpMyChkInf->ChkCancelBool = TRUE;
  2187.     SendDlgItemMessage(lpMyChkInf->hProgDlgWnd,
  2188.        DLGCHK_CANCEL,BM_SETSTATE,
  2189.        TRUE,0L);
  2190. }
  2191.     }
  2192.     TranslateMessage((LPMSG)&wmsg);
  2193.     DispatchMessage((LPMSG)&wmsg);
  2194.     if((wmsg.message == WM_KEYDOWN)    ||
  2195.        (wmsg.message == WM_KEYUP)      ||
  2196.        (wmsg.message == WM_SYSKEYDOWN) ||
  2197.        (wmsg.message == WM_SYSKEYUP)  )
  2198.     {
  2199. goto DoWait;
  2200.     }
  2201. #ifdef OPK2
  2202.     goto DoYld2;
  2203. #else
  2204.     goto DoYld;
  2205. #endif
  2206. }
  2207.     }
  2208.     if(lpMyChkInf->ChkCancelBool)
  2209. return(1L);
  2210.     else
  2211. return(0L);
  2212.     break;
  2213. default:
  2214.     return(0L);
  2215.     break;
  2216.     }
  2217. }
  2218. #ifdef DOSETUPCHK
  2219. LRESULT CALLBACK ChkSetupCBProc(UINT msg, LPARAM lRefData, LPARAM lParam1,
  2220. LPARAM lParam2, LPARAM lParam3,
  2221. LPARAM lParam4, LPARAM lParam5)
  2222. {
  2223.     LPMYCHKINFOSTRUCT  lpMyChkInf;
  2224.     BOOL        PMRet;
  2225.     MSG         wmsg;
  2226.     lpMyChkInf   = (LPMYCHKINFOSTRUCT)lRefData;
  2227.     lpMyChkInf->lpFixFDisp   = (LPFIXFATDISP)lParam1;
  2228.     lpMyChkInf->lParam1    = lParam1;
  2229.     lpMyChkInf->lParam2    = lParam2;
  2230.     lpMyChkInf->lParam3    = lParam3;
  2231.     lpMyChkInf->lParam4    = lParam4;
  2232.     lpMyChkInf->lParam5    = lParam5;
  2233.     lpMyChkInf->IsFolder   = FALSE;
  2234.     lpMyChkInf->IsRootFolder   = FALSE;
  2235.     lpMyChkInf->UseAltDlgTxt   = FALSE;
  2236.     lpMyChkInf->UseAltDefBut   = FALSE;
  2237.     lpMyChkInf->CancelIsDefault   = FALSE;
  2238.     lpMyChkInf->AltDefButIndx   = 0;
  2239.     lpMyChkInf->UseAltCantFix   = FALSE;
  2240.     lpMyChkInf->AltCantFixTstFlag = 0;
  2241.     lpMyChkInf->AltCantFixHID   = 0xFFFFFFFFL;
  2242.     lpMyChkInf->AltCantFixRepHID  = 0xFFFFFFFFL;
  2243.     switch(msg)
  2244.     {
  2245. case DU_ERRORDETECTED:
  2246.     switch(LOWORD(lpMyChkInf->lParam2)) {
  2247. case FATERRXLNK:
  2248.     MessageBox(lpMyChkInf->hProgDlgWnd,
  2249.        "Setup Check detected a Cross Link.",
  2250.        "ScanDisk for SETUP",
  2251.        MB_ICONINFORMATION | MB_OK);
  2252.     return(0L);
  2253.     break;
  2254. default:
  2255.     return(0L);
  2256.     break;
  2257.     }
  2258.     break;
  2259. case DU_OPCOMPLETE:
  2260.     return(0L);
  2261.     break;
  2262. case DU_INITENGINE:
  2263.     SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+4, TRUE, lpMyChkInf->lParam1);
  2264.     return(0L);
  2265.     break;
  2266. case DU_YIELD:
  2267. case DU_OPUPDATE:
  2268.     SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+4, TRUE, lpMyChkInf->lParam1);
  2269. DoYld:
  2270. #ifdef OPK2
  2271.     SendMessage(lpMyChkInf->hProgDlgWnd, WM_APP+5, 0, 0L);
  2272. #endif
  2273.     PMRet = PeekMessage((LPMSG)&wmsg, NULL, 0, 0, PM_REMOVE);
  2274.     if(PMRet)
  2275.     {
  2276. if(lpMyChkInf->ChkIsActive &&
  2277.    (wmsg.message == WM_KEYDOWN))
  2278. {
  2279.     //
  2280.     // Because this Message Loop is not USERS dialog
  2281.     // message loop we must do all the keyboard API
  2282.     // mapping ourselves. Mouse works OK.
  2283.     //
  2284.     // Only thing that's enabled is the CANCEL button,
  2285.     // so all of ESC RETURN and SPACE will cancel.
  2286.     //
  2287.     if((wmsg.wParam == VK_ESCAPE) ||
  2288.        (wmsg.wParam == VK_SPACE)  ||
  2289.        (wmsg.wParam == VK_RETURN)    )
  2290.     {
  2291. lpMyChkInf->ChkCancelBool = TRUE;
  2292. SendDlgItemMessage(lpMyChkInf->hProgDlgWnd,
  2293.    DLGCHK_CANCEL,BM_SETSTATE,
  2294.    TRUE,0L);
  2295.     }
  2296. }
  2297. TranslateMessage((LPMSG)&wmsg);
  2298. DispatchMessage((LPMSG)&wmsg);
  2299. if((wmsg.message == WM_KEYDOWN)    ||
  2300.    (wmsg.message == WM_KEYUP)    ||
  2301.    (wmsg.message == WM_SYSKEYDOWN) ||
  2302.    (wmsg.message == WM_SYSKEYUP)     )
  2303. {
  2304.     WaitMessage();
  2305. }
  2306. goto DoYld;
  2307.     }
  2308.     if(lpMyChkInf->ChkCancelBool)
  2309. return(1L);
  2310.     else
  2311. return(0L);
  2312.     break;
  2313. default:
  2314.     return(0L);
  2315.     break;
  2316.     }
  2317. }
  2318. #endif // DOSETUPCHK
  2319. BOOL WINAPI ChkSADlgWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  2320. {
  2321.     LPMYCHKINFOSTRUCT lpMyChkInf;
  2322.     lpMyChkInf = (LPMYCHKINFOSTRUCT)GetWindowLong(hwnd,DWL_USER);
  2323.     switch (msg) {
  2324. case  WM_INITDIALOG:
  2325.     SetWindowLong(hwnd,DWL_USER,lParam);
  2326.     lpMyChkInf = (LPMYCHKINFOSTRUCT)lParam;
  2327.     if(lpMyChkInf->MyFixOpt & DLGCHK_NOSYS)
  2328. CheckRadioButton(hwnd, DLGCHKSAO_DOALL, DLGCHKSAO_NODATA, DLGCHKSAO_NOSYS);
  2329.     else if(lpMyChkInf->MyFixOpt & DLGCHK_NODATA)
  2330. CheckRadioButton(hwnd, DLGCHKSAO_DOALL, DLGCHKSAO_NODATA, DLGCHKSAO_NODATA);
  2331.     else
  2332. CheckRadioButton(hwnd, DLGCHKSAO_DOALL, DLGCHKSAO_NODATA, DLGCHKSAO_DOALL);
  2333.     if(lpMyChkInf->MyFixOpt & DLGCHK_NOWRTTST)
  2334. CheckDlgButton(hwnd, DLGCHKSAO_NOWRTTST , TRUE);
  2335.     else
  2336. CheckDlgButton(hwnd, DLGCHKSAO_NOWRTTST , FALSE);
  2337.     if(lpMyChkInf->MyFixOpt & DLGCHK_ALLHIDSYS)
  2338. CheckDlgButton(hwnd, DLGCHKSAO_ALLHIDSYS , TRUE);
  2339.     else
  2340. CheckDlgButton(hwnd, DLGCHKSAO_ALLHIDSYS , FALSE);
  2341.     return(TRUE);
  2342.     break;
  2343. case WM_COMMAND:
  2344.     switch  (wParam) {
  2345. case DLGCHKSAO_OK:
  2346.     if(IsDlgButtonChecked(hwnd, DLGCHKSAO_ALLHIDSYS))
  2347. lpMyChkInf->MyFixOpt |= DLGCHK_ALLHIDSYS;
  2348.     else
  2349. lpMyChkInf->MyFixOpt &= ~DLGCHK_ALLHIDSYS;
  2350.     if(IsDlgButtonChecked(hwnd, DLGCHKSAO_NOWRTTST))
  2351. lpMyChkInf->MyFixOpt |= DLGCHK_NOWRTTST;
  2352.     else
  2353. lpMyChkInf->MyFixOpt &= ~DLGCHK_NOWRTTST;
  2354.     lpMyChkInf->MyFixOpt &= ~(DLGCHK_NOSYS | DLGCHK_NODATA);
  2355.     if(IsDlgButtonChecked(hwnd, DLGCHKSAO_NOSYS))
  2356. lpMyChkInf->MyFixOpt |= DLGCHK_NOSYS;
  2357.     else if(IsDlgButtonChecked(hwnd, DLGCHKSAO_NODATA))
  2358. lpMyChkInf->MyFixOpt |= DLGCHK_NODATA;
  2359.     EndDialog(hwnd, IDOK);
  2360.     return(TRUE);
  2361.     break;
  2362. case DLGCHKSAO_CANCEL:
  2363.     EndDialog(hwnd, IDCANCEL);
  2364.     return(TRUE);
  2365.     break;
  2366. case DLGCHKSAO_DOALL:
  2367. case DLGCHKSAO_NOSYS:
  2368. case DLGCHKSAO_NODATA:
  2369.     CheckRadioButton(hwnd, DLGCHKSAO_DOALL, DLGCHKSAO_NODATA, wParam);
  2370.     return(TRUE);
  2371.     break;
  2372. case DLGCHKSAO_NOWRTTST:
  2373. case DLGCHKSAO_ALLHIDSYS:
  2374.     CheckDlgButton(hwnd, wParam, !IsDlgButtonChecked(hwnd, wParam));
  2375.     return(TRUE);
  2376.     break;
  2377. default:
  2378.     return(FALSE);
  2379.     }
  2380.     break;
  2381. case WM_HELP:
  2382.     WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP,
  2383.     (DWORD) (LPSTR) ChkSAOaIds);
  2384.     return(TRUE);
  2385.     break;
  2386. case WM_CONTEXTMENU:
  2387.     WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
  2388.     (DWORD) (LPSTR) ChkSAOaIds);
  2389.     return(TRUE);
  2390.     break;
  2391. default:
  2392.     return(FALSE);
  2393.     break;
  2394.     }
  2395.     return(FALSE);
  2396. }
  2397. BOOL WINAPI ChkAdvDlgWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  2398. {
  2399.     LPMYCHKINFOSTRUCT lpMyChkInf;
  2400.     PSTR       pMsgBuf;
  2401. #define SZBUFA2       128
  2402. #define SZBUFB2       128
  2403. #define SZBUFC2       128
  2404. #define TOTMSZ2       (SZBUFA2+SZBUFB2+SZBUFC2)
  2405. #define aBuf1 (&(pMsgBuf[0]))
  2406. #define aBuf2 (&(pMsgBuf[SZBUFA2]))
  2407. #define aBuf3 (&(pMsgBuf[SZBUFA2+SZBUFB2]))
  2408.     lpMyChkInf = (LPMYCHKINFOSTRUCT)GetWindowLong(hwnd,DWL_USER);
  2409.     switch (msg) {
  2410. case  WM_INITDIALOG:
  2411.     SetWindowLong(hwnd,DWL_USER,lParam);
  2412.     lpMyChkInf = (LPMYCHKINFOSTRUCT)lParam;
  2413.     pMsgBuf = (PSTR)LocalAlloc(LMEM_FIXED,TOTMSZ2);
  2414.     if(!pMsgBuf)
  2415.     {
  2416. MyChkdskMessageBox(lpMyChkInf, IDS_NOMEM2,
  2417.    MB_ICONINFORMATION | MB_OK);
  2418. EndDialog(hwnd, IDCANCEL);
  2419. return(TRUE);
  2420.     }
  2421.     if(lpMyChkInf->MyFixOpt & DLGCHK_XLDEL)
  2422. CheckRadioButton(hwnd, DLGCHKADV_XLDEL, DLGCHKADV_XLIGN, DLGCHKADV_XLDEL);
  2423.     else if(lpMyChkInf->MyFixOpt & DLGCHK_XLCPY)
  2424. CheckRadioButton(hwnd, DLGCHKADV_XLDEL, DLGCHKADV_XLIGN, DLGCHKADV_XLCPY);
  2425.     else
  2426. CheckRadioButton(hwnd, DLGCHKADV_XLDEL, DLGCHKADV_XLIGN, DLGCHKADV_XLIGN);
  2427.     if(lpMyChkInf->MyFixOpt & DLGCHK_LSTMF)
  2428. CheckRadioButton(hwnd, DLGCHKADV_LSTF, DLGCHKADV_LSTMF, DLGCHKADV_LSTMF);
  2429.     else
  2430. CheckRadioButton(hwnd, DLGCHKADV_LSTF, DLGCHKADV_LSTMF, DLGCHKADV_LSTF);
  2431.     if(lpMyChkInf->MyFixOpt & DLGCHK_NOCHKDT)
  2432. CheckDlgButton(hwnd, DLGCHKADV_CHKDT , FALSE);
  2433.     else
  2434. CheckDlgButton(hwnd, DLGCHKADV_CHKDT , TRUE);
  2435.     if(lpMyChkInf->MyFixOpt2 & DLGCHK_NOCHKHST)
  2436. CheckDlgButton(hwnd, DLGCHKADV_CHKHST , FALSE);
  2437.     else
  2438. CheckDlgButton(hwnd, DLGCHKADV_CHKHST , TRUE);
  2439.     if(lpMyChkInf->MyFixOpt & DLGCHK_NOCHKNM)
  2440. CheckDlgButton(hwnd, DLGCHKADV_CHKNM , FALSE);
  2441.     else
  2442. CheckDlgButton(hwnd, DLGCHKADV_CHKNM , TRUE);
  2443.     if(lpMyChkInf->MyFixOpt & DLGCHK_REP)
  2444.     {
  2445. if(lpMyChkInf->MyFixOpt2 & DLGCHK_REPONLYERR)
  2446. {
  2447.     CheckRadioButton(hwnd, DLGCHKADV_REPALWAYS, DLGCHKADV_REPIFERR, DLGCHKADV_REPIFERR);
  2448. } else {
  2449.     CheckRadioButton(hwnd, DLGCHKADV_REPALWAYS, DLGCHKADV_REPIFERR, DLGCHKADV_REPALWAYS);
  2450. }
  2451.     } else {
  2452. CheckRadioButton(hwnd, DLGCHKADV_REPALWAYS, DLGCHKADV_REPIFERR, DLGCHKADV_NOREP);
  2453.     }
  2454.     if(lpMyChkInf->MyFixOpt2 & DLGCHK_NOLOG)
  2455.     {
  2456. CheckRadioButton(hwnd, DLGCHKADV_LOGREP, DLGCHKADV_NOLOG, DLGCHKADV_NOLOG);
  2457.     } else {
  2458. if(lpMyChkInf->MyFixOpt2 & DLGCHK_LOGAPPEND)
  2459. {
  2460.     CheckRadioButton(hwnd, DLGCHKADV_LOGREP, DLGCHKADV_NOLOG, DLGCHKADV_LOGAPPND);
  2461. } else {
  2462.     CheckRadioButton(hwnd, DLGCHKADV_LOGREP, DLGCHKADV_NOLOG, DLGCHKADV_LOGREP);
  2463. }
  2464.     }
  2465.     return(TRUE);
  2466.     break;
  2467. case WM_COMMAND:
  2468.     switch  (wParam) {
  2469. case DLGCHKADV_OK:
  2470.     if(IsDlgButtonChecked(hwnd, DLGCHKADV_CHKDT))
  2471. lpMyChkInf->MyFixOpt &= ~DLGCHK_NOCHKDT;
  2472.     else
  2473. lpMyChkInf->MyFixOpt |= DLGCHK_NOCHKDT;
  2474.     if(IsDlgButtonChecked(hwnd, DLGCHKADV_CHKHST))
  2475. lpMyChkInf->MyFixOpt2 &= ~DLGCHK_NOCHKHST;
  2476.     else
  2477. lpMyChkInf->MyFixOpt2 |= DLGCHK_NOCHKHST;
  2478.     if(IsDlgButtonChecked(hwnd, DLGCHKADV_CHKNM))
  2479. lpMyChkInf->MyFixOpt &= ~DLGCHK_NOCHKNM;
  2480.     else
  2481. lpMyChkInf->MyFixOpt |= DLGCHK_NOCHKNM;
  2482.     if(IsDlgButtonChecked(hwnd, DLGCHKADV_LSTMF))
  2483. lpMyChkInf->MyFixOpt |= DLGCHK_LSTMF;
  2484.     else
  2485. lpMyChkInf->MyFixOpt &= ~DLGCHK_LSTMF;
  2486.     lpMyChkInf->MyFixOpt &= ~(DLGCHK_XLDEL | DLGCHK_XLCPY);
  2487.     if(IsDlgButtonChecked(hwnd, DLGCHKADV_XLDEL))
  2488. lpMyChkInf->MyFixOpt |= DLGCHK_XLDEL;
  2489.     else if(IsDlgButtonChecked(hwnd, DLGCHKADV_XLCPY))
  2490. lpMyChkInf->MyFixOpt |= DLGCHK_XLCPY;
  2491.     lpMyChkInf->MyFixOpt2 &= ~(DLGCHK_NOLOG | DLGCHK_LOGAPPEND);
  2492.     if(IsDlgButtonChecked(hwnd, DLGCHKADV_NOLOG))
  2493. lpMyChkInf->MyFixOpt2 |= DLGCHK_NOLOG;
  2494.     else if(IsDlgButtonChecked(hwnd, DLGCHKADV_LOGAPPND))
  2495. lpMyChkInf->MyFixOpt2 |= DLGCHK_LOGAPPEND;
  2496.     lpMyChkInf->MyFixOpt &= ~(DLGCHK_REP);
  2497.     lpMyChkInf->MyFixOpt2 &= ~(DLGCHK_REPONLYERR);
  2498.     if(!IsDlgButtonChecked(hwnd, DLGCHKADV_NOREP))
  2499.     {
  2500. lpMyChkInf->MyFixOpt |= DLGCHK_REP;
  2501. if(IsDlgButtonChecked(hwnd, DLGCHKADV_REPIFERR))
  2502. {
  2503.     lpMyChkInf->MyFixOpt2 |= DLGCHK_REPONLYERR;
  2504. }
  2505.     }
  2506.     EndDialog(hwnd, IDOK);
  2507.     return(TRUE);
  2508.     break;
  2509. case DLGCHKADV_CANCEL:
  2510.     EndDialog(hwnd, IDCANCEL);
  2511.     return(TRUE);
  2512.     break;
  2513. case DLGCHKADV_LSTF:
  2514. case DLGCHKADV_LSTMF:
  2515.     CheckRadioButton(hwnd, DLGCHKADV_LSTF, DLGCHKADV_LSTMF, wParam);
  2516.     return(TRUE);
  2517.     break;
  2518. case DLGCHKADV_XLDEL:
  2519. case DLGCHKADV_XLCPY:
  2520. case DLGCHKADV_XLIGN:
  2521.     CheckRadioButton(hwnd, DLGCHKADV_XLDEL, DLGCHKADV_XLIGN, wParam);
  2522.     return(TRUE);
  2523.     break;
  2524. case DLGCHKADV_LOGREP:
  2525. case DLGCHKADV_LOGAPPND:
  2526. case DLGCHKADV_NOLOG:
  2527.     CheckRadioButton(hwnd, DLGCHKADV_LOGREP, DLGCHKADV_NOLOG, wParam);
  2528.     return(TRUE);
  2529.     break;
  2530. case DLGCHKADV_REPALWAYS:
  2531. case DLGCHKADV_NOREP:
  2532. case DLGCHKADV_REPIFERR:
  2533.     CheckRadioButton(hwnd, DLGCHKADV_REPALWAYS, DLGCHKADV_REPIFERR, wParam);
  2534.     return(TRUE);
  2535.     break;
  2536. case DLGCHKADV_CHKDT:
  2537. case DLGCHKADV_CHKNM:
  2538. case DLGCHKADV_CHKHST:
  2539.     CheckDlgButton(hwnd, wParam, !IsDlgButtonChecked(hwnd, wParam));
  2540.     return(TRUE);
  2541.     break;
  2542. default:
  2543.     return(FALSE);
  2544.     }
  2545.     break;
  2546. case WM_HELP:
  2547.     WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle, NULL, HELP_WM_HELP,
  2548.     (DWORD) (LPSTR) ChkAdvaIds);
  2549.     return(TRUE);
  2550.     break;
  2551. case WM_CONTEXTMENU:
  2552.     WinHelp((HWND) wParam, NULL, HELP_CONTEXTMENU,
  2553.     (DWORD) (LPSTR) ChkAdvaIds);
  2554.     return(TRUE);
  2555.     break;
  2556. default:
  2557.     return(FALSE);
  2558.     break;
  2559.     }
  2560.     return(FALSE);
  2561. }
  2562. #ifdef OPK2
  2563. // this right aligns the numbers to dxNum1 width and pretty's it up 
  2564. void FAR PASCAL BeutifyNumberOutput(HWND hwnd, HDC hDC,
  2565.     WORD dxNum1, int id, int AltSRcID,
  2566.     DWORD dwInput, DWORD dwInput2)
  2567. {
  2568.     char szBuf1[128];
  2569.     char szBuf2[128];
  2570.     char szBuf3[128];
  2571.     char szBuf4[128];
  2572.     DWORD pdw[2] = { (DWORD)(LPSTR)szBuf2, (DWORD)(LPSTR)szBuf4};
  2573.     int j;
  2574.     
  2575.     if(AltSRcID)
  2576.     {
  2577. LoadString(g_hInstance, AltSRcID,szBuf1,sizeof(szBuf1));
  2578.     } else {
  2579. GetDlgItemText(hwnd,id,szBuf1,sizeof(szBuf1));
  2580.     }
  2581.     AddCommas(dwInput,szBuf2,sizeof(szBuf2),FALSE);
  2582.     j = lstrlen(szBuf2);
  2583.     while(LOWORD(GetTextExtent(hDC,(LPSTR)szBuf2,j)) < (dxNum1 - 2))
  2584.     {
  2585.         hmemcpy(szBuf2+1, szBuf2, j+1);
  2586.         szBuf2[0] = ' ';
  2587.         j++;
  2588.     }
  2589.     
  2590.     AddCommas(dwInput2,szBuf4,sizeof(szBuf4),FALSE);
  2591.     
  2592.     FormatMessage( FORMAT_MESSAGE_FROM_STRING, // | FORMAT_MESSAGE_ARGUMENT_ARRAY,
  2593.                   szBuf1, 0, 0, szBuf3, sizeof(szBuf3), pdw);
  2594.     //wsprintf(szBuf3,szBuf1,(LPSTR)szBuf2,(LPSTR)szBuf4);
  2595.     SetDlgItemText(hwnd,id,szBuf3);
  2596. }
  2597. void ChkRepInit(LPMYCHKINFOSTRUCT lpMyChkInf, HWND hwnd)
  2598. {
  2599.     LPFATFIXREPORT    lpChkRep;
  2600.     DWORD       dwi;
  2601.     HFONT       hTxtFnt;
  2602.     HFONT       hFnt;
  2603.     HWND       hCtrl;
  2604.     HDC        hDC;
  2605.     WORD       dxNum1;
  2606.     WORD       i;
  2607.     char       Buf1[128];
  2608.     char       Buf2[128];
  2609.     
  2610.     lpChkRep = lpMyChkInf->lpFixRep;
  2611.     GetWindowText(hwnd,Buf1,sizeof(Buf1));
  2612.     SetStdChkTitle(lpMyChkInf, Buf1, Buf2, sizeof(Buf2));
  2613.     SetWindowText(hwnd,Buf2);
  2614.     if(lpChkRep->ProbCnt == 0L)
  2615.         i = IDS_NOERROR;
  2616.     else if(lpMyChkInf->MyFixOpt & DLGCHK_RO)
  2617.         i = IDS_NONEFIXED;
  2618.     else if(lpChkRep->ProbCnt == lpChkRep->ProbFixedCnt)
  2619.         i = IDS_ALLFIXED;
  2620.     else
  2621.         i = IDS_SOMEFIXED;
  2622.     LoadString(g_hInstance, i, Buf2, sizeof(Buf2));
  2623.     SetDlgItemText(hwnd,DLGCHKREP_ESTAT,Buf2);
  2624.     hCtrl = GetDlgItem(hwnd,DLGCHKREP_TOT);
  2625.     hTxtFnt = (HFONT)SendMessage(hCtrl,WM_GETFONT,0,0L);
  2626.     if(!hTxtFnt)
  2627.         hTxtFnt = GetStockObject(SYSTEM_FONT);
  2628.     hDC = GetDC(hCtrl);
  2629.     hFnt = SelectObject(hDC,hTxtFnt);
  2630.     dxNum1 = LOWORD(GetTextExtent(hDC,(LPSTR)"100,000,000,000",15));
  2631.     if((lpChkRep->TotDiskSzByte == 0L) &&
  2632.        ((lpChkRep->TotDiskSzK != 0L) || (lpChkRep->TotDiskSzM != 0L)))
  2633.     {
  2634. if(lpChkRep->TotDiskSzK == 0L)
  2635. {
  2636.     i = IDS_REP_TOTM;
  2637.     dwi = lpChkRep->TotDiskSzM;
  2638. } else {
  2639.     i = IDS_REP_TOTK;
  2640.     dwi = lpChkRep->TotDiskSzK;
  2641. }
  2642.     } else {
  2643. i = 0;
  2644. dwi = lpChkRep->TotDiskSzByte;
  2645.     }
  2646.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_TOT, i, dwi, 0);
  2647.     if((lpChkRep->AvailSzByte == 0L) &&
  2648.        ((lpChkRep->AvailSzK != 0L) || (lpChkRep->AvailSzM != 0L)))
  2649.     {
  2650. if(lpChkRep->AvailSzK == 0L)
  2651. {
  2652.     i = IDS_REP_AVAILM;
  2653.     dwi = lpChkRep->AvailSzM;
  2654. } else {
  2655.     i = IDS_REP_AVAILK;
  2656.     dwi = lpChkRep->AvailSzK;
  2657. }
  2658.     } else {
  2659. i = 0;
  2660. dwi = lpChkRep->AvailSzByte;
  2661.     }
  2662.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_AVAIL, i, dwi, 0);
  2663.     if((lpChkRep->BadSzDataByte == 0L) &&
  2664.        ((lpChkRep->BadSzDataK != 0L) || (lpChkRep->BadSzDataM != 0L)))
  2665.     {
  2666. if(lpChkRep->BadSzDataK == 0L)
  2667. {
  2668.     i = IDS_REP_BADM;
  2669.     dwi = lpChkRep->BadSzDataM;
  2670. } else {
  2671.     i = IDS_REP_BADK;
  2672.     dwi = lpChkRep->BadSzDataK;
  2673. }
  2674.     } else {
  2675. i = 0;
  2676. dwi = lpChkRep->BadSzDataByte;
  2677.     }
  2678.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_BAD, i, dwi, 0);
  2679.     if((lpChkRep->DirSzByte == 0L) &&
  2680.        ((lpChkRep->DirSzK != 0L) || (lpChkRep->DirSzM != 0L)))
  2681.     {
  2682. if(lpChkRep->DirSzK == 0L)
  2683. {
  2684.     i = IDS_REP_DIRM;
  2685.     dwi = lpChkRep->DirSzM;
  2686. } else {
  2687.     i = IDS_REP_DIRK;
  2688.     dwi = lpChkRep->DirSzK;
  2689. }
  2690.     } else {
  2691. i = 0;
  2692. dwi = lpChkRep->DirSzByte;
  2693.     }
  2694.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_DIR, i, dwi, lpChkRep->DirFileCnt);
  2695.     if((lpChkRep->UserSzByte == 0L) &&
  2696.        ((lpChkRep->UserSzK != 0L) || (lpChkRep->UserSzM != 0L)))
  2697.     {
  2698. if(lpChkRep->UserSzK == 0L)
  2699. {
  2700.     i = IDS_REP_USERM;
  2701.     dwi = lpChkRep->UserSzM;
  2702. } else {
  2703.     i = IDS_REP_USERK;
  2704.     dwi = lpChkRep->UserSzK;
  2705. }
  2706.     } else {
  2707. i = 0;
  2708. dwi = lpChkRep->UserSzByte;
  2709.     }
  2710.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_USER, i, dwi, lpChkRep->UserFileCnt);
  2711.     if((lpChkRep->HidSzByte == 0L) &&
  2712.        ((lpChkRep->HidSzK != 0L) || (lpChkRep->HidSzM != 0L)))
  2713.     {
  2714. if(lpChkRep->HidSzK == 0L)
  2715. {
  2716.     i = IDS_REP_HIDM;
  2717.     dwi = lpChkRep->HidSzM;
  2718. } else {
  2719.     i = IDS_REP_HIDK;
  2720.     dwi = lpChkRep->HidSzK;
  2721. }
  2722.     } else {
  2723. i = 0;
  2724. dwi = lpChkRep->HidSzByte;
  2725.     }
  2726.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_HID, i,dwi, lpChkRep->HidFileCnt);
  2727.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_BCLUS, 0,lpChkRep->BytesPerClus, 0);
  2728.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_TCLUS, 0,lpChkRep->TotDataClus, 0);
  2729.     BeutifyNumberOutput(hwnd, hDC, dxNum1, DLGCHKREP_ACLUS, 0,lpChkRep->AvailDataClus, 0);
  2730.     SelectObject(hDC,hFnt);
  2731.     ReleaseDC(hCtrl,hDC);
  2732. }
  2733. #else
  2734. // this right aligns the numbers to dxNum1 width and pretty's it up 
  2735. void FAR PASCAL SomeRandomMagic(HWND hwnd, HDC hDC, WORD dxNum1, int id, DWORD dwInput, DWORD dwInput2)
  2736. {
  2737.     char szBuf1[128];
  2738.     char szBuf2[128];
  2739.     char szBuf3[128];
  2740.     char szBuf4[128];
  2741.     DWORD pdw[2] = { (DWORD)(LPSTR)szBuf2, (DWORD)(LPSTR)szBuf4};
  2742.     int j;
  2743.     
  2744.     GetDlgItemText(hwnd,id,szBuf1,sizeof(szBuf1));
  2745.     AddCommas(dwInput,szBuf2,sizeof(szBuf2),FALSE);
  2746.     j = lstrlen(szBuf2);
  2747.     while(LOWORD(GetTextExtent(hDC,(LPSTR)szBuf2,j)) < (dxNum1 - 2))
  2748.     {
  2749.         hmemcpy(szBuf2+1, szBuf2, j+1);
  2750.         szBuf2[0] = ' ';
  2751.         j++;
  2752.     }
  2753.     
  2754.     AddCommas(dwInput2,szBuf4,sizeof(szBuf4),FALSE);
  2755.     
  2756.     FormatMessage( FORMAT_MESSAGE_FROM_STRING, // | FORMAT_MESSAGE_ARGUMENT_ARRAY,
  2757.                   szBuf1, 0, 0, szBuf3, sizeof(szBuf3), pdw);
  2758.     //wsprintf(szBuf3,szBuf1,(LPSTR)szBuf2,(LPSTR)szBuf4);
  2759.     SetDlgItemText(hwnd,id,szBuf3);
  2760. }
  2761. void ChkRepInit(LPMYCHKINFOSTRUCT lpMyChkInf, HWND hwnd)
  2762. {
  2763.     LPFATFIXREPORT    lpChkRep;
  2764.     HFONT       hTxtFnt;
  2765.     HFONT       hFnt;
  2766.     HWND       hCtrl;
  2767.     HDC        hDC;
  2768.     WORD       dxNum1;
  2769.     WORD i;
  2770.     char Buf1[128];
  2771.     char Buf2[128];
  2772.     
  2773.     lpChkRep = lpMyChkInf->lpFixRep;
  2774.     GetWindowText(hwnd,Buf1,sizeof(Buf1));
  2775.     SetStdChkTitle(lpMyChkInf, Buf1, Buf2, sizeof(Buf2));
  2776.     SetWindowText(hwnd,Buf2);
  2777.     if(lpChkRep->ProbCnt == 0L)
  2778.         i = IDS_NOERROR;
  2779.     else if(lpMyChkInf->MyFixOpt & DLGCHK_RO)
  2780.         i = IDS_NONEFIXED;
  2781.     else if(lpChkRep->ProbCnt == lpChkRep->ProbFixedCnt)
  2782.         i = IDS_ALLFIXED;
  2783.     else
  2784.         i = IDS_SOMEFIXED;
  2785.     LoadString(g_hInstance, i, Buf2, sizeof(Buf2));
  2786.     SetDlgItemText(hwnd,DLGCHKREP_ESTAT,Buf2);
  2787.     hCtrl = GetDlgItem(hwnd,DLGCHKREP_TOT);
  2788.     hTxtFnt = (HFONT)SendMessage(hCtrl,WM_GETFONT,0,0L);
  2789.     if(!hTxtFnt)
  2790.         hTxtFnt = GetStockObject(SYSTEM_FONT);
  2791.     hDC = GetDC(hCtrl);
  2792.     hFnt = SelectObject(hDC,hTxtFnt);
  2793.     dxNum1 = LOWORD(GetTextExtent(hDC,(LPSTR)"100,000,000,000",15));
  2794.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_TOT, lpChkRep->TotDiskSzByte, 0);
  2795.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_AVAIL, lpChkRep->AvailSzByte, 0);
  2796.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_BAD, lpChkRep->BadSzDataByte, 0);
  2797.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_BCLUS, lpChkRep->BytesPerClus, 0);
  2798.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_TCLUS, lpChkRep->TotDataClus, 0);
  2799.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_ACLUS, lpChkRep->AvailDataClus, 0);
  2800.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_DIR, lpChkRep->DirSzByte, lpChkRep->DirFileCnt);
  2801.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_USER, lpChkRep->UserSzByte, lpChkRep->UserFileCnt);
  2802.     SomeRandomMagic(hwnd, hDC, dxNum1, DLGCHKREP_HID, lpChkRep->HidSzByte, lpChkRep->HidFileCnt);
  2803.     SelectObject(hDC,hFnt);
  2804.     ReleaseDC(hCtrl,hDC);
  2805. }
  2806. #endif
  2807. BOOL WINAPI ChkRepDlgWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  2808. {
  2809.     switch (msg) {
  2810. case  WM_INITDIALOG:
  2811.             ChkRepInit((LPMYCHKINFOSTRUCT)lParam, hwnd);
  2812.     return(TRUE);
  2813. case WM_COMMAND:
  2814.     switch  (wParam) {
  2815. case DLGCHKREP_CLOSE:
  2816.     EndDialog(hwnd, IDOK);
  2817.     return(TRUE);
  2818.     break;
  2819. default:
  2820.     return(FALSE);
  2821.     }
  2822.     break;
  2823. default:
  2824.     return(FALSE);
  2825.     break;
  2826.     }
  2827. }
  2828. #define MAX_DRIVELIST_STRING_LEN (64+4)
  2829. #define MINIDRIVE_MARGIN 4
  2830. #define DRIVELIST_BORDER 3
  2831. BOOL NEAR MyDrawItem(HWND hwnd, WORD wParam, LPDRAWITEMSTRUCT lpdis)
  2832. {
  2833.     HDC hdc;
  2834.     RECT rc;
  2835.     char szText[MAX_DRIVELIST_STRING_LEN];
  2836.     int xString, yString, xMiniDrive, dyString;
  2837.     SIZE siz;
  2838.     if(lpdis->CtlID != DLGCHK_DRVLIST)
  2839. return(FALSE);
  2840.     hdc = lpdis->hDC;
  2841.     rc = lpdis->rcItem;
  2842.     SendMessage(lpdis->hwndItem,LB_GETTEXT,lpdis->itemID,(LPARAM)(LPSTR)szText);
  2843.     xMiniDrive = rc.left + DRIVELIST_BORDER;
  2844.     rc.left = xString = xMiniDrive + g_cxIcon + MINIDRIVE_MARGIN;
  2845.     GetTextExtentPoint(hdc, szText, lstrlen(szText), &siz);
  2846.     dyString = siz.cy;
  2847.     rc.right = rc.left + siz.cx;
  2848.     rc.left--;
  2849.     rc.right++;
  2850.     if(lpdis->itemAction != ODA_FOCUS)
  2851.     {
  2852. yString = rc.top + (rc.bottom - rc.top - dyString)/2;
  2853. SetBkColor(hdc, GetSysColor((lpdis->itemState & ODS_SELECTED) ?
  2854. COLOR_HIGHLIGHT : COLOR_WINDOW));
  2855. SetTextColor(hdc, GetSysColor((lpdis->itemState & ODS_SELECTED) ?
  2856. COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));
  2857. ExtTextOut(hdc, xString, yString, ETO_OPAQUE,
  2858.     &rc, szText, lstrlen(szText), NULL);
  2859. ImageList_Draw(g_himlIconsSmall,
  2860.        (int)HIWORD(lpdis->itemData),
  2861.                        hdc, xMiniDrive,
  2862.        rc.top + (rc.bottom - rc.top - g_cyIcon)/2,
  2863.                        (lpdis->itemState & ODS_SELECTED) ? (ILD_SELECTED | ILD_FOCUS) : ILD_NORMAL);
  2864.     }
  2865.     if (lpdis->itemAction == ODA_FOCUS ||
  2866. (lpdis->itemState & ODS_FOCUS))
  2867.     {
  2868. DrawFocusRect(hdc, &rc);
  2869.     }
  2870.     return(TRUE);
  2871. }
  2872. //---------------------------------------------------------------------------
  2873. // Returns TRUE if the given string is a UNC path.
  2874. //
  2875. // TRUE
  2876. // "\foobar"
  2877. // "\foo" <- careful
  2878. // "\"
  2879. // FALSE
  2880. // "foo"
  2881. // "foo"
  2882. BOOL NEAR MyPathIsUNC(LPSTR lpsz)
  2883. {
  2884.     if (lpsz[0] == '\' && lpsz[1] == '\')
  2885. return TRUE;
  2886.     else
  2887. return FALSE;
  2888. }
  2889. VOID NEAR MakeThisDriveVisible(HWND hwndDlg, LPMYCHKINFOSTRUCT lpMyChkInf)
  2890. {
  2891.     HWND  hDrv;
  2892.     WORD  ThisDrv;
  2893.     int   i;
  2894.     int   cnt;
  2895.     if(!lpMyChkInf->IsDrvList)
  2896. return;
  2897.     hDrv = GetDlgItem(hwndDlg,DLGCHK_DRVLIST);
  2898.     if((lpMyChkInf->IsSplitDrv) && (!(lpMyChkInf->DoingCompDrv)))
  2899.     {
  2900. ThisDrv = lpMyChkInf->CompDrv;
  2901.     } else {
  2902. ThisDrv = lpMyChkInf->lpwddi->iDrive;
  2903.     }
  2904.     cnt = (int)SendMessage(hDrv,LB_GETCOUNT,0,0L);
  2905.     for(i = 0; i < cnt; i++)
  2906.     {
  2907. if(LOWORD(SendMessage(hDrv,LB_GETITEMDATA,i,0L)) == ThisDrv)
  2908.     break;
  2909.     }
  2910.     if(i < cnt)
  2911. SendMessage(hDrv,LB_SETTOPINDEX,i,0L);
  2912.     return;
  2913. }
  2914. BOOL NEAR InitDriveList(HWND hwndDlg, LPSHCHECKDISKINFO  lpSHChkInfo)
  2915. {
  2916.     SHFILEINFO       shfi;
  2917.     LPMYCHKINFOSTRUCT lpMyChkInf;
  2918.     DWORD       EngFlags[26];
  2919. #ifndef FROSTING
  2920.     DWORD       typ;
  2921.     DWORD       sz;
  2922. #endif
  2923.     int        ThisDrv = 0;
  2924. #ifndef FROSTING
  2925.     HKEY       hKey;
  2926. #endif
  2927.     BOOL       LastDrvValid;
  2928.     HWND       hDrv;
  2929.     int        i;
  2930.     int        j;
  2931.     int        iIndex;
  2932.     BOOL       FndValidDrv = FALSE;
  2933.     char       Drv[] = "A:\";
  2934. #ifndef FROSTING
  2935.     char       RegKey[80];
  2936. #endif