/********************************************************************* * * PROJECT: nrsenum * FILE: nrsenum.c * * DESCRIPTION: sample on enumerating network resources * * REVISION: Created 09/19/98 * * Copyright(C) 1998, Tomas Restrepo. All rights Reserved * *********************************************************************/ #define STRICT #define WINVER 0x0400 #include #include #include #define BUFFER_SIZE (16384) void DisplayResources (HANDLE hEnum) { DWORD dwSize = BUFFER_SIZE; DWORD dwCount = 0xFFFFFFFF; const char * dtype = NULL; const char * type = NULL; int i; LPNETRESOURCE lpData; // allocate 16K of space lpData = (LPNETRESOURCE)malloc (dwSize); if (lpData == NULL) { puts ("Not enough memory\n"); return; } while (WNetEnumResource (hEnum, &dwCount, (LPVOID)lpData, &dwSize) == NO_ERROR) { for (i = 0; i < (int)dwCount; i++) { switch (lpData[i].dwDisplayType) { case RESOURCEDISPLAYTYPE_DOMAIN: dtype = "DOMAIN: "; break; case RESOURCEDISPLAYTYPE_GENERIC: dtype = "GENERIC: "; break; case RESOURCEDISPLAYTYPE_SERVER: dtype = "SERVER: "; break; case RESOURCEDISPLAYTYPE_SHARE: dtype = "SHARE: "; break; // Documentation only mentions the 4 // types above. The next ones // appear only in the header files // with WINVER >= 0x0400 defined case RESOURCEDISPLAYTYPE_FILE: dtype = "FILE: "; break; case RESOURCEDISPLAYTYPE_GROUP: dtype = "GROUP: "; break; case RESOURCEDISPLAYTYPE_NETWORK: dtype = "NETWORK: "; break; case RESOURCEDISPLAYTYPE_ROOT: dtype = "ROOT: "; break; case RESOURCEDISPLAYTYPE_SHAREADMIN: dtype = "SHAREADMIN: "; break; case RESOURCEDISPLAYTYPE_DIRECTORY: dtype = "DIRECTORY: "; break; case RESOURCEDISPLAYTYPE_TREE: dtype = "TREE: "; break; case RESOURCEDISPLAYTYPE_NDSCONTAINER: dtype = "NDSCONTAINER: "; break; default: dtype = "UNKNOWN: "; break; } switch (lpData[i].dwType) { case RESOURCETYPE_DISK: type = "DISK: "; break; case RESOURCETYPE_PRINT: type = "PRINTER: "; break; default: type = "UNKNOWN: "; break; } printf ("%s %s %s\n", dtype, type, lpData[i].lpRemoteName); // if the resource is a container, // recursively enumerate if (lpData[i].dwUsage & RESOURCEUSAGE_CONTAINER) { HANDLE hCont; if (WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, &lpData[i], &hCont) == NO_ERROR) { DisplayResources (hCont); WNetCloseEnum (hCont); } else printf ("Error enumerating resources: %d\n", GetLastError()); } } // for dwSize = BUFFER_SIZE; } // while free (lpData); } /* DisplayResources */ int main (void) { HANDLE hEnum = NULL; // first call, enumerate all resources (including containers) // starting at the root of the network if (WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, NULL, &hEnum) != NO_ERROR) { printf ("Error enumerating resources: %d\n", GetLastError()); return -1; } // Initiate recursive enumeration through all containers DisplayResources (hEnum); // Close enumeration WNetCloseEnum (hEnum); return 0; } /* main */