117 lines
4.2 KiB
C
117 lines
4.2 KiB
C
|
/*++
|
||
|
w95fdump.c
|
||
|
|
||
|
Copyright (c) 1997 Microsoft Corporation
|
||
|
|
||
|
This utility dumps configuration information about the win95 fax.
|
||
|
It pulls this information from the registry...
|
||
|
This is primarily a warm-up application for win95->NT migration; the migration
|
||
|
DLL will need to get all of this information to configure the NT setup.
|
||
|
|
||
|
Author:
|
||
|
Brian Dewey (t-briand) 1997-7-18
|
||
|
--*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <tchar.h>
|
||
|
#include <setupapi.h>
|
||
|
#include "migrate.h" // Includes my migration prototypes.
|
||
|
|
||
|
// ------------------------------------------------------------
|
||
|
// Prototypes
|
||
|
BOOL EnumUsers();
|
||
|
|
||
|
// ------------------------------------------------------------
|
||
|
// main
|
||
|
|
||
|
int _cdecl
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
LPCSTR ProductID; // Will hold the ID string from my DLL.
|
||
|
UINT DllVersion; // Holds the version of the DLL.
|
||
|
LPINT CodePageArray; // Locale info.
|
||
|
LPCSTR ExeNamesBuf; // Executables to look for.
|
||
|
LPVOID Reserved = NULL; // Placeholder.
|
||
|
|
||
|
// Print banner.
|
||
|
fprintf(stderr, "Win32 Fax Configuration Dump Utility\n");
|
||
|
fprintf(stderr, "Copyright (c) 1997 Microsoft Corporation\n");
|
||
|
QueryVersion(&ProductID, &DllVersion, &CodePageArray, &ExeNamesBuf, Reserved);
|
||
|
fprintf(stderr, "Library '%s' version %d.\n", ProductID, DllVersion);
|
||
|
|
||
|
// Simulate the initialization.
|
||
|
Initialize9x(".", ".", Reserved);
|
||
|
|
||
|
// This will try to gather all user information.
|
||
|
if(EnumUsers())
|
||
|
fprintf(stderr, "User migration succeeded.\n");
|
||
|
else {
|
||
|
fprintf(stderr, "User migration failed, exiting...\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// Finally, try to migrate the system.
|
||
|
if(MigrateSystem9x(NULL, ".\\unattend.txt", Reserved) != ERROR_SUCCESS) {
|
||
|
fprintf(stderr, "System migration failed.\n");
|
||
|
return 1;
|
||
|
} else {
|
||
|
fprintf(stderr, "System migration succeeded.\n");
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// ------------------------------------------------------------
|
||
|
// Auxiliary functions
|
||
|
BOOL
|
||
|
EnumUsers()
|
||
|
{
|
||
|
DWORD dwIndex; // Index of the HKEY_USERS subkey.
|
||
|
TCHAR szKeyName[MAX_PATH]; // Name of the subkey.
|
||
|
DWORD cbBufSize; // Size of the name buffer.
|
||
|
FILETIME ftTime; // Will hold the time the key was last modified.
|
||
|
HKEY hUserKey; // Registry key for a user.
|
||
|
LONG lResult; // Result codes from API calls.
|
||
|
LONGLONG llDiskSpace, // Total disk space used.
|
||
|
llComponentSpace; // Component space required.
|
||
|
|
||
|
dwIndex = 0;
|
||
|
cbBufSize = sizeof(szKeyName);
|
||
|
while(RegEnumKeyEx(HKEY_USERS, // We're enumerating through the users.
|
||
|
dwIndex++, // Keep incrementing the index!
|
||
|
szKeyName, // Will hold the name of the subkey.
|
||
|
&cbBufSize, // Will hold the # of characters in the key name.
|
||
|
NULL, // Reserved; must be NULL.
|
||
|
NULL, // Class info (I don't need this).
|
||
|
NULL, // size of class info -- not needed.
|
||
|
&ftTime) == ERROR_SUCCESS) {
|
||
|
_tprintf(TEXT("User %s.\n"), szKeyName);
|
||
|
// Open the key.
|
||
|
if((lResult = RegOpenKeyEx(HKEY_USERS,
|
||
|
szKeyName,
|
||
|
0, // Zero options.
|
||
|
KEY_READ, // Read-only permission.
|
||
|
&hUserKey)) != ERROR_SUCCESS) {
|
||
|
// FIXBKD: Use FormatMessage
|
||
|
_ftprintf(stderr, TEXT("EnumUsers:Unable to open key for user %s.\n"),
|
||
|
szKeyName);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// Call the migration DLL MigrateUser9x routine.
|
||
|
MigrateUser9x(
|
||
|
NULL, // No window for UI.
|
||
|
"unattend.txt", // Sample unattend file.
|
||
|
hUserKey, // Key to the user's part of the registry.
|
||
|
szKeyName, // Pass in the user's name.
|
||
|
&llComponentSpace // Receive the amount of space needed.
|
||
|
);
|
||
|
|
||
|
RegCloseKey(hUserKey); // Close the key.
|
||
|
cbBufSize = sizeof(szKeyName); // Reset size indicator.
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|