windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/migdlls/setup/winmine.c
2020-09-26 16:20:57 +08:00

292 lines
6.8 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
winmine.c
Abstract:
This source file implements the operations needed to properly migrate
Minesweeper settings from Windows 9x to Windows NT. This is part of the
Setup Migration DLL.
Author:
Ovidiu Temereanca (ovidiut) 07-Jul-1999
Revision History:
--*/
#include "pch.h"
#define S_WINMINE_INI "WINMINE.INI"
#define S_ALREADYPLAYED "AlreadyPlayed"
#define S_WINMINE "Software\\Microsoft\\winmine"
BOOL
WinMine_Attach (
IN HINSTANCE DllInstance
)
{
return TRUE;
}
BOOL
WinMine_Detach (
IN HINSTANCE DllInstance
)
{
return TRUE;
}
LONG
WinMine_QueryVersion (
IN PCSTR *ExeNamesBuf
)
{
CHAR Path[MAX_PATH];
PSTR p;
if (!GetWindowsDirectoryA (Path, MAX_PATH)) {
return GetLastError ();
}
p = AppendWackA (Path);
StringCopyA (p, S_WINMINE_INI);
if (DoesFileExistA (Path)) {
return ERROR_SUCCESS;
}
return ERROR_NOT_INSTALLED;
}
LONG
WinMine_Initialize9x (
IN PCSTR WorkingDirectory,
IN PCSTR SourceDirectories
)
{
return ERROR_SUCCESS;
}
LONG
WinMine_MigrateUser9x (
IN HWND ParentWnd,
IN PCSTR UnattendFile,
IN HKEY UserRegKey,
IN PCSTR UserName
)
{
return ERROR_SUCCESS;
}
LONG
WinMine_MigrateSystem9x (
IN HWND ParentWnd,
IN PCSTR UnattendFile
)
{
CHAR Path[MAX_PATH];
PSTR p;
if (!GetWindowsDirectoryA (Path, MAX_PATH)) {
return GetLastError ();
}
p = AppendWackA (Path);
StringCopyA (p, S_WINMINE_INI);
//
// write this file to Handled
//
if (!WritePrivateProfileStringA (S_HANDLED, Path, "FILE", g_MigrateInfPath)) {
DEBUGMSGA ((DBG_ERROR, "WinMine migration DLL: Could not write winmine.ini as handled."));
}
return ERROR_SUCCESS;
}
BOOL
pGetUINT (
IN PCSTR Value,
OUT PUINT ui
)
{
INT i = 0;
CHAR ch;
if (!Value || !*Value) {
return FALSE;
}
while((ch = (CHAR)_mbsnextc (Value)) != 0) {
if (ch < '0' || ch > '9') {
return FALSE;
}
i = i * 10 + ch - '0';
if (i < 0) {
return FALSE;
}
Value = _mbsinc (Value);
}
*ui = i;
return TRUE;
}
LONG
WinMine_InitializeNT (
IN PCWSTR WorkingDirectory,
IN PCWSTR SourceDirectories
)
{
return ERROR_SUCCESS;
}
LONG
WinMine_MigrateUserNT (
IN HINF UnattendFile,
IN HKEY UserRegKey,
IN PCWSTR UserName
)
{
HKEY Key;
LONG rc = ERROR_SUCCESS;
DWORD Value = 1;
CHAR Path[MAX_PATH];
CHAR SectBuffer[MAX_PATH];
CHAR KeyBuffer[MAX_PATH];
CHAR String[MAX_PATH];
PSTR p;
UINT ui;
if (!GetWindowsDirectoryA (Path, MAX_PATH)) {
return GetLastError ();
}
p = AppendWackA (Path);
StringCopyA (p, S_WINMINE_INI);
if (!DoesFileExistA (Path)) {
DEBUGMSGA ((DBG_ERROR, "Could not find %s", Path));
return ERROR_FILE_NOT_FOUND;
}
rc = TrackedRegCreateKeyA (
UserRegKey,
S_WINMINE,
&Key
);
if (rc != ERROR_SUCCESS) {
DEBUGMSGA ((DBG_ERROR, "Could not create user key %s", S_WINMINE));
return rc;
}
rc = RegSetValueExA (
Key,
S_ALREADYPLAYED,
0,
REG_DWORD,
(PCBYTE)&Value,
sizeof (Value)
);
if (rc == ERROR_SUCCESS) {
Value = GetPrivateProfileStringA (NULL, NULL, "", SectBuffer, sizeof (SectBuffer), Path);
if (Value > 0 && Value < sizeof (SectBuffer) - 2) {
//
// there should be only one section
//
if (*(SectBuffer + SizeOfStringA (SectBuffer)) == 0) {
//
// get all keys with numeric values and put them in the registry
// as REG_DWORD; the rest of them migrate as text
//
Value = GetPrivateProfileStringA (
SectBuffer,
NULL,
"",
KeyBuffer,
sizeof (KeyBuffer),
Path
);
if (Value > 0 && Value < sizeof (KeyBuffer) - 1) {
p = KeyBuffer;
while (rc == ERROR_SUCCESS && *p) {
Value = GetPrivateProfileStringA (
SectBuffer,
p,
"",
String,
sizeof (String),
Path
);
if (Value > 0) {
if (pGetUINT (String, &ui)) {
MYASSERT (sizeof (ui) == sizeof (DWORD));
rc = RegSetValueExA (
Key,
p,
0,
REG_DWORD,
(PCBYTE)&ui,
sizeof (ui)
);
if (rc == ERROR_SUCCESS) {
DEBUGMSGA ((DBG_VERBOSE, "Migrated value %s=%lu", p, ui));
} else {
DEBUGMSGA ((DBG_ERROR, "Couldn't migrate value %s", p));
}
} else {
rc = RegSetValueExA (
Key,
p,
0,
REG_SZ,
(PCBYTE)String,
Value + 1
);
if (rc == ERROR_SUCCESS) {
DEBUGMSGA ((DBG_VERBOSE, "Migrated value %s=%s", p, String));
} else {
DEBUGMSGA ((DBG_ERROR, "Couldn't migrate value %s", p));
}
}
}
p += SizeOfStringA (p);
}
}
}
ELSE_DEBUGMSGA ((DBG_WARNING, "Found multiple sections in winmine.ini"));
}
}
ELSE_DEBUGMSGA ((DBG_ERROR, "Could not create Value %s", S_ALREADYPLAYED));
CloseRegKey (Key);
return rc;
}
LONG
WinMine_MigrateSystemNT (
IN HINF UnattendFile
)
{
return ERROR_SUCCESS;
}