1853 lines
54 KiB
C
1853 lines
54 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
MakeFLOP.C
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Boot Floppy disk creation setup dialog
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bob Watson (a-robw)
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
17 Feb 94 Written
|
|||
|
|
|||
|
--*/
|
|||
|
//
|
|||
|
// Windows Include Files
|
|||
|
//
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include <tchar.h> // unicode macros
|
|||
|
//
|
|||
|
// app include files
|
|||
|
//
|
|||
|
#include "otnboot.h"
|
|||
|
#include "otnbtdlg.h"
|
|||
|
|
|||
|
// local windows message
|
|||
|
|
|||
|
#define NCDU_START_FILE_COPY (WM_USER +1)
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
//
|
|||
|
// For DOS/V setup disk define
|
|||
|
//
|
|||
|
#define SETUP_DOSV_1 1
|
|||
|
#define SETUP_DOSV_2 2
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// Module Static Data
|
|||
|
//
|
|||
|
static BOOL bCopying; // TRUE when copying files, FALSE to abort
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
IsZeroIpAddr (
|
|||
|
IN PUSHORT pwIpVal
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
evaluates an IP address array structure to determine if it's all
|
|||
|
zeroes
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN PUSHORT pwIpVal
|
|||
|
pointer to an IP address array of integers
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if all 4 elements in the array are 0, otherwise
|
|||
|
FALSE
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PUSHORT pwTest;
|
|||
|
int nElem;
|
|||
|
|
|||
|
pwTest = pwIpVal;
|
|||
|
nElem = 0;
|
|||
|
while (nElem < 4) {
|
|||
|
if (*pwTest == 0) {
|
|||
|
pwTest++;
|
|||
|
nElem++;
|
|||
|
} else {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
LPCTSTR
|
|||
|
GetDirPathFromUnc (
|
|||
|
IN LPCTSTR szPath
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Parses the Directories from a UNC path specification, removing the
|
|||
|
Server and share point.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN LPCTSTR szPath
|
|||
|
pointer to a zero terminated UNC path specification.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Pointer to somewhere in the string passed in the argument list where
|
|||
|
the directory path begins or a pointer to an empty string if
|
|||
|
the path specified contains only a server and sharepoint.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
int nSlashCount = 0;
|
|||
|
|
|||
|
LPTSTR szPathPtr;
|
|||
|
|
|||
|
szPathPtr = (LPTSTR)szPath;
|
|||
|
|
|||
|
if (IsUncPath(szPath)) {
|
|||
|
while (szPathPtr != 0) {
|
|||
|
if (*szPathPtr == cBackslash) nSlashCount++;
|
|||
|
++szPathPtr;
|
|||
|
if (nSlashCount == 4) {
|
|||
|
break; // exit loop
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (nSlashCount != 4) {
|
|||
|
return cszEmptyString;
|
|||
|
} else {
|
|||
|
return szPathPtr;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
GetServerAndSharepointFromUnc (
|
|||
|
IN LPCTSTR szPath,
|
|||
|
OUT LPTSTR szServer
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
copies only the server and share point to the buffer provided
|
|||
|
by the caller.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN LPCTSTR szPath
|
|||
|
UNC path to parse
|
|||
|
|
|||
|
OUT LPCTSTR szServer
|
|||
|
buffer provided to receive the Server and sharepoint. The buffer
|
|||
|
is assumed to be large enough to recieve the data.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if successful
|
|||
|
FALSE if error
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
int nSlashCount = 0;
|
|||
|
|
|||
|
LPTSTR szPathPtr;
|
|||
|
LPTSTR szServPtr;
|
|||
|
|
|||
|
szPathPtr = (LPTSTR)szPath;
|
|||
|
szServPtr = szServer;
|
|||
|
|
|||
|
if (IsUncPath(szPath)) {
|
|||
|
while (szPathPtr != 0) {
|
|||
|
if (*szPathPtr == cBackslash) nSlashCount++;
|
|||
|
if (nSlashCount < 4) {
|
|||
|
*szServPtr++ = *szPathPtr++;
|
|||
|
} else {
|
|||
|
break; // exit loop
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
*szServPtr = 0; // terminate server name
|
|||
|
|
|||
|
if (szServPtr == szServer) {
|
|||
|
return FALSE;
|
|||
|
} else {
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
DWORD
|
|||
|
UpdatePercentComplete (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN DWORD dwDone,
|
|||
|
IN DWORD dwTotal
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Update's the percent complete text in the dialog box using the
|
|||
|
information from the argument list.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to the dialog box window
|
|||
|
|
|||
|
IN DWORD dwDone
|
|||
|
Units completed (Must be less than 42,949,671)
|
|||
|
|
|||
|
IN DWORD dwTotal
|
|||
|
Total Units (must be less than 4,394,967,296)
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Percent completed.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DWORD dwPercent = 0;
|
|||
|
LPTSTR szOutBuff;
|
|||
|
|
|||
|
szOutBuff = (LPTSTR)GlobalAlloc(GPTR, MAX_PATH_BYTES);
|
|||
|
|
|||
|
if (szOutBuff != NULL) {
|
|||
|
dwPercent = ((dwDone * 100) + 50) / dwTotal;
|
|||
|
if (dwPercent > 100) dwPercent = 100;
|
|||
|
_stprintf (szOutBuff,
|
|||
|
GetStringResource (FMT_PERCENT_COMPLETE), dwPercent);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_PERCENT_COMPLETE, szOutBuff);
|
|||
|
FREE_IF_ALLOC (szOutBuff);
|
|||
|
}
|
|||
|
|
|||
|
return dwPercent;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
IsDestBootableDosFloppy (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Checks device in boot file path (from global structure) to see any
|
|||
|
of the "signature" boot files are present
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if any of the boot files were found on the poot file path drive
|
|||
|
FALSE if not
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LPTSTR szTestFileName;
|
|||
|
LPTSTR *pszThisFile;
|
|||
|
LPTSTR szNameStart;
|
|||
|
BOOL bReturn = FALSE;
|
|||
|
|
|||
|
szTestFileName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
|
|||
|
if (szTestFileName == NULL) return FALSE;
|
|||
|
|
|||
|
if (!IsUncPath(pAppInfo->szBootFilesPath)) {
|
|||
|
lstrcpy (szTestFileName, pAppInfo->szBootFilesPath);
|
|||
|
if (szTestFileName[lstrlen(szTestFileName)-1] == cBackslash) lstrcat(szTestFileName, cszBackslash);
|
|||
|
szNameStart = &szTestFileName[lstrlen(szTestFileName)];
|
|||
|
// go through list of "test files" and see if any are present
|
|||
|
for (pszThisFile = (LPTSTR *)&szBootIdFiles[0];
|
|||
|
*pszThisFile != NULL;
|
|||
|
pszThisFile++) {
|
|||
|
lstrcpy (szNameStart, *pszThisFile);
|
|||
|
if (FileExists(szTestFileName)) bReturn = TRUE;
|
|||
|
}
|
|||
|
// if here then none of the files could be found.
|
|||
|
} else {
|
|||
|
// if a UNC name return false
|
|||
|
}
|
|||
|
|
|||
|
FREE_IF_ALLOC (szTestFileName);
|
|||
|
return bReturn;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
WriteMszToFile (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN LPCTSTR mszList,
|
|||
|
IN LPCTSTR szFileName,
|
|||
|
IN DWORD dwCreateFlags
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Function to output each entry in the "list" as a record in the "file"
|
|||
|
Entries that start with a left "square bracket" ([) will be
|
|||
|
prefixed with a new line. (for INF file formatting);
|
|||
|
|
|||
|
NOTE: this function outputs ANSI characters to an ANSI file regardless
|
|||
|
if the _UNICODE flags are set or not.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to dialog box window
|
|||
|
|
|||
|
IN LPCTSTR mszList
|
|||
|
Multi SZ list to write to the files
|
|||
|
|
|||
|
IN LPCTSTR szFileName
|
|||
|
file name & path to write data to
|
|||
|
|
|||
|
IN DWORD dwCreateFlags
|
|||
|
flags used by CreateFile function to open file.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE no errors
|
|||
|
FALSE error (use GetLastError() to get more error data)
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
HANDLE hFile;
|
|||
|
LPTSTR szEntry;
|
|||
|
DWORD dwBytes;
|
|||
|
LPSTR szAnsiBuffer;
|
|||
|
BOOL bReturn;
|
|||
|
|
|||
|
MSG msg;
|
|||
|
|
|||
|
#if _UNICODE
|
|||
|
szAnsiBuffer = (LPSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
|
|||
|
if (szAnsiBuffer == NULL) return FALSE;
|
|||
|
|
|||
|
*(PDWORD)szAnsiBuffer = 0L;
|
|||
|
#endif
|
|||
|
|
|||
|
hFile = CreateFile (
|
|||
|
szFileName,
|
|||
|
GENERIC_WRITE,
|
|||
|
(FILE_SHARE_READ | FILE_SHARE_WRITE),
|
|||
|
NULL,
|
|||
|
dwCreateFlags,
|
|||
|
FILE_ATTRIBUTE_NORMAL,
|
|||
|
NULL);
|
|||
|
|
|||
|
if (hFile != INVALID_HANDLE_VALUE) {
|
|||
|
for (szEntry = (LPTSTR)mszList;
|
|||
|
*szEntry != 0;
|
|||
|
szEntry += lstrlen(szEntry) + 1) {
|
|||
|
#if _UNICODE
|
|||
|
// convert output buffer to ANSI
|
|||
|
//#if defined(DBCS)
|
|||
|
WideCharToMultiByte(CP_ACP,
|
|||
|
0L,
|
|||
|
szEntry,
|
|||
|
-1,
|
|||
|
szAnsiBuffer,
|
|||
|
SMALL_BUFFER_SIZE,
|
|||
|
NULL,
|
|||
|
NULL);
|
|||
|
//#else // defined(DBCS)
|
|||
|
// wcstombs (szAnsiBuffer, szEntry, SMALL_BUFFER_SIZE);
|
|||
|
//#endif // defined(DBCS)
|
|||
|
#else
|
|||
|
// copy ansi data to output buffer
|
|||
|
szAnsiBuffer = szEntry;
|
|||
|
#endif
|
|||
|
// output to dialog box
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FROM_PATH,
|
|||
|
GetStringResource (FMT_INTERNAL_BUFFER));
|
|||
|
SetDlgItemText (hwndDlg, NCDU_TO_PATH, _tcslwr((LPTSTR)szFileName));
|
|||
|
|
|||
|
if (*szAnsiBuffer == '[') {
|
|||
|
WriteFile (hFile, "\r\n", 2, &dwBytes, NULL);
|
|||
|
}
|
|||
|
WriteFile (hFile, szAnsiBuffer, strlen(szAnsiBuffer),
|
|||
|
&dwBytes, NULL);
|
|||
|
WriteFile (hFile, "\r\n", 2, &dwBytes, NULL);
|
|||
|
|
|||
|
// check for messages
|
|||
|
|
|||
|
while (PeekMessage (&msg, 0, 0, 0, PM_REMOVE)) {
|
|||
|
TranslateMessage (&msg);
|
|||
|
DispatchMessage (&msg);
|
|||
|
}
|
|||
|
}
|
|||
|
CloseHandle (hFile);
|
|||
|
bReturn = TRUE;
|
|||
|
} else {
|
|||
|
bReturn = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
#if _UNICODE
|
|||
|
FREE_IF_ALLOC(szAnsiBuffer);
|
|||
|
#endif
|
|||
|
|
|||
|
return bReturn;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
LoadProtocolIni (
|
|||
|
OUT LPTSTR mszProtocolIni,
|
|||
|
OUT LPTSTR mszNetFileList,
|
|||
|
OUT PDWORD pdwNetFileCount
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Creates the Protocol.Ini file using information from the user specified
|
|||
|
configuration
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
OUT LPTSTR mszProtocolIni
|
|||
|
buffer to receive the file data
|
|||
|
|
|||
|
OUT LPTSTR mszNetFileList
|
|||
|
buffer to recieve the list of files to copy as determined by
|
|||
|
scanning the INF based on the selected protocol & driver info.
|
|||
|
|
|||
|
OUT PDWORD pdwNetFileCount
|
|||
|
pointer to DWORD variable used to maintain a running total count of
|
|||
|
the number of files to copy for the % done calculation.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if Protocol.INI file contents were generated
|
|||
|
FALSE if an error occured.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LPTSTR szThisString;
|
|||
|
LPTSTR szTemp;
|
|||
|
LPTSTR szTemp2;
|
|||
|
LPTSTR szNifKey;
|
|||
|
LPTSTR szSectionBuffer;
|
|||
|
LPCTSTR szDefaultValue = cszEmptyString;
|
|||
|
BOOL bTcp; // TRUE if protocol is TCP
|
|||
|
BOOL bIpx; // TRUE if protocol is IPX
|
|||
|
|
|||
|
szSectionBuffer = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE * sizeof(TCHAR));
|
|||
|
szTemp = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
szTemp2 = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
szNifKey = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
|
|||
|
if ((szSectionBuffer == NULL) ||
|
|||
|
(szTemp == NULL) ||
|
|||
|
(szTemp2 == NULL) ||
|
|||
|
(szNifKey == NULL)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// TCP/IP & IPX are special cases, so detect them here
|
|||
|
//
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szKey, cszTcpKey, lstrlen(cszTcpKey)) == 0) {
|
|||
|
bTcp = TRUE;
|
|||
|
bIpx = FALSE;
|
|||
|
} else if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszIpxKey, lstrlen(cszTcpKey)) == 0) {
|
|||
|
bTcp = FALSE;
|
|||
|
bIpx = TRUE;
|
|||
|
} else { // it's neither
|
|||
|
bTcp = FALSE;
|
|||
|
bIpx = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (szSectionBuffer != NULL) {
|
|||
|
*(PDWORD)szSectionBuffer = 0;
|
|||
|
} else {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
//fill in text of protocol ini file
|
|||
|
//
|
|||
|
// add common files to Net dir list
|
|||
|
//
|
|||
|
lstrcpy (szTemp, pAppInfo->szDistPath);
|
|||
|
if (szTemp[lstrlen(szTemp)-1] != cBackslash) lstrcat (szTemp, cszBackslash);
|
|||
|
lstrcat (szTemp, cszOtnBootInf);
|
|||
|
|
|||
|
GetPrivateProfileSection (cszOTNCommonFiles,
|
|||
|
szSectionBuffer, SMALL_BUFFER_SIZE, szTemp);
|
|||
|
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += (lstrlen(szThisString)+1)) {
|
|||
|
AddStringToMultiSz (mszNetFileList, GetKeyFromEntry (szThisString));
|
|||
|
*pdwNetFileCount += 1;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// add in protocol specific files here
|
|||
|
//
|
|||
|
|
|||
|
GetPrivateProfileSection (pAppInfo->piFloppyProtocol.szKey,
|
|||
|
szSectionBuffer, SMALL_BUFFER_SIZE, szTemp);
|
|||
|
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += (lstrlen(szThisString)+1)) {
|
|||
|
AddStringToMultiSz (mszNetFileList, GetKeyFromEntry (szThisString));
|
|||
|
*pdwNetFileCount += 1;
|
|||
|
}
|
|||
|
|
|||
|
// [network.setup] section
|
|||
|
|
|||
|
AddStringToMultiSz (mszProtocolIni, cszNetworkSetup);
|
|||
|
AddStringToMultiSz (mszProtocolIni, cszInfVersion);
|
|||
|
|
|||
|
// examine & log netcard info
|
|||
|
lstrcpy (szTemp2, pAppInfo->niNetCard.szInfKey);
|
|||
|
_tcsupr (szTemp2);
|
|||
|
|
|||
|
_stprintf (szTemp, fmtNetcardDefEntry,
|
|||
|
pAppInfo->niNetCard.szInfKey,
|
|||
|
szTemp2);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
|
|||
|
// load transport information
|
|||
|
if (!bTcp) {
|
|||
|
// load the ndishlp transport
|
|||
|
AddStringToMultiSz (mszProtocolIni, fmtTransportDefEntry);
|
|||
|
}
|
|||
|
|
|||
|
// load transport from listbox
|
|||
|
lstrcpy (szTemp2, pAppInfo->piFloppyProtocol.szKey);
|
|||
|
_tcsupr (szTemp2);
|
|||
|
_stprintf (szTemp, fmtTransportItem,
|
|||
|
pAppInfo->piFloppyProtocol.szKey,
|
|||
|
szTemp2);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
|
|||
|
// format the bindings
|
|||
|
_stprintf (szTemp, fmtLana0Entry,
|
|||
|
pAppInfo->niNetCard.szInfKey,
|
|||
|
pAppInfo->piFloppyProtocol.szKey);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
if (!bTcp) {
|
|||
|
_stprintf (szTemp, fmtLana1Entry,
|
|||
|
pAppInfo->niNetCard.szInfKey);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
}
|
|||
|
|
|||
|
// format the netcard settings to the default values
|
|||
|
// add the net card driver file to the list of NetDir files
|
|||
|
QuietGetPrivateProfileString (pAppInfo->niNetCard.szDeviceKey,
|
|||
|
cszNdis2, cszEmptyString,
|
|||
|
szTemp2, MAX_PATH,
|
|||
|
pAppInfo->niNetCard.szInf);
|
|||
|
// save filename
|
|||
|
lstrcpy (pAppInfo->niNetCard.szDriverFile, GetFileNameFromEntry(szTemp2));
|
|||
|
AddStringToMultiSz (mszNetFileList, pAppInfo->niNetCard.szDriverFile);
|
|||
|
*pdwNetFileCount += 1;
|
|||
|
|
|||
|
// output section with default values
|
|||
|
|
|||
|
_stprintf (szTemp2, fmtIniSection, pAppInfo->niNetCard.szInfKey);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp2);
|
|||
|
|
|||
|
// lookup parameters
|
|||
|
GetPrivateProfileSection (pAppInfo->niNetCard.szNifKey,
|
|||
|
szSectionBuffer, MEDIUM_BUFFER_SIZE,
|
|||
|
pAppInfo->niNetCard.szInf);
|
|||
|
|
|||
|
// process section. Format of each line is:
|
|||
|
// entry=IniName,DescriptionString,Type,OptionRange,Default,?
|
|||
|
// for each entry, I'll print:
|
|||
|
// IniName=Default
|
|||
|
// in the protocol.ini file
|
|||
|
//
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += lstrlen(szThisString) +1) {
|
|||
|
if (_tcsnicmp(szThisString, cszDrivername, 10) == 0) {
|
|||
|
// drivername entry is a special case
|
|||
|
AddStringToMultiSz (mszProtocolIni, szThisString);
|
|||
|
} else {
|
|||
|
szDefaultValue = GetItemFromEntry(szThisString, 5);
|
|||
|
_stprintf (szTemp, fmtCmntIniKeyEntry,
|
|||
|
GetItemFromEntry(szThisString, 1),
|
|||
|
szDefaultValue);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
// add protman files to the list
|
|||
|
//
|
|||
|
QuietGetPrivateProfileString (cszProtmanInstall,
|
|||
|
cszNetdir, cszEmptyString,
|
|||
|
szSectionBuffer, MEDIUM_BUFFER_SIZE,
|
|||
|
pAppInfo->niNetCard.szInf);
|
|||
|
|
|||
|
// add all files to the list
|
|||
|
|
|||
|
szThisString = _tcstok (szSectionBuffer, cszComma);
|
|||
|
while (szThisString != NULL ) {
|
|||
|
AddStringToMultiSz (mszNetFileList, GetFileNameFromEntry (szThisString));
|
|||
|
*pdwNetFileCount += 1;
|
|||
|
szThisString = _tcstok (NULL, cszComma);
|
|||
|
}
|
|||
|
|
|||
|
// do protman entry
|
|||
|
|
|||
|
AddStringToMultiSz (mszProtocolIni, fmtProtmanSection);
|
|||
|
lstrcpy (szNifKey, cszProtman);
|
|||
|
|
|||
|
GetPrivateProfileSection (szNifKey,
|
|||
|
szSectionBuffer, MEDIUM_BUFFER_SIZE,
|
|||
|
pAppInfo->niNetCard.szInf);
|
|||
|
|
|||
|
// process section. Format of each line is:
|
|||
|
// entry=IniName,DescriptionString,Type,Default
|
|||
|
// for each entry, I'll print:
|
|||
|
// IniName=Default
|
|||
|
// in the protocol.ini file
|
|||
|
//
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += lstrlen(szThisString) +1) {
|
|||
|
if (_tcsnicmp(szThisString, cszDrivername, lstrlen(cszDrivername)) == 0) {
|
|||
|
// drivername entry is a special case
|
|||
|
AddStringToMultiSz (mszProtocolIni, szThisString);
|
|||
|
} else {
|
|||
|
szDefaultValue = GetItemFromEntry(szThisString, 4);
|
|||
|
if (lstrlen(szDefaultValue) > 0) {
|
|||
|
_stprintf (szTemp, fmtIniKeyEntry,
|
|||
|
GetItemFromEntry(szThisString, 1),
|
|||
|
szDefaultValue);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!bTcp) {
|
|||
|
// do NdisHlp section
|
|||
|
|
|||
|
AddStringToMultiSz (mszProtocolIni, cszMsNdisHlp);
|
|||
|
lstrcpy (szNifKey, cszMsNdisHlpXif);
|
|||
|
|
|||
|
GetPrivateProfileSection (szNifKey,
|
|||
|
szSectionBuffer, MEDIUM_BUFFER_SIZE,
|
|||
|
pAppInfo->niNetCard.szInf);
|
|||
|
|
|||
|
// process section. Format of each line is:
|
|||
|
// drivername=name
|
|||
|
//
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += lstrlen(szThisString) +1) {
|
|||
|
if (_tcsnicmp(szThisString, cszDrivername, lstrlen(cszDrivername)) == 0) {
|
|||
|
// drivername entry is a special case
|
|||
|
AddStringToMultiSz (mszProtocolIni, szThisString);
|
|||
|
} else {
|
|||
|
_stprintf (szTemp, fmtIniKeyEntry,
|
|||
|
GetKeyFromEntry(szThisString),
|
|||
|
GetItemFromEntry(szThisString, 1));
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
}
|
|||
|
}
|
|||
|
// do bindings
|
|||
|
|
|||
|
_stprintf (szTemp, fmtBindingsEntry, pAppInfo->niNetCard.szInfKey);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
}
|
|||
|
|
|||
|
// do Protocol configuration
|
|||
|
|
|||
|
_stprintf (szTemp2, fmtIniSection, pAppInfo->piFloppyProtocol.szKey);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp2);
|
|||
|
_stprintf (szNifKey, fmtXifEntry, pAppInfo->piFloppyProtocol.szKey);
|
|||
|
|
|||
|
if (bTcp) {
|
|||
|
// format the TCP/IP protocol section here using information
|
|||
|
// from the previous dialog boxes
|
|||
|
AddStringToMultiSz (mszProtocolIni, fmtNBSessions);
|
|||
|
if (IsZeroIpAddr (&pAppInfo->tiTcpIpInfo.DefaultGateway[0])) {
|
|||
|
_stprintf (szTemp, fmtEmptyParam, cszDefaultGateway);
|
|||
|
} else {
|
|||
|
_stprintf (szTemp, fmtIpParam, cszDefaultGateway,
|
|||
|
pAppInfo->tiTcpIpInfo.DefaultGateway[0],
|
|||
|
pAppInfo->tiTcpIpInfo.DefaultGateway[1],
|
|||
|
pAppInfo->tiTcpIpInfo.DefaultGateway[2],
|
|||
|
pAppInfo->tiTcpIpInfo.DefaultGateway[3]);
|
|||
|
}
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
|
|||
|
if (IsZeroIpAddr (&pAppInfo->tiTcpIpInfo.SubNetMask[0])) {
|
|||
|
_stprintf (szTemp, fmtEmptyParam, cszSubNetMask);
|
|||
|
} else {
|
|||
|
_stprintf (szTemp, fmtIpParam, cszSubNetMask,
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[0],
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[1],
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[2],
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[3]);
|
|||
|
}
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
|
|||
|
if (IsZeroIpAddr (&pAppInfo->tiTcpIpInfo.IpAddr[0])) {
|
|||
|
_stprintf (szTemp, fmtEmptyParam, cszIPAddress);
|
|||
|
} else {
|
|||
|
_stprintf (szTemp, fmtIpParam, cszIPAddress,
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[0],
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[1],
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[2],
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[3]);
|
|||
|
}
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
|
|||
|
_stprintf (szTemp, fmtIniKeyEntry,
|
|||
|
cszDisableDHCP,
|
|||
|
((pAppInfo->bUseDhcp) ? csz0 : csz1));
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
AddStringToMultiSz (mszProtocolIni, cszTcpIpDriver);
|
|||
|
} else {
|
|||
|
// for Protocols other than TCP/IP get the info from the INF
|
|||
|
|
|||
|
GetPrivateProfileSection (szNifKey,
|
|||
|
szSectionBuffer, MEDIUM_BUFFER_SIZE,
|
|||
|
pAppInfo->niNetCard.szInf);
|
|||
|
|
|||
|
// process section. Format of each line is:
|
|||
|
// entry=IniName,DescriptionString,Type,OptionRange,Default
|
|||
|
// for each entry, I'll print:
|
|||
|
// IniName=Default
|
|||
|
// in the protocol.ini file
|
|||
|
//
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += lstrlen(szThisString) +1) {
|
|||
|
if (_tcsnicmp(szThisString, cszDrivername, lstrlen(cszDrivername)) == 0) {
|
|||
|
// drivername entry is a special case
|
|||
|
AddStringToMultiSz (mszProtocolIni, szThisString);
|
|||
|
} else {
|
|||
|
if (bIpx && pAppInfo->niNetCard.bTokenRing) {
|
|||
|
// another special case is when IPX is used with Token Ring
|
|||
|
// cards.
|
|||
|
if (_tcsnicmp(GetItemFromEntry(szThisString,1),
|
|||
|
cszFrame, lstrlen(cszFrame)) == 0) {
|
|||
|
szDefaultValue = cszTokenRingEntry;
|
|||
|
}
|
|||
|
} else {
|
|||
|
szDefaultValue = GetItemFromEntry(szThisString, 5);
|
|||
|
}
|
|||
|
// only write parameters that actually have a default value
|
|||
|
// to write
|
|||
|
if (lstrlen(szDefaultValue) > 0) {
|
|||
|
_stprintf (szTemp, fmtIniKeyEntry,
|
|||
|
GetItemFromEntry(szThisString, 1),
|
|||
|
szDefaultValue);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
_stprintf (szTemp, fmtBindingsEntry, pAppInfo->niNetCard.szInfKey);
|
|||
|
AddStringToMultiSz (mszProtocolIni, szTemp);
|
|||
|
|
|||
|
// IPX does not get a LANABASE entry
|
|||
|
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szKey, cszIpxKey, lstrlen(cszIpxKey)) != 0) {
|
|||
|
AddStringToMultiSz (mszProtocolIni, fmtLanabase0);
|
|||
|
}
|
|||
|
|
|||
|
FREE_IF_ALLOC (szSectionBuffer);
|
|||
|
FREE_IF_ALLOC (szTemp);
|
|||
|
FREE_IF_ALLOC (szTemp2);
|
|||
|
FREE_IF_ALLOC (szNifKey);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
LoadSystemIni (
|
|||
|
OUT LPTSTR mszList
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Routine to generate the System.INI file for the boot floppy
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
OUT LPTSTR mszList
|
|||
|
buffer to fill with system.INI records
|
|||
|
NOTE: BUFFER SIZE is assumed to be sufficient (i.e. it's not checked!)
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if entries generated
|
|||
|
FALSE if error
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LPTSTR szTemp1;
|
|||
|
LPTSTR szTemp2;
|
|||
|
LPSTR szAnsi1;
|
|||
|
BOOL bReturn;
|
|||
|
|
|||
|
szTemp1 = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
szTemp2 = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
szAnsi1 = (LPSTR)GlobalAlloc (GPTR, MAX_PATH);
|
|||
|
|
|||
|
if ((szTemp1 != NULL) &&
|
|||
|
(szTemp2 != NULL) &&
|
|||
|
(szAnsi1 != NULL)) {
|
|||
|
AddStringToMultiSz (mszList, cszNetworkSection);
|
|||
|
AddStringToMultiSz (mszList, fmtNoFilesharing);
|
|||
|
AddStringToMultiSz (mszList, fmtNoPrintsharing);
|
|||
|
AddStringToMultiSz (mszList, fmtYesAutologon);
|
|||
|
_stprintf (szTemp1, fmtComputernameEntry, pAppInfo->szComputerName);
|
|||
|
CharToOemBuff (szTemp1, szAnsi1, (DWORD)(lstrlen(szTemp1)+1));
|
|||
|
#ifdef UNICODE
|
|||
|
mbstowcs (szTemp2, szAnsi1, MAX_PATH);
|
|||
|
#else
|
|||
|
lstrcpy (szTemp2, szAnsi1);
|
|||
|
#endif
|
|||
|
AddStringToMultiSz (mszList, szTemp2);
|
|||
|
AddStringToMultiSz (mszList, fmtLanaRootOnA);
|
|||
|
_stprintf (szTemp1, fmtUsernameEntry, pAppInfo->szUsername);
|
|||
|
CharToOemBuff (szTemp1, szAnsi1, (DWORD)(lstrlen(szTemp1)+1));
|
|||
|
#ifdef UNICODE
|
|||
|
mbstowcs (szTemp2, szAnsi1, MAX_PATH);
|
|||
|
#else
|
|||
|
lstrcpy (szTemp2, szAnsi1);
|
|||
|
#endif
|
|||
|
AddStringToMultiSz (mszList, szTemp2);
|
|||
|
_stprintf (szTemp1, fmtWorkgroupEntry, pAppInfo->szDomain);
|
|||
|
CharToOemBuff (szTemp1, szAnsi1, (DWORD)(lstrlen(szTemp1)+1));
|
|||
|
#ifdef UNICODE
|
|||
|
mbstowcs (szTemp2, szAnsi1, MAX_PATH);
|
|||
|
#else
|
|||
|
lstrcpy (szTemp2, szAnsi1);
|
|||
|
#endif
|
|||
|
AddStringToMultiSz (mszList, szTemp2);
|
|||
|
AddStringToMultiSz (mszList, fmtNoReconnect);
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszNetbeuiKey, lstrlen(cszNetbeuiKey)) == 0) {
|
|||
|
// only NetBEUI gets this
|
|||
|
AddStringToMultiSz (mszList, fmtNoDirectHost);
|
|||
|
}
|
|||
|
AddStringToMultiSz (mszList, fmtNoDosPopHotKey);
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szKey, cszIpxKey, lstrlen(cszIpxKey)) == 0) {
|
|||
|
AddStringToMultiSz (mszList, fmtLmLogon1);
|
|||
|
} else {
|
|||
|
AddStringToMultiSz (mszList, fmtLmLogon0);
|
|||
|
}
|
|||
|
_stprintf (szTemp1, fmtLogonDomainEntry, pAppInfo->szDomain);
|
|||
|
CharToOemBuff (szTemp1, szAnsi1, (DWORD)(lstrlen(szTemp1)+1));
|
|||
|
#ifdef UNICODE
|
|||
|
mbstowcs (szTemp2, szAnsi1, MAX_PATH);
|
|||
|
#else
|
|||
|
lstrcpy (szTemp2, szAnsi1);
|
|||
|
#endif
|
|||
|
AddStringToMultiSz (mszList, szTemp2);
|
|||
|
AddStringToMultiSz (mszList, fmtPreferredRedirFull);
|
|||
|
AddStringToMultiSz (mszList, fmtAutostartFull);
|
|||
|
AddStringToMultiSz (mszList, fmtMaxConnections);
|
|||
|
|
|||
|
// network driver section
|
|||
|
|
|||
|
AddStringToMultiSz (mszList, fmtNetworkDriversSection);
|
|||
|
_stprintf (szTemp1, fmtNetcardEntry, pAppInfo->niNetCard.szDriverFile);
|
|||
|
CharToOemBuff (szTemp1, szAnsi1, (DWORD)(lstrlen(szTemp1)+1));
|
|||
|
#ifdef UNICODE
|
|||
|
mbstowcs (szTemp2, szAnsi1, MAX_PATH);
|
|||
|
#else
|
|||
|
lstrcpy (szTemp2, szAnsi1);
|
|||
|
#endif
|
|||
|
AddStringToMultiSz (mszList, szTemp2);
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszTCP, lstrlen(cszTCP)) == 0 ) {
|
|||
|
// tcpip Transport
|
|||
|
lstrcpy (szTemp1, fmtTcpTransportEntry);
|
|||
|
} else {
|
|||
|
lstrcpy (szTemp1, fmtNdisTransportEntry);
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszNetbeui, lstrlen(cszNetbeui)) == 0 ) {
|
|||
|
// add NetBEUI string
|
|||
|
lstrcat (szTemp1, fmtNetbeuiAddon);
|
|||
|
}
|
|||
|
}
|
|||
|
AddStringToMultiSz (mszList, szTemp1);
|
|||
|
AddStringToMultiSz (mszList, fmtDevdir);
|
|||
|
AddStringToMultiSz (mszList, fmtLoadRmDrivers);
|
|||
|
|
|||
|
// password file list (header only)
|
|||
|
AddStringToMultiSz (mszList, fmtPasswordListSection);
|
|||
|
bReturn = TRUE;
|
|||
|
} else {
|
|||
|
bReturn = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
FREE_IF_ALLOC (szTemp1);
|
|||
|
FREE_IF_ALLOC (szTemp2);
|
|||
|
FREE_IF_ALLOC (szAnsi1);
|
|||
|
|
|||
|
return bReturn;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
LoadAutoexecBat (
|
|||
|
OUT LPTSTR mszList
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Routine to generate the Autoexec.bat file for the boot floppy
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
OUT LPTSTR mszList
|
|||
|
Buffer to write autoexec.bat entries into
|
|||
|
NOTE: BUFFER SIZE is assumed to be sufficient (i.e. it's not checked!)
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if entries generated
|
|||
|
FALSE if error
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LPTSTR szTemp;
|
|||
|
LPTSTR szTemp2;
|
|||
|
LPTSTR szSectionBuffer;
|
|||
|
LPTSTR szDir;
|
|||
|
LPTSTR szEntry;
|
|||
|
|
|||
|
szSectionBuffer = GlobalAlloc (GPTR, (SMALL_BUFFER_SIZE * sizeof(TCHAR)));
|
|||
|
szTemp = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
szTemp2 = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
|
|||
|
if ((szSectionBuffer == NULL) ||
|
|||
|
(szTemp == NULL) ||
|
|||
|
(szTemp2 == NULL)) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
// fixed kkntbug #12382
|
|||
|
// NCAdmin:"[] Make Japanese startup disks" is not functioning.
|
|||
|
|
|||
|
if (bJpnDisk) {
|
|||
|
AddStringToMultiSz (mszList, GetStringResource (FMT_LOAD_AUTOEXEC_ECHO));
|
|||
|
AddStringToMultiSz (mszList, fmtPause);
|
|||
|
}
|
|||
|
#endif
|
|||
|
AddStringToMultiSz (mszList, fmtPathSpec);
|
|||
|
|
|||
|
// load network starting commands from INF
|
|||
|
// get commands from INF for this protocol
|
|||
|
|
|||
|
//
|
|||
|
// put INF filename into szTemp
|
|||
|
//
|
|||
|
lstrcpy (szTemp, pAppInfo->szDistPath);
|
|||
|
if (szTemp[lstrlen(szTemp)-1] != cBackslash) lstrcat (szTemp, cszBackslash);
|
|||
|
lstrcat (szTemp, cszAppInfName);
|
|||
|
//
|
|||
|
// put key name made from protocol and "_autoexec" into szTemp2
|
|||
|
//
|
|||
|
lstrcpy (szTemp2, pAppInfo->piFloppyProtocol.szKey);
|
|||
|
lstrcat (szTemp2, fmtAutoexec);
|
|||
|
|
|||
|
GetPrivateProfileSection (szTemp2, szSectionBuffer,
|
|||
|
SMALL_BUFFER_SIZE, szTemp);
|
|||
|
|
|||
|
for (szEntry = szSectionBuffer;
|
|||
|
*szEntry != 0;
|
|||
|
szEntry += (lstrlen(szEntry) + 1)) {
|
|||
|
lstrcpy (szTemp, fmtNetPrefix);
|
|||
|
lstrcat (szTemp, GetKeyFromEntry(szEntry));
|
|||
|
AddStringToMultiSz (mszList, szTemp);
|
|||
|
}
|
|||
|
|
|||
|
// create network connection commands
|
|||
|
|
|||
|
if (GetServerAndSharepointFromUnc(pAppInfo->piTargetProtocol.szDir, szTemp2)) {
|
|||
|
_stprintf (szTemp, fmtNetUseDrive, szTemp2);
|
|||
|
AddStringToMultiSz (mszList, szTemp);
|
|||
|
} else {
|
|||
|
AddStringToMultiSz (mszList,
|
|||
|
GetStringResource (FMT_CONNECTING_COMMENT));
|
|||
|
}
|
|||
|
|
|||
|
// create setup command
|
|||
|
|
|||
|
szDir = (LPTSTR)GetDirPathFromUnc(pAppInfo->piTargetProtocol.szDir);
|
|||
|
if (lstrlen(szDir) > 0) {
|
|||
|
AddStringToMultiSz (mszList,
|
|||
|
GetStringResource (FMT_RUNNING_SETUP_COMMENT));
|
|||
|
_stprintf (szTemp, fmtSetupCommand,
|
|||
|
szDir, pAppInfo->szTargetSetupCmd);
|
|||
|
AddStringToMultiSz (mszList, szTemp);
|
|||
|
} else {
|
|||
|
AddStringToMultiSz (mszList,
|
|||
|
GetStringResource (FMT_OTN_COMMENT));
|
|||
|
}
|
|||
|
|
|||
|
FREE_IF_ALLOC (szSectionBuffer);
|
|||
|
FREE_IF_ALLOC (szTemp);
|
|||
|
FREE_IF_ALLOC (szTemp2);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
LoadConfigSys (
|
|||
|
OUT LPTSTR mszList
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Routine to write Config.Sys entries for the Boot Floppy.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
OUT LPTSTR mszList
|
|||
|
Buffer to write Config.sys commands into
|
|||
|
NOTE: BUFFER SIZE is assumed to be sufficient (i.e. it's not checked!)
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
AddStringToMultiSz (mszList, fmtFilesParam);
|
|||
|
AddStringToMultiSz (mszList, fmtDeviceIfsHlpSys);
|
|||
|
AddStringToMultiSz (mszList, fmtLastDrive);
|
|||
|
if (GetBootDiskDosVersion (pAppInfo->szBootFilesPath) >= 5) {
|
|||
|
AddStringToMultiSz (mszList, fmtLoadHiMem);
|
|||
|
AddStringToMultiSz (mszList, fmtLoadEMM386);
|
|||
|
AddStringToMultiSz (mszList, fmtDosHigh);
|
|||
|
#ifdef JAPAN
|
|||
|
// fixed kkntbug #12382
|
|||
|
// NCAdmin:"[] Make Japanese startup disks" is not functioning.
|
|||
|
|
|||
|
if (bJpnDisk) {
|
|||
|
AddStringToMultiSz (mszList, fmtBilingual);
|
|||
|
AddStringToMultiSz (mszList, fmtFontSys);
|
|||
|
AddStringToMultiSz (mszList, fmtDispSys);
|
|||
|
AddStringToMultiSz (mszList, fmtKeyboard);
|
|||
|
AddStringToMultiSz (mszList, fmtNlsFunc);
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
MakeFlopDlg_NCDU_START_FILE_COPY (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Processes NCDU_START_FILE_COPY message. Allocates buffers to be
|
|||
|
used in creating boot and network configuration files. Fills
|
|||
|
them in using information from the pAppInfo struct then
|
|||
|
writes them to the output files on the destination drive.
|
|||
|
Once the generated files have been written, the other
|
|||
|
files are copied from the OTN dir to the destination drive.
|
|||
|
If all goes well, then the dialog box is closed.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to dialog box window
|
|||
|
|
|||
|
IN WPARAM wParam
|
|||
|
Not Used
|
|||
|
|
|||
|
IN LPARAM lParam
|
|||
|
Not Used
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LPTSTR mszNetFileList;
|
|||
|
LPTSTR mszProtocolIni;
|
|||
|
LPTSTR mszSystemIni;
|
|||
|
LPTSTR mszAutoexecBat;
|
|||
|
LPTSTR mszConfigSys;
|
|||
|
DWORD dwNetFileCount = 0;
|
|||
|
DWORD dwFilesCopied = 0;
|
|||
|
DWORD dwDestClusterSize = 0;
|
|||
|
|
|||
|
DWORD dwFileBytesToCopy = 0;
|
|||
|
DWORD dwDestFreeSpace = 0;
|
|||
|
DWORD dwFileSize;
|
|||
|
|
|||
|
LPTSTR szSrcFile;
|
|||
|
LPTSTR szSrcFilePart;
|
|||
|
|
|||
|
LPTSTR szDestFile;
|
|||
|
LPTSTR szDestFilePart;
|
|||
|
|
|||
|
LPTSTR szThisFile;
|
|||
|
LPTSTR szInfFile;
|
|||
|
|
|||
|
int nMbResult;
|
|||
|
BOOL bBootable;
|
|||
|
BOOL bAborted = FALSE;
|
|||
|
|
|||
|
DWORD dwSystemFileSize;
|
|||
|
|
|||
|
MSG msg;
|
|||
|
UINT nExitCode = IDOK;
|
|||
|
#ifdef JAPAN
|
|||
|
LPTSTR szThisString;
|
|||
|
LPTSTR szVolumeName;
|
|||
|
LPTSTR szTextString;
|
|||
|
LPTSTR szSectionBuffer;
|
|||
|
LPTSTR szDOSVDirectory;
|
|||
|
LPTSTR szTemp;
|
|||
|
#endif
|
|||
|
|
|||
|
mszNetFileList = (LPTSTR)GlobalAlloc(GPTR, MEDIUM_BUFFER_SIZE);
|
|||
|
mszProtocolIni = (LPTSTR)GlobalAlloc(GPTR, MEDIUM_BUFFER_SIZE);
|
|||
|
mszSystemIni = (LPTSTR)GlobalAlloc(GPTR, MEDIUM_BUFFER_SIZE);
|
|||
|
mszAutoexecBat = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
mszConfigSys = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
szSrcFile = (LPTSTR)GlobalAlloc(GPTR, MAX_PATH_BYTES);
|
|||
|
szDestFile = (LPTSTR)GlobalAlloc(GPTR, MAX_PATH_BYTES);
|
|||
|
szInfFile = (LPTSTR)GlobalAlloc(GPTR, MAX_PATH_BYTES);
|
|||
|
#ifdef JAPAN
|
|||
|
szVolumeName = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
szTextString = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
szSectionBuffer = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
szDOSVDirectory = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
szTemp = (LPTSTR)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
#endif
|
|||
|
|
|||
|
if ((mszNetFileList != NULL) &&
|
|||
|
(mszProtocolIni != NULL) &&
|
|||
|
(mszConfigSys != NULL) &&
|
|||
|
(mszAutoexecBat != NULL) &&
|
|||
|
(szSrcFile != NULL) &&
|
|||
|
(szDestFile != NULL) &&
|
|||
|
(szInfFile != NULL) &&
|
|||
|
#ifdef JAPAN
|
|||
|
(szVolumeName != NULL) &&
|
|||
|
(szTextString != NULL) &&
|
|||
|
(szSectionBuffer != NULL) &&
|
|||
|
(szDOSVDirectory != NULL) &&
|
|||
|
(szTemp != NULL) &&
|
|||
|
#endif
|
|||
|
(mszSystemIni != NULL)) {
|
|||
|
|
|||
|
*(PDWORD)mszNetFileList = 0L;
|
|||
|
*(PDWORD)mszProtocolIni = 0L;
|
|||
|
*(PDWORD)mszSystemIni = 0L;
|
|||
|
*(PDWORD)mszAutoexecBat = 0L;
|
|||
|
*(PDWORD)mszConfigSys = 0L;
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if (wParam) {
|
|||
|
wsprintf(szTemp, GetStringResource (FMT_OTN_BOOT_FILES_DOSV), wParam);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_COPY_APPNAME, szTemp);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
szDestFilePart = szDestFile; // to initialize the var
|
|||
|
|
|||
|
lstrcpy (szInfFile, pAppInfo->szDistPath);
|
|||
|
if (szInfFile[lstrlen(szInfFile)-1] != cBackslash)
|
|||
|
lstrcat (szInfFile, cszBackslash);
|
|||
|
lstrcat (szInfFile, cszAppInfName);
|
|||
|
|
|||
|
if (GetPrivateProfileString (cszSizes, csz_SystemFileSize_,
|
|||
|
cszEmptyString, szSrcFile, MAX_PATH, szInfFile) > 0) {
|
|||
|
// a value was found so get the filesize value from the string
|
|||
|
dwSystemFileSize = GetSizeFromInfString (szSrcFile);
|
|||
|
} else {
|
|||
|
dwSystemFileSize = 0;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if (wParam == SETUP_DOSV_2) {
|
|||
|
_stprintf (szTextString,
|
|||
|
GetStringResource (FMT_LOAD_NET_CLIENT2),
|
|||
|
GetStringResource (
|
|||
|
(pAppInfo->mtBootDriveType == F3_1Pt44_512) ?
|
|||
|
CSZ_35_HD : CSZ_525_HD),
|
|||
|
pAppInfo->szBootFilesPath);
|
|||
|
|
|||
|
while(1) {
|
|||
|
|
|||
|
GetVolumeInformation(
|
|||
|
pAppInfo->szBootFilesPath,
|
|||
|
szVolumeName,
|
|||
|
SMALL_BUFFER_SIZE,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
0);
|
|||
|
|
|||
|
if (lstrcmp(szVolumeName, cszDOSVLabel1)) {
|
|||
|
SetVolumeLabel(pAppInfo->szBootFilesPath, cszDOSVLabel2);
|
|||
|
break;
|
|||
|
}
|
|||
|
else {
|
|||
|
|
|||
|
nMbResult = DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_DRIVE_NOT_BOOTDISK,
|
|||
|
FMT_LOAD_NET_CLIENT2_TITLE,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
if (!(bBootable = IsDestBootableDosFloppy())) {
|
|||
|
#ifdef JAPAN
|
|||
|
if (wParam == SETUP_DOSV_2) {
|
|||
|
while ((nMbResult = DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_DRIVE_NOT_BOOTDISK,
|
|||
|
0,
|
|||
|
MB_OKCANCEL_TASK_INFO)) != IDCANCEL) {
|
|||
|
if ((bBootable = IsDestBootableDosFloppy())) {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (nMbResult == IDCANCEL) bCopying = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if (bCopying == FALSE)
|
|||
|
#endif
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_COPY_TO_FLOPPY);
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if (wParam == SETUP_DOSV_1)
|
|||
|
SetVolumeLabel(pAppInfo->szBootFilesPath, cszDOSVLabel1);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_2) || !wParam) {
|
|||
|
#endif
|
|||
|
// generate protocol.ini
|
|||
|
|
|||
|
LoadProtocolIni (
|
|||
|
mszProtocolIni,
|
|||
|
mszNetFileList,
|
|||
|
&dwNetFileCount);
|
|||
|
dwNetFileCount += 1; // account for protocol.ini file
|
|||
|
|
|||
|
// generate system.ini
|
|||
|
LoadSystemIni (mszSystemIni);
|
|||
|
dwNetFileCount += 1;
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
else {
|
|||
|
if (QuietGetPrivateProfileString (cszOtnInstall, cszDOSV, cszEmptyString,
|
|||
|
szDOSVDirectory, SMALL_BUFFER_SIZE, szInfFile) > 0) {
|
|||
|
|
|||
|
GetPrivateProfileSection (cszOTNDOSVFiles,
|
|||
|
szSectionBuffer, SMALL_BUFFER_SIZE, szInfFile);
|
|||
|
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += (lstrlen(szThisString)+1)) {
|
|||
|
lstrcpy(szTemp, szDOSVDirectory);
|
|||
|
lstrcat(szTemp, cszBackslash);
|
|||
|
lstrcat(szTemp, GetKeyFromEntry (szThisString));
|
|||
|
AddStringToMultiSz (mszNetFileList, szTemp);
|
|||
|
dwNetFileCount += 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
GetPrivateProfileSection (cszDOSVCommonFiles,
|
|||
|
szSectionBuffer, SMALL_BUFFER_SIZE, szInfFile);
|
|||
|
|
|||
|
for (szThisString = szSectionBuffer;
|
|||
|
*szThisString != 0;
|
|||
|
szThisString += (lstrlen(szThisString)+1)) {
|
|||
|
AddStringToMultiSz (mszNetFileList, GetKeyFromEntry (szThisString));
|
|||
|
dwNetFileCount += 1;
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
// generate autoexec.bat
|
|||
|
LoadAutoexecBat (mszAutoexecBat);
|
|||
|
dwNetFileCount += 1;
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_1) || !wParam) {
|
|||
|
#endif
|
|||
|
// generate config.sys
|
|||
|
LoadConfigSys (mszConfigSys);
|
|||
|
dwNetFileCount += 1;
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
// determine number of bytes to copy to destination
|
|||
|
|
|||
|
dwDestClusterSize = GetClusterSizeOfDisk (pAppInfo->szBootFilesPath);
|
|||
|
|
|||
|
dwFileBytesToCopy = 0; // clear
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_2) || !wParam) {
|
|||
|
#endif
|
|||
|
// get size of file that will be written
|
|||
|
dwFileBytesToCopy += GetMultiSzLen (mszProtocolIni);
|
|||
|
// and round up to the next sector size
|
|||
|
dwFileBytesToCopy += dwDestClusterSize -
|
|||
|
(dwFileBytesToCopy % dwDestClusterSize);
|
|||
|
|
|||
|
// get size of file that will be written
|
|||
|
dwFileBytesToCopy += GetMultiSzLen (mszSystemIni);
|
|||
|
// and round up to the next sector size
|
|||
|
dwFileBytesToCopy += dwDestClusterSize -
|
|||
|
(dwFileBytesToCopy % dwDestClusterSize);
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
// get size of file that will be written
|
|||
|
dwFileBytesToCopy += GetMultiSzLen (mszAutoexecBat);
|
|||
|
// and round up to the next sector size
|
|||
|
dwFileBytesToCopy += dwDestClusterSize -
|
|||
|
(dwFileBytesToCopy % dwDestClusterSize);
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_1) || !wParam) {
|
|||
|
#endif
|
|||
|
// get size of file that will be written
|
|||
|
dwFileBytesToCopy += GetMultiSzLen (mszConfigSys);
|
|||
|
// and round up to the next sector size
|
|||
|
dwFileBytesToCopy += dwDestClusterSize -
|
|||
|
(dwFileBytesToCopy % dwDestClusterSize);
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_1) || !wParam) {
|
|||
|
#endif
|
|||
|
// get size of files in copy list and add to internally created files
|
|||
|
|
|||
|
lstrcpy (szSrcFile, pAppInfo->piFloppyProtocol.szDir);
|
|||
|
if (szSrcFile[lstrlen(szSrcFile)-1] != cBackslash) lstrcat (szSrcFile, cszBackslash);
|
|||
|
szSrcFilePart = &szSrcFile[lstrlen(szSrcFile)];
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
for (szThisFile = mszNetFileList;
|
|||
|
*szThisFile != 0;
|
|||
|
szThisFile += (lstrlen(szThisFile) + 1)) {
|
|||
|
// make full path of filename
|
|||
|
lstrcpy (szSrcFilePart, szThisFile);
|
|||
|
// get the size of the file and add it to the total
|
|||
|
dwFileSize = QuietGetFileSize (szSrcFile);
|
|||
|
if (dwFileSize != 0xFFFFFFFF) {
|
|||
|
dwFileBytesToCopy += dwFileSize;
|
|||
|
// and round to the next larger allocation unit
|
|||
|
dwFileBytesToCopy += dwDestClusterSize -
|
|||
|
(dwFileBytesToCopy % dwDestClusterSize);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
dwDestFreeSpace = ComputeFreeSpace (pAppInfo->szBootFilesPath);
|
|||
|
|
|||
|
if (dwDestFreeSpace < dwFileBytesToCopy) {
|
|||
|
DisplayMessageBox (hwndDlg,
|
|||
|
NCDU_INSUFFICIENT_DISK_SPACE,
|
|||
|
0,
|
|||
|
MB_OK_TASK_EXCL);
|
|||
|
bCopying = FALSE;
|
|||
|
bAborted = TRUE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
if (!bBootable) {
|
|||
|
// see if there will be room to add the system files
|
|||
|
// later...
|
|||
|
dwFileBytesToCopy += dwSystemFileSize;
|
|||
|
if (dwDestFreeSpace < dwFileBytesToCopy) {
|
|||
|
if (DisplayMessageBox (hwndDlg,
|
|||
|
NCDU_SYSTEM_MAY_NOT_FIT,
|
|||
|
0,
|
|||
|
MB_OKCANCEL_TASK_INFO | MB_DEFBUTTON2) == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
bAborted = TRUE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
// they want to continue so stick a message in the
|
|||
|
// exit messages
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_SMALL_DISK_WARN);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (bCopying) {
|
|||
|
// write files to root directory
|
|||
|
|
|||
|
lstrcpy (szDestFile, pAppInfo->szBootFilesPath);
|
|||
|
if (szDestFile[lstrlen(szDestFile)-1] != cBackslash) lstrcat (szDestFile, cszBackslash);
|
|||
|
szDestFilePart = &szDestFile[lstrlen(szDestFile)];
|
|||
|
|
|||
|
// make sure destination path exists
|
|||
|
CreateDirectoryFromPath (szDestFile, NULL);
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_1) || !wParam) {
|
|||
|
#endif
|
|||
|
// config.sys
|
|||
|
lstrcpy (szDestFilePart, cszConfigSys);
|
|||
|
if (WriteMszToFile (hwndDlg, mszConfigSys, szDestFile, CREATE_ALWAYS)) {
|
|||
|
UpdatePercentComplete (hwndDlg, ++dwFilesCopied, dwNetFileCount);
|
|||
|
} else {
|
|||
|
// bail out here since there was a copy error
|
|||
|
nMbResult = MessageBox (
|
|||
|
hwndDlg,
|
|||
|
GetStringResource (CSZ_UNABLE_COPY),
|
|||
|
szDestFile,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_FLOPPY_NOT_COMPLETE);
|
|||
|
}
|
|||
|
}
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
if (bCopying) {
|
|||
|
// autoexec.bat
|
|||
|
lstrcpy (szDestFilePart, cszAutoexecBat);
|
|||
|
if (WriteMszToFile (hwndDlg, mszAutoexecBat, szDestFile, CREATE_ALWAYS)) {
|
|||
|
UpdatePercentComplete (hwndDlg, ++dwFilesCopied, dwNetFileCount);
|
|||
|
} else {
|
|||
|
// bail out here since there was a copy error
|
|||
|
nMbResult = MessageBox (
|
|||
|
hwndDlg,
|
|||
|
GetStringResource (CSZ_UNABLE_COPY),
|
|||
|
szDestFile,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_FLOPPY_NOT_COMPLETE);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (bCopying) {
|
|||
|
// write INI files
|
|||
|
// make NET subdir
|
|||
|
lstrcpy (szDestFilePart, cszNet);
|
|||
|
CreateDirectory (szDestFile, NULL);
|
|||
|
|
|||
|
// add net sub dir to dest path
|
|||
|
if (szDestFile[lstrlen(szDestFile)-1] != cBackslash) lstrcat (szDestFile, cszBackslash);
|
|||
|
szDestFilePart = &szDestFile[lstrlen(szDestFile)];
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_2) || !wParam) {
|
|||
|
#endif
|
|||
|
lstrcpy (szDestFilePart, cszSystemIni);
|
|||
|
|
|||
|
if (WriteMszToFile (hwndDlg, mszSystemIni, szDestFile, CREATE_ALWAYS)) {
|
|||
|
UpdatePercentComplete (hwndDlg, ++dwFilesCopied, dwNetFileCount);
|
|||
|
} else {
|
|||
|
// bail out here since there was a copy error
|
|||
|
nMbResult = MessageBox (
|
|||
|
hwndDlg,
|
|||
|
GetStringResource (CSZ_UNABLE_COPY),
|
|||
|
szDestFile,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_FLOPPY_NOT_COMPLETE);
|
|||
|
}
|
|||
|
}
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
else {
|
|||
|
// make DOSV subdir
|
|||
|
lstrcpy (szDestFilePart, cszDOSV);
|
|||
|
CreateDirectory (szDestFile, NULL);
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_2) || !wParam) {
|
|||
|
#endif
|
|||
|
if (bCopying) {
|
|||
|
lstrcpy (szDestFilePart, cszProtocolIni);
|
|||
|
if (WriteMszToFile (hwndDlg, mszProtocolIni, szDestFile, CREATE_ALWAYS)) {
|
|||
|
UpdatePercentComplete (hwndDlg, ++dwFilesCopied, dwNetFileCount);
|
|||
|
} else {
|
|||
|
// bail out here since there was a copy error
|
|||
|
nMbResult = MessageBox (
|
|||
|
hwndDlg,
|
|||
|
GetStringResource (CSZ_UNABLE_COPY),
|
|||
|
szDestFile,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_FLOPPY_NOT_COMPLETE);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
if (bCopying) {
|
|||
|
// copy files in list from ??? to destination dir
|
|||
|
lstrcpy (szSrcFile, pAppInfo->piFloppyProtocol.szDir);
|
|||
|
if (szSrcFile[lstrlen(szSrcFile)-1] != cBackslash) lstrcat (szSrcFile, cszBackslash);
|
|||
|
szSrcFilePart = &szSrcFile[lstrlen(szSrcFile)];
|
|||
|
|
|||
|
for (szThisFile = mszNetFileList;
|
|||
|
*szThisFile != 0;
|
|||
|
szThisFile += (lstrlen(szThisFile) + 1)) {
|
|||
|
lstrcpy (szSrcFilePart, szThisFile);
|
|||
|
lstrcpy (szDestFilePart, szThisFile);
|
|||
|
|
|||
|
if (bCopying) {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FROM_PATH, szSrcFile);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_TO_PATH, szDestFile);
|
|||
|
|
|||
|
if (!CopyFile (szSrcFile, szDestFile, FALSE)) {
|
|||
|
// error in file copy so bail out here
|
|||
|
// bail out here since there was a copy error
|
|||
|
nMbResult = MessageBox (
|
|||
|
hwndDlg,
|
|||
|
GetStringResource (CSZ_UNABLE_COPY),
|
|||
|
szSrcFile,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
nExitCode = IDCANCEL; // operation ended in error
|
|||
|
} else {
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_FLOPPY_NOT_COMPLETE);
|
|||
|
}
|
|||
|
} else {
|
|||
|
// copy was successful so update the % complete
|
|||
|
// and Set destination File attributest to NORMAL
|
|||
|
SetFileAttributes (szDestFile, FILE_ATTRIBUTE_NORMAL);
|
|||
|
UpdatePercentComplete (hwndDlg, ++dwFilesCopied, dwNetFileCount);
|
|||
|
}
|
|||
|
|
|||
|
// check for messages
|
|||
|
|
|||
|
while (PeekMessage (&msg, 0, 0, 0, PM_REMOVE)) {
|
|||
|
TranslateMessage (&msg);
|
|||
|
DispatchMessage (&msg);
|
|||
|
}
|
|||
|
} else {
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if (bCopying) {
|
|||
|
if (wParam == SETUP_DOSV_1) {
|
|||
|
_stprintf (szTextString,
|
|||
|
GetStringResource (FMT_LOAD_NET_CLIENT2),
|
|||
|
GetStringResource (
|
|||
|
(pAppInfo->mtBootDriveType == F3_1Pt44_512) ?
|
|||
|
CSZ_35_HD : CSZ_525_HD),
|
|||
|
pAppInfo->szBootFilesPath);
|
|||
|
|
|||
|
nMbResult = MessageBox (
|
|||
|
hwndDlg,
|
|||
|
szTextString,
|
|||
|
GetStringResource (FMT_LOAD_NET_CLIENT2_TITLE),
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
|
|||
|
if (nMbResult == IDCANCEL) {
|
|||
|
bCopying = FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
if (bCopying) {
|
|||
|
#ifdef JAPAN
|
|||
|
if (((wParam == SETUP_DOSV_2) && bBootable) || !wParam) {
|
|||
|
#endif
|
|||
|
// files copied completely, but check params.
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_CHECK_PROTOCOL_INI);
|
|||
|
DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_FLOPPY_COMPLETE,
|
|||
|
0,
|
|||
|
MB_OK_TASK_INFO);
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
} else {
|
|||
|
if (!bAborted) {
|
|||
|
// don't show "not copied" dialog since they know
|
|||
|
// this
|
|||
|
// floppy not copied completely
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_FLOPPY_NOT_COMPLETE);
|
|||
|
DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_FLOPPY_NOT_COMPLETE,
|
|||
|
0,
|
|||
|
MB_OK_TASK_EXCL);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (nExitCode == IDOK) {
|
|||
|
// enable display of exit messages since a floppy was created
|
|||
|
EnableExitMessage(TRUE);
|
|||
|
}
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if (!wParam ||
|
|||
|
(wParam == SETUP_DOSV_2) ||
|
|||
|
((wParam == SETUP_DOSV_1) && !bCopying)) {
|
|||
|
#endif
|
|||
|
EndDialog (hwndDlg, nExitCode);
|
|||
|
#ifdef JAPAN
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
FREE_IF_ALLOC (mszNetFileList);
|
|||
|
FREE_IF_ALLOC (mszProtocolIni);
|
|||
|
FREE_IF_ALLOC (mszSystemIni);
|
|||
|
FREE_IF_ALLOC (mszConfigSys);
|
|||
|
FREE_IF_ALLOC (mszAutoexecBat);
|
|||
|
FREE_IF_ALLOC (szSrcFile);
|
|||
|
FREE_IF_ALLOC (szDestFile);
|
|||
|
FREE_IF_ALLOC (szInfFile);
|
|||
|
#ifdef JAPAN
|
|||
|
FREE_IF_ALLOC (szVolumeName);
|
|||
|
FREE_IF_ALLOC (szTextString);
|
|||
|
FREE_IF_ALLOC (szSectionBuffer);
|
|||
|
FREE_IF_ALLOC (szDOSVDirectory);
|
|||
|
FREE_IF_ALLOC (szTemp);
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef JAPAN
|
|||
|
if ((wParam == SETUP_DOSV_1) && !bCopying)
|
|||
|
return FALSE;
|
|||
|
#endif
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
MakeFlopDlg_WM_INITDIALOG (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initializes the text fields of the dialog box and post's the
|
|||
|
"start copying" message
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to dialog box window
|
|||
|
|
|||
|
IN WPARAM wParam
|
|||
|
Not Used
|
|||
|
|
|||
|
IN LPARAM lParam
|
|||
|
Not Used
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
// intialize Global data
|
|||
|
bCopying = TRUE;
|
|||
|
|
|||
|
RemoveMaximizeFromSysMenu (hwndDlg);
|
|||
|
PositionWindow (hwndDlg);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_COPY_APPNAME,
|
|||
|
GetStringResource (FMT_OTN_BOOT_FILES));
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FROM_PATH, cszEmptyString);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_TO_PATH, cszEmptyString);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_PERCENT_COMPLETE,
|
|||
|
GetStringResource (FMT_ZERO_PERCENT_COMPLETE));
|
|||
|
SetFocus (GetDlgItem(hwndDlg, IDCANCEL));
|
|||
|
|
|||
|
// start copying files
|
|||
|
PostMessage (hwndDlg, NCDU_START_FILE_COPY, 0, lParam);
|
|||
|
// clear old Dialog and register current
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_CLEAR_DLG, (WPARAM)hwndDlg, IDOK);
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_REGISTER_DLG,
|
|||
|
NCDU_COPYING_FILES_DLG, (LPARAM)hwndDlg);
|
|||
|
SetCursor(LoadCursor(NULL, IDC_ARROW));
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
MakeFlopDlg_WM_COMMAND (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Process WM_COMMAND message. Stops copying if the Cancel (abort)
|
|||
|
button is pressed.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to dialog box procedure
|
|||
|
|
|||
|
IN WPARAM wParam
|
|||
|
LOWORD contains the id of the control that initiated this message
|
|||
|
|
|||
|
IN LPARAM lParam
|
|||
|
Not Used
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
switch (LOWORD(wParam)) {
|
|||
|
case IDCANCEL:
|
|||
|
bCopying = FALSE;
|
|||
|
return TRUE;
|
|||
|
|
|||
|
default: return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
INT_PTR CALLBACK
|
|||
|
MakeFlopDlgProc (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN UINT message,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Main Dialog Box Procedure. Dispatches Windows messages to the appropriate
|
|||
|
processing routine. The following windows messages are processed
|
|||
|
by this module:
|
|||
|
|
|||
|
WM_INITDIALOG: dialog initialization routine
|
|||
|
WM_COMMAND: user input
|
|||
|
NCDU_START_FILE_COPY: local windows message to start copy op.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Standard WNDPROC arguments
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE if message is not processed by this routine, otherwise
|
|||
|
the value returned by the dispatched routine.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
switch (message) {
|
|||
|
case WM_INITDIALOG: return (MakeFlopDlg_WM_INITDIALOG (hwndDlg, wParam, lParam));
|
|||
|
case WM_COMMAND: return (MakeFlopDlg_WM_COMMAND (hwndDlg, wParam, lParam));
|
|||
|
#ifdef JAPAN
|
|||
|
// fixed kkntbug #12382
|
|||
|
// NCAdmin:"[] Make Japanese startup disks" is not functioning.
|
|||
|
|
|||
|
case NCDU_START_FILE_COPY:
|
|||
|
if (bJpnDisk) {
|
|||
|
if (!MakeFlopDlg_NCDU_START_FILE_COPY (hwndDlg, SETUP_DOSV_1, lParam))
|
|||
|
return TRUE;
|
|||
|
|
|||
|
return (MakeFlopDlg_NCDU_START_FILE_COPY (hwndDlg, SETUP_DOSV_2, lParam));
|
|||
|
}
|
|||
|
else
|
|||
|
return (MakeFlopDlg_NCDU_START_FILE_COPY (hwndDlg, wParam, lParam));
|
|||
|
#else
|
|||
|
case NCDU_START_FILE_COPY: return (MakeFlopDlg_NCDU_START_FILE_COPY (hwndDlg, wParam, lParam));
|
|||
|
#endif
|
|||
|
case WM_PAINT: return (Dlg_WM_PAINT (hwndDlg, wParam, lParam));
|
|||
|
case WM_MOVE: return (Dlg_WM_MOVE (hwndDlg, wParam, lParam));
|
|||
|
case WM_SYSCOMMAND: return (Dlg_WM_SYSCOMMAND (hwndDlg, wParam, lParam));
|
|||
|
default: return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|