385 lines
7.9 KiB
C
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));
|
|
}
|
|
}
|