952 lines
29 KiB
C
952 lines
29 KiB
C
/*++
|
||
|
||
Copyright (c) 1994 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
COPYFLOP.C
|
||
|
||
Abstract:
|
||
|
||
Floppy disk creation setup dialog
|
||
|
||
Author:
|
||
|
||
Bob Watson (a-robw)
|
||
|
||
Revision History:
|
||
|
||
17 Feb 94 Written
|
||
|
||
--*/
|
||
//
|
||
// Windows Include Files
|
||
//
|
||
|
||
#include <windows.h>
|
||
#include <stdio.h>
|
||
#include <malloc.h>
|
||
#include <tchar.h> // unicode macros
|
||
//
|
||
// app include files
|
||
//
|
||
#include "otnboot.h"
|
||
#include "otnbtdlg.h"
|
||
|
||
//
|
||
// static data for this module
|
||
//
|
||
//
|
||
// mszDirNameList is the local list of directories that corresponds to the
|
||
// items displayed in the Client List. This buffer is loaded by the
|
||
// LoadClientList routine and the entry index of the directory is the
|
||
// Item Data for the list box name entry.
|
||
//
|
||
static TCHAR mszDirNameList[SMALL_BUFFER_SIZE];
|
||
//
|
||
// These string arrays are used to cross reference the drive selected
|
||
// to the "drive name" for IOCTL functions or the Dir name for file
|
||
// operations.
|
||
//
|
||
static LPCTSTR szDriveNames[2] = {TEXT("\\\\.\\A:"), TEXT("\\\\.\\B:")};
|
||
static LPCTSTR szDriveDirs[2] = {TEXT("A:"), TEXT("B:")};
|
||
|
||
#ifdef TERMSRV
|
||
extern TCHAR szCommandLineVal[MAX_PATH];
|
||
extern BOOL bUseCleanDisks;
|
||
#endif // TERMSRV
|
||
|
||
|
||
static
|
||
MEDIA_TYPE
|
||
GetDriveTypeFromList (
|
||
IN HWND hwndDlg
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Gets the selected drive from the drive list box and looks up the drive
|
||
type using the IOCTL function. The drive type enum value is
|
||
returned.
|
||
|
||
NOTE: This function may cause a system error box if there is no media
|
||
in the drive or there is a device/drive error.
|
||
|
||
Arguments:
|
||
|
||
IN HWND hwndDlg
|
||
handle to the dialog box window
|
||
|
||
Return Value:
|
||
|
||
value of type MEDIA_TYPE that corresponds to the drive type of the
|
||
drive selected in the drive list box.
|
||
|
||
--*/
|
||
{
|
||
int nSelIndex;
|
||
HANDLE hFloppy;
|
||
DWORD dwRetSize;
|
||
DISK_GEOMETRY dgFloppy;
|
||
|
||
// get selected drive
|
||
nSelIndex = (int)SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST,
|
||
LB_GETCURSEL, 0, 0);
|
||
|
||
// open device to get type
|
||
hFloppy = CreateFile (
|
||
szDriveNames[nSelIndex],
|
||
0,
|
||
(FILE_SHARE_READ | FILE_SHARE_WRITE),
|
||
NULL,
|
||
OPEN_EXISTING,
|
||
FILE_ATTRIBUTE_NORMAL,
|
||
NULL);
|
||
|
||
if (hFloppy != INVALID_HANDLE_VALUE) {
|
||
// get drive information
|
||
if (!DeviceIoControl (hFloppy,
|
||
IOCTL_DISK_GET_DRIVE_GEOMETRY,
|
||
NULL, 0,
|
||
&dgFloppy,
|
||
sizeof(DISK_GEOMETRY),
|
||
&dwRetSize,
|
||
NULL) ){
|
||
// unable to get data so set to unknown
|
||
dgFloppy.MediaType = Unknown;
|
||
} // else return data from returned structure
|
||
CloseHandle (hFloppy);
|
||
} else {
|
||
// unable to access floppy, so return unknown
|
||
dgFloppy.MediaType = Unknown;
|
||
}
|
||
|
||
return dgFloppy.MediaType;
|
||
}
|
||
|
||
static
|
||
VOID
|
||
FillDriveList (
|
||
IN HWND hwndDlg
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Loads the text strings into the drive selection list box.
|
||
|
||
NOTE: The order of these entries is significant in that it is
|
||
used to index into the static device and drive name arrays.
|
||
|
||
Arguments:
|
||
|
||
IN HWND hwndDlg
|
||
handle to dialog box window
|
||
|
||
Return Value:
|
||
|
||
NONE
|
||
|
||
--*/
|
||
{
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
PDISK_GEOMETRY pDiskGeometry;
|
||
HANDLE hDrive;
|
||
LPTSTR szDrive;
|
||
TCHAR cDriveName;
|
||
BYTE nCounter;
|
||
BOOL bFloppy;
|
||
BOOL bRet;
|
||
DWORD dwArryCount;
|
||
DWORD dwLastError;
|
||
DWORD dwMediaType;
|
||
DWORD dwLogicalDrive;
|
||
DWORD dwReturnedByteCount;
|
||
#endif
|
||
|
||
// clear list box
|
||
SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST, LB_RESETCONTENT, 0, 0);
|
||
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
szDrive = GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
|
||
if (szDrive != NULL) {
|
||
dwLogicalDrive = GetLogicalDrives();
|
||
for (cDriveName = *cszAColon, nCounter = 0;
|
||
cDriveName <= *cszLastDrive;
|
||
cDriveName++, nCounter++) {
|
||
|
||
if ((dwLogicalDrive>>nCounter)&NCDU_LOGICAL_DRIVE_MASK) {
|
||
|
||
bFloppy = FALSE;
|
||
|
||
wsprintf (szDrive, TEXT("%s%s%s%c%s"),
|
||
cszDoubleBackslash, cszDot, cszBackslash, cDriveName, cszColon);
|
||
|
||
hDrive = CreateFile (szDrive,
|
||
0,
|
||
(FILE_SHARE_READ | FILE_SHARE_WRITE),
|
||
NULL,
|
||
OPEN_EXISTING,
|
||
FILE_ATTRIBUTE_NORMAL,
|
||
NULL);
|
||
|
||
if (hDrive != INVALID_HANDLE_VALUE) {
|
||
|
||
dwArryCount = 1;
|
||
pDiskGeometry = NULL;
|
||
|
||
do {
|
||
if (!pDiskGeometry)
|
||
pDiskGeometry = (PDISK_GEOMETRY)
|
||
GlobalLock (GlobalAlloc (GHND,
|
||
sizeof(DISK_GEOMETRY)*dwArryCount));
|
||
else
|
||
pDiskGeometry = (PDISK_GEOMETRY)
|
||
GlobalLock (GlobalReAlloc (GlobalHandle (pDiskGeometry),
|
||
sizeof(DISK_GEOMETRY)*dwArryCount,
|
||
GHND));
|
||
|
||
if (!pDiskGeometry) break;
|
||
|
||
bRet = DeviceIoControl (hDrive,
|
||
IOCTL_DISK_GET_MEDIA_TYPES,
|
||
NULL,
|
||
0,
|
||
pDiskGeometry,
|
||
sizeof(DISK_GEOMETRY)*dwArryCount,
|
||
&dwReturnedByteCount,
|
||
NULL);
|
||
|
||
dwLastError = GetLastError();
|
||
|
||
GlobalUnlock(GlobalHandle(pDiskGeometry));
|
||
|
||
dwArryCount++;
|
||
} while ( ! bRet && ( dwLastError == ERROR_INSUFFICIENT_BUFFER ||
|
||
dwLastError == ERROR_MORE_DATA ) );
|
||
|
||
if (pDiskGeometry) {
|
||
pDiskGeometry = (PDISK_GEOMETRY)GlobalLock(GlobalHandle(pDiskGeometry));
|
||
for (dwMediaType = 0; dwMediaType < (dwArryCount-1); dwMediaType++) {
|
||
if (((pDiskGeometry+dwMediaType)->MediaType != Unknown) &&
|
||
((pDiskGeometry+dwMediaType)->MediaType != RemovableMedia) &&
|
||
((pDiskGeometry+dwMediaType)->MediaType != FixedMedia))
|
||
bFloppy = TRUE;
|
||
}
|
||
GlobalUnlock(GlobalHandle(pDiskGeometry));
|
||
GlobalFree(GlobalHandle(pDiskGeometry));
|
||
}
|
||
|
||
if (bFloppy) {
|
||
wsprintf (szDrive, TEXT("%c%s"), cDriveName, cszColon);
|
||
SendDlgItemMessage (hwndDlg,
|
||
NCDU_DRIVE_LIST,
|
||
LB_ADDSTRING,
|
||
0,
|
||
(LPARAM)szDrive);
|
||
}
|
||
|
||
CloseHandle (hDrive);
|
||
}
|
||
}
|
||
}
|
||
FREE_IF_ALLOC (szDrive);
|
||
} else {
|
||
#else
|
||
SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST, LB_ADDSTRING, 0, (LPARAM)cszAColon);
|
||
SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST, LB_ADDSTRING, 0, (LPARAM)cszBColon);
|
||
#endif
|
||
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
}
|
||
#endif
|
||
|
||
SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST, LB_SETCURSEL, 0, 0);
|
||
|
||
}
|
||
|
||
static
|
||
DWORD
|
||
NumberOfDisks (
|
||
IN HWND hwndDlg
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Counts the number of "disk" directories in the currently selected client
|
||
installation disk dir. The method used to count disks relies on the
|
||
assumption that each disk's files are in a directory and the
|
||
directories are mamed Disk1, Disk2, etc. The count is performed by
|
||
looking for each disk directory in sequence and stopping when a
|
||
dir is not found. i.e. if disk5 is not found, then 4 disks are
|
||
assumed.
|
||
|
||
Arguments:
|
||
|
||
Handle to dialog box window
|
||
|
||
Return Value:
|
||
|
||
count of directorys ("disks") found
|
||
|
||
--*/
|
||
{
|
||
LPTSTR szFromPath;
|
||
LPTSTR szDirStart;
|
||
BOOL bCounting;
|
||
UINT nClientIndex;
|
||
DWORD nDiskNumber = 0;
|
||
|
||
szFromPath = GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
|
||
if (szFromPath != NULL) {
|
||
// get root dir of dist tree
|
||
lstrcpy (szFromPath, pAppInfo->szDistPath);
|
||
if (szFromPath[lstrlen(szFromPath)-1] != cBackslash) lstrcat (szFromPath, cszBackslash);
|
||
|
||
// append client sw subdir
|
||
nClientIndex = (UINT)SendDlgItemMessage (hwndDlg, NCDU_CLIENT_SOFTWARE_LIST,
|
||
LB_GETCURSEL, 0, 0);
|
||
lstrcat (szFromPath, GetEntryInMultiSz (mszDirNameList, nClientIndex+1));
|
||
if (szFromPath[lstrlen(szFromPath)-1] != cBackslash) lstrcat (szFromPath, cszBackslash);
|
||
lstrcat (szFromPath, cszDisksSubDir);
|
||
if (szFromPath[lstrlen(szFromPath)-1] != cBackslash) lstrcat (szFromPath, cszBackslash);
|
||
szDirStart = &szFromPath[lstrlen(szFromPath)];
|
||
|
||
// count directories
|
||
bCounting = TRUE;
|
||
nDiskNumber = 0;
|
||
while (bCounting) {
|
||
nDiskNumber++;
|
||
_stprintf (szDirStart, fmtDiskNumber,
|
||
nDiskNumber);
|
||
bCounting = IsPathADir (szFromPath);
|
||
}
|
||
// account for last directory that wasn't found
|
||
nDiskNumber -= 1;
|
||
|
||
FREE_IF_ALLOC (szFromPath);
|
||
}
|
||
|
||
return nDiskNumber; // for now
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
UpdateDiskCount (
|
||
IN HWND hwndDlg
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
updates the disk count text displayed in the dialog box.
|
||
|
||
Arguments:
|
||
|
||
IN HWND hwndDlg
|
||
handle to dialog box window
|
||
|
||
Return Value:
|
||
|
||
TRUE if display updated successfully
|
||
FALSE if not.
|
||
|
||
--*/
|
||
{
|
||
LPTSTR szBuffer;
|
||
DWORD dwNumDisks;
|
||
|
||
szBuffer = GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
|
||
if (szBuffer != NULL) {
|
||
dwNumDisks = NumberOfDisks (hwndDlg);
|
||
if (dwNumDisks == 1) {
|
||
_stprintf (szBuffer, GetStringResource (FMT_1_DISK_REQUIRED));
|
||
} else {
|
||
_stprintf (szBuffer, GetStringResource (FMT_N_DISKS_REQUIRED),
|
||
dwNumDisks);
|
||
}
|
||
SetDlgItemText (hwndDlg, NCDU_NUM_DISKS_REQUIRED, szBuffer);
|
||
FREE_IF_ALLOC (szBuffer);
|
||
return TRUE;
|
||
} else {
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
CopyFlopDlg_WM_INITDIALOG (
|
||
IN HWND hwndDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Dialog box initialization routine. Loads list boxes in dialog
|
||
|
||
Arguments:
|
||
|
||
IN HWND hwndDlg
|
||
Handle to dialog box window
|
||
|
||
IN WPARAM wParam
|
||
Not used
|
||
|
||
IN LPARAM lParam
|
||
Not used
|
||
|
||
Return Value:
|
||
|
||
FALSE, always.
|
||
|
||
--*/
|
||
{
|
||
// update dialog window menu and position
|
||
RemoveMaximizeFromSysMenu (hwndDlg);
|
||
PositionWindow (hwndDlg);
|
||
|
||
// load clients to display
|
||
LoadClientList (hwndDlg, NCDU_CLIENT_SOFTWARE_LIST,
|
||
pAppInfo->szDistPath, CLT_FLOPPY_INSTALL, mszDirNameList);
|
||
|
||
// set selection
|
||
SendDlgItemMessage (hwndDlg, NCDU_CLIENT_SOFTWARE_LIST,
|
||
LB_SETCURSEL, (WPARAM)0, (LPARAM)0);
|
||
|
||
// load drives to select from
|
||
FillDriveList(hwndDlg);
|
||
|
||
// update disk count to reflect default selection
|
||
UpdateDiskCount (hwndDlg);
|
||
|
||
// clear old Dialog and register current
|
||
PostMessage (GetParent(hwndDlg), NCDU_CLEAR_DLG, (WPARAM)hwndDlg, IDOK);
|
||
PostMessage (GetParent(hwndDlg), NCDU_REGISTER_DLG,
|
||
NCDU_CREATE_INSTALL_DISKS_DLG, (LPARAM)hwndDlg);
|
||
|
||
// set cursor and focus
|
||
SetCursor(LoadCursor(NULL, IDC_ARROW));
|
||
SetFocus (GetDlgItem(hwndDlg, NCDU_MAKE_DISKS));
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
CopyFlopDlg_NCDU_MAKE_DISKS (
|
||
IN HWND hwndDlg
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Function to copy the client files to the floppy disks.
|
||
Selects the source directory using the client name and
|
||
disk type then copies the files to the floppy disks
|
||
sequentially assuming that the contents of each disk
|
||
are stored in sub directory named "DiskX" where X is the
|
||
decimal number indicating the disk sequence (e.g. 1, 2, 3, etc.)
|
||
|
||
Arguments:
|
||
|
||
IN HWND hwndDlg
|
||
Handle to dialog box window
|
||
|
||
Return Value:
|
||
FALSE, always.
|
||
|
||
--*/
|
||
{
|
||
MEDIA_TYPE mtFloppy;
|
||
LPTSTR szFromPath;
|
||
LPTSTR szInfName;
|
||
TCHAR szSubDir[16];
|
||
TCHAR szDestRoot[4];
|
||
TCHAR szDriveRoot[8];
|
||
LPTSTR szClientName;
|
||
LPTSTR szDisplayName;
|
||
LPTSTR szDirStart;
|
||
LPTSTR szDiskName;
|
||
LPTSTR szClientSection;
|
||
LPTSTR szDisplayString;
|
||
LPTSTR szVolumeLabel;
|
||
DWORD dwFileAttr;
|
||
BOOL bCopyFiles;
|
||
int nSelIndex;
|
||
int nClientIndex;
|
||
int nCancelResult = 0;
|
||
int nDiskNumber;
|
||
CF_DLG_DATA cfData;
|
||
BOOL bFormatDisks;
|
||
#ifdef TERMSRV
|
||
int nDiskCount;
|
||
#endif // TERMSRV
|
||
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
//
|
||
// Buffer for real FD path
|
||
//
|
||
TCHAR szDriveName[10];
|
||
TCHAR szDriveDir[5];
|
||
#endif
|
||
|
||
szFromPath = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
szInfName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
szClientName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
szDisplayName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
szDiskName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
szClientSection = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
szVolumeLabel = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
|
||
if ((szFromPath == NULL) ||
|
||
(szClientName == NULL) ||
|
||
(szClientSection == NULL) ||
|
||
(szInfName == NULL) ||
|
||
(szDiskName == NULL) ||
|
||
(szVolumeLabel == NULL) ||
|
||
(szDisplayName == NULL)) {
|
||
// message not processed
|
||
return FALSE;
|
||
}
|
||
|
||
// check floppy selection to see if it's supported
|
||
|
||
//
|
||
// This function is really flakey, so for now, (for ever?)
|
||
// we'll assume they are using a HD disk drive
|
||
//
|
||
// mtFloppy = GetDriveTypeFromList (hwndDlg);
|
||
//
|
||
mtFloppy = F3_1Pt44_512;
|
||
|
||
if ((mtFloppy == F5_1Pt2_512) || // 5.25 HD
|
||
(mtFloppy == F3_1Pt44_512)) { // 3.5 HD
|
||
// get format check box state
|
||
bFormatDisks = (BOOL)(IsDlgButtonChecked (hwndDlg, NCDU_FORMAT_DISKS) == CHECKED);
|
||
|
||
// then this is a supported format
|
||
// make source path using:
|
||
// dist tree + client type + "disks" + drive type
|
||
//
|
||
// get root dir of dist tree
|
||
lstrcpy (szFromPath, pAppInfo->szDistPath);
|
||
if (szFromPath[lstrlen(szFromPath)-1] != cBackslash) lstrcat (szFromPath, cszBackslash);
|
||
|
||
// append client sw subdir
|
||
nClientIndex = (int)SendDlgItemMessage (hwndDlg, NCDU_CLIENT_SOFTWARE_LIST,
|
||
LB_GETCURSEL, 0, 0);
|
||
lstrcat (szFromPath, GetEntryInMultiSz (mszDirNameList, nClientIndex+1));
|
||
if (szFromPath[lstrlen(szFromPath)-1] != cBackslash) lstrcat (szFromPath, cszBackslash);
|
||
lstrcat (szFromPath, cszDisksSubDir);
|
||
|
||
// make INF file Name
|
||
|
||
lstrcpy (szInfName, pAppInfo->szDistPath);
|
||
if (szInfName[lstrlen(szInfName)-1] != cBackslash) lstrcat (szInfName, cszBackslash);
|
||
lstrcat (szInfName, cszAppInfName);
|
||
|
||
// get client name
|
||
SendDlgItemMessage (hwndDlg, NCDU_CLIENT_SOFTWARE_LIST,
|
||
LB_GETTEXT, (WPARAM)nClientIndex, (LPARAM)szClientName);
|
||
|
||
if (szFromPath[lstrlen(szFromPath)-1] != cBackslash) lstrcat (szFromPath, cszBackslash);
|
||
szDirStart = &szFromPath[lstrlen(szFromPath)];
|
||
|
||
nSelIndex = (int)SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST,
|
||
LB_GETCURSEL, 0, 0);
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
// get real FD path
|
||
SendDlgItemMessage (hwndDlg, NCDU_DRIVE_LIST,
|
||
LB_GETTEXT, nSelIndex, (LPARAM)szDriveDir);
|
||
wsprintf(szDriveName, TEXT("%s%s%s%s"), cszBackslash,cszBackslash,cszColon,cszBackslash);
|
||
lstrcat(szDriveName, szDriveDir);
|
||
#endif
|
||
|
||
// format client name key used to look up disk names in INF
|
||
lstrcpy (szClientSection, GetEntryInMultiSz (mszDirNameList, nClientIndex+1));
|
||
lstrcat (szClientSection, cszNames);
|
||
|
||
// set the destination path
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
lstrcpy (szDestRoot, szDriveDir);
|
||
lstrcpy (szDriveRoot, szDriveName);
|
||
lstrcat (szDriveRoot, cszBackslash);
|
||
#else
|
||
lstrcpy (szDestRoot, szDriveDirs[nSelIndex]);
|
||
lstrcpy (szDriveRoot, szDriveNames[nSelIndex]);
|
||
lstrcat (szDriveRoot, cszBackslash);
|
||
#endif
|
||
|
||
nDiskNumber = 1;
|
||
_stprintf (szSubDir, fmtDiskNumber, nDiskNumber);
|
||
lstrcpy (szDirStart, szSubDir);
|
||
if ((dwFileAttr = QuietGetFileAttributes(szFromPath)) != 0xFFFFFFFF) {
|
||
bCopyFiles = TRUE;
|
||
} else {
|
||
bCopyFiles = FALSE;
|
||
}
|
||
// initialize counter fields
|
||
cfData.dwFilesCopied = 0;
|
||
cfData.dwDirsCreated = 0;
|
||
|
||
while (bCopyFiles) {
|
||
if ((dwFileAttr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
|
||
// see if this disk has a name, if so display it, otherwise
|
||
// just show the disk number
|
||
if (QuietGetPrivateProfileString (szClientSection, szSubDir,
|
||
cszEmptyString, szDiskName, MAX_PATH, szInfName) == 0) {
|
||
lstrcpy (szDiskName, szSubDir);
|
||
} else {
|
||
// append "disk" to the name string
|
||
lstrcat (szDiskName, cszDisk);
|
||
}
|
||
// display "load the floppy" message
|
||
_stprintf (szDisplayName,
|
||
GetStringResource (FMT_CLIENT_DISK_AND_DRIVE),
|
||
#ifdef JAPAN
|
||
// fixed kkntbug #11940
|
||
// Network client administrator can not make install disks on PC with C drive as FD
|
||
|
||
szClientName, szDiskName, szDriveDir);
|
||
#else
|
||
szClientName, szDiskName, szDriveDirs[nSelIndex]);
|
||
#endif
|
||
|
||
nCancelResult = MessageBox (
|
||
hwndDlg,
|
||
szDisplayName,
|
||
GetStringResource (FMT_INSERT_FLOPPY),
|
||
MB_OKCANCEL_TASK_INFO);
|
||
|
||
if (nCancelResult == IDOK) {
|
||
// format the copying files message
|
||
_stprintf (szDisplayName,
|
||
GetStringResource (FMT_CLIENT_DISPLAY_NAME),
|
||
szClientName, szDiskName);
|
||
|
||
// set the disk volume label if one is in the INF
|
||
lstrcat (szSubDir, cszLabel);
|
||
if (QuietGetPrivateProfileString (szClientSection, szSubDir,
|
||
cszEmptyString, szVolumeLabel, MAX_PATH, szInfName) > 0) {
|
||
}
|
||
|
||
if (bFormatDisks) {
|
||
while (!FormatDiskInDrive (hwndDlg,
|
||
szDestRoot[0],
|
||
szVolumeLabel,
|
||
TRUE)) {
|
||
|
||
// an error occured so see if they want to try again or bail out
|
||
if (DisplayMessageBox (hwndDlg,
|
||
IDS_CORRECT_FMT_ERROR,
|
||
FMT_INSERT_FLOPPY,
|
||
MB_OKCANCEL_TASK_EXCL) == IDCANCEL) {
|
||
bCopyFiles = FALSE;
|
||
nCancelResult = IDCANCEL;
|
||
break; // now exit retry loop
|
||
}
|
||
}
|
||
if (!bCopyFiles) continue; // bail out at the top
|
||
}
|
||
|
||
cfData.szDisplayName = szDisplayName;
|
||
cfData.szSourceDir = szFromPath;
|
||
cfData.szDestDir = szDestRoot;
|
||
cfData.dwCopyFlags = CD_FLAGS_COPY_SUB_DIR | CD_FLAGS_COPY_ATTR | CD_FLAGS_IGNORE_ERROR;
|
||
cfData.dwTotalSize = 0;
|
||
|
||
if (bUseCleanDisks) {
|
||
WIN32_FIND_DATA fdSearch;
|
||
TCHAR filesToFind[8];
|
||
HANDLE hSearch;
|
||
BOOL bDiskContainsFiles;
|
||
|
||
lstrcpy(filesToFind, szDestRoot);
|
||
if (filesToFind[lstrlen(filesToFind)-1] != cBackslash) {
|
||
lstrcat (filesToFind, cszBackslash);
|
||
}
|
||
lstrcat(filesToFind, cszWildcard);
|
||
|
||
// loop till the user inserts an empty disk, or hits cancel.
|
||
|
||
do {
|
||
nCancelResult = IDOK;
|
||
bDiskContainsFiles = FALSE;
|
||
|
||
hSearch = FindFirstFile(filesToFind, &fdSearch);
|
||
|
||
if(hSearch != INVALID_HANDLE_VALUE) {
|
||
BOOL bSearching = TRUE;
|
||
while (bSearching) {
|
||
if (!DotOrDotDotDir(fdSearch.cFileName)) {
|
||
//
|
||
// looks like some files are already existing there..
|
||
//
|
||
bDiskContainsFiles = TRUE;
|
||
nCancelResult = DisplayMessageBox (
|
||
hwndDlg,
|
||
NCDU_CLEAN_DISK_REQUIRED,
|
||
0,
|
||
(MB_OKCANCEL | MB_ICONERROR | MB_TASKMODAL));
|
||
break;
|
||
}
|
||
bSearching = FindNextFile(hSearch, &fdSearch);
|
||
}
|
||
FindClose(hSearch);
|
||
}
|
||
}
|
||
while (bDiskContainsFiles && nCancelResult != IDCANCEL);
|
||
|
||
if (nCancelResult == IDCANCEL) {
|
||
bCopyFiles = FALSE;
|
||
}
|
||
}
|
||
|
||
if (!bCopyFiles) continue; // bail out at the top
|
||
|
||
nCancelResult = (int)DialogBoxParam (
|
||
(HANDLE)GetWindowLongPtr(GetParent(hwndDlg), GWLP_HINSTANCE),
|
||
MAKEINTRESOURCE(NCDU_COPYING_FILES_DLG),
|
||
hwndDlg,
|
||
CopyFileDlgProc,
|
||
(LPARAM)&cfData);
|
||
|
||
if (nCancelResult == IDCANCEL) {
|
||
bCopyFiles = FALSE;
|
||
} else {
|
||
// set volume label (if not set already)
|
||
if ((!bFormatDisks) & (lstrlen(szVolumeLabel) > 0)) {
|
||
// set volume label here
|
||
LabelDiskInDrive (hwndDlg, szDestRoot[0], szVolumeLabel);
|
||
}
|
||
}
|
||
|
||
} else {
|
||
bCopyFiles = FALSE;
|
||
}
|
||
}
|
||
if (bCopyFiles) {
|
||
_stprintf (szSubDir, fmtDiskNumber, ++nDiskNumber);
|
||
lstrcpy (szDirStart, szSubDir);
|
||
if ((dwFileAttr = QuietGetFileAttributes(szFromPath)) != 0xFFFFFFFF) {
|
||
bCopyFiles = TRUE;
|
||
} else {
|
||
bCopyFiles = FALSE;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (nCancelResult != IDCANCEL) {
|
||
szDisplayString = GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
||
if (szDisplayString == NULL) {
|
||
// unable to allocate string buffer so try default message
|
||
DisplayMessageBox (
|
||
hwndDlg,
|
||
NCDU_COPY_COMPLETE,
|
||
0,
|
||
MB_OK_TASK_INFO);
|
||
} else {
|
||
#ifdef TERMSRV
|
||
nDiskCount = NumberOfDisks(hwndDlg);
|
||
_stprintf (szDisplayString,
|
||
GetStringResource (
|
||
//(cfData.dwDirsCreated == 1) ?
|
||
(nDiskCount == 1) ?
|
||
FMT_COPY_COMPLETE_STATS1 :
|
||
FMT_COPY_COMPLETE_STATS2),
|
||
nDiskCount, cfData.dwFilesCopied);
|
||
#else // TERMSRV
|
||
_stprintf (szDisplayString,
|
||
GetStringResource (FMT_COPY_COMPLETE_STATS),
|
||
cfData.dwDirsCreated, cfData.dwFilesCopied);
|
||
#endif // TERMSRV
|
||
MessageBox (
|
||
hwndDlg, szDisplayString,
|
||
GetStringResource (SZ_APP_TITLE),
|
||
MB_OK_TASK_INFO);
|
||
FREE_IF_ALLOC (szDisplayString);
|
||
}
|
||
} else {
|
||
DisplayMessageBox (
|
||
hwndDlg,
|
||
NCDU_DISK_NOT_DONE,
|
||
0,
|
||
MB_OK_TASK_EXCL);
|
||
}
|
||
|
||
PostMessage (GetParent(hwndDlg), NCDU_SHOW_SW_CONFIG_DLG, 0, 0);
|
||
SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||
|
||
} else {
|
||
// unsupported format
|
||
nCancelResult = DisplayMessageBox (
|
||
hwndDlg,
|
||
NCDU_UNKNOWN_FLOPPY,
|
||
0,
|
||
MB_OK_TASK_EXCL);
|
||
}
|
||
|
||
FREE_IF_ALLOC (szFromPath);
|
||
FREE_IF_ALLOC (szClientName);
|
||
FREE_IF_ALLOC (szDisplayName);
|
||
FREE_IF_ALLOC (szInfName);
|
||
FREE_IF_ALLOC (szDiskName);
|
||
FREE_IF_ALLOC (szVolumeLabel);
|
||
FREE_IF_ALLOC (szClientSection);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
static
|
||
BOOL
|
||
CopyFlopDlg_WM_COMMAND (
|
||
IN HWND hwndDlg,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
processes the WM_COMMAND windows message. The only buttons processed
|
||
are:
|
||
IDCANCEL which will cause the dlg box to exit.
|
||
Make Disks start the copy file process
|
||
|
||
Arguments:
|
||
|
||
IN HWND hwndDlg
|
||
Handle to dialog box window
|
||
|
||
IN WPARAM wParam
|
||
LOWORD has ID of control selected
|
||
|
||
IN LPARAM lParam
|
||
Not Used.
|
||
|
||
Return Value:
|
||
|
||
TRUE if message not processed,
|
||
otherwise value returned by selected function
|
||
|
||
--*/
|
||
{
|
||
switch (LOWORD(wParam)) {
|
||
case IDCANCEL:
|
||
switch (HIWORD(wParam)) {
|
||
case BN_CLICKED:
|
||
#ifdef TERMSRV
|
||
if ( szCommandLineVal[0] != 0x00 )
|
||
PostQuitMessage(ERROR_SUCCESS);
|
||
#endif // TERMSRV
|
||
PostMessage (GetParent(hwndDlg), NCDU_SHOW_SHARE_NET_SW_DLG, 0, 0);
|
||
SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
|
||
case NCDU_CLIENT_SOFTWARE_LIST:
|
||
switch (HIWORD(wParam)) {
|
||
case LBN_SELCHANGE:
|
||
// update the disk count for the currently selected client
|
||
UpdateDiskCount (hwndDlg);
|
||
return TRUE;
|
||
|
||
case LBN_DBLCLK:
|
||
// pretend that the OK buton was pressed
|
||
PostMessage (hwndDlg, WM_COMMAND,
|
||
MAKEWPARAM (NCDU_MAKE_DISKS, BN_CLICKED),
|
||
(LPARAM)GetDlgItem(hwndDlg, NCDU_MAKE_DISKS));
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
|
||
case NCDU_MAKE_DISKS: return CopyFlopDlg_NCDU_MAKE_DISKS (hwndDlg);
|
||
case NCDU_CREATE_INSTALL_DISKS_HELP:
|
||
switch (HIWORD(wParam)) {
|
||
case BN_CLICKED:
|
||
// return ShowAppHelp (hwndDlg, LOWORD(wParam));
|
||
return PostMessage (GetParent(hwndDlg), WM_HOTKEY,
|
||
(WPARAM)NCDU_HELP_HOT_KEY, 0);
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
|
||
default: return TRUE;
|
||
}
|
||
}
|
||
|
||
INT_PTR CALLBACK
|
||
CopyFlopDlgProc (
|
||
IN HWND hwndDlg,
|
||
IN UINT message,
|
||
IN WPARAM wParam,
|
||
IN LPARAM lParam
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Main window processing routine. Processes the following messages by
|
||
dispatching to the local processing routine. All other messages
|
||
are handled by the default dialog procedure.
|
||
|
||
WM_INITDIALOG: dialog box initialization
|
||
WM_COMMAND: user input message
|
||
WM_PAINT: for painting icon when minimized
|
||
WM_MOVE: for saving the new location of the window
|
||
WM_SYSCOMMAND: for processing menu messages
|
||
|
||
|
||
Arguments:
|
||
|
||
standard WNDPROC arguments
|
||
|
||
Return Value:
|
||
|
||
FALSE if message not processed here, otherwise
|
||
value returned by dispatched routine.
|
||
|
||
--*/
|
||
{
|
||
switch (message) {
|
||
case WM_INITDIALOG: return (CopyFlopDlg_WM_INITDIALOG (hwndDlg, wParam, lParam));
|
||
case WM_COMMAND: return (CopyFlopDlg_WM_COMMAND (hwndDlg, wParam, lParam));
|
||
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;
|
||
}
|
||
}
|
||
|