// rasenum.cpp : Defines the entry point for the console application.
//  Copyright 2000 Sir Dystic - Cult of the Dead Cow - sirdystic@cultdeadcow.com
//
// Must be linked with rasapi32.lib 
#pragma comment( lib, "rasapi32.lib" )


#define WINVER 0x401

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

#define BUFFSIZE 65536



int main(int argc, char* argv[])
{
	DWORD d, buffsize, entriesread;
	char buff[BUFFSIZE];
	char buff2[BUFFSIZE];
	LPRASENTRYNAME prasentryname;
	RASCREDENTIALS rascreds;
	LPRASENTRY prasentry;
	char *phonebook = NULL;

	puts("RasEnum v.9 - Questions, comments, bitches and bugs to sirdystic@cultdeadcow.com");

	if (argc == 2)
		phonebook = argv[1];

	prasentryname = (LPRASENTRYNAME)buff;

	prasentryname->dwSize = sizeof(RASENTRYNAME);

	buffsize = BUFFSIZE;
	d = RasEnumEntries(NULL, phonebook, (LPRASENTRYNAME)buff, &buffsize, &entriesread);

	if (d != 0)
	{
		printf("Error %d calling RasEnumEntries\n", d);
		return 0;
	}

	for (d = 0; d < entriesread; d++)
	{
		printf( "Entry: \"%s\"\n", prasentryname[d].szEntryName );

		rascreds.dwSize = sizeof(RASCREDENTIALS);
		rascreds.dwMask = RASCM_UserName|RASCM_Password|RASCM_Domain;

		if (RasGetCredentials(phonebook, prasentryname[d].szEntryName, &rascreds) == 0)
		{
			printf(" User: \"%s\"\n Password: \"%s\"\n Domain: \"%s\"\n", rascreds.szUserName, rascreds.szPassword, rascreds.szDomain );
		}

		prasentry = (LPRASENTRY)buff2;

		prasentry->dwSize = sizeof(RASENTRY);
		buffsize = BUFFSIZE;
		if (RasGetEntryProperties(phonebook, prasentryname[d].szEntryName, (LPRASENTRY)buff2, &buffsize, NULL, NULL) == 0)
		{
			if (RASEO_UseCountryAndAreaCodes & prasentry->dwfOptions)
				printf(" Phone: (%s)%s\n", prasentry->szAreaCode, prasentry->szLocalPhoneNumber);
			else
				printf(" Phone: %s\n", prasentry->szLocalPhoneNumber );

			if (RASEO_SpecificIpAddr & prasentry->dwfOptions)
				printf(" IP address: %u.%u.%u.%u\n", prasentry->ipaddr.a, prasentry->ipaddr.b, prasentry->ipaddr.c, prasentry->ipaddr.d );

			if (RASEO_SpecificNameServers &  prasentry->dwfOptions)
			{
				printf(" DNS: %u.%u.%u.%u  %u.%u.%u.%u\n", prasentry->ipaddrDns.a, prasentry->ipaddrDns.b, prasentry->ipaddrDns.c, prasentry->ipaddrDns.d, prasentry->ipaddrDnsAlt.a, prasentry->ipaddrDnsAlt.b, prasentry->ipaddrDnsAlt.c, prasentry->ipaddrDnsAlt.d );
				printf(" WINS: %u.%u.%u.%u  %u.%u.%u.%u\n", prasentry->ipaddrWins.a, prasentry->ipaddrWins.b, prasentry->ipaddrWins.c, prasentry->ipaddrWins.d, prasentry->ipaddrWinsAlt.a, prasentry->ipaddrWinsAlt.b, prasentry->ipaddrWinsAlt.c, prasentry->ipaddrWinsAlt.d );
			}

			printf(" Net Protocols: ");
			if (prasentry->dwfNetProtocols & RASNP_NetBEUI)
				printf("NetBEUI ");

			if (prasentry->dwfNetProtocols & RASNP_Ipx)
				printf("IPX ");

			if (prasentry->dwfNetProtocols & RASNP_Ip)
				printf("IP ");
			puts("");

			if (strlen(prasentry->szScript ))
				printf(" Script: %s\n", prasentry->szScript );

#if (WINVER >= 0x500)
			printf(" Port: %s\n", prasentry->szPortName );
#endif
			printf(" Device: %s\n", prasentry->szDeviceName );
			printf(" Device type: %s\n", prasentry->szDeviceType );
		}

		puts("");
	}

	return 0;
}

