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

554 lines
12 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
wiztools.c
Abstract:
Implements common code for upgwiz wizard plugins.
Author:
Jim Schmidt (jimschm) 07-Oct-1998
Revision History:
<alias> <date> <comments>
--*/
#include "pch.h"
#include "..\inc\dgdll.h"
#include "..\..\w95upg\migapp\migdbp.h"
HINSTANCE g_OurInst;
BOOL
Init (
VOID
)
{
return InitToolMode (g_OurInst);
}
VOID
Terminate (
VOID
)
{
TerminateToolMode (g_OurInst);
}
BOOL
WINAPI
DllMain (
IN HINSTANCE hInstance,
IN DWORD dwReason,
IN LPVOID lpReserved
)
{
g_OurInst = hInstance;
return TRUE;
}
VOID
WizToolsMain (
IN DWORD dwReason
)
{
if (dwReason == DLL_PROCESS_ATTACH) {
Init();
} else if (dwReason == DLL_PROCESS_DETACH) {
Terminate();
}
}
BOOL
WizardWriteRealString (
IN HANDLE File,
IN PCSTR String
)
{
if (!WriteFileString (File, String)) {
return FALSE;
}
printf ("%s", String);
return TRUE;
}
VOID
GenerateUniqueStringSectKey (
IN PCSTR TwoLetterId,
OUT PSTR Buffer
)
{
SYSTEMTIME Time;
DWORD TimeLow, TimeHigh;
DWORD UserHash;
DWORD Size;
CHAR UserName[MAX_USER_NAME];
PCSTR p;
Size = MAX_USER_NAME;
GetUserName (UserName, &Size);
p = UserName;
UserHash = 0;
while (*p) {
UserHash = _rotl (UserHash, 1) ^ (*p & 0x3f);
p++;
}
GetLocalTime (&Time);
TimeLow = Time.wMilliseconds +
Time.wSecond * 1000 +
Time.wMinute * 60000;
TimeHigh = Time.wHour +
Time.wDay * 24 +
Time.wMonth * 744 +
Time.wYear * 8928;
wsprintf (Buffer, "%s%x%x%x", TwoLetterId, TimeLow, TimeHigh, UserHash);
}
BOOL
WriteHeader (
IN HANDLE File
)
{
CHAR Msg[256];
CHAR UserName[64];
DWORD Size = 64;
SYSTEMTIME SysTime;
SYSTEMTIME LocTime;
static PCSTR Month[12] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
GetUserName (UserName, &Size);
GetSystemTime (&SysTime);
GetLocalTime (&LocTime);
wsprintf (
Msg,
"Report From %s on %u:%02u (%u:%02u) %02u-%s-%04u:\r\n\r\n",
UserName,
LocTime.wHour,
LocTime.wMinute,
SysTime.wHour,
SysTime.wMinute,
LocTime.wDay,
Month[LocTime.wMonth - 1],
LocTime.wYear
);
return WizardWriteRealString (File, Msg);
}
BOOL
pWriteAdditionalSpaces (
IN HANDLE File,
IN DWORD SpacesWritten,
IN DWORD SpacesNeeded
)
{
while (SpacesWritten < SpacesNeeded) {
if (!WizardWriteRealString (File, " ")) {
return FALSE;
}
SpacesWritten ++;
}
return TRUE;
}
BOOL
WizardWriteInfString (
IN HANDLE File,
IN PCSTR String,
IN BOOL Quoted,
IN BOOL SkipCRLF,
IN BOOL ReplaceSpace,
IN CHAR SpaceReplacement,
IN DWORD ColumnWidth
)
{
PCSTR s;
PSTR d;
CHAR Buf[2048];
BOOL quoteMode = FALSE;
BOOL replaceMode = FALSE;
DWORD columnWidth = 0;
if (!String) {
if (!WizardWriteRealString (File, "\"\"")) {
return FALSE;
}
columnWidth +=2;
return pWriteAdditionalSpaces (File, columnWidth, ColumnWidth);
}
if (Quoted) {
if (!WizardWriteRealString (File, "\"")) {
return FALSE;
}
columnWidth ++;
}
s = String;
d = Buf;
while (*s) {
if (SkipCRLF && ((*s == '\r') || (*s == '\n'))) {
s++;
continue;
}
if (ReplaceSpace && (*s == ' ')) {
*d++ = SpaceReplacement;
s++;
columnWidth ++;
continue;
}
if (*s == '\"') {
if (Quoted) {
*d++ = '\"';
columnWidth ++;
} else if (!replaceMode) {
quoteMode = !quoteMode;
}
}
if (*s == '%') {
if (!quoteMode && !Quoted) {
replaceMode = !replaceMode;
*d++ = '%';
columnWidth ++;
}
}
*d++ = *s++;
columnWidth ++;
}
if (Quoted) {
*d++ = '\"';
columnWidth ++;
}
*d = 0;
if (!WizardWriteRealString (File, Buf)) {
return FALSE;
}
return pWriteAdditionalSpaces (File, columnWidth, ColumnWidth);
}
BOOL
WriteStringSectKey (
IN HANDLE File,
IN PCSTR KeyName,
IN PCSTR String
)
{
if (!WizardWriteQuotedString (File, KeyName)) {
return FALSE;
}
if (!WizardWriteRealString (File, " = ")) {
return FALSE;
}
if (!WizardWriteQuotedString (File, String)) {
return FALSE;
}
if (!WizardWriteRealString (File, "\r\n")) {
return FALSE;
}
return TRUE;
}
BOOL
WriteFileAttributes (
IN POUTPUTARGS Args,
IN PCSTR NonLocalizedName, OPTIONAL
IN HANDLE FileHandle,
IN PCSTR FileSpec,
IN PCSTR Section OPTIONAL
)
{
BOOL b = FALSE;
WIN32_FIND_DATA fd;
HANDLE FindHandle;
CHAR Buf[2048];
CHAR NameKey[64];
CHAR TextKey[64];
FindHandle = FindFirstFile (FileSpec, &fd);
if (FindHandle == INVALID_HANDLE_VALUE) {
return FALSE;
}
__try {
GenerateUniqueStringSectKey ("WN", NameKey);
GenerateUniqueStringSectKey ("WD", TextKey);
if (Section) {
if (!WizardWriteRealString (FileHandle, Section)) {
__leave;
}
if (!WizardWriteRealString (FileHandle, "\r\n")) {
__leave;
}
}
Buf[0] = 0;
if (NonLocalizedName) {
wsprintf (Buf, "%s,", NonLocalizedName);
NameKey[0] = 0;
} else {
wsprintf (Buf, "%%%s%%,", NameKey);
}
if (Args->OptionalText) {
wsprintf (_mbschr (Buf, 0), " %%%s%%,", TextKey);
} else {
StringCat (Buf, ",");
TextKey[0] = 0;
}
if (!WizardWriteColumn (FileHandle, Buf, 45)) {
__leave;
}
if (GetFileAttributesLine (FileSpec, Buf, 2048)) {
if (!WizardWriteColumn (FileHandle, Buf, 0)) {
__leave;
}
} else {
wsprintf (Buf, "%s,", GetFileNameFromPath (FileSpec));
if (!WizardWriteColumn (FileHandle, Buf, 14)) {
__leave;
}
wsprintf (Buf, "FILESIZE(%u)", fd.nFileSizeLow);
if (!WizardWriteRealString (FileHandle, Buf)) {
__leave;
}
}
if (NameKey[0] || TextKey[0]) {
if (!WizardWriteRealString (FileHandle, "\r\n\r\n[Strings]\r\n")) {
__leave;
}
}
if (NameKey[0]) {
if (!WriteStringSectKey (FileHandle, NameKey, Args->OptionalDescription)) {
__leave;
}
}
if (TextKey[0]) {
if (!WriteStringSectKey (FileHandle, TextKey, Args->OptionalText)) {
__leave;
}
}
b = TRUE;
}
__finally {
FindClose (FindHandle);
}
return b;
}
#define ATTR_FILESIZE 0x1
#define ATTR_CHECKSUM 0x2
#define ATTR_COMPNAME 0x4
#define ATTR_FILEDESC 0x8
#define ATTR_FILEVER 0x10
#define ATTR_INTNAME 0x20
#define ATTR_LEGAL 0x40
#define ATTR_ORIGNAME 0x80
#define ATTR_PRODNAME 0x100
#define ATTR_PRODVER 0x200
#define ATTR_EXETYPE 0x400
#define ATTR_DESCR16 0x800
#define ATTR_HLPTITLE 0x1000
DWORD g_ListedAttr = 0xFFFFFFFF;
typedef struct _VERSION_DATA {
PCSTR versionValue;
PCSTR versionName;
DWORD attrib;
} VERSION_DATA, *PVERSION_DATA;
VERSION_DATA verData [] = {{NULL, "COMPANYNAME", ATTR_COMPNAME},
{NULL, "PRODUCTVERSION", ATTR_PRODVER},
{NULL, "PRODUCTNAME", ATTR_PRODNAME},
{NULL, "FILEDESCRIPTION", ATTR_FILEDESC},
{NULL, "FILEVERSION", ATTR_FILEVER},
{NULL, "ORIGINALFILENAME", ATTR_ORIGNAME},
{NULL, "INTERNALNAME", ATTR_INTNAME},
{NULL, "LEGALCOPYRIGHT", ATTR_LEGAL},
{NULL, NULL, 0}};
extern PSTR g_ExeTypes[4];
BOOL
GetFileAttributesLine (
IN PCTSTR FileName,
OUT PTSTR Buffer,
IN DWORD BufferSize
)
{
FILE_HELPER_PARAMS Params;
PCTSTR extPtr;
TCHAR result[MAX_TCHAR_PATH];
PTSTR resultPtr;
UINT checkSum;
DWORD exeType;
PCSTR fileDesc16;
PCSTR hlpTitle;
DWORD listedAttr = 0;
PVERSION_DATA p;
WIN32_FIND_DATA FindData;
BOOL goOn = FALSE;
while (!goOn) {
if (!DoesFileExistEx (FileName, &FindData)) {
sprintf (result, "Target file does not exist: %s", FileName);
if (MessageBox (NULL, result, "Error", MB_RETRYCANCEL) != IDRETRY) {
*Buffer = 0;
return TRUE;
}
goOn = FALSE;
} else {
goOn = TRUE;
}
}
Params.FindData = &FindData;
Params.Handled = 0;
Params.FullFileSpec = FileName;
extPtr = GetFileNameFromPath (FileName);
MYASSERT (extPtr);
StringCopyAB (Params.DirSpec, FileName, extPtr);
Params.IsDirectory = FALSE;
Params.Extension = GetFileExtensionFromPath (FileName);
Params.VirtualFile = FALSE;
Params.CurrentDirData = NULL;
_stprintf (
result,
TEXT("%-14s"),
extPtr);
resultPtr = GetEndOfString (result);
listedAttr = 0;
p = verData;
while (p->versionName) {
if (((g_ListedAttr == 0xFFFFFFFF) && (listedAttr < 2)) || ((g_ListedAttr != 0xFFFFFFFF) && (g_ListedAttr & p->attrib))) {
p->versionValue = QueryVersionEntry (FileName, p->versionName);
if (p->versionValue) {
listedAttr ++;
}
}
else {
p->versionValue = NULL;
}
p++;
}
p = verData;
while (p->versionName) {
if (p->versionValue) {
_stprintf (
resultPtr,
TEXT(", %s(\"%s\")"),
p->versionName,
p->versionValue);
resultPtr = GetEndOfString (resultPtr);
}
p++;
}
if (((g_ListedAttr == 0xFFFFFFFF) && (listedAttr < 2)) || ((g_ListedAttr != 0xFFFFFFFF) && (g_ListedAttr & ATTR_DESCR16))) {
fileDesc16 = Get16ModuleDescription (FileName);
if (fileDesc16 != NULL) {
listedAttr ++;
_stprintf (
resultPtr,
TEXT(", DESCRIPTION(\"%s\")"),
fileDesc16);
resultPtr = GetEndOfString (resultPtr);
FreePathString (fileDesc16);
}
}
if (((g_ListedAttr == 0xFFFFFFFF) && (listedAttr < 2)) || ((g_ListedAttr != 0xFFFFFFFF) && (g_ListedAttr & ATTR_EXETYPE))) {
exeType = GetModuleType (FileName);
if (exeType != UNKNOWN_MODULE) {
listedAttr ++;
_stprintf (
resultPtr,
TEXT(", EXETYPE(\"%s\")"),
g_ExeTypes[exeType]);
resultPtr = GetEndOfString (resultPtr);
}
}
if (((g_ListedAttr == 0xFFFFFFFF) && (listedAttr < 2)) || ((g_ListedAttr != 0xFFFFFFFF) && (g_ListedAttr & ATTR_HLPTITLE))) {
hlpTitle = GetHlpFileTitle (FileName);
if (hlpTitle != NULL) {
listedAttr ++;
_stprintf (
resultPtr,
TEXT(", HLPTITLE(\"%s\")"),
hlpTitle);
resultPtr = GetEndOfString (resultPtr);
FreePathString (hlpTitle);
}
}
if (((g_ListedAttr == 0xFFFFFFFF) && (listedAttr < 2)) || ((g_ListedAttr != 0xFFFFFFFF) && (g_ListedAttr & ATTR_FILESIZE))) {
listedAttr ++;
_stprintf (
resultPtr,
TEXT(", FILESIZE(0x%08lX)"),
Params.FindData->nFileSizeLow);
resultPtr = GetEndOfString (resultPtr);
}
if (((g_ListedAttr == 0xFFFFFFFF) && (listedAttr < 2)) || ((g_ListedAttr != 0xFFFFFFFF) && (g_ListedAttr & ATTR_CHECKSUM))) {
listedAttr ++;
checkSum = ComputeCheckSum (&Params);
_stprintf (
resultPtr,
TEXT(", CHECKSUM(0x%08lX)"),
checkSum);
resultPtr = GetEndOfString (resultPtr);
}
_tcssafecpy (Buffer, result, BufferSize / sizeof (TCHAR));
return TRUE;
}