mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
775 lines
22 KiB
775 lines
22 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
FindClnt.C
|
|
|
|
Abstract:
|
|
|
|
Displays the Searching for clients dialog box and looks for the selected
|
|
client distribution tree returning the path and type of path found.
|
|
|
|
Author:
|
|
|
|
Bob Watson (a-robw)
|
|
|
|
Revision History:
|
|
|
|
24 Jun 94 Written
|
|
|
|
--*/
|
|
//
|
|
// Windows Include Files
|
|
//
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <malloc.h>
|
|
#include <tchar.h> // unicode macros
|
|
#include <lmcons.h> // lanman API constants
|
|
#include <lmerr.h> // lanman error returns
|
|
#include <lmshare.h> // sharing API prototypes
|
|
#include <lmapibuf.h> // lanman buffer API prototypes
|
|
//
|
|
// app include files
|
|
//
|
|
#include "otnboot.h"
|
|
#include "otnbtdlg.h"
|
|
//
|
|
// local dialog box messages
|
|
//
|
|
#define NCDU_SEARCH_FOR_CLIENTS (WM_USER+101)
|
|
//
|
|
// Search Phases
|
|
#define SEARCH_REGISTRY (0x00000001)
|
|
#define SEARCH_SHARED_DIRS (0x00000002)
|
|
#define SEARCH_HARD_DRIVES (0x00000004)
|
|
#define SEARCH_CD_ROM (0x00000008)
|
|
#define SEARCH_LAST_PHASE SEARCH_CD_ROM
|
|
//
|
|
// module static variables
|
|
//
|
|
static BOOL bSearchForClients; // flag to trip out of search
|
|
static HCURSOR hOrigCursor = NULL; // cursor to save/restore
|
|
|
|
LONG
|
|
GetDistributionPath (
|
|
IN HWND hwndDlg, // handle to dialog box window
|
|
IN DWORD dwSearchType, // type of dir to find: Client/tools
|
|
IN OUT LPTSTR szPath, // buffer to return path in (Req'd)
|
|
IN DWORD dwPathLen, // size of path buffer in chars
|
|
IN PLONG plPathType // pointer to buffer recieving path type (opt)
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Gets the default distribution file path for loading the dialog box
|
|
entries with.
|
|
|
|
Arguments:
|
|
|
|
IN HWND hwndDlg
|
|
handle to parent dialog box window
|
|
IN DWORD dwSearchType
|
|
type of dir to find: Client/tools
|
|
IN OUT LPTSTR szPath
|
|
buffer to return path in (Req'd)
|
|
IN DWORD dwPathLen
|
|
size of path buffer in chars
|
|
IN PLONG plPathType
|
|
pointer to buffer recieving path type (opt)
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS if file found
|
|
ERROR_FILE_NOT_FOUND if unable to find file
|
|
|
|
--*/
|
|
{
|
|
FDT_DATA Fdt;
|
|
UINT nDBReturn;
|
|
|
|
// build data structure for search
|
|
|
|
Fdt.szPathBuffer = szPath;
|
|
Fdt.dwPathBufferLen = dwPathLen;
|
|
Fdt.plPathType = plPathType;
|
|
Fdt.dwSearchType = dwSearchType;
|
|
|
|
nDBReturn = (UINT)DialogBoxParam (
|
|
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
|
|
MAKEINTRESOURCE(NCDU_FINDING_CLIENT_DIRS_DLG),
|
|
hwndDlg,
|
|
FindClientsDlgProc,
|
|
(LPARAM)&Fdt);
|
|
|
|
if (nDBReturn == IDOK) {
|
|
return ERROR_SUCCESS;
|
|
} else {
|
|
return ERROR_FILE_NOT_FOUND;
|
|
}
|
|
}
|
|
|
|
static
|
|
LPCTSTR
|
|
GetLastPathFromRegistry (
|
|
IN DWORD dwSearchType
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
looks up the last path (server\share) for either the tools directory
|
|
or the client tree as it appears in the registry. If unable to
|
|
find both components of the selected search, then an empty string
|
|
is returned.
|
|
|
|
Arguments:
|
|
|
|
IN DWORD dwSearchType
|
|
FDT_TOOLS_TREE for server tools path
|
|
FDT_CLIENT_TREE for client distribution path
|
|
|
|
Return Value:
|
|
|
|
pointer to a read only string that contains the desired path if
|
|
one was stored in the registry or an empty string if not.
|
|
|
|
--*/
|
|
{
|
|
static TCHAR szLastPath[MAX_PATH];
|
|
HKEY hkeyUserInfo;
|
|
HKEY hkeyAppInfo;
|
|
|
|
LONG lStatus;
|
|
DWORD dwBufLen;
|
|
|
|
// open registry key containing net apps
|
|
|
|
lStatus = RegOpenKeyEx (
|
|
HKEY_CURRENT_USER,
|
|
cszUserInfoKey,
|
|
0L,
|
|
KEY_READ,
|
|
&hkeyUserInfo);
|
|
|
|
if (lStatus != ERROR_SUCCESS) {
|
|
// unable to open key so return an empty buffer
|
|
szLastPath[0] = 0;
|
|
} else {
|
|
// open registry key containing this app's info
|
|
lStatus = RegOpenKeyEx (
|
|
hkeyUserInfo,
|
|
szAppName,
|
|
0L,
|
|
KEY_READ,
|
|
&hkeyAppInfo);
|
|
|
|
if (lStatus != ERROR_SUCCESS) {
|
|
// unable to open key so return an empty buffer
|
|
szLastPath[0] = 0;
|
|
} else {
|
|
// initialize path variable
|
|
lstrcpy (szLastPath, cszDoubleBackslash);
|
|
|
|
// get server name from registry
|
|
dwBufLen = MAX_COMPUTERNAME_LENGTH + 1;
|
|
lStatus = RegQueryValueEx (
|
|
hkeyAppInfo,
|
|
(LPTSTR)(dwSearchType == FDT_TOOLS_TREE ? cszLastToolsServer : cszLastClientServer),
|
|
(LPDWORD)NULL,
|
|
(LPDWORD)NULL,
|
|
(LPBYTE)&szLastPath[lstrlen(szLastPath)],
|
|
&dwBufLen);
|
|
|
|
if (lStatus != ERROR_SUCCESS) {
|
|
// unable to read value so return an empty buffer
|
|
szLastPath[0] = 0;
|
|
} else {
|
|
// get sharepoint name from registry
|
|
lstrcat (szLastPath, cszBackslash);
|
|
dwBufLen = MAX_SHARENAME + 1;
|
|
lStatus = RegQueryValueEx (
|
|
hkeyAppInfo,
|
|
(LPTSTR)(dwSearchType == FDT_TOOLS_TREE ? cszLastToolsSharepoint : cszLastClientSharepoint),
|
|
(LPDWORD)NULL,
|
|
(LPDWORD)NULL,
|
|
(LPBYTE)&szLastPath[lstrlen(szLastPath)],
|
|
&dwBufLen);
|
|
|
|
if (lStatus != ERROR_SUCCESS) {
|
|
// unable to read value so return an empty buffer
|
|
szLastPath[0] = 0;
|
|
}
|
|
}
|
|
RegCloseKey (hkeyAppInfo);
|
|
}
|
|
RegCloseKey (hkeyUserInfo);
|
|
}
|
|
|
|
return (LPCTSTR)&szLastPath[0];
|
|
}
|
|
|
|
static
|
|
LONG
|
|
SearchForDistPath (
|
|
IN OUT LPTSTR szPath, // buffer to return path in (Req'd)
|
|
IN DWORD dwPathLen, // size of path buffer in chars
|
|
IN PLONG plPathType, // pointer to buffer recieving path type (opt)
|
|
IN DWORD dwSearchType, // type of tree to look for
|
|
IN DWORD dwPhase // phase(s) to search
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
function that looks for the desired directory tree in the following
|
|
locations:
|
|
a) the registry, for the stored server\share
|
|
b) the shared directories on the system
|
|
c) the local and redirected drives
|
|
d) the CD-Rom
|
|
|
|
The search is divided into phases to allow the user to cancel the
|
|
search.
|
|
|
|
Arguments:
|
|
|
|
IN OUT LPTSTR szPath, // buffer to return path in (Req'd)
|
|
IN DWORD dwPathLen, // size of path buffer in chars
|
|
IN PLONG plPathType, // pointer to buffer recieving path type (opt)
|
|
IN DWORD dwSearchType, // type of tree to look for
|
|
IN DWORD dwPhase // phase(s) to search
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS
|
|
|
|
--*/
|
|
{
|
|
LONG lStatus = ERROR_SUCCESS;
|
|
LONG lPathType = NCDU_NO_CLIENT_PATH_FOUND;
|
|
LPTSTR szLocalPath = NULL;
|
|
NET_API_STATUS naStatus = NERR_Success;
|
|
DWORD dwTotalEntries;
|
|
DWORD dwEntriesRead;
|
|
DWORD dwEntriesProcessed;
|
|
DWORD dwResumeHandle;
|
|
DWORD dwIndex;
|
|
DWORD dwBufLen;
|
|
BOOL bFound;
|
|
UINT nDriveType;
|
|
TCHAR szRootDir[32];
|
|
PSHARE_INFO_2 psi2Data;
|
|
UINT nErrorMode;
|
|
BOOL bValidPath;
|
|
|
|
if (szPath == NULL) {
|
|
// the pointer to the path is required
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
// allocate temp buffers
|
|
|
|
szLocalPath = GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|
|
|
if (szLocalPath == NULL) {
|
|
return ERROR_OUTOFMEMORY;
|
|
}
|
|
|
|
// disable windows error message popup
|
|
nErrorMode = SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
|
|
|
|
bFound = FALSE;
|
|
|
|
if ((dwPhase & SEARCH_REGISTRY) == SEARCH_REGISTRY) {
|
|
// check registry for saved server/sharepoint
|
|
|
|
// if server/share found in registry, make into a UNC path
|
|
// and validate that it's really a client tree. return path if valid
|
|
|
|
lstrcpy (szLocalPath, GetLastPathFromRegistry(dwSearchType));
|
|
if (szLocalPath[lstrlen(szLocalPath)] != cBackslash) lstrcat (szLocalPath, cszBackslash);
|
|
if (dwSearchType == FDT_TOOLS_TREE){
|
|
bValidPath = (BOOL)(ValidSrvToolsPath (szLocalPath) == 0);
|
|
} else {
|
|
bValidPath = (BOOL)(ValidSharePath (szLocalPath) == 0);
|
|
}
|
|
if (bValidPath) {
|
|
// it's there so save it in user's buffer and leave
|
|
lstrcpy (szPath, szLocalPath);
|
|
lPathType = NCDU_PATH_FROM_REGISTRY;
|
|
lStatus = ERROR_SUCCESS;
|
|
goto GDP_ExitPoint;
|
|
}
|
|
}
|
|
|
|
if ((dwPhase & SEARCH_SHARED_DIRS) == SEARCH_SHARED_DIRS) {
|
|
// if here, then no valid server/share was found in registry, so
|
|
// look at shared dir's on this machine and see if any of them are
|
|
// valid client trees. If one is found, return the path in UNC form
|
|
|
|
// search all current shares on this system
|
|
|
|
dwEntriesProcessed = 0;
|
|
dwEntriesRead = 0;
|
|
dwTotalEntries = 0;
|
|
dwResumeHandle = 0;
|
|
while ((naStatus = NetShareEnum(
|
|
NULL,
|
|
2,
|
|
(LPBYTE *)&psi2Data,
|
|
0x00010000,
|
|
&dwEntriesRead,
|
|
&dwTotalEntries,
|
|
&dwResumeHandle)) == NERR_Success) {
|
|
if (dwEntriesRead == 0) break; // then it'd done
|
|
for (dwIndex = 0; dwIndex < dwEntriesRead; dwIndex++){
|
|
// don't check shares that translate to floppy drives A: & B:
|
|
if ((_tcsnicmp(psi2Data[dwIndex].shi2_path, cszADriveRoot, 3) != 0) &&
|
|
(_tcsnicmp(psi2Data[dwIndex].shi2_path, cszBDriveRoot, 3) != 0)) {
|
|
if (dwSearchType == FDT_TOOLS_TREE){
|
|
bValidPath = (BOOL)(ValidSrvToolsPath (psi2Data[dwIndex].shi2_path) == 0);
|
|
} else {
|
|
bValidPath = (BOOL)(ValidSharePath (psi2Data[dwIndex].shi2_path) == 0);
|
|
}
|
|
if (bValidPath) {
|
|
// make a UNC name out of share name
|
|
lstrcpy (szLocalPath, cszDoubleBackslash);
|
|
dwBufLen = MAX_COMPUTERNAME_LENGTH+1;
|
|
GetComputerName (&szLocalPath[2], &dwBufLen);
|
|
lstrcat (szLocalPath, cszBackslash);
|
|
lstrcat (szLocalPath, psi2Data[dwIndex].shi2_netname);
|
|
lstrcat (szLocalPath, cszBackslash);
|
|
|
|
if (lstrlen(szLocalPath) < (LONG)dwPathLen) {
|
|
// save path string in user's buffer and leave
|
|
lstrcpy (szPath, szLocalPath);
|
|
lPathType = NCDU_LOCAL_SHARE_PATH;
|
|
lStatus = ERROR_SUCCESS;
|
|
bFound = TRUE;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// free buffer created by Net API
|
|
if (psi2Data != NULL) NetApiBufferFree (psi2Data);
|
|
// update entry counters to know when to stop looping
|
|
dwEntriesProcessed += dwEntriesRead;
|
|
if ((dwEntriesProcessed >= dwTotalEntries) || bFound) {
|
|
break; // out of while loop
|
|
}
|
|
}
|
|
if (bFound) goto GDP_ExitPoint;
|
|
}
|
|
|
|
if ((dwPhase & SEARCH_HARD_DRIVES) == SEARCH_HARD_DRIVES) {
|
|
// if here, then no shared path was found, so search hard drives for
|
|
// a client tree in the root directory and return the DOS path if one
|
|
// is found
|
|
|
|
szRootDir[0] = 0;
|
|
szRootDir[1] = cColon;
|
|
szRootDir[2] = cBackslash;
|
|
szRootDir[3] = 0;
|
|
for (szRootDir[0] = cC; szRootDir[0] <= cZ; szRootDir[0]++) {
|
|
// if it's local or remote drive look for a clients dir.
|
|
// don't check CD_ROM, RAM Disks or Removable drive
|
|
nDriveType = GetDriveType(szRootDir);
|
|
if ((nDriveType == DRIVE_FIXED) || (nDriveType == DRIVE_REMOTE)) {
|
|
// see if this is drive has the appropriate sub-dir on it
|
|
if (dwSearchType == FDT_TOOLS_TREE){
|
|
lstrcpy (&szRootDir[3], cszToolsDir);
|
|
bValidPath = (BOOL)(ValidSrvToolsPath (szRootDir) == 0);
|
|
} else {
|
|
lstrcpy (&szRootDir[3], cszClientsDir);
|
|
bValidPath = (BOOL)(ValidSharePath (szRootDir) == 0);
|
|
}
|
|
if (bValidPath) {
|
|
// a valid path was found
|
|
if (nDriveType == DRIVE_REMOTE) {
|
|
// then this drive is shared on another machine
|
|
// so return the UNC version of the path
|
|
dwBufLen = MAX_PATH * sizeof(TCHAR);
|
|
if (LookupRemotePath (szRootDir, szLocalPath, &dwBufLen)) {
|
|
// save path string in user's buffer and leave
|
|
lstrcpy (szPath, szLocalPath);
|
|
lPathType = NCDU_LOCAL_SHARE_PATH;
|
|
lStatus = ERROR_SUCCESS;
|
|
} else {
|
|
// unable to look up redirected drive so return dos
|
|
// version of path (this shouldn't happen);
|
|
lstrcpy (szPath, szRootDir);
|
|
lPathType = NCDU_HARD_DRIVE_PATH;
|
|
lStatus = ERROR_SUCCESS;
|
|
}
|
|
} else {
|
|
// this is a Local drive so return the DOS
|
|
// version of path
|
|
lstrcpy (szPath, szRootDir);
|
|
lPathType = NCDU_HARD_DRIVE_PATH;
|
|
lStatus = ERROR_SUCCESS;
|
|
}
|
|
bFound = TRUE;
|
|
break;
|
|
}
|
|
} // else ignore if not a local or remote hard drive
|
|
szRootDir[3] = 0; // reset string back to a drive only
|
|
} // end of for loop
|
|
if (bFound) goto GDP_ExitPoint;
|
|
}
|
|
|
|
if ((dwPhase & SEARCH_CD_ROM) == SEARCH_CD_ROM) {
|
|
// if here, then no client tree was found on a hard drive, so see if
|
|
// they have a CD-ROM with the client tree on it. If they do, then
|
|
// return the DOS path of the dir.
|
|
|
|
// find CD-ROM drive
|
|
szRootDir[0] = 0;
|
|
szRootDir[1] = cColon;
|
|
szRootDir[2] = cBackslash;
|
|
szRootDir[3] = 0;
|
|
|
|
for (szRootDir[0] = cC; szRootDir[0] <= cZ; szRootDir[0]++) {
|
|
if (GetDriveType(szRootDir) == DRIVE_CDROM) break;
|
|
}
|
|
|
|
if (szRootDir[0] <= cZ) {
|
|
// then a CD-ROM must have been found, so append the "clients" dir
|
|
// and see if this is a valid client tree
|
|
if (dwSearchType == FDT_TOOLS_TREE){
|
|
lstrcat (szRootDir, cszToolsDir);
|
|
bValidPath = (BOOL)(ValidSrvToolsPath (szRootDir) == 0);
|
|
} else {
|
|
lstrcat (szRootDir, cszClientsDir);
|
|
bValidPath = (BOOL)(ValidSharePath (szRootDir) == 0);
|
|
}
|
|
if (bValidPath) {
|
|
// found one on the CD so return the DOS
|
|
// version of path
|
|
lstrcpy (szPath, szRootDir);
|
|
lPathType = NCDU_CDROM_PATH;
|
|
lStatus = ERROR_SUCCESS;
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
goto GDP_ExitPoint;
|
|
}
|
|
|
|
// if here, then NO client tree was found. so return an empty string
|
|
// bufffer and error code.
|
|
|
|
lStatus = ERROR_SUCCESS;
|
|
lPathType = NCDU_NO_CLIENT_PATH_FOUND;
|
|
*szPath = 0; // make string buffer empty
|
|
|
|
GDP_ExitPoint:
|
|
|
|
if (plPathType != NULL) {
|
|
*plPathType = lPathType;
|
|
}
|
|
|
|
FREE_IF_ALLOC (szLocalPath);
|
|
|
|
SetErrorMode (nErrorMode); // restore old error mode
|
|
|
|
return lStatus;
|
|
}
|
|
|
|
static
|
|
BOOL
|
|
FindClientsDlg_WM_INITDIALOG (
|
|
IN HWND hwndDlg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dialog Box initialization routine:
|
|
calls routines that format the currently selected options
|
|
for display in the static text fields of the dialog box
|
|
|
|
Arguments:
|
|
|
|
IN HWND hwndDlg
|
|
Handle to dialog box window
|
|
|
|
IN WPARAM wParam
|
|
Not Used
|
|
|
|
IN LPARAM lParam
|
|
pointer to client search data strucutre
|
|
|
|
Return Value:
|
|
|
|
FALSE because focus is set in this routine to the CANCEL button
|
|
|
|
--*/
|
|
{
|
|
PFDT_DATA pFdt = (PFDT_DATA)lParam;
|
|
LPTSTR szTitle;
|
|
|
|
// locate windw
|
|
PositionWindow (hwndDlg);
|
|
|
|
// set global flag
|
|
bSearchForClients = TRUE;
|
|
|
|
// clear dialog box text
|
|
SetDlgItemText (hwndDlg, NCDU_CLIENT_SEARCH_PHASE, cszEmptyString);
|
|
|
|
// display Tools Tree search string if appropriate
|
|
szTitle = GlobalAlloc (GPTR, MAX_PATH_BYTES);
|
|
if (szTitle != NULL) {
|
|
if (pFdt->dwSearchType == FDT_TOOLS_TREE) {
|
|
if (LoadString (
|
|
(HINSTANCE)GetWindowLongPtr(hwndDlg, GWLP_HINSTANCE),
|
|
NCDU_FINDING_TOOLS_PATH,
|
|
szTitle,
|
|
80) > 0) {
|
|
SetDlgItemText (hwndDlg, NCDU_SEARCH_TYPE_TITLE, szTitle);
|
|
}
|
|
}
|
|
FREE_IF_ALLOC (szTitle);
|
|
}
|
|
|
|
// start 1st phase of search
|
|
PostMessage (hwndDlg, NCDU_SEARCH_FOR_CLIENTS, (WPARAM)SEARCH_REGISTRY, lParam);
|
|
|
|
// set focus
|
|
SetFocus (GetDlgItem(hwndDlg, IDCANCEL));
|
|
|
|
// need an arrow cursor to cancel out of dialog box.
|
|
|
|
hOrigCursor = SetCursor (LoadCursor(NULL, IDC_ARROW));
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static
|
|
BOOL
|
|
FindClientsDlg_SEARCH_FOR_CLIENTS (
|
|
IN HWND hwndDlg, // dlg window handle
|
|
IN WPARAM wParam, // search phase
|
|
IN LPARAM lParam // search data structure
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
message processing routine to perform client tree search in phases
|
|
|
|
Arguments:
|
|
|
|
IN HWND hwndDlg
|
|
dlg window handle
|
|
|
|
IN WPARAM wParam
|
|
search phase
|
|
|
|
IN LPARAM lParam
|
|
search data structure
|
|
|
|
Return Value:
|
|
|
|
TRUE
|
|
|
|
--*/
|
|
{
|
|
UINT nPhaseName;
|
|
PFDT_DATA pFdt;
|
|
|
|
if (bSearchForClients) {
|
|
// perform this phase of the search
|
|
// set dlg box text
|
|
switch (wParam) {
|
|
case SEARCH_REGISTRY:
|
|
nPhaseName = CSZ_SYSTEM_REGISTRY;
|
|
break;
|
|
|
|
case SEARCH_SHARED_DIRS:
|
|
nPhaseName = CSZ_SHARED_DIRS;
|
|
break;
|
|
|
|
case SEARCH_HARD_DRIVES:
|
|
nPhaseName = CSZ_HARD_DISK_DIRS;
|
|
break;
|
|
|
|
case SEARCH_CD_ROM:
|
|
nPhaseName = CSZ_CD_ROM;
|
|
break;
|
|
|
|
default:
|
|
nPhaseName = CSZ_LOCAL_MACHINE;
|
|
break;
|
|
}
|
|
SetDlgItemText (hwndDlg, NCDU_CLIENT_SEARCH_PHASE,
|
|
GetStringResource (nPhaseName));
|
|
|
|
pFdt = (PFDT_DATA)lParam;
|
|
|
|
// search for clients
|
|
|
|
SearchForDistPath (
|
|
pFdt->szPathBuffer,
|
|
pFdt->dwPathBufferLen,
|
|
pFdt->plPathType,
|
|
pFdt->dwSearchType,
|
|
(DWORD)wParam);
|
|
|
|
if (*pFdt->plPathType != NCDU_NO_CLIENT_PATH_FOUND) {
|
|
// client found, so end here
|
|
EndDialog (hwndDlg, IDOK);
|
|
} else {
|
|
// try next phase
|
|
if (wParam != SEARCH_LAST_PHASE) {
|
|
wParam <<= 1; // go to next phase
|
|
PostMessage (hwndDlg, NCDU_SEARCH_FOR_CLIENTS,
|
|
wParam, lParam);
|
|
} else {
|
|
// this is the last phase so exit
|
|
EndDialog (hwndDlg, (bSearchForClients ? IDOK : IDCANCEL));
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
static
|
|
BOOL
|
|
FindClientsDlg_WM_COMMAND (
|
|
IN HWND hwndDlg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_COMMAND message dispatching routine.
|
|
Dispatches IDCANCEL and IDOK button messages, sends all others
|
|
to the DefDlgProc.
|
|
|
|
Arguments:
|
|
|
|
IN HWND hwndDlg
|
|
Handle to dialog box window
|
|
|
|
IN WPARAM wParam
|
|
windows message wParam arg
|
|
|
|
IN LPARAM lParam
|
|
windows message lParam arg
|
|
|
|
Return Value:
|
|
|
|
TRUE if message is not dispatched (i.e. not processed)
|
|
othewise the value returned by the called routine.
|
|
|
|
--*/
|
|
{
|
|
|
|
switch (LOWORD(wParam)) {
|
|
case IDCANCEL:
|
|
switch (HIWORD(wParam)) {
|
|
case BN_CLICKED:
|
|
bSearchForClients = FALSE;
|
|
return TRUE;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
}
|
|
static
|
|
BOOL
|
|
FindClientsDlg_WM_DESTROY (
|
|
IN HWND hwndDlg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
restores original cursor when dialog box exits
|
|
|
|
Arguments:
|
|
|
|
std. windows message args
|
|
|
|
Return Value:
|
|
|
|
TRUE
|
|
|
|
--*/
|
|
{
|
|
if (hOrigCursor != NULL) SetCursor (hOrigCursor);
|
|
hOrigCursor = NULL;
|
|
return TRUE;
|
|
}
|
|
|
|
static
|
|
INT_PTR CALLBACK
|
|
FindClientsDlgProc (
|
|
IN HWND hwndDlg,
|
|
IN UINT message,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
main dialog proc for this dialog box.
|
|
Processes the following messages:
|
|
|
|
WM_INITDIALOG: dialog box initialization
|
|
WM_COMMAND: command button/item selected
|
|
WM_DESTROY: restore cursor on exit
|
|
NCDU_SEARCH_FOR_CLIENTS: execute search message
|
|
|
|
Arguments:
|
|
|
|
IN HWND hwndDlg
|
|
handle to dialog box window
|
|
|
|
IN UINT message
|
|
message id
|
|
|
|
IN WPARAM wParam
|
|
message wParam arg
|
|
|
|
IN LPARAM lParam
|
|
message lParam arg
|
|
|
|
Return Value:
|
|
|
|
FALSE if message not processed by this module, otherwise the
|
|
value returned by the message processing routine.
|
|
|
|
--*/
|
|
{
|
|
switch (message) {
|
|
// windows messages
|
|
case WM_INITDIALOG: return (FindClientsDlg_WM_INITDIALOG (hwndDlg, wParam, lParam));
|
|
case WM_COMMAND: return (FindClientsDlg_WM_COMMAND (hwndDlg, wParam, lParam));
|
|
case WM_DESTROY: return (FindClientsDlg_WM_DESTROY (hwndDlg, wParam, lParam));
|
|
// local messages
|
|
case NCDU_SEARCH_FOR_CLIENTS: return (FindClientsDlg_SEARCH_FOR_CLIENTS (hwndDlg, wParam, lParam));
|
|
default: return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|