PRB: WNetEnumResource Returns Different Info on Win95 and NT

Last reviewed: June 28, 1996
Article ID: Q152823
The information in this article applies to:

- Microsoft Win32 Software Development KIT (SDK) for Windows NT,

  version 3.5
- Microsoft Win32 Software Development KIT (SDK) for Windows 95,
  version 3.5

SYMPTOMS

When the WINNET example from the January 96 MSDN is built on Windows 95, and the sample is executed at the MS-DOS prompt from within Windows 95, the following error is displayed:

   This program has performed an illegal operation and will be shutdown.
   If the problem persists, contact the program vendor.

If the WINNET example is executed within the Visual C++ 4.0 debug environment, the following error is received:

   Unhandled exception in winnet.exe: 0xC0000005 : Access Violation.

CAUSE

The WNetEnumResouce API returns different values on Win95 than on Windows NT.

The problem occurs when an enumeration starts at the root of the network. The first buffer of NETRESOURCE structures returned from WNetEnumResource is different. On Windows 95, the lpProvider field is set to the Network Provider name and the lpRemoteName is set to NULL. On NT, the lpProvider and lpRemoteName fields point to different strings containing the same values.

In the WINNET sample, when the EnumResource function tries to execute its example filter, the _strnicmp C Run-Time function causes an ACCESS VIOLATION because the lpRemoteName is NULL.

RESOLUTION

Checking the value of the lpRemoteName field and ensuring it is pointing to a valid address before allowing the filter to execute prevents the ACCESS VIOLATION error.

STATUS

This behavior is by design.

MORE INFORMATION

The difference between the way the WNetEnumResource API works on NT and Windows 95 has only been observed when starting an enumeration at the root of the network. On Windows 95 platforms, it becomes necessary to check the value returned in the lpRemoteName for the first set of structures returned from WNetEnumResource.

Sample Code

   /* Compile options needed:
     Be sure to include the mpr.lib library when linking.
   */
   #include <windows.h>
   #include <winnetwk.h>
   #include <stdio.h>

   void main ( void )
   {
      NETRESOURCE resourcebuffer[5000];
      HANDLE hEnum;
      DWORD  netRet, dwEntriesToGet=0XFFFFFFFF;
      DWORD  dwSizeResourcebuffer = sizeof( resourcebuffer);

      //
      // Enumerate starting at the root of the network
      //
      netRet = WNetOpenEnum( RESOURCE_GLOBALNET,
                             RESOURCETYPE_DISK,
                             (RESOURCEUSAGE_CONNECTABLE |
    RESOUCEUSAGE_CONTAINER),
                             (LPNETRESOURCE)NULL,
                             &hEnum);
     if( netRet == NO_ERROR )
     {
        //
        // The WNetOpenEnum was successful. Now get all the network
   providers
    for
        // the network.
        //
        netRet = WNetEnumResource( hEnum,
                                   (LPDWORD)&dwEntriesToGet,
                                   (LPVOID)resourcebuffer,
                                   (LPDWORD)&dwSizeResourcebuffer);
        if( netRet == NO_ERROR )
        {
           //
           // The resourcebuffer contains the network providers. Take a
   look at
           // the lpRemoteName field. ON win 95, this field will be NULL,
   on NT
           // the field will match the lpProvider field
           //
           DWORD i;
           for( i = 0; i < dwEntriesToGet; i++ )
           {
              if( resourcebuffer[i].lpRemoteName ) printf("Remote Name:
   %s\n",
                     resourcebuffer[i].lpRemoteName);
              else printf("Remote Name: IS NULL\n");
              printf( "Network Provider: %s\n\n",
   resourcebuffer[i].lpProvider );
           }
        }
        else printf("ERROR: WNetEnumResource API failed : %ld\n", netRet );
    }
    else printf("ERROR: WNetOpenEnum API Failed: %ld\n", netRet);

   }


Additional reference words: 3.50
KBCategory: kbprg kbnetwork kbprb
KBSubcategory: kbnocat
.END
<><><><><><tegory:
KBSubcategory:
.END

Max Vaughn
SAE, Microsoft Premier Developer Support



THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: June 28, 1996
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.