868 lines
22 KiB
C
868 lines
22 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1997 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
w9xtool.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Implements a stub tool that is designed to run with Win9x-side
|
||
|
upgrade code.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
<full name> (<alias>) <date>
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
<alias> <date> <comments>
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "pch.h"
|
||
|
|
||
|
typedef struct _IPData {
|
||
|
DWORD dwSize;
|
||
|
DWORD fdwTCPIP;
|
||
|
DWORD dwIPAddr;
|
||
|
DWORD dwDNSAddr;
|
||
|
DWORD dwDNSAddrAlt;
|
||
|
DWORD dwWINSAddr;
|
||
|
DWORD dwWINSAddrAlt;
|
||
|
} IPDATA, *PIPDATA;
|
||
|
|
||
|
typedef struct _AddrEntry {
|
||
|
DWORD dwVersion;
|
||
|
DWORD dwCountryCode;
|
||
|
UINT uOffArea;
|
||
|
UINT uOffPhone;
|
||
|
DWORD dwCountryID;
|
||
|
UINT uOffSMMCfg;
|
||
|
UINT uOffSMM;
|
||
|
UINT uOffDI;
|
||
|
} ADDRENTRY, *PADDRENTRY;
|
||
|
|
||
|
|
||
|
typedef struct _SubConnEntry {
|
||
|
DWORD dwSize;
|
||
|
DWORD dwFlags;
|
||
|
char szDeviceType[RAS_MaxDeviceType+1];
|
||
|
char szDeviceName[RAS_MaxDeviceName+1];
|
||
|
char szLocal[RAS_MaxPhoneNumber+1];
|
||
|
} SUBCONNENTRY, *PSUBCONNENTRY;
|
||
|
|
||
|
|
||
|
typedef struct _DEVICEINFO {
|
||
|
DWORD dwVersion;
|
||
|
UINT uSize;
|
||
|
char szDeviceName[RAS_MaxDeviceName+1];
|
||
|
char szDeviceType[RAS_MaxDeviceType+1];
|
||
|
} DEVICEINFO, *PDEVICEINFO;
|
||
|
|
||
|
|
||
|
typedef struct _SMMCFG {
|
||
|
DWORD dwSize;
|
||
|
DWORD fdwOptions;
|
||
|
DWORD fdwProtocols;
|
||
|
} SMMCFG, *PSMMCFG;
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD Size;
|
||
|
DWORD Unknown1;
|
||
|
DWORD ModemUiOptions; // num seconds in high byte.
|
||
|
DWORD Unknown2;
|
||
|
DWORD Unknown3;
|
||
|
DWORD Unknown4;
|
||
|
DWORD ConnectionSpeed;
|
||
|
DWORD UnknownFlowControlData; //Somehow related to flow control.
|
||
|
DWORD Unknown5;
|
||
|
DWORD Unknown6;
|
||
|
DWORD Unknown7;
|
||
|
DWORD Unknown8;
|
||
|
DWORD Unknown9;
|
||
|
DWORD Unknown10;
|
||
|
DWORD Unknown11;
|
||
|
DWORD Unknown12;
|
||
|
DWORD Unknown13;
|
||
|
DWORD Unknown14;
|
||
|
DWORD Unknown15;
|
||
|
DWORD CancelSeconds; //Num seconds to wait before cancel if not connected. (0xFF equals off.)
|
||
|
DWORD IdleDisconnectSeconds; // 0 = Not Set.
|
||
|
DWORD Unknown16;
|
||
|
DWORD SpeakerVolume; // 0|1
|
||
|
DWORD ConfigOptions;
|
||
|
DWORD Unknown17;
|
||
|
DWORD Unknown18;
|
||
|
DWORD Unknown19;
|
||
|
} MODEMDEVINFO, *PMODEMDEVINFO;
|
||
|
|
||
|
#define RAS_UI_FLAG_TERMBEFOREDIAL 0x1
|
||
|
#define RAS_UI_FLAG_TERMAFTERDIAL 0x2
|
||
|
#define RAS_UI_FLAG_OPERATORASSISTED 0x4
|
||
|
#define RAS_UI_FLAG_MODEMSTATUS 0x8
|
||
|
|
||
|
#define RAS_CFG_FLAG_HARDWARE_FLOW_CONTROL 0x00000010
|
||
|
#define RAS_CFG_FLAG_SOFTWARE_FLOW_CONTROL 0x00000020
|
||
|
#define RAS_CFG_FLAG_STANDARD_EMULATION 0x00000040
|
||
|
#define RAS_CFG_FLAG_COMPRESS_DATA 0x00000001
|
||
|
#define RAS_CFG_FLAG_USE_ERROR_CONTROL 0x00000002
|
||
|
#define RAS_CFG_FLAG_ERROR_CONTROL_REQUIRED 0x00000004
|
||
|
#define RAS_CFG_FLAG_USE_CELLULAR_PROTOCOL 0x00000008
|
||
|
#define RAS_CFG_FLAG_NO_WAIT_FOR_DIALTONE 0x00000200
|
||
|
|
||
|
|
||
|
PCTSTR g_User = NULL;
|
||
|
PCTSTR g_Setting = NULL;
|
||
|
PCTSTR g_Entry = NULL;
|
||
|
BOOL g_ShowBinary = FALSE;
|
||
|
|
||
|
|
||
|
|
||
|
#define S_REMOTE_ACCESS_KEY TEXT("RemoteAccess")
|
||
|
#define S_PROFILE_KEY TEXT("RemoteAccess\\Profile")
|
||
|
#define S_ADDRESSES_KEY TEXT("RemoteAccess\\Addresses")
|
||
|
#define S_DIALUI TEXT("DialUI")
|
||
|
#define S_ENABLE_REDIAL TEXT("EnableRedial")
|
||
|
#define S_REDIAL_WAIT TEXT("RedialWait")
|
||
|
#define S_REDIAL_TRY TEXT("RedialTry")
|
||
|
#define S_ENABLE_IMPLICIT TEXT("EnableImplicit")
|
||
|
#define S_TERMINAL TEXT("Terminal")
|
||
|
#define S_MODE TEXT("Mode")
|
||
|
#define S_MULTILINK TEXT("MultiLink")
|
||
|
|
||
|
#define DIALUI_DONT_PROMPT_FOR_INFO 0x01
|
||
|
#define DIALUI_DONT_SHOW_CONFIRM_DIALOG 0x02
|
||
|
#define DIALUI_DONT_SHOW_ICON 0x04
|
||
|
|
||
|
#define SMMCFG_TCPIP_PROTOCOL 0x04
|
||
|
#define SMMCFG_NETBEUI_PROTOCOL 0x01
|
||
|
#define SMMCFG_IPXSPX_PROTOCOL 0x02
|
||
|
|
||
|
|
||
|
#define PAESMMCFG(pAE) ((PSMMCFG)(((PBYTE)pAE)+(pAE->uOffSMMCfg)))
|
||
|
#define PAESMM(pAE) ((PSTR)(((PBYTE)pAE)+(pAE->uOffSMM)))
|
||
|
#define PAEDI(pAE) ((PDEVICEINFO)(((PBYTE)pAE)+(pAE->uOffDI )))
|
||
|
#define PAEAREA(pAE) ((PSTR)(((PBYTE)pAE)+(pAE->uOffArea)))
|
||
|
#define PAEPHONE(pAE) ((PSTR)(((PBYTE)pAE)+(pAE->uOffPhone)))
|
||
|
#define DECRYPTENTRY(x, y, z) EnDecryptEntry(x, (LPBYTE)y, z)
|
||
|
|
||
|
|
||
|
|
||
|
static BYTE NEAR PASCAL GenerateEncryptKey (LPSTR szKey)
|
||
|
{
|
||
|
BYTE bKey;
|
||
|
LPBYTE lpKey;
|
||
|
|
||
|
for (bKey = 0, lpKey = (LPBYTE)szKey; *lpKey != 0; lpKey++)
|
||
|
{
|
||
|
bKey += *lpKey;
|
||
|
};
|
||
|
|
||
|
return bKey;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD NEAR PASCAL EnDecryptEntry (LPSTR szEntry, LPBYTE lpEnt,
|
||
|
DWORD cb);
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pDumpPerUserSettings (
|
||
|
IN HKEY UserKey
|
||
|
)
|
||
|
{
|
||
|
HKEY settingsKey;
|
||
|
PDWORD data;
|
||
|
|
||
|
printf("\n*** Ras Per User Setting Information ***\n");
|
||
|
|
||
|
|
||
|
settingsKey = OpenRegKey(UserKey,S_REMOTE_ACCESS_KEY);
|
||
|
|
||
|
|
||
|
if (settingsKey) {
|
||
|
|
||
|
//
|
||
|
// Get UI settings.
|
||
|
//
|
||
|
data = (PDWORD) GetRegValueBinary(settingsKey,S_DIALUI);
|
||
|
|
||
|
printf("\n\t** Dialup UI Information **\n");
|
||
|
|
||
|
if (data) {
|
||
|
|
||
|
|
||
|
|
||
|
printf("\t\t%sprompt for information before dialing.\n",
|
||
|
DIALUI_DONT_PROMPT_FOR_INFO & *data ? "Don't " :""
|
||
|
);
|
||
|
printf("\t\t%sshow confirmation dialog after connected.\n",
|
||
|
DIALUI_DONT_SHOW_CONFIRM_DIALOG & *data ? "Don't ":""
|
||
|
);
|
||
|
printf("\t\t%sshow an icon on the taskbar after connected.\n",
|
||
|
DIALUI_DONT_SHOW_ICON & *data ? "Don't ":""
|
||
|
);
|
||
|
|
||
|
|
||
|
MemFree(g_hHeap,0,data);
|
||
|
}
|
||
|
else {
|
||
|
printf("\t\tNo user UI Settings found..\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get Redial information.
|
||
|
//
|
||
|
|
||
|
printf("\n\t** Redialing Information **\n");
|
||
|
data = (PDWORD) GetRegValueBinary(settingsKey,S_ENABLE_REDIAL);
|
||
|
|
||
|
if (data) {
|
||
|
|
||
|
printf("\t\tRedialing %s.\n",*data ? "Enabled." : "Disabled.");
|
||
|
|
||
|
MemFree(g_hHeap,0,data);
|
||
|
}
|
||
|
else {
|
||
|
printf("\t\tNo Redial information found.\n");
|
||
|
}
|
||
|
|
||
|
data = (PDWORD) GetRegValueBinary(settingsKey,S_REDIAL_TRY);
|
||
|
|
||
|
if (data) {
|
||
|
|
||
|
printf("\t\tNumber of redial tries: %u.\n", *data);
|
||
|
|
||
|
MemFree(g_hHeap,0,data);
|
||
|
|
||
|
}
|
||
|
|
||
|
data = (PDWORD) GetRegValueBinary(settingsKey,S_REDIAL_WAIT);
|
||
|
|
||
|
if (data) {
|
||
|
|
||
|
printf("\t\tRedial time in seconds: %u\n", HIWORD(*data) * 60 + LOWORD(*data));
|
||
|
|
||
|
|
||
|
MemFree(g_hHeap,0,data);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get implicit connection information.
|
||
|
//
|
||
|
data = (PDWORD) GetRegValueBinary(settingsKey,S_ENABLE_IMPLICIT);
|
||
|
|
||
|
if (data) {
|
||
|
|
||
|
printf("\n\t%sprompt with dial-up networking to establish connection.\n",
|
||
|
*data ? "" : "Don't "
|
||
|
);
|
||
|
|
||
|
|
||
|
MemFree(g_hHeap,0,data);
|
||
|
}
|
||
|
|
||
|
CloseRegKey(settingsKey);
|
||
|
}
|
||
|
|
||
|
printf("\n***\n");
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
PTSTR
|
||
|
pIpAddressAsString(
|
||
|
DWORD dwAddress
|
||
|
)
|
||
|
{
|
||
|
BYTE bAddress[4];
|
||
|
static TCHAR address[30];
|
||
|
|
||
|
*((LPDWORD)bAddress) = dwAddress;
|
||
|
sprintf(address,"%d.%d.%d.%d", bAddress[0], bAddress[1], bAddress[2],bAddress[3]);
|
||
|
|
||
|
return address;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
pDumpBinaryData(
|
||
|
IN PBYTE Data,
|
||
|
IN UINT Size
|
||
|
)
|
||
|
{
|
||
|
|
||
|
UINT i,j;
|
||
|
|
||
|
TCHAR hexArray[40];
|
||
|
TCHAR strArray[20];
|
||
|
TCHAR buf[20];
|
||
|
|
||
|
printf("\n\t\tBinary Dump...\n");
|
||
|
|
||
|
for (j = 0;j<Size + Size % 8;j +=8) {
|
||
|
|
||
|
*hexArray = 0;
|
||
|
*strArray = 0;
|
||
|
|
||
|
for (i = 0;i < 8;i++) {
|
||
|
sprintf(buf," %02x",i + j < Size ? Data[i+j] : 0x00);
|
||
|
_tcscat(hexArray,buf);
|
||
|
sprintf(buf," %c",isprint(Data[i+j]) && i + j < Size ? Data[i+j] : TEXT('.'));
|
||
|
_tcscat(strArray,buf);
|
||
|
}
|
||
|
|
||
|
printf("\n\t\t%s\t%s",hexArray,strArray);
|
||
|
}
|
||
|
|
||
|
printf("\n\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pDumpIpInformation (
|
||
|
IN PIPDATA IpData
|
||
|
)
|
||
|
{
|
||
|
|
||
|
printf("\t\t<IPINFO> fTcpIp = %u\n",IpData -> fdwTCPIP);
|
||
|
printf("\t\t<IPINFO> IP Address = %s\n",pIpAddressAsString(IpData -> dwIPAddr));
|
||
|
printf("\t\t<IPINFO> DNS Address = %s\n",pIpAddressAsString(IpData -> dwDNSAddr));
|
||
|
printf("\t\t<IPINFO> Alternate DNS Address = %s\n",pIpAddressAsString(IpData -> dwDNSAddrAlt));
|
||
|
printf("\t\t<IPINFO> WINS Address = %s\n",pIpAddressAsString(IpData -> dwWINSAddr));
|
||
|
printf("\t\t<IPINFO> Alternate WINS Address = %s\n",pIpAddressAsString(IpData -> dwWINSAddrAlt));
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
pDumpConnectionSettings (
|
||
|
IN HANDLE Key,
|
||
|
IN PCTSTR Name
|
||
|
)
|
||
|
{
|
||
|
|
||
|
REGVALUE_ENUM e;
|
||
|
PBYTE curData;
|
||
|
|
||
|
printf("\n\t** %s Setting.. **\n",Name);
|
||
|
|
||
|
if (EnumFirstRegValue(&e,Key)) {
|
||
|
|
||
|
do {
|
||
|
|
||
|
//
|
||
|
// Get the data for this entry.
|
||
|
//
|
||
|
curData = GetRegValueData(Key,e.ValueName);
|
||
|
|
||
|
if (curData) {
|
||
|
|
||
|
if (!g_Setting || StringIMatch(g_Setting,e.ValueName)) {
|
||
|
|
||
|
switch (e.Type) {
|
||
|
|
||
|
case REG_SZ:
|
||
|
case REG_MULTI_SZ:
|
||
|
case REG_EXPAND_SZ:
|
||
|
|
||
|
printf("\t\t<STRING DATA> %s = %s\n",e.ValueName,(PCTSTR) curData);
|
||
|
break;
|
||
|
case REG_DWORD:
|
||
|
printf("\t\t<DWORD DATA> %s = %u\n",e.ValueName,*((PDWORD) curData));
|
||
|
break;
|
||
|
case REG_BINARY:
|
||
|
if (StringIMatch(S_IPINFO,e.ValueName)) {
|
||
|
|
||
|
pDumpIpInformation((PIPDATA) curData);
|
||
|
|
||
|
}
|
||
|
else if (StringIMatch(S_TERMINAL,e.ValueName)) {
|
||
|
|
||
|
PWINDOWPLACEMENT wp = (PWINDOWPLACEMENT) curData;
|
||
|
PCTSTR showStr = NULL;
|
||
|
|
||
|
switch(wp -> showCmd) {
|
||
|
case SW_HIDE:
|
||
|
showStr = "SW_HIDE";
|
||
|
break;
|
||
|
case SW_MINIMIZE:
|
||
|
showStr = "SW_MINIMIZE";
|
||
|
break;
|
||
|
case SW_RESTORE:
|
||
|
showStr = "SW_RESTORE";
|
||
|
break;
|
||
|
case SW_SHOW:
|
||
|
showStr = "SW_SHOW";
|
||
|
break;
|
||
|
case SW_SHOWMAXIMIZED:
|
||
|
showStr = "SW_SHOWMAXIMIZED";
|
||
|
break;
|
||
|
case SW_SHOWMINIMIZED:
|
||
|
showStr = "SW_SHOWMINIMIZED";
|
||
|
break;
|
||
|
case SW_SHOWMINNOACTIVE:
|
||
|
showStr = "SW_SHOWMINNOACTIVE";
|
||
|
break;
|
||
|
case SW_SHOWNA:
|
||
|
showStr = "SW_SHOWNA";
|
||
|
break;
|
||
|
case SW_SHOWNOACTIVATE:
|
||
|
showStr = "SW_SHOWNOACTIVATE";
|
||
|
break;
|
||
|
case SW_SHOWNORMAL:
|
||
|
showStr = "SW_SHOWNORMAL";
|
||
|
break;
|
||
|
default:
|
||
|
showStr = "Unknown SHOW FLAG!";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
printf("\t\tTerminal Window Show Flag: %s\n", showStr);
|
||
|
|
||
|
|
||
|
|
||
|
} else if (StringIMatch(S_MODE,e.ValueName)) {
|
||
|
|
||
|
if (*curData) {
|
||
|
printf("\t\tStep through script. (Testing Mode..)\n");
|
||
|
}
|
||
|
else {
|
||
|
printf("\t\tScript should be run in normal mode.\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
} else if (StringIMatch(S_MULTILINK,e.ValueName)) {
|
||
|
|
||
|
printf("\t\tMultilink is %s.\n",*curData ? "ENABLED" : "DISABLED");
|
||
|
|
||
|
|
||
|
} else {
|
||
|
|
||
|
printf("\t\t<!!UNKNOWN BINARY DATA!!> %s = <BINARY BLOB>\n",e.ValueName);
|
||
|
}
|
||
|
|
||
|
if (g_ShowBinary) {
|
||
|
pDumpBinaryData(curData,e.DataSize);
|
||
|
}
|
||
|
|
||
|
|
||
|
break;
|
||
|
default:
|
||
|
printf("\t\t<UNKNOWN DATA TYPE> %s = <UNKNOWN DATA TYPE>\n",e.ValueName);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MemFree(g_hHeap,0,curData);
|
||
|
}
|
||
|
|
||
|
} while (EnumNextRegValue(&e));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
pDumpDevInfo (
|
||
|
IN PDEVICEINFO Info
|
||
|
)
|
||
|
{
|
||
|
UINT size;
|
||
|
UINT i;
|
||
|
PMODEMDEVINFO caps;
|
||
|
|
||
|
printf ("** Device Info: \n"
|
||
|
"\t\tVersion: %u \n"
|
||
|
"\t\tSize: %u\n"
|
||
|
"\t\tDevice Name: %s\n"
|
||
|
"\t\tDevice Type: %s\n",
|
||
|
Info->dwVersion,
|
||
|
Info->uSize,
|
||
|
Info->szDeviceName,
|
||
|
Info->szDeviceType
|
||
|
);
|
||
|
|
||
|
|
||
|
size = Info->uSize - ((PBYTE) (Info->szDeviceType + RAS_MaxDeviceType + 1) - (PBYTE) Info);
|
||
|
|
||
|
caps = (PMODEMDEVINFO) (Info->szDeviceType + RAS_MaxDeviceType + 3);
|
||
|
#if 0
|
||
|
pDumpBinaryData ((PBYTE) caps, sizeof (REGDEVCAPS));
|
||
|
|
||
|
|
||
|
printf ("As Dwords..\n");
|
||
|
|
||
|
for (i = 0; i < 27; i++) {
|
||
|
printf ("Dword %u = %u (%x)\n",i, caps->foo[i], caps->foo[i]);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
printf (
|
||
|
"\tCaps Size: %u\n"
|
||
|
"\tStart Term Before Redial? %s\n"
|
||
|
"\tStart Term After Redial? %s\n"
|
||
|
"\tOperator Assited Dial? %s\n"
|
||
|
"\tShow Modem Status? %s\n"
|
||
|
"\tUI Options: %u (%x)\n"
|
||
|
"\tConnection Speed: %u\n"
|
||
|
"\tCancel if not connected within %u seconds.\n"
|
||
|
"\tDisconnect if Idle for %u seconds.\n"
|
||
|
"\tSpeaker %s.\n"
|
||
|
"\tHardware Flow Control? %s\n"
|
||
|
"\tSoftware Flow Control? %s\n"
|
||
|
"\tStandard Emulation? %s\n"
|
||
|
"\tCompress Data? %s\n"
|
||
|
"\tUse Error Control? %s\n"
|
||
|
"\tError Control Required? %s\n"
|
||
|
"\tUse Cellular Protocol? %s\n"
|
||
|
"\tWait for Dialtone? %s\n"
|
||
|
"\tConfig Options: %u (%x)\n",
|
||
|
caps->Size,
|
||
|
caps->ModemUiOptions & RAS_UI_FLAG_TERMBEFOREDIAL ? "Yes" : "No",
|
||
|
caps->ModemUiOptions & RAS_UI_FLAG_TERMAFTERDIAL ? "Yes" : "No",
|
||
|
caps->ModemUiOptions & RAS_UI_FLAG_OPERATORASSISTED ? "Yes" : "No",
|
||
|
caps->ModemUiOptions & RAS_UI_FLAG_MODEMSTATUS ? "Yes" : "No",
|
||
|
caps->ModemUiOptions,
|
||
|
caps->ModemUiOptions,
|
||
|
caps->ConnectionSpeed,
|
||
|
caps->CancelSeconds,
|
||
|
caps->IdleDisconnectSeconds,
|
||
|
caps->SpeakerVolume ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_HARDWARE_FLOW_CONTROL ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_SOFTWARE_FLOW_CONTROL ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_STANDARD_EMULATION ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_COMPRESS_DATA ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_USE_ERROR_CONTROL ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_ERROR_CONTROL_REQUIRED ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_USE_CELLULAR_PROTOCOL ? "Yes" : "No",
|
||
|
caps->ConfigOptions & RAS_CFG_FLAG_NO_WAIT_FOR_DIALTONE ? "No" : "Yes",
|
||
|
caps->ConfigOptions,
|
||
|
caps->ConfigOptions
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pDumpAddressInfo (
|
||
|
IN HKEY AddressKey,
|
||
|
IN PCTSTR SubKeyName
|
||
|
)
|
||
|
{
|
||
|
|
||
|
PBYTE data = NULL;
|
||
|
UINT count = 0;
|
||
|
UINT type = 0;
|
||
|
PADDRENTRY entry;
|
||
|
PSMMCFG smmCfg;
|
||
|
PDEVICEINFO devInfo;
|
||
|
UINT sequencer = 0;
|
||
|
HKEY subEntriesKey;
|
||
|
PTSTR subEntriesKeyStr;
|
||
|
REGVALUE_ENUM eSubEntries;
|
||
|
PSUBCONNENTRY subEntry;
|
||
|
|
||
|
if (RegQueryValueEx(AddressKey, SubKeyName, NULL, &type, NULL, &count) == ERROR_SUCCESS) {
|
||
|
|
||
|
data = MemAlloc(g_hHeap,0,count);
|
||
|
if (data) {
|
||
|
|
||
|
if (RegQueryValueEx(AddressKey, SubKeyName, NULL, &type, (LPBYTE)data,&count) == ERROR_SUCCESS) {
|
||
|
|
||
|
entry = (PADDRENTRY) data;
|
||
|
|
||
|
DECRYPTENTRY((PTSTR)SubKeyName, entry, count);
|
||
|
|
||
|
smmCfg = PAESMMCFG(entry);
|
||
|
devInfo = PAEDI(entry);
|
||
|
|
||
|
pDumpDevInfo (devInfo);
|
||
|
|
||
|
if (!g_Setting || StringMatch(g_Setting,"AddressData")) {
|
||
|
|
||
|
printf("\t\t<AddressData> Phone Number = %s\n",PAEPHONE(entry));
|
||
|
printf("\t\t<AddressData> Area Code = %s\n",PAEAREA(entry));
|
||
|
printf("\t\t<AddressData> SMM = %s\n",PAESMM(entry));
|
||
|
printf("\t\t<AddressData> Country Code = %u\n",entry -> dwCountryCode);
|
||
|
printf("\t\t<AddressData> Country Id = %u\n",entry -> dwCountryID);
|
||
|
|
||
|
printf("\t\t<Device Info> DeviceName = %s\n",devInfo -> szDeviceName);
|
||
|
printf("\t\t<Device Info> DeviceType = %s\n",devInfo -> szDeviceType);
|
||
|
printf("\t\t<SMM Cfg> Options = %u\n",smmCfg -> fdwOptions);
|
||
|
printf("\t\t<SMM Cfg> TCPIP is %s.\n",
|
||
|
smmCfg -> fdwProtocols & SMMCFG_TCPIP_PROTOCOL ? "ENABLED" : "DISABLED");
|
||
|
printf("\t\t<SMM Cfg> NETBEUI is %s.\n",
|
||
|
smmCfg -> fdwProtocols & SMMCFG_NETBEUI_PROTOCOL ? "ENABLED" : "DISABLED");
|
||
|
printf("\t\t<SMM Cfg> IPX/SPX is %s.\n",
|
||
|
smmCfg -> fdwProtocols & SMMCFG_IPXSPX_PROTOCOL ? "ENABLED" : "DISABLED");
|
||
|
|
||
|
|
||
|
|
||
|
if (g_ShowBinary) {
|
||
|
pDumpBinaryData((PBYTE) entry,count);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
MemFree(g_hHeap,0,data);
|
||
|
|
||
|
subEntriesKeyStr = JoinPaths ("SubEntries", SubKeyName);
|
||
|
subEntriesKey = OpenRegKey (AddressKey, subEntriesKeyStr);
|
||
|
FreePathString (subEntriesKeyStr);
|
||
|
sequencer = 0;
|
||
|
|
||
|
if (subEntriesKey) {
|
||
|
|
||
|
if (EnumFirstRegValue (&eSubEntries, subEntriesKey)) {
|
||
|
|
||
|
do {
|
||
|
|
||
|
data = GetRegValueBinary (subEntriesKey, eSubEntries.ValueName);
|
||
|
|
||
|
if (data) {
|
||
|
|
||
|
subEntry = (PSUBCONNENTRY) data;
|
||
|
DECRYPTENTRY ((PTSTR) SubKeyName, subEntry, eSubEntries.DataSize);
|
||
|
|
||
|
printf ("\tSub Entry Device Type: %s\n", subEntry->szDeviceType);
|
||
|
printf ("\tSub Entry Device Name: %s\n", subEntry->szDeviceName);
|
||
|
printf ("\tSub Entry Phone Number: %s\n", subEntry->szDeviceName);
|
||
|
printf ("\tSub Entry Flags: %u (%x)\n", subEntry->dwFlags);
|
||
|
printf ("\tSub Entry Size: %u\n", subEntry->dwSize);
|
||
|
|
||
|
pDumpBinaryData ((PBYTE) subEntry, subEntry->dwSize);
|
||
|
|
||
|
MemFree (g_hHeap, 0, data);
|
||
|
}
|
||
|
|
||
|
sequencer++;
|
||
|
|
||
|
} while (EnumNextRegValue (&eSubEntries));
|
||
|
}
|
||
|
|
||
|
CloseRegKey (subEntriesKey);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pDumpPerConnectionSettings (
|
||
|
IN HKEY UserKey
|
||
|
)
|
||
|
{
|
||
|
|
||
|
REGKEY_ENUM e;
|
||
|
HKEY profileKey;
|
||
|
HKEY entryKey = NULL;
|
||
|
HKEY addressKey = NULL;
|
||
|
|
||
|
|
||
|
printf("\n*** Ras Per Connection Setting Information ***\n");
|
||
|
|
||
|
|
||
|
profileKey = OpenRegKey (UserKey,S_PROFILE_KEY);
|
||
|
addressKey = OpenRegKey (UserKey,S_ADDRESSES_KEY);
|
||
|
|
||
|
if (profileKey && addressKey) {
|
||
|
|
||
|
if (EnumFirstRegKey(&e,addressKey)) {
|
||
|
do {
|
||
|
|
||
|
if (!g_Entry || StringIMatch(g_Entry,e.SubKeyName)) {
|
||
|
|
||
|
pDumpAddressInfo(addressKey,e.SubKeyName);
|
||
|
entryKey = OpenRegKey(profileKey,e.SubKeyName);
|
||
|
|
||
|
if (entryKey ) {
|
||
|
|
||
|
pDumpConnectionSettings (entryKey, e.SubKeyName);
|
||
|
CloseRegKey(entryKey);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
} while (EnumNextRegKey(&e));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
CloseRegKey(addressKey);
|
||
|
CloseRegKey(profileKey);
|
||
|
|
||
|
printf("\n***\n");
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
Init (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
HINSTANCE hInstance;
|
||
|
|
||
|
hInstance = GetModuleHandle (NULL);
|
||
|
|
||
|
return InitToolMode (hInstance);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
Terminate (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
HINSTANCE hInstance;
|
||
|
|
||
|
hInstance = GetModuleHandle (NULL);
|
||
|
|
||
|
TerminateToolMode (hInstance);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pShowHelp (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
printf("\nUsage: RasDump [-h?b] [-u:<UserName>] [-e:<EntryName>] [-s:<SettingName>]\n"
|
||
|
"\n\t\t -h - Display this message."
|
||
|
"\n\t\t -? - Display this message."
|
||
|
"\n\t\t -u - Dump information for user <UserName>."
|
||
|
"\n\t\t -b - Dump raw binary data."
|
||
|
"\n\t\t -e - Dump Entry infor for DialUp Connection <EntryName>.\n");
|
||
|
|
||
|
|
||
|
exit(0);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pProcessCommandLine (
|
||
|
UINT argc,
|
||
|
PTSTR * argv
|
||
|
)
|
||
|
{
|
||
|
|
||
|
|
||
|
UINT i;
|
||
|
PTSTR p;
|
||
|
|
||
|
for (i = 1;i < argc; i++) {
|
||
|
|
||
|
p = argv[i];
|
||
|
|
||
|
if (*p != TEXT('-') && *p != TEXT('/')) {
|
||
|
pShowHelp();
|
||
|
|
||
|
}
|
||
|
|
||
|
p++;
|
||
|
|
||
|
switch(tolower(*p)) {
|
||
|
|
||
|
|
||
|
case TEXT('u'):
|
||
|
if (*++p != ':') {
|
||
|
pShowHelp();
|
||
|
}
|
||
|
g_User = ++p;
|
||
|
break;
|
||
|
|
||
|
case TEXT('s'):
|
||
|
if (*++p != ':') {
|
||
|
pShowHelp();
|
||
|
}
|
||
|
g_Setting = ++p;
|
||
|
break;
|
||
|
|
||
|
|
||
|
case TEXT('h'): case TEXT('?'):
|
||
|
pShowHelp();
|
||
|
break;
|
||
|
|
||
|
|
||
|
case TEXT('e'):
|
||
|
if (*++p != ':') {
|
||
|
pShowHelp();
|
||
|
}
|
||
|
g_Entry = ++p;
|
||
|
break;
|
||
|
|
||
|
case TEXT('b') :
|
||
|
g_ShowBinary = TRUE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
pShowHelp();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
INT
|
||
|
__cdecl
|
||
|
main (
|
||
|
INT argc,
|
||
|
CHAR *argv[]
|
||
|
)
|
||
|
{
|
||
|
USERENUM e;
|
||
|
TCHAR buf[MEMDB_MAX];
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
if (!Init()) {
|
||
|
printf ("Unable to initialize!\n");
|
||
|
return 255;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// needed by enumuser..
|
||
|
//
|
||
|
|
||
|
GetWindowsDirectory(buf,MAX_PATH);
|
||
|
g_WinDir = buf;
|
||
|
Win95RegInit(g_WinDir,NULL);
|
||
|
|
||
|
pProcessCommandLine(argc,argv);
|
||
|
|
||
|
|
||
|
if (EnumFirstUser (&e, ENUMUSER_ENABLE_NAME_FIX)) {
|
||
|
|
||
|
do {
|
||
|
|
||
|
if (!g_User || StringIMatch(g_User,e.UserName)) {
|
||
|
printf("Dumping ras settings for user %s..\n",*e.UserName ? e.UserName : "<Default>");
|
||
|
__try {
|
||
|
pDumpPerUserSettings(e.UserRegKey);
|
||
|
pDumpPerConnectionSettings(e.UserRegKey);
|
||
|
}
|
||
|
except (1) {
|
||
|
printf("Caught an exception..");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} while (EnumNextUser(&e));
|
||
|
}
|
||
|
|
||
|
|
||
|
Terminate();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|