Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

587 lines
18 KiB

  1. // Created 04-Jan-1993 1:10pm by Jeff Parsons
  2. #include "shellprv.h"
  3. #pragma hdrstop
  4. BINF abinfPrg[] = {
  5. {IDC_CLOSEONEXIT, BITNUM(PRG_CLOSEONEXIT)},
  6. };
  7. // Per-Dialog data
  8. typedef struct PRGINFO { /* pi */
  9. PPROPLINK ppl;
  10. HICON hIcon;
  11. TCHAR atchIconFile[PIFDEFFILESIZE];
  12. WORD wIconIndex;
  13. LPVOID hConfig;
  14. LPVOID hAutoexec;
  15. WORD flPrgInitPrev;
  16. BOOL fCfgSetByWiz;
  17. } PRGINFO;
  18. typedef PRGINFO * PPRGINFO; /* ppi */
  19. // Private function prototypes
  20. void InitPrgDlg(HWND hDlg, PPRGINFO ppi);
  21. void AdjustMSDOSModeControls(PPROPLINK ppl, HWND hDlg);
  22. void ApplyPrgDlg(HWND hDlg, PPRGINFO ppi);
  23. void BrowseIcons(HWND hDlg, PPRGINFO ppi);
  24. BOOL_PTR CALLBACK DlgPifNtProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
  25. WORD InitNtPifDlg(HWND hDlg, register PPRGINFO ppi);
  26. void ApplyNtPifDlg( HWND hDlg, PPRGINFO ppi );
  27. // Context-sensitive help ids
  28. const static DWORD rgdwHelp[] = {
  29. IDC_ICONBMP, IDH_DOS_PROGRAM_ICON,
  30. IDC_TITLE, IDH_DOS_PROGRAM_DESCRIPTION,
  31. IDC_CMDLINE, IDH_DOS_PROGRAM_CMD_LINE,
  32. IDC_CMDLINELBL, IDH_DOS_PROGRAM_CMD_LINE,
  33. IDC_WORKDIR, IDH_DOS_PROGRAM_WORKDIR,
  34. IDC_WORKDIRLBL, IDH_DOS_PROGRAM_WORKDIR,
  35. IDC_HOTKEY, IDH_DOS_PROGRAM_SHORTCUT,
  36. IDC_HOTKEYLBL, IDH_DOS_PROGRAM_SHORTCUT,
  37. IDC_BATCHFILE, IDH_DOS_PROGRAM_BATCH,
  38. IDC_BATCHFILELBL, IDH_DOS_PROGRAM_BATCH,
  39. IDC_WINDOWSTATE, IDH_DOS_PROGRAM_RUN,
  40. IDC_WINDOWSTATELBL, IDH_DOS_PROGRAM_RUN,
  41. IDC_CLOSEONEXIT, IDH_DOS_WINDOWS_QUIT_CLOSE,
  42. IDC_CHANGEICON, IDH_DOS_PROGRAM_CHANGEICON,
  43. IDC_ADVPROG, IDH_DOS_PROGRAM_ADV_BUTTON,
  44. 0, 0
  45. };
  46. const static DWORD rgdwNTHelp[] = {
  47. IDC_DOS, IDH_COMM_GROUPBOX,
  48. 10, IDH_DOS_ADV_AUTOEXEC,
  49. 11, IDH_DOS_ADV_CONFIG,
  50. IDC_NTTIMER, IDH_DOS_PROGRAM_PIF_TIMER_EMULATE,
  51. 0, 0
  52. };
  53. BOOL MustRebootSystem(void)
  54. {
  55. HKEY hk;
  56. BOOL bMustReboot = FALSE;
  57. if (RegOpenKey(HKEY_LOCAL_MACHINE, REGSTR_PATH_SHUTDOWN, &hk) == ERROR_SUCCESS) {
  58. bMustReboot = (SHQueryValueEx(hk, REGSTR_VAL_FORCEREBOOT, NULL,
  59. NULL, NULL, NULL) == ERROR_SUCCESS);
  60. RegCloseKey(hk);
  61. }
  62. return(bMustReboot);
  63. }
  64. DWORD GetMSDOSOptGlobalFlags(void)
  65. {
  66. HKEY hk;
  67. DWORD dwDosOptGlobalFlags = 0;
  68. if (RegOpenKey(HKEY_LOCAL_MACHINE, REGSTR_PATH_MSDOSOPTS, &hk) == ERROR_SUCCESS) {
  69. DWORD cb = SIZEOF(dwDosOptGlobalFlags);
  70. if (SHQueryValueEx(hk, REGSTR_VAL_DOSOPTGLOBALFLAGS, NULL, NULL,
  71. (LPVOID)(&dwDosOptGlobalFlags), &cb)
  72. != ERROR_SUCCESS) {
  73. dwDosOptGlobalFlags = 0;
  74. }
  75. RegCloseKey(hk);
  76. }
  77. return(dwDosOptGlobalFlags);
  78. }
  79. BOOL_PTR CALLBACK DlgPrgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  80. {
  81. PPRGINFO ppi = (PPRGINFO)GetWindowLongPtr(hDlg, DWLP_USER);
  82. switch (uMsg) {
  83. case WM_INITDIALOG:
  84. // allocate dialog instance data
  85. if (NULL != (ppi = (PPRGINFO)LocalAlloc(LPTR, SIZEOF(PRGINFO)))) {
  86. ppi->ppl = (PPROPLINK)((LPPROPSHEETPAGE)lParam)->lParam;
  87. SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)ppi);
  88. SHAutoComplete(GetDlgItem(hDlg, IDC_CMDLINE), 0);
  89. SHAutoComplete(GetDlgItem(hDlg, IDC_WORKDIR), 0);
  90. SHAutoComplete(GetDlgItem(hDlg, IDC_BATCHFILE), 0);
  91. InitPrgDlg(hDlg, ppi);
  92. } else {
  93. EndDialog(hDlg, FALSE); // fail the dialog create
  94. }
  95. break;
  96. case WM_DESTROY:
  97. // free the ppi
  98. if (ppi) {
  99. EVAL(LocalFree(ppi) == NULL);
  100. SetWindowLongPtr(hDlg, DWLP_USER, 0);
  101. }
  102. break;
  103. HELP_CASES(rgdwHelp) // handle help messages
  104. case WM_COMMAND:
  105. if (LOWORD(lParam) == 0)
  106. break; // message not from a control
  107. switch (LOWORD(wParam)) {
  108. case IDC_TITLE:
  109. case IDC_CMDLINE:
  110. case IDC_WORKDIR:
  111. case IDC_BATCHFILE:
  112. case IDC_HOTKEY:
  113. if (HIWORD(wParam) == EN_CHANGE)
  114. SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
  115. break;
  116. case IDC_WINDOWSTATE:
  117. if (HIWORD(wParam) == CBN_SELCHANGE)
  118. SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
  119. break;
  120. case IDC_CLOSEONEXIT:
  121. if (HIWORD(wParam) == BN_CLICKED)
  122. SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
  123. break;
  124. case IDC_ADVPROG:
  125. if (HIWORD(wParam) == BN_CLICKED) {
  126. DialogBoxParam(HINST_THISDLL,
  127. MAKEINTRESOURCE(IDD_PIFNTTEMPLT),
  128. hDlg,
  129. DlgPifNtProc,
  130. (LPARAM)ppi);
  131. }
  132. return FALSE; // return 0 if we process WM_COMMAND
  133. case IDC_CHANGEICON:
  134. if (HIWORD(wParam) == BN_CLICKED)
  135. BrowseIcons(hDlg, ppi);
  136. return FALSE; // return 0 if we process WM_COMMAND
  137. }
  138. break;
  139. case WM_NOTIFY:
  140. switch (((NMHDR *)lParam)->code) {
  141. case PSN_KILLACTIVE:
  142. // This gives the current page a chance to validate itself
  143. break;
  144. case PSN_APPLY:
  145. // This happens on OK....
  146. ApplyPrgDlg(hDlg, ppi);
  147. break;
  148. case PSN_RESET:
  149. // This happens on Cancel....
  150. break;
  151. }
  152. break;
  153. default:
  154. return FALSE; // return 0 when not processing
  155. }
  156. return TRUE;
  157. }
  158. void InitPrgDlg(HWND hDlg, register PPRGINFO ppi)
  159. {
  160. int i;
  161. PROPPRG prg;
  162. PROPENV env;
  163. PROPNT40 nt40;
  164. PPROPLINK ppl = ppi->ppl;
  165. TCHAR szBuf[MAX_STRING_SIZE];
  166. FunctionName(InitPrgDlg);
  167. ASSERTTRUE(ppl->iSig == PROP_SIG);
  168. if (!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_PRG),
  169. &prg, SIZEOF(prg), GETPROPS_NONE
  170. ) ||
  171. !PifMgr_GetProperties(ppl, MAKELP(0,GROUP_ENV),
  172. &env, SIZEOF(env), GETPROPS_NONE
  173. )
  174. ||
  175. !PifMgr_GetProperties(ppl, MAKELP(0,GROUP_NT40),
  176. &nt40, SIZEOF(nt40), GETPROPS_NONE
  177. )
  178. ) {
  179. Warning(hDlg, IDS_QUERY_ERROR, MB_ICONEXCLAMATION | MB_OK);
  180. return;
  181. }
  182. /*
  183. * Initialize Icon and IconFile information
  184. *
  185. */
  186. ppi->wIconIndex = prg.wIconIndex;
  187. lstrcpyW(ppi->atchIconFile, nt40.awchIconFile);
  188. if (NULL != (ppi->hIcon = LoadPIFIcon(&prg, &nt40))) {
  189. VERIFYFALSE(SendDlgItemMessage(hDlg, IDC_ICONBMP, STM_SETICON, (WPARAM)ppi->hIcon, 0));
  190. }
  191. /*
  192. * Initialize window Title information
  193. *
  194. */
  195. LimitDlgItemText(hDlg, IDC_TITLE, ARRAYSIZE(prg.achTitle)-1);
  196. SetDlgItemTextW(hDlg, IDC_TITLE, nt40.awchTitle);
  197. /*
  198. * Initialize command line information
  199. *
  200. */
  201. LimitDlgItemText(hDlg, IDC_CMDLINE, ARRAYSIZE(prg.achCmdLine)-1);
  202. SetDlgItemTextW(hDlg, IDC_CMDLINE, nt40.awchCmdLine);
  203. /*
  204. * Initialize command line information
  205. *
  206. */
  207. LimitDlgItemText(hDlg, IDC_WORKDIR, ARRAYSIZE(prg.achWorkDir)-1);
  208. SetDlgItemTextW(hDlg, IDC_WORKDIR, nt40.awchWorkDir);
  209. /*
  210. * Require at least one of Ctrl, Alt or Shift to be pressed.
  211. * The hotkey control does not enforce the rule on function keys
  212. * and other specials, which is good.
  213. */
  214. SendDlgItemMessage(hDlg, IDC_HOTKEY, HKM_SETRULES, HKCOMB_NONE, HOTKEYF_CONTROL | HOTKEYF_ALT);
  215. SendDlgItemMessage(hDlg, IDC_HOTKEY, HKM_SETHOTKEY, prg.wHotKey, 0);
  216. /*
  217. * Initialize batch file information
  218. *
  219. */
  220. LimitDlgItemText(hDlg, IDC_BATCHFILE, ARRAYSIZE(env.achBatchFile)-1);
  221. SetDlgItemTextW(hDlg, IDC_BATCHFILE, nt40.awchBatchFile);
  222. /*
  223. * Fill in the "Run" combo box.
  224. */
  225. for (i=0; i < 3; i++) {
  226. VERIFYTRUE(LoadString(HINST_THISDLL, IDS_NORMALWINDOW+i, szBuf, ARRAYSIZE(szBuf)));
  227. VERIFYTRUE((int)SendDlgItemMessage(hDlg, IDC_WINDOWSTATE, CB_ADDSTRING, 0, (LPARAM)(LPTSTR)szBuf) == i);
  228. }
  229. i = 0;
  230. if (prg.flPrgInit & PRGINIT_MINIMIZED)
  231. i = 1;
  232. if (prg.flPrgInit & PRGINIT_MAXIMIZED)
  233. i = 2;
  234. SendDlgItemMessage(hDlg, IDC_WINDOWSTATE, CB_SETCURSEL, i, 0);
  235. SetDlgBits(hDlg, &abinfPrg[0], ARRAYSIZE(abinfPrg), prg.flPrg);
  236. AdjustMSDOSModeControls(ppl, hDlg);
  237. }
  238. void AdjustMSDOSModeControls(PPROPLINK ppl, HWND hDlg)
  239. {
  240. int i;
  241. BOOL f = TRUE;
  242. AdjustRealModeControls(ppl, hDlg);
  243. /*
  244. * The working directory and startup batch file controls are only
  245. * supported in real-mode if there is a private configuration (only
  246. * because it's more work). So, disable the controls appropriately.
  247. */
  248. if (ppl->flProp & PROP_REALMODE) {
  249. f = (PifMgr_GetProperties(ppl, szCONFIGHDRSIG40, NULL, 0, GETPROPS_NONE) != 0 ||
  250. PifMgr_GetProperties(ppl, szAUTOEXECHDRSIG40, NULL, 0, GETPROPS_NONE) != 0);
  251. }
  252. #if (IDC_WORKDIRLBL != IDC_WORKDIR-1)
  253. #error Error in IDC constants: IDC_WORKDIRLBL != IDC_WORKDIR-1
  254. #endif
  255. #if (IDC_WORKDIR != IDC_BATCHFILELBL-1)
  256. #error Error in IDC constants: IDC_WORKDIR != IDC_BATCHFILELBL-1
  257. #endif
  258. #if (IDC_BATCHFILELBL != IDC_BATCHFILE-1)
  259. #error Error in IDC constants: IDC_BATCHFILELBL != IDC_BATCHFILE-1
  260. #endif
  261. for (i=IDC_WORKDIRLBL; i<=IDC_BATCHFILE; i++)
  262. EnableWindow(GetDlgItem(hDlg, i), f);
  263. }
  264. void ApplyPrgDlg(HWND hDlg, PPRGINFO ppi)
  265. {
  266. int i;
  267. PROPPRG prg;
  268. PROPENV env;
  269. PROPNT40 nt40;
  270. PPROPLINK ppl = ppi->ppl;
  271. FunctionName(ApplyPrgDlg);
  272. ASSERTTRUE(ppl->iSig == PROP_SIG);
  273. // Get the current set of properties, then overlay the new settings
  274. if (!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_PRG),
  275. &prg, SIZEOF(prg), GETPROPS_NONE
  276. ) ||
  277. !PifMgr_GetProperties(ppl, MAKELP(0,GROUP_ENV),
  278. &env, SIZEOF(env), GETPROPS_NONE
  279. )
  280. ||
  281. !PifMgr_GetProperties(ppl, MAKELP(0,GROUP_NT40),
  282. &nt40, SIZEOF(nt40), GETPROPS_NONE
  283. )
  284. ) {
  285. Warning(hDlg, IDS_UPDATE_ERROR, MB_ICONEXCLAMATION | MB_OK);
  286. return;
  287. }
  288. // Retrieve Icon information
  289. lstrcpyW( nt40.awchIconFile, ppi->atchIconFile );
  290. PifMgr_WCtoMBPath( nt40.awchIconFile, nt40.achSaveIconFile, ARRAYSIZE(nt40.achSaveIconFile) );
  291. lstrcpyA( prg.achIconFile, nt40.achSaveIconFile );
  292. prg.wIconIndex = ppi->wIconIndex;
  293. // Retrieve strings for Title, Command Line,
  294. // Working Directory and Batch File
  295. // Title
  296. GetDlgItemTextW(hDlg, IDC_TITLE, nt40.awchTitle, ARRAYSIZE(nt40.awchTitle));
  297. GetDlgItemTextA(hDlg, IDC_TITLE, nt40.achSaveTitle, ARRAYSIZE(nt40.achSaveTitle));
  298. nt40.awchTitle[ ARRAYSIZE(nt40.awchTitle)-1 ] = TEXT('\0');
  299. nt40.achSaveTitle[ ARRAYSIZE(nt40.achSaveTitle)-1 ] = '\0';
  300. lstrcpyA( prg.achTitle, nt40.achSaveTitle );
  301. // Command Line
  302. GetDlgItemTextW(hDlg, IDC_CMDLINE, nt40.awchCmdLine, ARRAYSIZE(nt40.awchCmdLine));
  303. GetDlgItemTextA(hDlg, IDC_CMDLINE, nt40.achSaveCmdLine, ARRAYSIZE(nt40.achSaveCmdLine));
  304. nt40.awchCmdLine[ ARRAYSIZE(nt40.awchCmdLine)-1 ] = TEXT('\0');
  305. nt40.achSaveCmdLine[ ARRAYSIZE(nt40.achSaveCmdLine)-1 ] = '\0';
  306. lstrcpyA( prg.achCmdLine, nt40.achSaveCmdLine );
  307. // Working Directory
  308. GetDlgItemTextW(hDlg, IDC_WORKDIR, nt40.awchWorkDir, ARRAYSIZE(nt40.awchWorkDir));
  309. nt40.awchWorkDir[ ARRAYSIZE(nt40.awchWorkDir)-1 ] = TEXT('\0');
  310. PifMgr_WCtoMBPath(nt40.awchWorkDir, nt40.achSaveWorkDir, ARRAYSIZE(nt40.achSaveWorkDir));
  311. lstrcpyA(prg.achWorkDir, nt40.achSaveWorkDir);
  312. // Batch File
  313. GetDlgItemTextW(hDlg, IDC_BATCHFILE, nt40.awchBatchFile, ARRAYSIZE(nt40.awchBatchFile));
  314. nt40.awchBatchFile[ ARRAYSIZE(nt40.awchBatchFile)-1 ] = TEXT('\0');
  315. PifMgr_WCtoMBPath(nt40.awchBatchFile, nt40.achSaveBatchFile, ARRAYSIZE(nt40.achSaveBatchFile));
  316. lstrcpyA(env.achBatchFile, nt40.achSaveBatchFile);
  317. prg.wHotKey = (WORD)SendDlgItemMessage(hDlg, IDC_HOTKEY, HKM_GETHOTKEY, 0, 0);
  318. i = (int)SendDlgItemMessage(hDlg, IDC_WINDOWSTATE, CB_GETCURSEL, 0, 0);
  319. prg.flPrgInit &= ~(PRGINIT_MINIMIZED | PRGINIT_MAXIMIZED);
  320. if (i == 1)
  321. prg.flPrgInit |= PRGINIT_MINIMIZED;
  322. if (i == 2)
  323. prg.flPrgInit |= PRGINIT_MAXIMIZED;
  324. GetDlgBits(hDlg, &abinfPrg[0], ARRAYSIZE(abinfPrg), &prg.flPrg);
  325. if (!PifMgr_SetProperties(ppl, MAKELP(0,GROUP_PRG),
  326. &prg, SIZEOF(prg), SETPROPS_NONE) ||
  327. !PifMgr_SetProperties(ppl, MAKELP(0,GROUP_ENV),
  328. &env, SIZEOF(env), SETPROPS_NONE)
  329. ||
  330. !PifMgr_SetProperties(ppl, MAKELP(0,GROUP_NT40),
  331. &nt40, SIZEOF(nt40), SETPROPS_NONE)
  332. )
  333. Warning(hDlg, IDS_UPDATE_ERROR, MB_ICONEXCLAMATION | MB_OK);
  334. else
  335. if (ppl->hwndNotify) {
  336. ppl->flProp |= PROP_NOTIFY;
  337. PostMessage(ppl->hwndNotify, ppl->uMsgNotify, SIZEOF(prg), (LPARAM)MAKELP(0,GROUP_PRG));
  338. PostMessage(ppl->hwndNotify, ppl->uMsgNotify, SIZEOF(env), (LPARAM)MAKELP(0,GROUP_ENV));
  339. PostMessage(ppl->hwndNotify, ppl->uMsgNotify, SIZEOF(nt40), (LPARAM)MAKELP(0,GROUP_NT40));
  340. }
  341. }
  342. void BrowseIcons(HWND hDlg, PPRGINFO ppi)
  343. {
  344. HICON hIcon;
  345. int wIconIndex = (int)ppi->wIconIndex;
  346. if (PickIconDlg(hDlg, ppi->atchIconFile, ARRAYSIZE(ppi->atchIconFile), (int *)&wIconIndex)) {
  347. hIcon = ExtractIcon(HINST_THISDLL, ppi->atchIconFile, wIconIndex);
  348. if ((UINT_PTR)hIcon <= 1)
  349. Warning(hDlg, IDS_NO_ICONS, MB_ICONINFORMATION | MB_OK);
  350. else {
  351. ppi->hIcon = hIcon;
  352. ppi->wIconIndex = (WORD)wIconIndex;
  353. hIcon = (HICON)SendDlgItemMessage(hDlg, IDC_ICONBMP, STM_SETICON, (WPARAM)ppi->hIcon, 0);
  354. if (hIcon)
  355. VERIFYTRUE(DestroyIcon(hIcon));
  356. }
  357. }
  358. }
  359. BOOL WarnUserCfgChange(HWND hDlg)
  360. {
  361. TCHAR szTitle[MAX_STRING_SIZE];
  362. TCHAR szWarning[MAX_STRING_SIZE];
  363. LoadString(HINST_THISDLL, IDS_WARNING, szTitle, ARRAYSIZE(szTitle));
  364. LoadString(HINST_THISDLL, IDS_NUKECONFIGMSG, szWarning, ARRAYSIZE(szWarning));
  365. return(IDYES == MessageBox(hDlg, szWarning, szTitle,
  366. MB_YESNO | MB_DEFBUTTON1 | MB_ICONHAND));
  367. }
  368. BOOL_PTR CALLBACK DlgPifNtProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  369. {
  370. PPRGINFO ppi = (PPRGINFO)GetWindowLongPtr( hDlg, DWLP_USER );
  371. switch (uMsg)
  372. {
  373. case WM_INITDIALOG:
  374. ppi = (PPRGINFO)lParam;
  375. SetWindowLongPtr(hDlg, DWLP_USER, lParam);
  376. InitNtPifDlg(hDlg, ppi);
  377. break;
  378. case WM_DESTROY:
  379. SetWindowLongPtr(hDlg, DWLP_USER, 0);
  380. break;
  381. HELP_CASES(rgdwNTHelp) // handle help messages
  382. case WM_COMMAND:
  383. switch (LOWORD(wParam)) {
  384. case IDOK:
  385. case IDC_OK:
  386. ApplyNtPifDlg(hDlg, ppi);
  387. // fall through
  388. case IDCANCEL:
  389. case IDC_CANCEL :
  390. EndDialog(hDlg, 0);
  391. return FALSE; // return 0 if we process WM_COMMAND
  392. case IDC_NTTIMER:
  393. CheckDlgButton(hDlg, IDC_NTTIMER, !IsDlgButtonChecked(hDlg, IDC_NTTIMER));
  394. break;
  395. }
  396. break;
  397. default:
  398. return(FALSE);
  399. }
  400. return(TRUE);
  401. }
  402. WORD InitNtPifDlg(HWND hDlg, register PPRGINFO ppi)
  403. {
  404. PROPNT31 nt31;
  405. PPROPLINK ppl = ppi->ppl;
  406. FunctionName(InitAdvPrgDlg);
  407. ASSERTTRUE(ppl->iSig == PROP_SIG);
  408. if (!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_NT31),
  409. &nt31, SIZEOF(nt31), GETPROPS_NONE)
  410. ) {
  411. Warning(hDlg, IDS_QUERY_ERROR, MB_ICONEXCLAMATION | MB_OK);
  412. return 0;
  413. }
  414. // initialize the DLG controls
  415. SetDlgItemTextA( hDlg, IDC_CONFIGNT, nt31.achConfigFile );
  416. SetDlgItemTextA( hDlg, IDC_AUTOEXECNT, nt31.achAutoexecFile );
  417. if (nt31.dwWNTFlags & COMPAT_TIMERTIC)
  418. CheckDlgButton( hDlg, IDC_NTTIMER, 1 );
  419. else
  420. CheckDlgButton( hDlg, IDC_NTTIMER, 0 );
  421. SHAutoComplete(GetDlgItem(hDlg, IDC_AUTOEXECNT), 0);
  422. SHAutoComplete(GetDlgItem(hDlg, IDC_CONFIGNT), 0);
  423. return 0;
  424. }
  425. void ApplyNtPifDlg( HWND hDlg, PPRGINFO ppi )
  426. {
  427. PROPNT31 nt31;
  428. PPROPLINK ppl = ppi->ppl;
  429. ASSERTTRUE(ppl->iSig == PROP_SIG);
  430. // Get current set of properties, then overlay new settings
  431. if (!PifMgr_GetProperties(ppl, MAKELP(0,GROUP_NT31),
  432. &nt31, SIZEOF(nt31), GETPROPS_NONE)
  433. ) {
  434. Warning(hDlg, IDS_UPDATE_ERROR, MB_ICONEXCLAMATION | MB_OK);
  435. return;
  436. }
  437. GetDlgItemTextA( hDlg,
  438. IDC_CONFIGNT,
  439. nt31.achConfigFile,
  440. ARRAYSIZE( nt31.achConfigFile )
  441. );
  442. GetDlgItemTextA( hDlg,
  443. IDC_AUTOEXECNT,
  444. nt31.achAutoexecFile,
  445. ARRAYSIZE( nt31.achAutoexecFile )
  446. );
  447. nt31.dwWNTFlags &= (~COMPAT_TIMERTIC);
  448. if (IsDlgButtonChecked( hDlg, IDC_NTTIMER ))
  449. nt31.dwWNTFlags |= COMPAT_TIMERTIC;
  450. if (!PifMgr_SetProperties(ppl, MAKELP(0,GROUP_NT31),
  451. &nt31, SIZEOF(nt31), SETPROPS_NONE)) {
  452. Warning(hDlg, IDS_UPDATE_ERROR, MB_ICONEXCLAMATION | MB_OK);
  453. }
  454. if (ppl->hwndNotify) {
  455. PostMessage(ppl->hwndNotify, ppl->uMsgNotify, SIZEOF(nt31), (LPARAM)MAKELP(0,GROUP_NT31));
  456. }
  457. }
  458. HICON LoadPIFIcon(LPPROPPRG lpprg, LPPROPNT40 lpnt40)
  459. {
  460. HICON hIcon = NULL;
  461. WCHAR awchTmp[ MAX_PATH ];
  462. ualstrcpy( awchTmp, lpnt40->awchIconFile );
  463. PifMgr_WCtoMBPath( awchTmp, lpprg->achIconFile, ARRAYSIZE(lpprg->achIconFile) );
  464. hIcon = ExtractIcon(HINST_THISDLL, awchTmp, lpprg->wIconIndex);
  465. if ((DWORD_PTR)hIcon <= 1) { // 0 means none, 1 means bad file
  466. hIcon = NULL;
  467. }
  468. return hIcon;
  469. }