RAS Detection Routine

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

Environment: VC6 SP3, NT4 SP5

The first thing you should do before you attempt to use a RAS function, is
find out it the RAS is actually installed. According to the
Microsoft Knowledgebase (article Q181518)
can detect wether the RAS has been
installed by trying to LoadLibrary("rasapi32.dll").
I have noticed that on almost all 9x systems (if not all) this will not work.
If you have installed the RAS and later removed it, the rasapi32.dll will remain in your
system directory. This causes the LoadLibrary() call to succeed, while further calls to
functions inside this library will fail.

Surfing though the registry I found out that there is a certain registry key which exists
if the RAS is installed, and is removed when the RAS is removed. This checked out for Win95,
Win98, WinNT and Win2000 (in fact, I don’t think it’s even possible to remove the RAS from
Win2k). The only ‘problem’, is that Win9x uses another registry key then WinNT. This can
easily be solved by an OS detect though.

The code below is all that is needed to successfully detect the RAS:

int RasDetect(void)
{
  HKEY registry = NULL;
  DWORD result;
  OSVERSIONINFO version;
  /* FIXME: GetLastError zelf implementeren */
  char regkey[70];

  /* First we have to find out which OS we are running on */
  version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  /* If we get and error, we can't continue. */
  if(!GetVersionEx(&version)) return -666;

  /* Then we set the registry key we want to look at */
  /* according to the OS we detected. */

  /* NOTE: WinME uses a registry layout similair to WinNT!! */
  if (version.dwPlatformId
  == VER_PLATFORM_WIN32_WINDOWS && version.dwMinorVersion != 90)
    strcpy(regkey, "system\currentcontrolset\services"
                   "\remoteaccess\networkprovider");
  else
    strcpy(regkey,"system\currentcontrolset\services\remoteaccess");

  /* We then try to open the registry key */
  if ((result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    regkey, 0,
    STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS
    | KEY_NOTIFY | READ_CONTROL,
    &registry))
  != ERROR_SUCCESS)
  {
    if(result == ERROR_FILE_NOT_FOUND)
    {
      RegCloseKey(registry);
      return 0; // No RAS found
    }
    else
    {
      RegCloseKey(registry);
      return -1; // Some other error
    }
  }

  RegCloseKey(registry);
  return 1; // Found RAS! Woohoo!!
}

Downloads

Download demo application – 4 Kb
Download demo source – 10 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read