发新话题
打印

[转载]Enum NETResource代码

[转载]Enum NETResource代码

文章作者:refdom

////////////////////////////////////////////////////////////////////////////////
//   
//    Enum NETResource
//   
//    File    : EnumNETResource.cpp
//   
//    Create at : 2002.3.19
//    Create by : refdom
//        Email      : refdom@263.net
//        Home Page : www.opengram.com
//
//        If you modify the code, or add more functions, please email me a copy.
//   
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <windows.h>
#include <winnetwk.h>

#pragma comment (lib, "Mpr.lib")

#define BUFFER_SIZE (16384)

void MyEnumResources(HANDLE, int);

int main (void)
{
    HANDLE hEnum = NULL;
    if (WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, NULL, &hEnum) != NO_ERROR)
    {
        printf ("Error!\n");
        return 0;
    }
    MyEnumResources (hEnum, 0);
    WNetCloseEnum (hEnum);
    return 0;
}

void MyEnumResources (HANDLE hEnum, int Layer)
{
    DWORD dwSize = BUFFER_SIZE;
    DWORD dwCount = -1;
    const char* pDisplayType = NULL;
    const char* pType = NULL;
    int i, n, nLayer, nRetCode;
    nLayer = Layer;

    LPNETRESOURCE lpNET;
    lpNET  =  (LPNETRESOURCE) malloc (dwSize);

    if (lpNET == NULL)
    {
        puts ("Not enough memory\n");
        return;
    }

    if (WNetEnumResource (hEnum, &dwCount, (LPVOID)lpNET, &dwSize) != NO_ERROR)
        goto Exit0;

    for (i = 0; i < (int) dwCount; i++)
    {
        switch (lpNET.dwDisplayType)
        {
        case RESOURCEDISPLAYTYPE_DOMAIN:
            pDisplayType = "DOMAIN: ";
            break;
        case RESOURCEDISPLAYTYPE_SERVER:
            pDisplayType = "SERVER: ";
            break;
        case RESOURCEDISPLAYTYPE_SHARE:
            pDisplayType = "SHARE: ";
            switch (lpNET.dwType)   
            {
            case RESOURCETYPE_DISK:
                pType = "DISK: ";
                break;
            case RESOURCETYPE_PRINT:
                pType = "PRINTER: ";
                break;
            default:
                pType = "UNKNOWN: ";
                break;
            }
            break;
        case RESOURCEDISPLAYTYPE_GENERIC:
            pDisplayType = "GENERIC: ";
            break;
        default:
            pDisplayType = "UNKNOWN: ";
            break;
        }

        for (n = 0 ; n < nLayer; n++)
        {
            printf ("\t");
        }
        if (lpNET.dwDisplayType == RESOURCEDISPLAYTYPE_SHARE)
            printf ("%s %s %s\n", pDisplayType, pType, lpNET.lpRemoteName);
        else
            printf ("%s %s\n", pDisplayType, lpNET.lpRemoteName);

        if (lpNET.dwUsage & RESOURCEUSAGE_CONTAINER)
        {
            HANDLE hCONTAINER;
            nRetCode = WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, &lpNET, &hCONTAINER);
            if ( nRetCode == NO_ERROR)
            {
                MyEnumResources (hCONTAINER, nLayer+1);
                WNetCloseEnum (hCONTAINER);
            }
            else
            {
                for (n = 0 ; n <= nLayer; n++)
                    printf ("\t");
                printf ("Error:");
                if (nRetCode == ERROR_NO_NETWORK)
                    printf ("The network is unavailable.\n");
                else if (nRetCode == 5)
                    printf ("Access Denial.\n");
                else
                    printf ("%d\n", GetLastError());
            }
        }
    }

Exit0:

    free (lpNET);
    return;
}

TOP

发新话题