989 lines
27 KiB
C
989 lines
27 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
SERVCONN.C
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Show server connection configuration dialog box
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Bob Watson (a-robw)
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
17 Feb 94 Written
|
|||
|
|
|||
|
--*/
|
|||
|
//
|
|||
|
// Windows Include Files
|
|||
|
//
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <time.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include <tchar.h> // unicode macros
|
|||
|
#include <commdlg.h> // common dialog defines
|
|||
|
#include <lmcons.h> // lanman API constant definitions
|
|||
|
#include <lmserver.h> // server info API's
|
|||
|
//
|
|||
|
// app include files
|
|||
|
//
|
|||
|
#include "otnboot.h"
|
|||
|
#include "otnbtdlg.h"
|
|||
|
//
|
|||
|
#define IP_CHARLIMIT 15
|
|||
|
//
|
|||
|
#define NCDU_BROWSE_DEST_PATH (WM_USER + 101)
|
|||
|
//
|
|||
|
// Local data structures
|
|||
|
//
|
|||
|
typedef struct _NETWORK_PROTOCOL_NAMES {
|
|||
|
UINT nDisplayName;
|
|||
|
UINT nTransportName;
|
|||
|
DWORD dwTransportNameLength;
|
|||
|
BOOL bLoaded;
|
|||
|
int nListBoxEntry;
|
|||
|
} NETWORK_PROTOCOL_NAMES, *PNETWORK_PROTOCOL_NAMES;
|
|||
|
//
|
|||
|
// static data
|
|||
|
//
|
|||
|
static NETWORK_PROTOCOL_NAMES NetProtocolList[] = {
|
|||
|
{CSZ_NW_LINK_PROTOCOL, NCDU_NW_LINK_TRANSPORT, 0, FALSE, CB_ERR},
|
|||
|
{CSZ_TCP_IP_PROTOCOL, NCDU_TCP_IP_TRANSPORT, 0, FALSE, CB_ERR},
|
|||
|
{CSZ_NETBEUI_PROTOCOL, NCDU_NETBEUI_TRANSPORT, 0, FALSE, CB_ERR},
|
|||
|
// "terminating" entry in array
|
|||
|
{0, 0, 0, FALSE, CB_ERR}
|
|||
|
};
|
|||
|
|
|||
|
static
|
|||
|
LPCTSTR
|
|||
|
GetDefaultDomain (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the domain the system is logged in to from the registry.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
pointer to domain name string if successful or pointer to an
|
|||
|
empty strin if not.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DWORD dwBufLen;
|
|||
|
DWORD dwDomainLen;
|
|||
|
static TCHAR szDomainName[32];
|
|||
|
TCHAR szUserName[MAX_USERNAME + 1];
|
|||
|
PSID pSid;
|
|||
|
SID_NAME_USE snu;
|
|||
|
|
|||
|
szDomainName[0] = 0;
|
|||
|
dwBufLen = MAX_USERNAME;
|
|||
|
if (GetUserName(szUserName, &dwBufLen)) {
|
|||
|
pSid = (PSID)GlobalAlloc(GPTR, SMALL_BUFFER_SIZE);
|
|||
|
if (pSid != NULL) {
|
|||
|
dwBufLen = (DWORD)GlobalSize(pSid);
|
|||
|
dwDomainLen = sizeof (szDomainName) / sizeof(TCHAR);
|
|||
|
LookupAccountName (
|
|||
|
NULL, // Local system
|
|||
|
szUserName, // username to look up
|
|||
|
pSid, // SID buffer
|
|||
|
&dwBufLen, // SID buffer size
|
|||
|
szDomainName, // return buffer for domain name
|
|||
|
&dwDomainLen, // size of buffer
|
|||
|
&snu);
|
|||
|
FREE_IF_ALLOC(pSid);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return szDomainName;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
LPCTSTR
|
|||
|
GetDefaultUsername (
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Returns the user name of the account running the app
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
pointer to user name string if successful or pointer to an empty
|
|||
|
string if not.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DWORD dwBufLen;
|
|||
|
static TCHAR szUserName[32];
|
|||
|
|
|||
|
szUserName[0] = 0;
|
|||
|
dwBufLen = sizeof(szUserName) / sizeof(TCHAR); // compute # of chars
|
|||
|
|
|||
|
GetUserName(szUserName, &dwBufLen);
|
|||
|
|
|||
|
return szUserName;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
LPCTSTR
|
|||
|
MakeIpAddrString (
|
|||
|
IN USHORT IpAddr[]
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
formats integer array into an address string for display
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IP Address info structure
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
pointer to formatted IP address string if successful or pointer to
|
|||
|
an empty string if not.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
static TCHAR szAddrBuffer[32];
|
|||
|
|
|||
|
szAddrBuffer[0] = 0;
|
|||
|
|
|||
|
_stprintf (szAddrBuffer, fmtIpAddr,
|
|||
|
IpAddr[0], IpAddr[1], IpAddr[2], IpAddr[3]);
|
|||
|
|
|||
|
return szAddrBuffer;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
LONG
|
|||
|
ListNetworkTransports (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN LPTSTR szServerName
|
|||
|
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
reads the registry and builds a list of the network protocols that are
|
|||
|
supported on the selected server and loads the combo box with all
|
|||
|
possible transports.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
handle to dialog box window
|
|||
|
|
|||
|
IN LPTSTR szServerName
|
|||
|
server to validate protocols on
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_SUCCESS if successful or WIN32 error value if not
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DWORD dwIndex;
|
|||
|
BOOL bDefaultFound;
|
|||
|
|
|||
|
DWORD dwSumOfEntries;
|
|||
|
DWORD dwEntriesRead;
|
|||
|
DWORD dwTotalEntries;
|
|||
|
DWORD dwResumeHandle;
|
|||
|
|
|||
|
LONG lStatus = ERROR_SUCCESS;
|
|||
|
|
|||
|
PNETWORK_PROTOCOL_NAMES pThisNetProtocol;
|
|||
|
PSERVER_TRANSPORT_INFO_0 pSrvrTransportInfo;
|
|||
|
PSERVER_TRANSPORT_INFO_0 pThisSrvrTransport;
|
|||
|
NET_API_STATUS netStatus;
|
|||
|
|
|||
|
pSrvrTransportInfo = (PSERVER_TRANSPORT_INFO_0)GlobalAlloc(GPTR, MEDIUM_BUFFER_SIZE);
|
|||
|
|
|||
|
if (pSrvrTransportInfo == NULL) {
|
|||
|
return ERROR_OUTOFMEMORY;
|
|||
|
}
|
|||
|
|
|||
|
// initialize static data
|
|||
|
|
|||
|
for (pThisNetProtocol = &NetProtocolList[0];
|
|||
|
pThisNetProtocol->nDisplayName != 0;
|
|||
|
pThisNetProtocol = &pThisNetProtocol[1]) {
|
|||
|
pThisNetProtocol->dwTransportNameLength =
|
|||
|
lstrlen (GetStringResource (pThisNetProtocol->nTransportName));
|
|||
|
pThisNetProtocol->bLoaded = FALSE;
|
|||
|
pThisNetProtocol->nListBoxEntry = CB_ERR;
|
|||
|
}
|
|||
|
|
|||
|
// build list of available network transports on server
|
|||
|
|
|||
|
dwEntriesRead = 0L;
|
|||
|
dwSumOfEntries = 0L;
|
|||
|
dwTotalEntries = 0xFFFFFFFF;
|
|||
|
dwResumeHandle = 0L;
|
|||
|
while (dwSumOfEntries != dwTotalEntries) {
|
|||
|
netStatus = NetServerTransportEnum (
|
|||
|
szServerName,
|
|||
|
0L,
|
|||
|
(LPBYTE *)&pSrvrTransportInfo,
|
|||
|
MEDIUM_BUFFER_SIZE,
|
|||
|
&dwEntriesRead,
|
|||
|
&dwTotalEntries,
|
|||
|
&dwResumeHandle);
|
|||
|
|
|||
|
if (netStatus == NO_ERROR) {
|
|||
|
dwSumOfEntries += dwEntriesRead;
|
|||
|
for (dwIndex = 0; dwIndex < dwEntriesRead; dwIndex++) {
|
|||
|
pThisSrvrTransport = &pSrvrTransportInfo[dwIndex];
|
|||
|
for (pThisNetProtocol = &NetProtocolList[0];
|
|||
|
pThisNetProtocol->nDisplayName != 0;
|
|||
|
pThisNetProtocol = &pThisNetProtocol[1]) {
|
|||
|
if (_tcsnicmp (GetStringResource(pThisNetProtocol->nTransportName),
|
|||
|
pThisSrvrTransport->svti0_transportname,
|
|||
|
pThisNetProtocol->dwTransportNameLength) == 0) {
|
|||
|
if (lstrcmp (pThisSrvrTransport->svti0_networkaddress,
|
|||
|
cszZeroNetAddress) != 0) {
|
|||
|
pThisNetProtocol->bLoaded = TRUE;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
// bail out of loop if an error is encountered
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// so all the supported protocols have been identified here, now
|
|||
|
// reload the combo box.
|
|||
|
|
|||
|
bDefaultFound = FALSE;
|
|||
|
dwIndex = 0;
|
|||
|
|
|||
|
// empty the combo box
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
|
|||
|
CB_RESETCONTENT, 0, 0);
|
|||
|
|
|||
|
for (pThisNetProtocol = &NetProtocolList[0];
|
|||
|
pThisNetProtocol->nDisplayName != 0;
|
|||
|
pThisNetProtocol = &pThisNetProtocol[1]) {
|
|||
|
// load combo box with each "transports"
|
|||
|
pThisNetProtocol->nListBoxEntry = (int)SendDlgItemMessage (hwndDlg,
|
|||
|
NCDU_PROTOCOL_COMBO_BOX, CB_ADDSTRING, (WPARAM)0,
|
|||
|
(LPARAM)GetStringResource (pThisNetProtocol->nDisplayName));
|
|||
|
|
|||
|
if (!bDefaultFound) {
|
|||
|
if (pThisNetProtocol->bLoaded) {
|
|||
|
bDefaultFound = TRUE;
|
|||
|
dwIndex = (DWORD)pThisNetProtocol->nListBoxEntry;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// select default entry
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
|
|||
|
CB_SETCURSEL, (WPARAM)dwIndex, 0);
|
|||
|
|
|||
|
FREE_IF_ALLOC(pSrvrTransportInfo);
|
|||
|
|
|||
|
return lStatus;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
LoadIpAddrArray (
|
|||
|
IN LPCTSTR szIpString,
|
|||
|
OUT USHORT nAddrItem[]
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Parses the display string into the IP address array
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN LPCTSTR szIpString
|
|||
|
input string to parse
|
|||
|
|
|||
|
OUT USHORT nAddrItem[]
|
|||
|
array to receive the address elements. Element 0 is the
|
|||
|
left-most element in the display string.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if parsed successfully
|
|||
|
FALSE if error
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
int nArgs;
|
|||
|
int nThisArg;
|
|||
|
|
|||
|
DWORD dw[4];
|
|||
|
|
|||
|
nArgs = _stscanf (szIpString, fmtIpAddrParse,
|
|||
|
&dw[0], &dw[1], &dw[2], &dw[3]);
|
|||
|
|
|||
|
if (nArgs == 4) {
|
|||
|
for (nThisArg = 0; nThisArg < nArgs; nThisArg++) {
|
|||
|
if (dw[nThisArg] > 255) {
|
|||
|
// bad value
|
|||
|
return FALSE;
|
|||
|
} else {
|
|||
|
// valid so copy the low byte of the value since that's
|
|||
|
// all that's allowed for an IP address or mask
|
|||
|
nAddrItem[nThisArg] = (USHORT)(dw[nThisArg] & 0x000000FF);
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
VOID
|
|||
|
SetTcpIpWindowState (
|
|||
|
IN HWND hwndDlg
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
enables the IP address fields when TCP/IP protocol is enabled and
|
|||
|
disabled the IP address fields when it is not selected.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
handle to the dialog box window
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NONE
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LPTSTR szProtocol;
|
|||
|
int nComboItem;
|
|||
|
BOOL bFrameState, bAddrState;
|
|||
|
|
|||
|
szProtocol = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
|
|||
|
if (szProtocol == NULL) return;
|
|||
|
|
|||
|
nComboItem = (int)SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
|
|||
|
CB_GETCURSEL, 0, 0);
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_GETLBTEXT,
|
|||
|
(WPARAM)nComboItem, (LPARAM)szProtocol);
|
|||
|
|
|||
|
if (_tcsnicmp(szProtocol, cszTcpKey, lstrlen(cszTcpKey)) == 0) {
|
|||
|
bFrameState = TRUE;
|
|||
|
if (IsDlgButtonChecked(hwndDlg, NCDU_USE_DHCP) == CHECKED) {
|
|||
|
bAddrState = FALSE;
|
|||
|
} else {
|
|||
|
bAddrState = TRUE;
|
|||
|
}
|
|||
|
} else {
|
|||
|
bFrameState = FALSE;
|
|||
|
bAddrState = FALSE;
|
|||
|
}
|
|||
|
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_USE_DHCP), bFrameState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_IP_ADDR_LABEL), bAddrState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_IP_ADDR), bAddrState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_SUBNET_LABEL), bAddrState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_FLOPPY_SUBNET_MASK), bAddrState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_DEFAULT_GATEWAY_LABEL), bFrameState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_DEFAULT_GATEWAY), bFrameState);
|
|||
|
EnableWindow (GetDlgItem(hwndDlg,NCDU_TCPIP_INFO_FRAME), bFrameState);
|
|||
|
|
|||
|
FREE_IF_ALLOC (szProtocol);
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
ComputeDefaultDefaultGateway (
|
|||
|
IN HWND hwndDlg
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Generates a default value for the default gateway using the
|
|||
|
IP address and Sub Net mask
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Handle to the dialog box window
|
|||
|
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
TRUE if a default value was entered,
|
|||
|
FALSE if not
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
TCHAR szIpAddr[IP_CHARLIMIT+1];
|
|||
|
TCHAR szSubNet[IP_CHARLIMIT+1];
|
|||
|
TCHAR szDefGate[IP_CHARLIMIT+1];
|
|||
|
|
|||
|
USHORT usIpArray[4], usSnArray[4], usDgArray[4];
|
|||
|
|
|||
|
// if not initialized, then preset to
|
|||
|
// default value
|
|||
|
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_IP_ADDR, szIpAddr, IP_CHARLIMIT);
|
|||
|
if (LoadIpAddrArray(szIpAddr, &usIpArray[0])) {
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, szSubNet, IP_CHARLIMIT);
|
|||
|
if (LoadIpAddrArray(szSubNet, &usSnArray[0])) {
|
|||
|
GetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY, szDefGate, IP_CHARLIMIT);
|
|||
|
if (LoadIpAddrArray(szDefGate, &usDgArray[0])) {
|
|||
|
if ((usDgArray[0] == 0) &&
|
|||
|
(usDgArray[1] == 0) &&
|
|||
|
(usDgArray[2] == 0) &&
|
|||
|
(usDgArray[3] == 0)) {
|
|||
|
usDgArray[0] = usIpArray[0] & usSnArray[0];
|
|||
|
usDgArray[1] = usIpArray[1] & usSnArray[1];
|
|||
|
usDgArray[2] = usIpArray[2] & usSnArray[2];
|
|||
|
usDgArray[3] = usIpArray[3] & usSnArray[3];
|
|||
|
SetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY,
|
|||
|
MakeIpAddrString(&usDgArray[0]));
|
|||
|
return TRUE; // value updated
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return FALSE; // value not updated
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
ServerConnDlg_WM_INITDIALOG (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Processes the WM_INITDIALOG windows message by initializing the
|
|||
|
display fields in the dialog box and setting focus to the first
|
|||
|
entry field
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to the dialog box window
|
|||
|
|
|||
|
IN WPARAM wParam
|
|||
|
Not Used
|
|||
|
|
|||
|
IN LPARAM lParam
|
|||
|
Not Used
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
LONG lProtocolNdx;
|
|||
|
LPTSTR szServerArg;
|
|||
|
LPTSTR szServerName;
|
|||
|
LPTSTR szPathOnServer;
|
|||
|
|
|||
|
szServerName = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
szPathOnServer = (LPTSTR)GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|||
|
|
|||
|
if ((szServerName == NULL) ||
|
|||
|
(szPathOnServer == NULL)) {
|
|||
|
SetLastError (ERROR_OUTOFMEMORY);
|
|||
|
EndDialog (hwndDlg, (int)WM_CLOSE);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
RemoveMaximizeFromSysMenu (hwndDlg);
|
|||
|
PositionWindow (hwndDlg);
|
|||
|
|
|||
|
// get name of server with client tree
|
|||
|
|
|||
|
lstrcpy (szServerName, cszDoubleBackslash);
|
|||
|
if (!GetNetPathInfo (pAppInfo->szDistPath,
|
|||
|
&szServerName[2], szPathOnServer)) {
|
|||
|
// unable to look up server, so use local path
|
|||
|
szServerArg = NULL;
|
|||
|
} else {
|
|||
|
szServerArg = szServerName;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ListNetworkTransports (hwndDlg, szServerArg);
|
|||
|
|
|||
|
// select current protocol (if any)
|
|||
|
if (*pAppInfo->piFloppyProtocol.szName != 0) {
|
|||
|
lProtocolNdx = (LONG)SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_FINDSTRING,
|
|||
|
(WPARAM)0, (LPARAM)pAppInfo->piFloppyProtocol.szName);
|
|||
|
if (lProtocolNdx == CB_ERR) {
|
|||
|
// selection not found so apply default
|
|||
|
lProtocolNdx = 0;
|
|||
|
}
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_SETCURSEL,
|
|||
|
(WPARAM)lProtocolNdx, 0);
|
|||
|
}
|
|||
|
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_USERNAME, EM_LIMITTEXT, MAX_USERNAME, 0);
|
|||
|
if (pAppInfo->szUsername[0] == 0) {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_USERNAME, GetDefaultUsername());
|
|||
|
} else {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_USERNAME, pAppInfo->szUsername);
|
|||
|
}
|
|||
|
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME, EM_LIMITTEXT, MAX_COMPUTERNAME_LENGTH, 0);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME, pAppInfo->szComputerName);
|
|||
|
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_DOMAIN, EM_LIMITTEXT, MAX_DOMAINNAME, 0);
|
|||
|
if (pAppInfo->szDomain[0] == 0) {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_DOMAIN, GetDefaultDomain());
|
|||
|
} else {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_DOMAIN, pAppInfo->szDomain);
|
|||
|
}
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_IP_ADDR, EM_LIMITTEXT, (WPARAM)IP_CHARLIMIT, 0);
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, EM_LIMITTEXT, (WPARAM)IP_CHARLIMIT, 0);
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_IP_ADDR, MakeIpAddrString(&pAppInfo->tiTcpIpInfo.IpAddr[0]));
|
|||
|
SetDlgItemText (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, MakeIpAddrString(&pAppInfo->tiTcpIpInfo.SubNetMask[0]));
|
|||
|
SetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY, MakeIpAddrString(&pAppInfo->tiTcpIpInfo.DefaultGateway[0]));
|
|||
|
|
|||
|
if (pAppInfo->bUseDhcp) {
|
|||
|
CheckDlgButton (hwndDlg, NCDU_USE_DHCP, CHECKED);
|
|||
|
} else {
|
|||
|
CheckDlgButton (hwndDlg, NCDU_USE_DHCP, UNCHECKED);
|
|||
|
}
|
|||
|
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_TARGET_DRIVEPATH, EM_LIMITTEXT,
|
|||
|
(WPARAM)(MAX_PATH-1), (LPARAM)0);
|
|||
|
|
|||
|
if (*pAppInfo->szBootFilesPath == 0) {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, cszADriveRoot);
|
|||
|
} else {
|
|||
|
SetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, pAppInfo->szBootFilesPath);
|
|||
|
}
|
|||
|
|
|||
|
SetTcpIpWindowState (hwndDlg);
|
|||
|
SetFocus (GetDlgItem(hwndDlg, NCDU_FLOPPY_COMPUTER_NAME));
|
|||
|
// clear old Dialog and register current
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_CLEAR_DLG, (WPARAM)hwndDlg, IDOK);
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_REGISTER_DLG,
|
|||
|
NCDU_SERVER_CFG_DLG, (LPARAM)hwndDlg);
|
|||
|
|
|||
|
FREE_IF_ALLOC(szServerName);
|
|||
|
FREE_IF_ALLOC(szPathOnServer);
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
ServerConnDlg_IDOK (
|
|||
|
IN HWND hwndDlg
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Processes the OK button command by validating the entries and
|
|||
|
storing them in the global application data structure. If an
|
|||
|
invalid value is detected a message box is displayed and the
|
|||
|
focus is set to the offending field, otherwise, the dialog
|
|||
|
box is terminated.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to the dialog box window
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
int nComboItem;
|
|||
|
int nMbResult;
|
|||
|
|
|||
|
TCHAR szIp[IP_CHARLIMIT*2];
|
|||
|
MEDIA_TYPE mtDest;
|
|||
|
|
|||
|
BOOL bProtocolLoaded;
|
|||
|
PNETWORK_PROTOCOL_NAMES pThisNetProtocol;
|
|||
|
|
|||
|
// save settings
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME, pAppInfo->szComputerName, MAX_COMPUTERNAME_LENGTH);
|
|||
|
TrimSpaces (pAppInfo->szComputerName);
|
|||
|
// see if there is a string...signal if no entry
|
|||
|
if (lstrlen(pAppInfo->szComputerName) == 0) {
|
|||
|
DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_INVALID_MACHINENAME,
|
|||
|
0,
|
|||
|
MB_OK_TASK_EXCL);
|
|||
|
SetFocus (GetDlgItem (hwndDlg, NCDU_FLOPPY_COMPUTER_NAME));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_USERNAME, pAppInfo->szUsername, MAX_USERNAME);
|
|||
|
TrimSpaces (pAppInfo->szUsername);
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_DOMAIN, pAppInfo->szDomain, MAX_DOMAINNAME);
|
|||
|
TrimSpaces (pAppInfo->szDomain);
|
|||
|
nComboItem = (int)SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX,
|
|||
|
CB_GETCURSEL, 0, 0);
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_PROTOCOL_COMBO_BOX, CB_GETLBTEXT,
|
|||
|
(WPARAM)nComboItem, (LPARAM)pAppInfo->piFloppyProtocol.szName);
|
|||
|
|
|||
|
// look up keyname from protocol name
|
|||
|
|
|||
|
if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszTcpKey, lstrlen(cszTcpKey)) == 0) {
|
|||
|
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszTcpIpEntry);
|
|||
|
} else if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszNetbeuiKey, lstrlen(cszNetbeuiKey)) == 0) {
|
|||
|
AddMessageToExitList (pAppInfo, NCDU_NETBEUI_NOT_ROUT);
|
|||
|
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszNetbeuiEntry);
|
|||
|
} else if (_tcsnicmp(pAppInfo->piFloppyProtocol.szName, cszIpxKey, lstrlen(cszIpxKey)) == 0) {
|
|||
|
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszIpxEntry);
|
|||
|
} else {
|
|||
|
lstrcpy(pAppInfo->piFloppyProtocol.szKey, cszEmptyString);
|
|||
|
}
|
|||
|
|
|||
|
// see if this protocol is supported by the server
|
|||
|
|
|||
|
bProtocolLoaded = FALSE;
|
|||
|
|
|||
|
for (pThisNetProtocol = &NetProtocolList[0];
|
|||
|
pThisNetProtocol->nDisplayName != 0;
|
|||
|
pThisNetProtocol = &pThisNetProtocol[1]) {
|
|||
|
// load combo box with "transports"
|
|||
|
|
|||
|
if (pThisNetProtocol->nListBoxEntry == nComboItem) {
|
|||
|
if (pThisNetProtocol->bLoaded) {
|
|||
|
bProtocolLoaded = TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!bProtocolLoaded) {
|
|||
|
nMbResult = DisplayMessageBox (hwndDlg,
|
|||
|
NCDU_UNSUP_PROTOCOL,
|
|||
|
0,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
if (nMbResult != IDOK) {
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Get target drive and path
|
|||
|
//
|
|||
|
GetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, pAppInfo->szBootFilesPath, MAX_PATH);
|
|||
|
TrimSpaces (pAppInfo->szBootFilesPath);
|
|||
|
mtDest = GetDriveTypeFromPath(pAppInfo->szBootFilesPath);
|
|||
|
if (mtDest == Unknown) {
|
|||
|
nMbResult = DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_NO_MEDIA,
|
|||
|
0,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
switch (nMbResult) {
|
|||
|
case IDOK:
|
|||
|
break;
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
// they want to go back to the dialog and insert a disk so bail out
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
} else if (mtDest != pAppInfo->mtBootDriveType) {
|
|||
|
nMbResult = DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_DEST_NOT_FLOPPY,
|
|||
|
0,
|
|||
|
MB_OKCANCEL_TASK_EXCL);
|
|||
|
switch (nMbResult) {
|
|||
|
case IDOK:
|
|||
|
break;
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
// they want to go back to the dialog so bail out
|
|||
|
SetFocus (GetDlgItem(hwndDlg, NCDU_TARGET_DRIVEPATH));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (IsDlgButtonChecked(hwndDlg, NCDU_USE_DHCP) == CHECKED) {
|
|||
|
pAppInfo->bUseDhcp = TRUE;
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[0] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[1] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[2] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.IpAddr[3] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[0] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[1] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[2] = 0;
|
|||
|
pAppInfo->tiTcpIpInfo.SubNetMask[3] = 0;
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_SHOW_CONFIRM_DLG, 0, 0);
|
|||
|
} else {
|
|||
|
pAppInfo->bUseDhcp = FALSE;
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_IP_ADDR, szIp, (IP_CHARLIMIT *2));
|
|||
|
if (LoadIpAddrArray(szIp, &pAppInfo->tiTcpIpInfo.IpAddr[0])) {
|
|||
|
GetDlgItemText (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, szIp, (IP_CHARLIMIT *2));
|
|||
|
if (LoadIpAddrArray(szIp, &pAppInfo->tiTcpIpInfo.SubNetMask[0])) {
|
|||
|
GetDlgItemText (hwndDlg, NCDU_DEFAULT_GATEWAY, szIp, (IP_CHARLIMIT *2));
|
|||
|
if (LoadIpAddrArray(szIp, &pAppInfo->tiTcpIpInfo.DefaultGateway[0])) {
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_SHOW_CONFIRM_DLG, 0, 0);
|
|||
|
} else {
|
|||
|
// bad Default Gateway
|
|||
|
DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_BAD_DEFAULT_GATEWAY,
|
|||
|
0,
|
|||
|
MB_OK_TASK_EXCL);
|
|||
|
SetFocus (GetDlgItem (hwndDlg, NCDU_DEFAULT_GATEWAY));
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_DEFAULT_GATEWAY, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
|
|||
|
}
|
|||
|
} else {
|
|||
|
// bad Subnet Mask
|
|||
|
DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_BAD_SUBNET_MASK,
|
|||
|
0,
|
|||
|
MB_OK_TASK_EXCL);
|
|||
|
SetFocus (GetDlgItem (hwndDlg, NCDU_FLOPPY_SUBNET_MASK));
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_SUBNET_MASK, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
|
|||
|
}
|
|||
|
} else {
|
|||
|
// bad IP
|
|||
|
DisplayMessageBox (
|
|||
|
hwndDlg,
|
|||
|
NCDU_BAD_IP_ADDR,
|
|||
|
0,
|
|||
|
MB_OK_TASK_EXCL);
|
|||
|
SetFocus (GetDlgItem (hwndDlg, NCDU_FLOPPY_IP_ADDR));
|
|||
|
SendDlgItemMessage (hwndDlg, NCDU_FLOPPY_IP_ADDR, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
ServerConnDlg_WM_COMMAND (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Dispatches to the correct routine based on the user input.
|
|||
|
Enables/disables the TCP/IP address info fields when
|
|||
|
the Protocol is changed
|
|||
|
Ends the dialog box if Cancel is selected
|
|||
|
Dispatches to the IDOK function if OK selected.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to dialog box window
|
|||
|
|
|||
|
IN WPARAM wParam
|
|||
|
LOWORD contains the ID of the control issuing the command
|
|||
|
|
|||
|
IN LPARAM lParam
|
|||
|
Not used
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE if processed
|
|||
|
TRUE if not processed
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
switch (LOWORD(wParam)) {
|
|||
|
case NCDU_USE_DHCP:
|
|||
|
case NCDU_PROTOCOL_COMBO_BOX:
|
|||
|
SetTcpIpWindowState (hwndDlg);
|
|||
|
return TRUE;
|
|||
|
|
|||
|
case NCDU_BROWSE:
|
|||
|
PostMessage (hwndDlg, NCDU_BROWSE_DEST_PATH, 0, 0);
|
|||
|
return TRUE;
|
|||
|
|
|||
|
case IDCANCEL:
|
|||
|
PostMessage (GetParent(hwndDlg), NCDU_SHOW_TARGET_WS_DLG, 0, 0);
|
|||
|
return TRUE;
|
|||
|
|
|||
|
case NCDU_DEFAULT_GATEWAY:
|
|||
|
if (HIWORD(wParam) == EN_SETFOCUS) {
|
|||
|
ComputeDefaultDefaultGateway (hwndDlg);
|
|||
|
return TRUE;
|
|||
|
} else {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
case IDOK: return ServerConnDlg_IDOK(hwndDlg);
|
|||
|
case NCDU_SERVER_CONN_CFG_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 FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
ServerConnDlg_NCDU_BROWSE_DEST_PATH (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Displays the file /dir browser to enter the destination path entry
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
IN HWND hwndDlg
|
|||
|
Handle to dialog box window
|
|||
|
|
|||
|
IN WPARAM wParam
|
|||
|
Not Used
|
|||
|
|
|||
|
IN LPARAM lParam
|
|||
|
Not Used
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
DB_DATA BrowseInfo;
|
|||
|
TCHAR szTempPath[MAX_PATH+1];
|
|||
|
|
|||
|
GetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, szTempPath, MAX_PATH);
|
|||
|
|
|||
|
BrowseInfo.dwTitle = NCDU_BROWSE_COPY_DEST_PATH;
|
|||
|
BrowseInfo.szPath = szTempPath;
|
|||
|
BrowseInfo.Flags = PDB_FLAGS_NOCHECKDIR;
|
|||
|
|
|||
|
if (DialogBoxParam (
|
|||
|
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
|
|||
|
MAKEINTRESOURCE(NCDU_DIR_BROWSER),
|
|||
|
hwndDlg,
|
|||
|
DirBrowseDlgProc,
|
|||
|
(LPARAM)&BrowseInfo) == IDOK) {
|
|||
|
|
|||
|
SetDlgItemText (hwndDlg, NCDU_TARGET_DRIVEPATH, szTempPath);
|
|||
|
|
|||
|
}
|
|||
|
SetFocus( GetDlgItem(hwndDlg, NCDU_TARGET_DRIVEPATH));
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static
|
|||
|
BOOL
|
|||
|
ServerConnDlg_NCDU_WM_NCDESTROY (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
{
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
INT_PTR CALLBACK
|
|||
|
ServerConnDlgProc (
|
|||
|
IN HWND hwndDlg,
|
|||
|
IN UINT message,
|
|||
|
IN WPARAM wParam,
|
|||
|
IN LPARAM lParam
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Dialog box procedure for the Server connection configuration dialog
|
|||
|
box. The following windows messages are processed by this
|
|||
|
function:
|
|||
|
|
|||
|
WM_INITDIALOG: Dialog box initialization
|
|||
|
WM_COMMAND: user input
|
|||
|
WM_NCDESTROY: to free memory before leaving
|
|||
|
|
|||
|
all other messages are sent to the default dialog box proc.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Standard WNDPROC arguments
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
FALSE if message not processed by this module, otherwise the
|
|||
|
value returned by the dispatched routine.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
switch (message) {
|
|||
|
case WM_INITDIALOG: return (ServerConnDlg_WM_INITDIALOG (hwndDlg, wParam, lParam));
|
|||
|
case WM_COMMAND: return (ServerConnDlg_WM_COMMAND (hwndDlg, wParam, lParam));
|
|||
|
case NCDU_BROWSE_DEST_PATH:
|
|||
|
return (ServerConnDlg_NCDU_BROWSE_DEST_PATH (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));
|
|||
|
case WM_NCDESTROY: return (ServerConnDlg_NCDU_WM_NCDESTROY (hwndDlg, wParam, lParam));
|
|||
|
default: return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|