windows-nt/Source/XPSP1/NT/admin/netui/mprui/test2/enum.cxx
2020-09-26 16:20:57 +08:00

1000 lines
24 KiB
C++

#include "headers.hxx"
#pragma hdrstop
#include "resource.h"
#include "nr.hxx"
/////////////////////////////////////////////////////////////////////////////
// Exported from t.cxx
//
VOID
PlaceIt(
HWND hwnd
);
/////////////////////////////////////////////////////////////////////////////
TCHAR g_szRoot[] = TEXT("Entire Network");
/////////////////////////////////////////////////////////////////////////////
//
// Timing stuff (stolen from the shell)
//
#if 1
__inline DWORD clockrate() {LARGE_INTEGER li; QueryPerformanceFrequency(&li); return li.LowPart;}
__inline DWORD clock() {LARGE_INTEGER li; QueryPerformanceCounter(&li); return li.LowPart;}
#else
__inline DWORD clockrate() {return 1000;}
__inline DWORD clock() {return GetTickCount();}
#endif
#define TIMEVAR(t) DWORD t ## T; DWORD t ## N
#define TIMEIN(t) t ## T = 0, t ## N = 0
#define TIMESTART(t) t ## T -= clock(), t ## N ++
#define TIMESTOP(t) t ## T += clock()
#define TIMEFMT(t) ((DWORD)(t) / clockrate()), (((DWORD)((t) * 1000) / clockrate()) % 1000)
#define TIMEOUT(t) if (t ## N) { \
TCHAR szBuf[1000]; \
wsprintf(szBuf, TEXT(#t) TEXT(": %ld calls, time: %ld, total: %ld.%03ld sec, average: %ld.%03ld sec/call\n"), t ## N, t ## T, TIMEFMT(t ## T), TIMEFMT( t ## T / t ## N )); \
OutputDebugString(szBuf); \
}
//
// Globals
//
HIMAGELIST g_himl;
#define DEFAULT_BUFFER_SIZE 50000
LPBYTE g_pBuffer = NULL;
DWORD g_dwBufferSize = 0;
BOOL g_bUseWNetFormatNetworkName = FALSE;
DWORD g_dwScope = 0;
DWORD g_dwType = 0;
DWORD g_dwUsage = 0;
DWORD CALLBACK
EnumThreadProc(
LPVOID lpThreadParameter
);
INT_PTR CALLBACK
DlgProcStart(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
);
INT_PTR CALLBACK
DlgProcMain(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
);
BOOL
OnInitDialog(
IN HWND hwnd,
IN LPNETRESOURCE pRootNR
);
BOOL
OnTreeNotify(
IN HWND hwnd,
IN LPNM_TREEVIEW ptvn
);
BOOL
OnExpand(
IN HWND hwnd,
IN LPNM_TREEVIEW ptvn
);
BOOL
OnGetDispInfo(
IN HWND hwnd,
IN LPNM_TREEVIEW ptvn
);
VOID
InsertChildren(
IN HWND hwnd,
IN HTREEITEM hParent,
IN CNetResource* pnrParent,
IN HANDLE hEnum
);
VOID
InsertItem(
IN HWND hwnd,
IN HTREEITEM hParent,
IN CNetResource* pnrParent,
IN LPNETRESOURCE pnr
);
VOID
GetItemText(
IN LPNETRESOURCE pnr,
OUT LPTSTR pszBuf // assume it's big enough
);
VOID
ErrorPopup(
IN HWND hwnd,
IN DWORD dwErr
);
/////////////////////////////////////////////////////////////////////////////
//
// For image list
//
//
// NOTE: the I_* indices defined in global.hxx MUST MATCH THIS ARRAY!
//
WORD s_IconArray[] =
{
IDI_GENERIC,
IDI_DOMAIN,
IDI_SERVER,
IDI_SHARE,
IDI_FILE,
IDI_GROUP,
IDI_NETWORK,
IDI_ROOT,
IDI_SHAREADMIN,
IDI_DIRECTORY,
IDI_TREE
};
int g_IconIndex[ARRAYLEN(s_IconArray)];
/////////////////////////////////////////////////////////////////////////////
ULONG
DoEnumeration(
IN HWND hwnd
)
{
DWORD idThread;
HANDLE hThread = CreateThread(NULL, 0, EnumThreadProc, (LPVOID)NULL, 0, &idThread);
if (hThread)
{
CloseHandle(hThread);
}
else
{
MessageBox(hwnd, TEXT("Couldn't create enumeration thread"), TEXT("Error!"), MB_OK);
}
return 0;
}
DWORD CALLBACK
EnumThreadProc(
LPVOID lpThreadParameter
)
{
InitCommonControls();
//
// Create the image list
//
int cxIcon = GetSystemMetrics(SM_CXSMICON);
int cyIcon = GetSystemMetrics(SM_CYSMICON);
g_himl = ImageList_Create(cxIcon, cyIcon, ILC_MASK, ARRAYLEN(g_IconIndex), 0);
if (NULL == g_himl)
{
return (ULONG)-1;
}
for (UINT i=0; i < ARRAYLEN(g_IconIndex); i++)
{
HICON hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(s_IconArray[i]));
if (NULL == hIcon)
{
continue;
}
g_IconIndex[i] = ImageList_AddIcon(g_himl, hIcon);
if (-1 == g_IconIndex[i])
{
// failed!
}
DestroyIcon(hIcon);
}
// Now see what the user wants to do
DWORD finalret = 0;
INT_PTR ret;
ret = DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_START), NULL, DlgProcStart);
if (-1 == ret)
{
ErrorPopup(NULL, GetLastError());
finalret = 1;
}
else if (!ret)
{
// user cancelled
finalret = 1;
}
//
// Release image list
//
if (NULL != g_himl)
{
ImageList_Destroy(g_himl);
}
return finalret;
}
/////////////////////////////////////////////////////////////////////////////
class CWaitCursor
{
public:
CWaitCursor(UINT idResCursor = 0);
~CWaitCursor();
private:
HCURSOR _hcurWait;
HCURSOR _hcurOld;
};
//----------------------------------------------------------------------------
CWaitCursor::CWaitCursor(UINT idResCursor)
{
_hcurWait = _hcurOld = NULL;
if (0 != idResCursor)
{
_hcurWait = LoadCursor(g_hInstance, MAKEINTRESOURCE(idResCursor));
_hcurOld = SetCursor(_hcurWait);
}
else
{
_hcurOld = SetCursor(LoadCursor(NULL, IDC_WAIT));
}
}
CWaitCursor::~CWaitCursor()
{
::SetCursor( _hcurOld );
if (_hcurWait)
{
::DestroyCursor( _hcurWait );
}
}
/////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK
DlgProcStart(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
switch (uMsg)
{
case WM_INITDIALOG:
{
PlaceIt(hwnd);
// Set default to be enumeration from the root of the network
SetDlgItemInt(hwnd, IDC_BUFFER_SIZE, DEFAULT_BUFFER_SIZE, FALSE);
SetDlgItemText(hwnd, IDC_REMOTE_TEXT, TEXT(""));
EnableWindow(GetDlgItem(hwnd, IDC_REMOTE_TEXT), FALSE);
CheckDlgButton(hwnd, IDC_REMOTE_TEXT, 0);
SetDlgItemText(hwnd, IDC_PROVIDER_TEXT, TEXT(""));
EnableWindow(GetDlgItem(hwnd, IDC_PROVIDER_TEXT), FALSE);
CheckDlgButton(hwnd, IDC_PROVIDER_TEXT, 0);
CheckRadioButton(hwnd, IDC_RESOURCE_CONNECTED, IDC_RESOURCE_SHAREABLE, IDC_RESOURCE_GLOBALNET);
CheckRadioButton(hwnd, IDC_DISK, IDC_RESERVED, IDC_ANY);
CheckDlgButton(hwnd, IDC_RESOURCEUSAGE_CONNECTABLE, 1);
CheckDlgButton(hwnd, IDC_RESOURCEUSAGE_CONTAINER, 1);
return 1; // didn't call SetFocus
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDOK:
{
NETRESOURCE nr = {0};
LPNETRESOURCE pnr = &nr;
DWORD dwScope = 0;
if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCE_CONNECTED))
{
dwScope = RESOURCE_CONNECTED;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCE_GLOBALNET))
{
dwScope = RESOURCE_GLOBALNET;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCE_REMEMBERED))
{
dwScope = RESOURCE_REMEMBERED;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCE_RECENT))
{
dwScope = RESOURCE_RECENT;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCE_CONTEXT))
{
dwScope = RESOURCE_CONTEXT;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCE_SHAREABLE))
{
dwScope = RESOURCE_SHAREABLE;
}
else
{
// internal error
}
DWORD dwType = 0;
if (1 == IsDlgButtonChecked(hwnd, IDC_DISK))
{
dwType = RESOURCETYPE_DISK;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_PRINTER))
{
dwType = RESOURCETYPE_PRINT;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_ANY))
{
dwType = RESOURCETYPE_ANY;
}
else if (1 == IsDlgButtonChecked(hwnd, IDC_RESERVED))
{
dwType = RESOURCETYPE_RESERVED;
}
else
{
// internal error
}
DWORD dwUsage = 0;
if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCEUSAGE_CONNECTABLE))
{
dwUsage |= RESOURCEUSAGE_CONNECTABLE;
}
if (1 == IsDlgButtonChecked(hwnd, IDC_RESOURCEUSAGE_CONTAINER))
{
dwUsage |= RESOURCEUSAGE_CONTAINER;
}
TCHAR szRemoteName[200];
LPTSTR pszRemoteName = NULL;
if (1 == IsDlgButtonChecked(hwnd, IDC_REMOTE))
{
GetDlgItemText(hwnd, IDC_REMOTE_TEXT, szRemoteName, ARRAYLEN(szRemoteName));
pszRemoteName = szRemoteName;
}
TCHAR szProviderName[200];
LPTSTR pszProviderName = NULL;
if (1 == IsDlgButtonChecked(hwnd, IDC_PROVIDER))
{
GetDlgItemText(hwnd, IDC_PROVIDER_TEXT, szProviderName, ARRAYLEN(szProviderName));
pszProviderName = szProviderName;
}
pnr->dwScope = 0;
pnr->dwType = 0;
pnr->dwDisplayType = 0;
pnr->dwUsage = 0;
pnr->lpLocalName = NULL;
pnr->lpRemoteName = NewDup(pszRemoteName);
pnr->lpComment = NULL;
pnr->lpProvider = NewDup(pszProviderName);
BOOL bTranslated;
UINT uiSize = GetDlgItemInt(hwnd, IDC_BUFFER_SIZE, &bTranslated, FALSE);
if (bTranslated)
{
g_dwBufferSize = (DWORD)uiSize;
}
else
{
g_dwBufferSize = DEFAULT_BUFFER_SIZE;
}
g_pBuffer = (LPBYTE)LocalAlloc(LMEM_FIXED, g_dwBufferSize);
if (NULL == g_pBuffer)
{
MessageBox(hwnd, TEXT("Error allocating buffer"), TEXT("Error"), MB_OK);
EndDialog(hwnd, FALSE); // pretend we cancelled
}
else
{
g_bUseWNetFormatNetworkName = FALSE;
if (1 == IsDlgButtonChecked(hwnd, IDC_USE_WNETFORMATNETWORKNAME))
{
g_bUseWNetFormatNetworkName = TRUE;
}
g_dwScope = dwScope;
g_dwType = dwType;
g_dwUsage = dwUsage;
if ((NULL == nr.lpRemoteName) && (NULL == nr.lpProvider))
{
pnr = NULL; // root
}
INT_PTR ret = DialogBoxParam(g_hInstance,
MAKEINTRESOURCE(IDD_MAIN),
hwnd,
DlgProcMain,
(LPARAM) pnr);
if (-1 == ret)
{
ErrorPopup(NULL, GetLastError());
EndDialog(hwnd, FALSE); // pretend we cancelled
}
LocalFree(g_pBuffer);
g_pBuffer = NULL;
}
return TRUE;
}
case IDCANCEL:
EndDialog(hwnd, FALSE);
return TRUE;
case IDC_REMOTE:
EnableWindow(GetDlgItem(hwnd, IDC_REMOTE_TEXT),
(1 == IsDlgButtonChecked(hwnd, IDC_REMOTE)));
return TRUE;
case IDC_PROVIDER:
EnableWindow(GetDlgItem(hwnd, IDC_PROVIDER_TEXT),
(1 == IsDlgButtonChecked(hwnd, IDC_PROVIDER)));
return TRUE;
} // end switch (LOWORD(wParam))
return FALSE;
}
default:
return FALSE; // didn't process
}
}
INT_PTR CALLBACK
DlgProcMain(
IN HWND hwnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
switch (uMsg)
{
case WM_INITDIALOG:
return OnInitDialog(hwnd, (LPNETRESOURCE)lParam);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hwnd, 0);
break;
}
return 0;
case WM_NOTIFY:
return OnTreeNotify(hwnd, (LPNM_TREEVIEW)lParam);
default:
return 0; // didn't process
}
}
BOOL
OnInitDialog(
IN HWND hwnd,
IN LPNETRESOURCE pRootNR
)
{
PlaceIt(hwnd);
// Set the image list
HIMAGELIST himl = TreeView_SetImageList(GetDlgItem(hwnd, IDC_TREE), g_himl, TVSIL_NORMAL);
// fill top-level enumeration
TCHAR szBuf[500]; // for the item name
szBuf[0] = TEXT('\0');
GetItemText(pRootNR, szBuf);
CNetResource* pnr = new CNetResource(pRootNR);
// appAssert(pnr->GetNetResource()->dwDisplayType >= 0
// && pnr->GetNetResource()->dwDisplayType < ARRAYLEN(g_IconIndex));
int iImage = g_IconIndex[RESOURCEDISPLAYTYPE_ROOT];
TV_ITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = NULL;
tvi.state = 0;
tvi.stateMask = 0;
tvi.pszText = szBuf;
tvi.cchTextMax = 0; // not used
tvi.iImage = iImage;
tvi.iSelectedImage = iImage;
tvi.cChildren = 1; // anything >0
tvi.lParam = (LPARAM)pnr;
TV_INSERTSTRUCT tvis;
tvis.hParent = TVI_ROOT;
tvis.item = tvi;
tvis.hInsertAfter = TVI_FIRST;
HTREEITEM hret = TreeView_InsertItem(GetDlgItem(hwnd, IDC_TREE), &tvis);
return 1;
}
BOOL
OnTreeNotify(
IN HWND hwnd,
IN LPNM_TREEVIEW ptvn
)
{
switch (ptvn->hdr.code)
{
case TVN_ITEMEXPANDING:
return OnExpand(hwnd, ptvn);
case TVN_GETDISPINFO:
return OnGetDispInfo(hwnd, ptvn);
case TVN_SETDISPINFO:
return 0;
case TVN_DELETEITEM:
{
CNetResource* pnr = (CNetResource*)ptvn->itemOld.lParam;
delete pnr;
return 1;
}
default:
return 0;
}
}
BOOL
OnExpand(
IN HWND hwnd,
IN LPNM_TREEVIEW ptvn
)
{
HWND hwndTree = GetDlgItem(hwnd, IDC_TREE);
BOOL b;
CWaitCursor wait;
if (ptvn->action == TVE_COLLAPSE)
{
// delete all children of ptvn->itemNew.hItem
HTREEITEM hChild;
for (;;) // forever
{
hChild = TreeView_GetChild(hwndTree, ptvn->itemNew.hItem);
if (NULL == hChild)
{
break;
}
TreeView_DeleteItem(hwndTree, hChild);
}
}
else if (ptvn->action == TVE_EXPAND)
{
// enumerate and add children
HTREEITEM hParent = ptvn->itemNew.hItem;
TV_ITEM tvi;
tvi.hItem = hParent;
tvi.mask = TVIF_PARAM;
b = TreeView_GetItem(hwndTree, &tvi);
CNetResource* pnrParent = (CNetResource*)tvi.lParam;
LPNETRESOURCE pnr = pnrParent->GetNetResource();
HANDLE hEnum;
TIMEVAR(WNetOpenEnum);
TIMEIN(WNetOpenEnum);
TIMESTART(WNetOpenEnum);
DWORD dwErr = WNetOpenEnum(
g_dwScope,
g_dwType,
g_dwUsage,
(g_dwScope == RESOURCE_GLOBALNET || g_dwScope == RESOURCE_SHAREABLE)
? pnr : NULL,
&hEnum);
TIMESTOP(WNetOpenEnum);
TIMEOUT(WNetOpenEnum);
if (NO_ERROR == dwErr)
{
InsertChildren(hwnd, hParent, pnrParent, hEnum);
dwErr = WNetCloseEnum(hEnum);
if (NO_ERROR != dwErr)
{
ErrorPopup(hwnd, dwErr);
}
}
else
{
ErrorPopup(hwnd, dwErr);
}
}
else
{
// nothing interesting
}
return 0;
}
BOOL
OnGetDispInfo(
IN HWND hwnd,
IN LPNM_TREEVIEW ptvn
)
{
// 1. delete all children
// 2. enumerate and add children
HWND hwndTree = GetDlgItem(hwnd, IDC_TREE);
TV_DISPINFO* ptvdi = (TV_DISPINFO*)ptvn;
if (!(TVIF_CHILDREN & ptvdi->item.mask))
{
// not asking for children, so go away
}
return 1;
}
TIMEVAR(WNetFormatNetworkName);
VOID
InsertChildren(
IN HWND hwnd,
IN HTREEITEM hParent,
IN CNetResource* pnrParent,
IN HANDLE hEnum
)
{
DWORD cEntries = 0xffffffff; // as many as possible
DWORD cNewItems = 0;
NETRESOURCE* pnr;
DWORD cbBuffer = g_dwBufferSize;
DWORD dwErr;
TIMEVAR(WNetEnumResource);
TIMEVAR(InsertItems);
TIMEVAR(SortItems);
TIMEIN(WNetEnumResource);
TIMEIN(InsertItems);
TIMEIN(WNetFormatNetworkName);
TIMEIN(SortItems);
do
{
TIMESTART(WNetEnumResource);
dwErr = WNetEnumResource(hEnum, &cEntries, g_pBuffer, &cbBuffer);
TIMESTOP(WNetEnumResource);
if (NO_ERROR == dwErr)
{
/////////////////
TCHAR sz[300];
wsprintf(sz, TEXT("Got %d entries. Total new: %d\n"), cEntries, cNewItems);
OutputDebugString(sz);
/////////////////
TIMEVAR(InsertOnce);
TIMEIN(InsertOnce);
pnr = (NETRESOURCE*)g_pBuffer;
cNewItems += cEntries;
TIMESTART(InsertItems);
TIMESTART(InsertOnce);
for (DWORD i=0; i<cEntries; i++)
{
InsertItem(hwnd, hParent, pnrParent, &pnr[i]);
}
TIMESTOP(InsertOnce);
TIMESTOP(InsertItems);
TIMEOUT(InsertOnce);
}
else if (ERROR_NO_MORE_ITEMS != dwErr)
{
ErrorPopup(hwnd, GetLastError());
}
} while (dwErr == NO_ERROR);
TIMESTART(SortItems);
TreeView_SortChildren(GetDlgItem(hwnd, IDC_TREE), hParent, 0);
TIMESTOP(SortItems);
TIMEOUT(WNetEnumResource);
TIMEOUT(InsertItems);
TIMEOUT(WNetFormatNetworkName);
TIMEOUT(SortItems);
if (0 == cNewItems)
{
MessageBox(hwnd, TEXT("No items were found"), TEXT("Error"), MB_OK);
}
}
VOID
InsertItem(
IN HWND hwnd,
IN HTREEITEM hParent,
IN CNetResource* pnrParent,
IN LPNETRESOURCE pnr
)
{
TCHAR szBuf[500]; // for the item name
szBuf[0] = TEXT('\0');
if (g_bUseWNetFormatNetworkName)
{
TIMESTART(WNetFormatNetworkName);
DWORD dwLen = ARRAYLEN(szBuf);
DWORD dwErr = WN_SUCCESS;
if (NULL == pnr->lpProvider || NULL == pnr->lpRemoteName)
{
if (pnr->dwDisplayType == RESOURCEDISPLAYTYPE_ROOT)
{
_tcscpy(szBuf, g_szRoot);
}
else
{
dwErr = WN_NET_ERROR;
}
}
else
{
dwErr = WNetFormatNetworkName(
pnr->lpProvider,
pnr->lpRemoteName,
szBuf,
&dwLen,
WNFMT_ABBREVIATED | WNFMT_INENUM,
1000); // random large #
}
TIMESTOP(WNetFormatNetworkName);
if (NO_ERROR != dwErr)
{
ErrorPopup(hwnd, GetLastError());
return;
}
}
else
{
GetItemText(pnr, szBuf);
}
CNetResource* pnrChild = new CNetResource(pnr);
// appAssert(pnrChild->GetNetResource()->dwDisplayType >= 0
// && pnrChild->GetNetResource()->dwDisplayType < ARRAYLEN(g_IconIndex));
int iImage = g_IconIndex[pnrChild->GetNetResource()->dwDisplayType];
TV_ITEM tvi;
tvi.mask = TVIF_TEXT | TVIF_PARAM | TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvi.hItem = NULL;
tvi.state = 0;
tvi.stateMask = 0;
tvi.pszText = szBuf;
tvi.cchTextMax = 0; // not used
tvi.iImage = iImage;
tvi.iSelectedImage = iImage;
tvi.cChildren = (pnr->dwUsage & RESOURCEUSAGE_CONTAINER) ? 1 : 0;
tvi.lParam = (LPARAM)pnrChild;
TV_INSERTSTRUCT tvis;
tvis.hParent = hParent;
tvis.item = tvi;
tvis.hInsertAfter = TVI_LAST;
// tvis.hInsertAfter = TVI_FIRST;
// tvis.hInsertAfter = TVI_SORT;
HTREEITEM hret = TreeView_InsertItem(GetDlgItem(hwnd, IDC_TREE), &tvis);
if (NULL == hret)
{
TCHAR szMess[1000];
wsprintf(szMess, TEXT("Couldn't insert item %s"), szBuf);
MessageBox(hwnd, szMess, TEXT("Error"), MB_OK);
}
}
VOID
GetItemText(
IN LPNETRESOURCE pnr,
OUT LPTSTR pszBuf // assume it's big enough
)
{
LPTSTR pszT = NULL;
TCHAR szTmp[500];
*pszBuf = TEXT('\0');
if (NULL == pnr)
{
_tcscat(pszBuf, g_szRoot);
return;
}
if (pnr->lpRemoteName == NULL)
{
_stprintf(szTmp, TEXT("Null remote"));
_tcscat(pszBuf, szTmp);
}
else if ( (pnr->lpRemoteName != NULL)
&& (*pnr->lpRemoteName != TEXT('\0'))
)
{
_stprintf(szTmp, TEXT("%s"), pnr->lpRemoteName);
_tcscat(pszBuf, szTmp);
}
if ( (pnr->lpLocalName != NULL)
&& (*pnr->lpLocalName != TEXT('\0'))
)
{
_stprintf(szTmp, TEXT(" {%s}"), pnr->lpLocalName);
_tcscat(pszBuf, szTmp);
}
if ( (pnr->lpComment != NULL)
&& (*pnr->lpComment != TEXT('\0'))
)
{
_stprintf(szTmp, TEXT(" [%s]"), pnr->lpComment);
_tcscat(pszBuf, szTmp);
}
if ( (pnr->lpProvider != NULL)
&& (*pnr->lpProvider != TEXT('\0'))
)
{
_stprintf(szTmp, TEXT(" <%s>"), pnr->lpProvider);
_tcscat(pszBuf, szTmp);
}
if (pnr->dwUsage & RESOURCEUSAGE_CONNECTABLE)
{
_tcscat(pszBuf, TEXT(" [connectable]"));
}
if (pnr->dwUsage & RESOURCEUSAGE_CONTAINER)
{
_tcscat(pszBuf, TEXT(" [container]"));
}
switch (pnr->dwDisplayType)
{
case RESOURCEDISPLAYTYPE_GENERIC: pszT = TEXT(" {generic}"); break;
case RESOURCEDISPLAYTYPE_DOMAIN: pszT = TEXT(" {domain}"); break;
case RESOURCEDISPLAYTYPE_SERVER: pszT = TEXT(" {server}"); break;
case RESOURCEDISPLAYTYPE_SHARE: pszT = TEXT(" {share}"); break;
case RESOURCEDISPLAYTYPE_FILE: pszT = TEXT(" {file}"); break;
case RESOURCEDISPLAYTYPE_GROUP: pszT = TEXT(" {group}"); break;
case RESOURCEDISPLAYTYPE_NETWORK: pszT = TEXT(" {network}"); break;
case RESOURCEDISPLAYTYPE_ROOT: pszT = TEXT(" {root}"); break;
case RESOURCEDISPLAYTYPE_SHAREADMIN: pszT = TEXT(" {shareadmin}"); break;
case RESOURCEDISPLAYTYPE_DIRECTORY: pszT = TEXT(" {directory}"); break;
case RESOURCEDISPLAYTYPE_TREE: pszT = TEXT(" {tree}"); break;
default: pszT = TEXT(" {unknown}"); break;
}
_tcscat(pszBuf, pszT);
}
VOID
ErrorPopup(
IN HWND hwnd,
IN DWORD dwErr
)
{
TCHAR sz[500];
if (dwErr == WN_EXTENDED_ERROR)
{
DWORD npErr;
TCHAR szNpErr[500];
TCHAR szNpName[500];
DWORD dw = WNetGetLastError(&npErr, szNpErr, ARRAYLEN(szNpErr), szNpName, ARRAYLEN(szNpName));
if (dw == WN_SUCCESS)
{
wsprintf(sz,
TEXT("WN_EXTENDED_ERROR: %d, %s (%s)"),
npErr,
szNpErr,
szNpName);
}
else
{
wsprintf(sz,
TEXT("WN_EXTENDED_ERROR: WNetGetLastError error %d"),
dw);
}
MessageBox(hwnd, sz, TEXT("Error"), MB_OK);
}
else
{
wsprintf(sz, TEXT("%d (0x%08lx) "), dwErr, dwErr);
TCHAR szBuffer[MAX_PATH];
DWORD dwBufferSize = ARRAYLEN(szBuffer);
DWORD dwReturn = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwErr,
LANG_SYSTEM_DEFAULT,
szBuffer,
dwBufferSize,
NULL);
if (0 == dwReturn)
{
// couldn't find message
_tcscat(sz, TEXT("unknown error"));
}
else
{
_tcscat(sz, szBuffer);
}
MessageBox(hwnd, sz, TEXT("Error"), MB_OK);
}
}