/*------------------------------------------------------------------------ | nt40.c - nt4.0 non-pnp setup.exe code - WinMain, etc. 12-11-98 - use szAppTitle(.rc str) instead of aptitle for prop sheet title. |------------------------------------------------------------------------*/ #include "precomp.h" /*----------------------- local vars ---------------------------------*/ static int unattended_flag = 0; static int test_mode = 0; static HMENU hMenuMain; int do_progman_add = 0; static int auto_install(void); // for nt4.0, we are a .EXE, so we need a WinMain... /*------------------------------------------------------------------------ | WinMain - Main program entry for NT4.0 EXE setup program. |------------------------------------------------------------------------*/ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASS wc; HWND hwnd; HACCEL hAccel; char *buf; int i, stat; #if DBG DebugLevel |= (D_Test | D_Error) ; #endif glob_hinst = hInstance; // ptr to dll hinstance if (hPrevInstance) // Other instances of app running? { MessageBox(0,"Program is already running!","",MB_OK); return 0; } InitCommonControls(); // Initialize the common control library. if (setup_init()) { return 0; } buf = lpCmdLine; i=0; while ((*buf != 0) && (i < 80)) { if ((*buf == '-') || (*buf == '/')) { ++buf; ++i; switch(toupper(*buf++)) { case 'A': // auto-install unattended_flag = 1; break; //return stat; case 'H': // help our_help(&wi->ip, WIN_NT); return 0; case 'P': // add program manager group do_progman_add = 1; // add progman group break; case 'N': wi->install_style = INS_SIMPLE; // default to original nt4.0 style break; case 'R': // remove driver and files // stat = our_message(&wi->ip, //"Would you like this setup program to remove this driver and related files?", // MB_YESNO); // if (stat == IDYES) if (toupper(*buf) == 'A') remove_driver(1); else remove_driver(0); return 0; case 'T': // test mode, run only to test ui test_mode = 1; break; case 'Z': // test mode, run only to test if (toupper(*buf) == 'I') setup_service(OUR_INSTALL_START, OUR_SERVICE); // do a remove on the service else setup_service(OUR_REMOVE, OUR_SERVICE); // do a remove on the service return 0; case '?': // our help stat = our_message(&wi->ip, "options>SETUP /options\n \ A - auto install routine\n \ P - add program manager group\n \ N - no inf file, simple install\n \ H - display driver help info\n \ R - remove driver(should do from control-panel first)", MB_OK); return 0; } // switch } // if (option) ++i; ++buf; } // while options if (unattended_flag) { unattended_add_port_entries(&wi->ip, 8, // num_entries 5); // start_port:com5 stat = auto_install(); return stat; } if (!hPrevInstance) // Other instances of app running? { // MAIN WINDOW wc.style = CS_HREDRAW | CS_VREDRAW; // Class style(s). wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; // No per-class extra data. wc.cbWndExtra = 0; // No per-window extra data. wc.hInstance = hInstance; // Application that owns the class. wc.hIcon = LoadIcon(hInstance, "SETUPICON"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); wc.lpszMenuName = NULL; // Name of menu resource in .RC file. wc.lpszClassName = szAppName; // Name used in call to CreateWindow. RegisterClass(&wc); } hMenuMain = LoadMenu (glob_hinst, "MAIN_MENU"); hAccel = LoadAccelerators (glob_hinst, "SetupAccel") ; /* Create a main window for this application instance. */ hwnd = CreateWindowEx( WS_EX_CONTEXTHELP, // gives question mark help thing szAppName, // See RegisterClass() call. // Text for window title bar. szAppTitle, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_CLIPCHILDREN, // WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, // Window style. // CW_USEDEFAULT, CW_USEDEFAULT, // Def. horz, vert pos. 0,0, // Def. horz, vert pos. 300, 200, // Default width, height // 455, 435, // Default width, height NULL, // No Parent Window hMenuMain, // Use the window class menu. hInstance, // This instance owns this window. NULL); // Pointer not needed. //ShowWindow (hwnd, nCmdShow); //UpdateWindow (hwnd); // Enter the modified message loop while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator (hwnd, hAccel, &msg)) { if (glob_hDlg == 0 || !IsDialogMessage(glob_hDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } return msg.wParam; } /*------------------------------------------------------------------------ | MainWndProc - Main Window Proc. |------------------------------------------------------------------------*/ LRESULT FAR PASCAL MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; int stat; int QuitFlag = 0; switch (message) { case WM_CREATE: // Initialize Global vars glob_hwnd = hwnd; wi->NumDevices = 0; get_nt_config(wi); // Read the configuration information from the registry. copy_setup_init(); // make a copy of config data for change detection validate_config(1); // validate and auto-fixup if config hosed // src_dir should always equal dest_dir since // INF copies files over files in NT. Otherwise they // are running setup.exe before doing network install if (my_lstricmp(wi->ip.src_dir, wi->ip.dest_dir) != 0) { if (wi->ip.major_ver < 5) // NT5.0 does not support 4.0 network inf files { if (wi->install_style != INS_SIMPLE) { // if they didn't explicitly ask for a non-adapter install // then: ask them(if allowed), or tell them about the control // panel/network to install correctly. #ifdef ALLOW_NON_NET_INSTALL stat = our_message(&wi->ip, "Would you like to install this software?", MB_YESNO); if (stat != IDYES) { stat = our_message(&wi->ip, "Would you like to view the help information?",MB_YESNO); if (stat == IDYES) our_help(&wi->ip, WIN_NT); QuitFlag = 1; PostQuitMessage(0); // end the setup program. } wi->install_style = INS_SIMPLE; // non-network adapter install do_progman_add = 1; // force full install #else if (!test_mode) // test mode to allow us to continue(for programmers) { stat = our_message(&wi->ip, "The software should be added as a network adapter in the control panel. \ Would you like to view the help information?",MB_YESNO); if (stat == IDYES) our_help(&wi->ip, WIN_NT); QuitFlag = 1; PostQuitMessage(0); // end the setup program. } #endif } } // not nt5.0 or above if (wi->nt_reg_flags & 1) // not installed(missing important reg entries) { wi->install_style = INS_SIMPLE; // do full install since we are not running out of cur dir. do_progman_add = 1; } else // is installed, but running setup somewhere besides rocket dir { // just update the thing. wi->install_style = INS_SIMPLE; // do full install since we are not running out of cur dir. do_progman_add = 1; } } // if registry not setup correctly, and not asking for a simple // install, then tell them the registry is screwed up. if ( (wi->nt_reg_flags & 1) && (!(wi->install_style == INS_SIMPLE))) { stat = our_message(&wi->ip, "Some Registry entries are missing for this Software, You may need to \ reinstall it from the Control Panel, Network applet. Are you sure you \ want to continue?", MB_YESNO); if (stat != IDYES) { QuitFlag = 1; PostQuitMessage(0); // end the setup program. } } // the NT install INF file copys files to our install directory, // so the following check is not good indicator if it is "reinstall" if (my_lstricmp(wi->ip.src_dir, wi->ip.dest_dir) != 0) do_progman_add = 1; //----- fire up the main level of property sheets. if (!QuitFlag) // eliminate the flash of showing and erasing the property sheet DoDriverPropPages(hwnd); // in nt40.c // end the program. PostQuitMessage(0); // end the setup program. return 0; case WM_SETFOCUS: SetFocus(glob_hDlg); return 0; case WM_COMMAND: // message: command from application menu switch(wParam) { case IDM_F1: our_help(&wi->ip, WIN_NT); break; case IDM_ADVANCED_MODEM_INF: update_modem_inf(1); break; case IDM_PM: // Try out the add pm group dde stuff stat = make_progman_group(progman_list_nt, wi->ip.dest_dir); if (stat) { our_message(&wi->ip,"Error setting up Program group",MB_OK); return 0; } break; #ifdef COMMENT_OUT case IDM_ADVANCED: DialogBox(glob_hinst, MAKEINTRESOURCE(IDD_DRIVER_OPTIONS), hwnd, adv_driver_setup_dlg_proc); break; case IDM_EDIT_README: // edit readme.txt strcpy(gtmpstr, "notepad.exe "); strcat(gtmpstr, wi->ip.src_dir); strcat(gtmpstr,"\\readme.txt"); WinExec(gtmpstr, SW_RESTORE); break; #endif return 0; case IDM_HELP: our_help(&wi->ip, WIN_NT); return 0; case IDM_HELPABOUT: strcpy(gtmpstr, szAppTitle); //strcpy(gtmpstr, aptitle); wsprintf(>mpstr[strlen(gtmpstr)], " Version %s\nCopyright (c) 1995-97 Comtrol Corp.", VERSION_STRING); MessageBox(hwnd, gtmpstr, "About",MB_OK); return 0; } break; case WM_SIZE: //frame_width = LOWORD(lParam); //frame_height = HIWORD(lParam); break; // have to let default have this too! case WM_PAINT: // PaintMainBMP(hwnd); hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return 0; case WM_HELP: // question mark thing our_context_help(lParam); break; case WM_SYSCOMMAND: if ((wParam & 0xfff0) == SC_CLOSE) { if (allow_exit(1) == 0) // ok, quit { } else { return 0; // we handled this, don't exit app. } } break; case WM_QUIT: case WM_DESTROY: // message: window being destroyed PostQuitMessage(0); return 0 ; default: break; } return DefWindowProc(hwnd, message, wParam, lParam); } /*------------------------------------------------------------------------ | auto_install - No prompt default installation, for automated installs. |------------------------------------------------------------------------*/ static int auto_install(void) { //int stat; wi->ip.prompting_off = 1; // turn our_message() prompting off. get_nt_config(wi); // get configured io-addresses, irq, etc copy_setup_init(); // make a copy of config data for change detection // if 0 dev-nodes setup, add 1 for the user. if (wi->NumDevices == 0) { ++wi->NumDevices; validate_device(&wi->dev[0], 1); } do_install(); return 0; }