554 lines
12 KiB
C
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;
|
|
}
|
|
|