mirror of https://github.com/lianthony/NT4.0
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.
245 lines
6.0 KiB
245 lines
6.0 KiB
#include <windows.h>
|
|
#include "resource.h"
|
|
|
|
#define BUF_SIZE 1000
|
|
|
|
HANDLE hInst;
|
|
LPSTR ApplpszCmdLine;
|
|
char szArg[BUF_SIZE];
|
|
int AppnCmdShow;
|
|
BOOL fRunSetup;
|
|
char szPath[BUF_SIZE];
|
|
|
|
const LPSTR px86 = {"x86"};
|
|
const LPSTR pMIPS = {"MIPS"};
|
|
const LPSTR pALPHA = {"ALPHA"};
|
|
const LPSTR pPPC = {"PPC"};
|
|
|
|
//
|
|
// Center the dialog
|
|
//
|
|
|
|
VOID CenterDialog ( HWND hdlg )
|
|
{
|
|
HWND hwndPar = GetDesktopWindow();
|
|
RECT rectDlg, rectPar;
|
|
int x, y;
|
|
int dyPar, dyDlg, dyOff;
|
|
POINT pt;
|
|
|
|
GetWindowRect(hdlg, &rectDlg);
|
|
GetClientRect(hwndPar, &rectPar);
|
|
|
|
if ((x = (rectPar.right - rectPar.left) / 2 -
|
|
(rectDlg.right - rectDlg.left) / 2) < 0)
|
|
{
|
|
x = 0;
|
|
}
|
|
dyPar = rectPar.bottom - rectPar.top;
|
|
dyDlg = rectDlg.bottom - rectDlg.top;
|
|
if ((y = dyPar / 2 - dyDlg / 2) < 0)
|
|
{
|
|
y = 0;
|
|
}
|
|
|
|
if (y > 0)
|
|
{
|
|
/* Offset by 1/2 width of title bar and border.
|
|
*/
|
|
pt.x = pt.y = 0;
|
|
ClientToScreen(hwndPar, &pt);
|
|
GetWindowRect(hwndPar, &rectPar);
|
|
dyOff = (pt.y - rectPar.top) / 2;
|
|
|
|
if (y + dyOff + dyDlg < dyPar)
|
|
y += dyOff;
|
|
else
|
|
y = dyPar - dyDlg;
|
|
}
|
|
|
|
SetWindowPos(hdlg, NULL, x, y, 0, 0, (SWP_NOSIZE | SWP_NOZORDER));
|
|
}
|
|
|
|
//
|
|
// Dialog Procedure
|
|
// It will get the CD-ROM path from the user
|
|
//
|
|
|
|
long FAR PASCAL DlgProc (HWND hWnd, UINT message, UINT wParam, LONG lParam)
|
|
{
|
|
char buf[BUF_SIZE];
|
|
char pCpu[BUF_SIZE];
|
|
OFSTRUCT ofs;
|
|
HFILE hInetstp;
|
|
static HWND hLocation;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
CenterDialog( hWnd );
|
|
hLocation = GetDlgItem(hWnd, IDC_LOCATION );
|
|
|
|
// Set up the initial path value
|
|
|
|
lstrcpy( szPath, "A:\\");
|
|
GetEnvironmentVariable("PROCESSOR_ARCHITECTURE", pCpu, BUF_SIZE);
|
|
if (!lstrcmp(pCpu, px86)) // Equal to
|
|
lstrcat(szPath,"i386");
|
|
else if (!lstrcmp(pCpu, pMIPS)) // Equal to
|
|
lstrcat(szPath,"mips");
|
|
else if (!lstrcmp(pCpu, pALPHA)) // Equal to
|
|
lstrcat(szPath,"alpha");
|
|
else if (!lstrcmp(pCpu, pPPC)) // Equal to
|
|
lstrcat(szPath,"ppc");
|
|
|
|
SetWindowText( hLocation, szPath );
|
|
SetFocus( hLocation );
|
|
|
|
break;
|
|
case WM_COMMAND:
|
|
switch( wParam )
|
|
{
|
|
case IDOK:
|
|
{
|
|
// make sure the path is correct and we can start it first
|
|
GetWindowText( hLocation, szPath, BUF_SIZE );
|
|
|
|
lstrcat(szPath,"\\inetsrv\\inetstp.exe");
|
|
|
|
hInetstp = OpenFile( szPath, &ofs, OF_EXIST );
|
|
if ( hInetstp == HFILE_ERROR )
|
|
{
|
|
// cannot find it
|
|
char strText[BUF_SIZE];
|
|
char strCaption[BUF_SIZE];
|
|
|
|
LoadString( hInst, IDS_CANNOT_FIND_FILE, strText, BUF_SIZE );
|
|
lstrcat( strText, szPath );
|
|
LoadString( hInst, IDS_TITLE, strCaption, BUF_SIZE );
|
|
MessageBox( hWnd, strText, strCaption, MB_OK );
|
|
break;
|
|
}
|
|
|
|
fRunSetup = TRUE;
|
|
PostQuitMessage(0 );
|
|
}
|
|
return(0);
|
|
// then kill myself
|
|
case IDCANCEL:
|
|
PostQuitMessage(1);
|
|
return(0);
|
|
}
|
|
break;
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
int RunSetup()
|
|
{
|
|
STARTUPINFO startup;
|
|
PROCESS_INFORMATION proc;
|
|
int nReturn = 0;
|
|
|
|
startup.cb = sizeof( STARTUPINFO );
|
|
startup.lpReserved = NULL;
|
|
startup.lpDesktop = NULL;
|
|
startup.lpTitle = NULL;
|
|
startup.dwX = 0;
|
|
startup.dwY = 0;
|
|
startup.dwXSize = 0;
|
|
startup.dwYSize = 0;
|
|
startup.dwXCountChars = 0;
|
|
startup.dwYCountChars = 0;
|
|
startup.dwFillAttribute= 0;
|
|
startup.dwFlags = 0;
|
|
startup.wShowWindow = 0;
|
|
startup.cbReserved2= 0;
|
|
startup.lpReserved2=NULL;
|
|
startup.hStdInput =NULL;
|
|
startup.hStdOutput=NULL;
|
|
startup.hStdError=NULL;
|
|
|
|
strcat( szArg, " /R");
|
|
|
|
CreateProcess( szPath, szArg, NULL, NULL,
|
|
FALSE, 0, NULL, NULL, &startup, &proc );
|
|
|
|
if ( proc.hProcess != NULL )
|
|
{
|
|
WaitForSingleObject( proc.hProcess, INFINITE );
|
|
GetExitCodeProcess(proc.hProcess,&nReturn);
|
|
CloseHandle( proc.hProcess );
|
|
}
|
|
return(nReturn);
|
|
}
|
|
|
|
//
|
|
// Main window which starts the Dialog
|
|
//
|
|
|
|
long FAR PASCAL WndProc (HWND hWnd, UINT message, UINT wParam, LONG lParam)
|
|
{
|
|
static FARPROC lpfnDlgProc;
|
|
|
|
switch( message )
|
|
{
|
|
case WM_CREATE:
|
|
// start the dialog
|
|
lpfnDlgProc = MakeProcInstance((FARPROC)DlgProc, hInst );
|
|
DialogBox( hInst, MAKEINTRESOURCE(IDD_FILE_NEEDED), hWnd, lpfnDlgProc );
|
|
break;
|
|
}
|
|
return(DefWindowProc(hWnd, message, wParam, lParam ));
|
|
}
|
|
|
|
//
|
|
// main routine
|
|
//
|
|
|
|
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
|
|
LPSTR lpszCmdLine, int nCmdShow )
|
|
{
|
|
static char szAppName[] = "Setup";
|
|
HWND hwnd;
|
|
MSG msg;
|
|
WNDCLASS wndclass;
|
|
|
|
hInst = hInstance;
|
|
ApplpszCmdLine = lpszCmdLine;
|
|
strcpy( szArg, lpszCmdLine );
|
|
AppnCmdShow = nCmdShow;
|
|
|
|
fRunSetup = FALSE;
|
|
|
|
if (!hPrevInstance)
|
|
{
|
|
wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
|
wndclass.lpfnWndProc = WndProc;
|
|
wndclass.cbClsExtra = 0;
|
|
wndclass.cbWndExtra = DLGWINDOWEXTRA;
|
|
wndclass.hInstance = hInstance;
|
|
wndclass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(ICON_SETUP));
|
|
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
|
|
wndclass.hbrBackground = COLOR_WINDOW+1;
|
|
wndclass.lpszMenuName = NULL;
|
|
wndclass.lpszClassName = szAppName;
|
|
|
|
RegisterClass( &wndclass );
|
|
}
|
|
|
|
hwnd = CreateDialog( hInstance, MAKEINTRESOURCE(IDD_INIVISIBLE), 0, NULL );
|
|
|
|
ShowWindow( hwnd, nCmdShow );
|
|
while (GetMessage(&msg, NULL, 0, 0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage( &msg);
|
|
}
|
|
if (fRunSetup )
|
|
{
|
|
int nReturn=RunSetup();
|
|
return(nReturn);
|
|
}
|
|
return(msg.wParam);
|
|
}
|
|
|