windows-nt/Source/XPSP1/NT/termsrv/clcreator/makeflop.c
2020-09-26 16:20:57 +08:00

1853 lines
54 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}
}