#include "dfuser.h" #include #include "dferr.h" #include "dfhlprs.h" #include "drvfull.h" #include #define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0])) _sFLAG_DESCR _scopeFD[] = { FLAG_DESCR(RESOURCE_CONNECTED ), FLAG_DESCR(RESOURCE_GLOBALNET ), FLAG_DESCR(RESOURCE_REMEMBERED), FLAG_DESCR(RESOURCE_RECENT ), FLAG_DESCR(RESOURCE_CONTEXT ), }; _sFLAG_DESCR _typeFD[] = { FLAG_DESCR(RESOURCETYPE_ANY ), FLAG_DESCR(RESOURCETYPE_DISK ), FLAG_DESCR(RESOURCETYPE_PRINT ), FLAG_DESCR(RESOURCETYPE_RESERVED ), FLAG_DESCR(RESOURCETYPE_UNKNOWN ), }; _sFLAG_DESCR _usageFD[] = { FLAG_DESCR(RESOURCEUSAGE_CONNECTABLE ), FLAG_DESCR(RESOURCEUSAGE_CONTAINER ), FLAG_DESCR(RESOURCEUSAGE_NOLOCALDEVICE ), FLAG_DESCR(RESOURCEUSAGE_SIBLING ), FLAG_DESCR(RESOURCEUSAGE_ATTACHED ), FLAG_DESCR(RESOURCEUSAGE_RESERVED ), }; _sFLAG_DESCR _displaytypeFD[] = { FLAG_DESCR(RESOURCEDISPLAYTYPE_GENERIC ), FLAG_DESCR(RESOURCEDISPLAYTYPE_DOMAIN ), FLAG_DESCR(RESOURCEDISPLAYTYPE_SERVER ), FLAG_DESCR(RESOURCEDISPLAYTYPE_SHARE ), FLAG_DESCR(RESOURCEDISPLAYTYPE_FILE ), FLAG_DESCR(RESOURCEDISPLAYTYPE_GROUP ), FLAG_DESCR(RESOURCEDISPLAYTYPE_NETWORK ), FLAG_DESCR(RESOURCEDISPLAYTYPE_ROOT ), FLAG_DESCR(RESOURCEDISPLAYTYPE_SHAREADMIN ), FLAG_DESCR(RESOURCEDISPLAYTYPE_DIRECTORY ), FLAG_DESCR(RESOURCEDISPLAYTYPE_TREE ), FLAG_DESCR(RESOURCEDISPLAYTYPE_NDSCONTAINER ), }; HRESULT _EnumConnections(DWORD dwFlags[], LPTSTR pszArg, DWORD cchIndent) { HRESULT hres = S_OK; HANDLE hEnum; DWORD dw; DWORD dwScope; _StartClock(); if (_IsFlagSet(USER_WNETENUMRESOURCECONNECTED, dwFlags)) { dwScope = RESOURCE_CONNECTED; } else { dwScope = RESOURCE_REMEMBERED; } dw = WNetOpenEnum(dwScope, RESOURCETYPE_DISK, 0, NULL, &hEnum); if (WN_SUCCESS == dw) { BOOL fExit = FALSE; DWORD cbBuf = 4096 * 4; PBYTE pbBuf = (PBYTE)LocalAlloc(LPTR, cbBuf); do { //return as much as possible DWORD c = 0xFFFFFFFF; ZeroMemory(pbBuf, cbBuf); dw = WNetEnumResource(hEnum, &c, pbBuf, &cbBuf); // we assume we'll call it only once _StopClock(); _PrintElapsedTime(cchIndent, TRUE); switch (dw) { case WN_SUCCESS: { NETRESOURCE* pnr = (NETRESOURCE*)pbBuf; for (DWORD i = 0; i < c; ++i) { _PrintIndent(cchIndent); wprintf(TEXT("NETRESOURCE\n")); _PrintIndent(cchIndent); wprintf(TEXT("{\n")); // Scope _PrintFlag(pnr->dwScope, _scopeFD, ARRAYSIZE(_scopeFD), cchIndent + 2, TRUE, TRUE, FALSE, FALSE); wprintf(TEXT(" (DWORD dwScope)\n")); // Type _PrintFlag(pnr->dwType, _typeFD, ARRAYSIZE(_typeFD), cchIndent + 2, TRUE, TRUE, FALSE, FALSE); wprintf(TEXT(" (DWORD dwType)\n")); // DisplayType _PrintFlag(pnr->dwDisplayType, _displaytypeFD, ARRAYSIZE(_displaytypeFD), cchIndent + 2, TRUE, TRUE, FALSE, FALSE); wprintf(TEXT(" (DWORD dwDisplayType)\n")); // Usage _PrintFlag(pnr->dwUsage, _usageFD, ARRAYSIZE(_usageFD), cchIndent + 2, TRUE, TRUE, FALSE, TRUE); wprintf(TEXT(" (DWORD dwUsage)\n")); // lpLocalName _PrintIndent(cchIndent + 2); if (pnr->lpLocalName) { wprintf(TEXT("'%s'"), pnr->lpLocalName); } else { wprintf(TEXT("")); } wprintf(TEXT(" (LPTSTR lpLocalName)\n")); // lpRemoteName _PrintIndent(cchIndent + 2); if (pnr->lpRemoteName) { wprintf(TEXT("'%s'"), pnr->lpRemoteName); } else { wprintf(TEXT("")); } wprintf(TEXT(" (LPTSTR lpRemoteName)\n")); // lpComment _PrintIndent(cchIndent + 2); if (pnr->lpComment) { wprintf(TEXT("'%s'"), pnr->lpComment); } else { wprintf(TEXT("")); } wprintf(TEXT(" (LPTSTR lpComment)\n")); // lpProvider _PrintIndent(cchIndent + 2); if (pnr->lpProvider) { wprintf(TEXT("'%s'"), pnr->lpProvider); } else { wprintf(TEXT("")); } wprintf(TEXT(" (LPTSTR lpProvider)\n")); _PrintIndent(cchIndent); wprintf(TEXT("}\n\n")); ++pnr; } break; } case ERROR_NO_MORE_ITEMS: { fExit = TRUE; break; } case ERROR_MORE_DATA: { if (pbBuf) { LocalFree(pbBuf); } // cbBuf contains required size pbBuf = (PBYTE)LocalAlloc(LPTR, cbBuf); if (!pbBuf) { fExit = TRUE; } break; } } } while (!fExit); if (pbBuf) { LocalFree(pbBuf); } WNetCloseEnum(hEnum); } else { if (ERROR_NO_NETWORK == dw) { wprintf(TEXT("Error: No Network!\n")); } else { if (ERROR_NO_MORE_ITEMS == dw) { wprintf(TEXT("None\n")); } } } return hres; }