windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/w95upg/sysmig/betacfg.c
2020-09-26 16:20:57 +08:00

385 lines
7.9 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
betacfg.c
Abstract:
This file enumerates various parts of the user's system and saves
entries into the config log.
The format of each line in config.dmp is:
<ID>\t<data>\t<data>\t<data>
Author:
Jim Schmidt (jimschm) 04-Aug-1998
Revision History:
None.
--*/
#include "pch.h"
//
// Function type declaration
//
typedef VOID (DUMP_FUNCTION_PROTOTYPE)(VOID);
typedef DUMP_FUNCTION_PROTOTYPE * DUMP_FUNCTION;
//
// Array of dump functions
//
#define FUNCTION_LIST \
DEFMAC(pDumpUserName) \
DEFMAC(pDumpHardware) \
DEFMAC(pDumpDosLines) \
DEFMAC(pDumpNetworkInfo) \
DEFMAC(pDumpUninstallList) \
DEFMAC(pDumpCompatReport) \
// DEFMAC(pDumpUserShellFolders) \
//
// Declare the function prototypes
//
#define DEFMAC(x) DUMP_FUNCTION_PROTOTYPE x;
FUNCTION_LIST
#undef DEFMAC
//
// Create a lookup array
//
typedef struct {
DUMP_FUNCTION Proc;
} DUMP_FUNCTION_LIST, *PDUMP_FUNCTION_LIST;
#define DEFMAC(x) {x},
static DUMP_FUNCTION_LIST g_Functions[] = {
FUNCTION_LIST /*,*/
{NULL}
};
#undef DEFMAC
VOID
SaveConfigurationForBeta (
VOID
)
{
INT i;
for (i = 0 ; g_Functions[i].Proc ; i++) {
g_Functions[i].Proc();
}
}
VOID
pDumpUserName (
VOID
)
{
TCHAR UserName[MAX_USER_NAME];
TCHAR ComputerName[MAX_COMPUTER_NAME];
DWORD Size;
Size = MAX_USER_NAME;
if (!GetUserName (UserName, &Size)) {
UserName[0] = 0;
}
Size = MAX_COMPUTER_NAME;
if (!GetComputerName (ComputerName, &Size)) {
ComputerName[0] = 0;
}
LOG ((LOG_CONFIG, "User\t%s", UserName));
LOG ((LOG_CONFIG, "Computer Name\t%s", ComputerName));
}
VOID
pDumpHardware (
VOID
)
{
HARDWARE_ENUM e;
if (EnumFirstHardware (&e, ENUM_ALL_DEVICES, ENUM_WANT_ALL)) {
do {
LOG ((
LOG_CONFIG,
"Device\t%s\t%s\t%s\t%s\t%s\t%s\t%u\t%u\t%u\t%u",
e.DeviceDesc,
e.Mfg,
e.HardwareID,
e.CompatibleIDs,
e.HWRevision,
e.UserDriveLetter,
e.Online,
e.SuppliedByUi,
e.HardwareIdCompatible,
e.CompatibleIdCompatible
));
} while (EnumNextHardware (&e));
}
}
#if 0
VOID
pDumpShellFolder (
IN PCTSTR ShellFolder
)
{
SHELLFOLDER_ENUM e;
TREE_ENUM te;
if (EnumFirstShellFolder (&e, USF_9X, ShellFolder)) {
do {
if (EnumFirstFileInTree (&te, e.ShellFolder, NULL, FALSE)) {
do {
if (!te.Directory) {
LOG ((
LOG_CONFIG,
"Shell Folder\t%s",
te.FullPath
));
}
} while (EnumNextFileInTree (&te));
}
} while (EnumNextShellFolder (&e));
}
}
VOID
pDumpUserShellFolders (
VOID
)
{
pDumpShellFolder (TEXT("Start Menu"));
pDumpShellFolder (TEXT("Programs"));
pDumpShellFolder (TEXT("Startup"));
pDumpShellFolder (TEXT("Desktop"));
pDumpShellFolder (TEXT("Recent"));
pDumpShellFolder (TEXT("AppData"));
pDumpShellFolder (TEXT("Local AppData"));
pDumpShellFolder (TEXT("Local Settings"));
pDumpShellFolder (TEXT("My Pictures"));
pDumpShellFolder (TEXT("SendTo"));
pDumpShellFolder (TEXT("Templates"));
}
#endif
VOID
pDumpDosLines (
VOID
)
{
MEMDB_ENUM e;
TCHAR line[MEMDB_MAX];
if (MemDbEnumItems(&e, MEMDB_CATEGORY_DM_LINES)) {
do {
if (MemDbGetEndpointValueEx (
MEMDB_CATEGORY_DM_LINES,
e.szName,
NULL,
line
)) {
LOG ((
LOG_CONFIG,
"Dos Lines\t%s",
line
));
}
} while (MemDbEnumNextValue (&e));
}
}
VOID
pDumpNetworkInfo (
VOID
)
{
MEMDB_ENUM e;
TCHAR buffer[MEMDB_MAX];
//
// Network protocols.
//
if (MemDbEnumFields (&e, MEMDB_CATEGORY_AF_SECTIONS, S_PAGE_NETPROTOCOLS)) {
do {
if (MemDbBuildKeyFromOffset (e.dwValue, buffer, 1, NULL)) {
LOG ((
LOG_CONFIG,
"Network Protocols\t%s",
buffer
));
}
} while (MemDbEnumNextValue (&e));
}
//
// Network clients.
//
if (MemDbEnumFields (&e, MEMDB_CATEGORY_AF_SECTIONS, S_PAGE_NETCLIENTS)) {
do {
if (MemDbBuildKeyFromOffset(e.dwValue,buffer,1,NULL)) {
LOG ((
LOG_CONFIG,
"Network Clients\t%s",
buffer
));
}
} while (MemDbEnumNextValue (&e));
}
//
// Network services.
//
if (MemDbEnumFields (&e, MEMDB_CATEGORY_AF_SECTIONS, S_PAGE_NETSERVICES)) {
do {
if (MemDbBuildKeyFromOffset(e.dwValue,buffer,1,NULL)) {
LOG ((
LOG_CONFIG,
"Network Services\t%s",
buffer
));
}
} while (MemDbEnumNextValue (&e));
}
}
VOID
pDumpUninstallList (
VOID
)
{
REGKEY_ENUM e;
PCTSTR DisplayName, UninstallString;
HKEY Key;
HKEY SubKey;
Key = OpenRegKeyStr (TEXT("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"));
if (Key) {
if (EnumFirstRegKey (&e, Key)) {
do {
SubKey = OpenRegKey (Key, e.SubKeyName);
if (SubKey) {
DisplayName = GetRegValueString (SubKey, TEXT("DisplayName"));
UninstallString = GetRegValueString (SubKey, TEXT("UninstallString"));
if (DisplayName && UninstallString) {
LOG ((LOG_CONFIG, "Add/Remove Programs\t%s\t%s", DisplayName, UninstallString));
}
if (DisplayName) {
MemFree (g_hHeap, 0, DisplayName);
}
if (UninstallString) {
MemFree (g_hHeap, 0, UninstallString);
}
CloseRegKey (SubKey);
}
} while (EnumNextRegKey (&e));
}
CloseRegKey (Key);
}
}
VOID
pDumpCompatReport (
VOID
)
{
MEMDB_ENUM e;
TCHAR key[MEMDB_MAX];
PTSTR p, q, append;
TCHAR line[MEMDB_MAX];
INT i;
#define COMPONENT_ITEMS_MAX 2
if (MemDbGetValueEx (&e, MEMDB_CATEGORY_COMPATREPORT, MEMDB_ITEM_OBJECTS, NULL)) {
do {
if (!MemDbBuildKeyFromOffset (e.dwValue, key, 3, NULL)) {
continue;
}
line[0] = 0;
append = StringCat (line, TEXT("Compat Report\t"));
//
// first append the Object that generated this entry
//
append = StringCat (append, e.szName);
//
// next append the Components as generated for the user report
//
p = key;
for (i = 0; i < COMPONENT_ITEMS_MAX; i++) {
q = _tcschr (p, TEXT('\\'));
if (!q || !q[1]) {
break;
}
*q = 0;
append = StringCat (append, TEXT("\t"));
append = StringCat (append, p);
p = q + 1;
}
append = StringCat (append, TEXT("\t"));
append = StringCat (append, p);
LOG ((LOG_CONFIG, line));
} while (MemDbEnumNextValue (&e));
}
}