Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

708 lines
17 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
migutil.h
Abstract:
Includes all header files necessary to use the lib generated by
common\migutil. Declares a bunch of utility functions and macros.
Declares project-wide MAX constants.
Author:
Jim Schmidt (jimschm) 23-Aug-1996
Revision History:
Many changes, see SLM log for details.
--*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
//
// MAX constants
//
#define MAX_PATH_PLUS_NUL (MAX_PATH+1)
#define MAX_MBCHAR_PATH (MAX_PATH_PLUS_NUL*2)
#define MAX_WCHAR_PATH MAX_PATH_PLUS_NUL
#define MAX_MBCHAR_PRINTABLE_PATH (MAX_PATH*2)
#define MAX_WCHAR_PRINTABLE_PATH MAX_PATH
#define MAX_SERVER_NAMEA (64*2)
#define MAX_USER_NAMEA (MAX_PATH)
#define MAX_REGISTRY_KEYA (1024 * 2)
#define MAX_REGISTRY_VALUE_NAMEA (260 * 2)
#define MAX_COMPONENT_NAMEA (256 * 2)
#define MAX_COMPUTER_NAMEA (64 * 2)
#define MAX_CMDLINEA (1024 * 2) // maximum number of chars in a Win95 command line
#define MAX_TRANSLATION 32
#define MAX_KEYBOARDLAYOUT 64
#define MAX_INF_SECTION_NAME 128
#define MAX_INF_KEY_NAME 128
#define MAX_SERVER_NAMEW 64
#define MAX_USER_NAMEW (MAX_PATH)
#define MAX_REGISTRY_KEYW 1024
#define MAX_REGISTRY_VALUE_NAMEW 260
#define MAX_COMPONENT_NAMEW 256
#define MAX_COMPUTER_NAMEW 64
#define MAX_CMDLINEW 1024 // maximum number of chars in a Win95 command line
#ifdef UNICODE
#define MAX_SERVER_NAME MAX_SERVER_NAMEW
#define MAX_USER_NAME MAX_USER_NAMEW
#define MAX_REGISTRY_KEY MAX_REGISTRY_KEYW
#define MAX_REGISTRY_VALUE_NAME MAX_REGISTRY_VALUE_NAMEW
#define MAX_COMPONENT_NAME MAX_COMPONENT_NAMEW
#define MAX_COMPUTER_NAME MAX_COMPUTER_NAMEW
#define MAX_CMDLINE MAX_CMDLINEW
#define MAX_TCHAR_PATH MAX_WCHAR_PATH
#define MAX_TCHAR_PRINTABLE_PATH MAX_WCHAR_PRINTABLE_PATH
#else
#define MAX_SERVER_NAME MAX_SERVER_NAMEA
#define MAX_USER_NAME MAX_USER_NAMEA
#define MAX_REGISTRY_KEY MAX_REGISTRY_KEYA
#define MAX_REGISTRY_VALUE_NAME MAX_REGISTRY_VALUE_NAMEA
#define MAX_COMPONENT_NAME MAX_COMPONENT_NAMEA
#define MAX_COMPUTER_NAME MAX_COMPUTER_NAMEA
#define MAX_CMDLINE MAX_CMDLINEA
#define MAX_TCHAR_PATH MAX_MBCHAR_PATH
#define MAX_TCHAR_PRINTABLE_PATH MAX_MBCHAR_PRINTABLE_PATH
#endif
//
// Critical Section APIs, implemented because TryEnterCriticalSection is
// supported only on NT, and we need it on Win9x.
//
typedef struct {
HANDLE EventHandle;
} OUR_CRITICAL_SECTION, *POUR_CRITICAL_SECTION;
BOOL
InitializeOurCriticalSection (
OUR_CRITICAL_SECTION *pcs
);
VOID
DeleteOurCriticalSection (
OUR_CRITICAL_SECTION *pcs
);
BOOL
EnterOurCriticalSection (
OUR_CRITICAL_SECTION *pcs
);
VOID
LeaveOurCriticalSection (
OUR_CRITICAL_SECTION *pcs
);
BOOL
TryEnterOurCriticalSection (
OUR_CRITICAL_SECTION *pcs
);
PSTR
UnicodeToCcs (
PCWSTR Source
);
//
// Fail-proof memory allocators
//
PVOID
SafeHeapAlloc (
HANDLE g_hHeap,
DWORD Flags,
DWORD Size
);
PVOID
SafeHeapReAlloc (
HANDLE g_hHeap,
DWORD Flags,
PVOID OldBlock,
DWORD Size
);
//
// Includes of util modules
//
#include "chartype.h"
#include "debug.h"
#include "log.h"
#include "staticsz.h"
#include "growbuf.h" // must appear before strings.h and file.h
#include "strings.h"
#include "poolmem.h"
#include "growlist.h"
#include "file.h"
#include "reg.h"
#include "ipc.h"
#include "fileenum.h"
#include "inf.h"
#include "unicode.h"
#include "expandit.h"
#include "hash.h"
#include "uninstall.h"
#include "persist.h"
extern HINSTANCE g_hInst;
extern HANDLE g_hHeap;
extern OSVERSIONINFOA g_OsInfo;
VOID
CenterWindow (
HWND Wnd,
HWND Parent OPTIONAL
);
VOID
TurnOnWaitCursor (
VOID
);
VOID
TurnOffWaitCursor (
VOID
);
//
// Version APIs
//
typedef struct {
WORD CodePage;
WORD Language;
} TRANSLATION, *PTRANSLATION;
typedef struct {
GROWBUFFER GrowBuf;
PBYTE VersionBuffer;
PTRANSLATION Translations;
PBYTE StringBuffer;
UINT Size;
DWORD Handle;
VS_FIXEDFILEINFO *FixedInfo;
UINT FixedInfoSize;
CHAR TranslationStr[MAX_TRANSLATION];
UINT MaxTranslations;
UINT CurrentTranslation;
UINT CurrentDefaultTranslation;
PCSTR FileSpec;
PCSTR VersionField;
} VERSION_STRUCTA, *PVERSION_STRUCTA;
typedef struct {
GROWBUFFER GrowBuf;
PBYTE VersionBuffer;
PTRANSLATION Translations;
PBYTE StringBuffer;
UINT Size;
DWORD Handle;
VS_FIXEDFILEINFO *FixedInfo;
UINT FixedInfoSize;
WCHAR TranslationStr[MAX_TRANSLATION];
UINT MaxTranslations;
UINT CurrentTranslation;
UINT CurrentDefaultTranslation;
PCWSTR FileSpec;
PCWSTR VersionField;
} VERSION_STRUCTW, *PVERSION_STRUCTW;
BOOL
CreateVersionStructA (
OUT PVERSION_STRUCTA VersionStruct,
IN PCSTR FileSpec
);
VOID
DestroyVersionStructA (
IN PVERSION_STRUCTA VersionStruct
);
PCSTR
EnumFirstVersionTranslationA (
IN OUT PVERSION_STRUCTA VersionStruct
);
PCSTR
EnumNextVersionTranslationA (
IN OUT PVERSION_STRUCTA VersionStruct
);
PCSTR
EnumFirstVersionValueA (
IN OUT PVERSION_STRUCTA VersionStruct,
IN PCSTR VersionField
);
PCSTR
EnumNextVersionValueA (
IN OUT PVERSION_STRUCTA VersionStruct
);
BOOL
CreateVersionStructW (
OUT PVERSION_STRUCTW VersionStruct,
IN PCWSTR FileSpec
);
VOID
DestroyVersionStructW (
IN PVERSION_STRUCTW VersionStruct
);
PCWSTR
EnumFirstVersionTranslationW (
IN OUT PVERSION_STRUCTW VersionStruct
);
PCWSTR
EnumNextVersionTranslationW (
IN OUT PVERSION_STRUCTW VersionStruct
);
PCWSTR
EnumFirstVersionValueW (
IN OUT PVERSION_STRUCTW VersionStruct,
IN PCWSTR VersionField
);
PCWSTR
EnumNextVersionValueW (
IN OUT PVERSION_STRUCTW VersionStruct
);
ULONGLONG
VerGetFileVer (
IN PVERSION_STRUCTA VersionStruct
);
ULONGLONG
VerGetProductVer (
IN PVERSION_STRUCTA VersionStruct
);
DWORD
VerGetFileDateLo (
IN PVERSION_STRUCTA VersionStruct
);
DWORD
VerGetFileDateHi (
IN PVERSION_STRUCTA VersionStruct
);
DWORD
VerGetFileVerOs (
IN PVERSION_STRUCTA VersionStruct
);
DWORD
VerGetFileVerType (
IN PVERSION_STRUCTA VersionStruct
);
//
// Reusable memory alloc, kind of like a GROWBUFFER but more simple
//
PVOID
ReuseAlloc (
HANDLE Heap,
PVOID OldPtr,
DWORD SizeNeeded
);
VOID
ReuseFree (
HANDLE Heap,
PVOID Ptr
);
VOID
OutOfMemory_Terminate (
VOID
);
VOID
SetOutOfMemoryParent (
HWND hwnd
);
//
// Error condition tags.
//
// These tags should be used for all error conditions.
//
#define ERROR_CRITICAL
#define ERROR_NONCRITICAL
#define ERROR_TRIVIAL
#define ERROR_ABNORMAL_CONDITION
//
// OSVERSION macros...
//
#define BUILDNUMBER() (LOWORD(g_OsInfo.dwBuildNumber))
#define ISNT() (g_OsInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
#define ISWIN9X() (g_OsInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
#define ISWIN95_GOLDEN() (ISWIN95() && BUILDNUMBER() <= 1000)
#define ISWIN95_OSR2() (ISWIN95() && BUILDNUMBER() > 1000)
#define ISWIN95() (ISWIN9X() && !ISATLEASTWIN98())
#define ISMEMPHIS() (ISWIN9X() && g_OsInfo.dwMajorVersion==4 && g_OsInfo.dwMinorVersion==10)
#define ISMILLENNIUM() (ISWIN9X() && g_OsInfo.dwMajorVersion==4 && g_OsInfo.dwMinorVersion==90)
#define ISATLEASTOSR2() (ISWIN9X() && g_OsInfo.dwMajorVersion>=4 && BUILDNUMBER()>1000)
#define ISATLEASTWIN98() (ISWIN9X() && g_OsInfo.dwMajorVersion>=4 && g_OsInfo.dwMinorVersion>=10)
//
// Platform macros...
//
extern BOOL g_IsPc98;
#define ISPC98() (g_IsPc98)
//
// Boot drive letter
//
extern PCSTR g_BootDrivePathA;
extern PCWSTR g_BootDrivePathW;
extern PCSTR g_BootDriveA;
extern PCWSTR g_BootDriveW;
extern CHAR g_BootDriveLetterA;
extern WCHAR g_BootDriveLetterW;
//
// String Mapping
//
#define STRMAP_ANY_MATCH 0
#define STRMAP_COMPLETE_MATCH_ONLY 0x0001
#define STRMAP_FIRST_CHAR_MUST_MATCH 0x0002
#define STRMAP_RETURN_AFTER_FIRST_REPLACE 0x0004
#define STRMAP_REQUIRE_WACK_OR_NUL 0x0008
typedef struct {
BOOL UnicodeData;
//
// The filter can replace NewSubString. (The filter must also
// set NewSubStringSizeInBytes when replacing NewSubString.)
//
union {
struct {
PCWSTR OriginalString;
PCWSTR BeginningOfMatch;
PCWSTR CurrentString;
PCWSTR OldSubString;
PCWSTR NewSubString;
INT NewSubStringSizeInBytes;
} Unicode;
struct {
PCSTR OriginalString;
PCSTR BeginningOfMatch;
PCSTR CurrentString;
PCSTR OldSubString;
PCSTR NewSubString;
INT NewSubStringSizeInBytes;
} Ansi;
};
} REG_REPLACE_DATA, *PREG_REPLACE_DATA;
typedef BOOL(REG_REPLACE_FILTER_PROTOTYPE)(PREG_REPLACE_DATA Data);
typedef REG_REPLACE_FILTER_PROTOTYPE * REG_REPLACE_FILTER;
typedef struct TAG_CHARNODE {
WORD Char;
WORD Flags;
PVOID OriginalStr;
PVOID ReplacementStr;
INT ReplacementBytes;
struct TAG_CHARNODE *NextLevel;
struct TAG_CHARNODE *NextPeer;
} CHARNODE, *PCHARNODE;
typedef struct {
CHARNODE Node;
REG_REPLACE_FILTER Filter;
ULONG_PTR ExtraData;
} CHARNODEEX, *PCHARNODEEX;
typedef struct {
POOLHANDLE Pool;
PCHARNODE FirstLevelRoot;
BOOL UsesExNode;
BOOL UsesFilter;
BOOL UsesExtraData;
} MAPSTRUCT, *PMAPSTRUCT;
//
// APIs
//
PMAPSTRUCT
CreateStringMappingEx (
IN BOOL UsesFilter,
IN BOOL UsesExtraData
);
#define CreateStringMapping() CreateStringMappingEx(FALSE,FALSE)
VOID
DestroyStringMapping (
IN PMAPSTRUCT Map
);
VOID
AddStringMappingPairExA (
IN OUT PMAPSTRUCT Map,
IN PCSTR Old,
IN PCSTR New,
IN REG_REPLACE_FILTER Filter, OPTIONAL
IN ULONG_PTR ExtraData, OPTIONAL
IN DWORD Flags
);
#define AddStringMappingPairA(Map,Old,New) AddStringMappingPairExA(Map,Old,New,NULL,0,0)
VOID
AddStringMappingPairExW (
IN OUT PMAPSTRUCT Map,
IN PCWSTR Old,
IN PCWSTR New,
IN REG_REPLACE_FILTER Filter, OPTIONAL
IN ULONG_PTR ExtraData, OPTIONAL
IN DWORD Flags
);
#define AddStringMappingPairW(Map,Old,New) AddStringMappingPairExW(Map,Old,New,NULL,0,0)
BOOL
MappingSearchAndReplaceExA (
IN PMAPSTRUCT Map,
IN PCSTR SrcBuffer,
OUT PSTR Buffer, // can be the same as SrcBuffer
IN INT InboundBytes, OPTIONAL
OUT PINT OutboundBytesPtr, OPTIONAL
IN INT MaxSizeInBytes,
IN DWORD Flags,
OUT ULONG_PTR *ExtraDataValue, OPTIONAL
OUT PCSTR *EndOfString OPTIONAL
);
#define MappingSearchAndReplaceA(map,buffer,maxbytes) MappingSearchAndReplaceExA(map,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
BOOL
MappingSearchAndReplaceExW (
IN PMAPSTRUCT Map,
IN PCWSTR SrcBuffer,
OUT PWSTR Buffer, // can be the same as SrcBuffer
IN INT InboundBytes, OPTIONAL
OUT PINT OutboundBytes, OPTIONAL
IN INT MaxSizeInBytes,
IN DWORD Flags,
OUT ULONG_PTR *ExtraDataValue, OPTIONAL
OUT PCWSTR *EndOfString OPTIONAL
);
#define MappingSearchAndReplaceW(map,buffer,maxbytes) MappingSearchAndReplaceExW(map,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
BOOL
MappingMultiTableSearchAndReplaceExA (
IN PMAPSTRUCT *MapArray,
IN UINT MapArrayCount,
IN PCSTR SrcBuffer,
OUT PSTR Buffer, // can be the same as SrcBuffer
IN INT InboundBytes, OPTIONAL
OUT PINT OutboundBytesPtr, OPTIONAL
IN INT MaxSizeInBytes,
IN DWORD Flags,
OUT ULONG_PTR *ExtraDataValue, OPTIONAL
OUT PCSTR *EndOfString OPTIONAL
);
#define MappingMultiTableSearchAndReplaceA(array,count,buffer,maxbytes) \
MappingMultiTableSearchAndReplaceExA(array,count,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
BOOL
MappingMultiTableSearchAndReplaceExW (
IN PMAPSTRUCT *MapArray,
IN UINT MapArrayCount,
IN PCWSTR SrcBuffer,
OUT PWSTR Buffer, // can be the same as SrcBuffer
IN INT InboundBytes, OPTIONAL
OUT PINT OutboundBytes, OPTIONAL
IN INT MaxSizeInBytes,
IN DWORD Flags,
OUT ULONG_PTR *ExtraDataValue, OPTIONAL
OUT PCWSTR *EndOfString OPTIONAL
);
#define MappingMultiTableSearchAndReplaceW(array,count,buffer,maxbytes) \
MappingMultiTableSearchAndReplaceExW(array,count,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
HANDLE
StartThread (
IN PTHREAD_START_ROUTINE Address,
IN PVOID Arg
);
typedef struct {
WCHAR DisplayName[80];
ULONGLONG Checksum;
WCHAR Version[80];
WCHAR Publisher[80];
WCHAR ProductID[80];
WCHAR RegisteredOwner[80];
WCHAR RegisteredCompany[80];
WCHAR Language[80];
WCHAR SupportUrl[80];
WCHAR SupportTelephone[80];
WCHAR HelpLink[80];
WCHAR InstallLocation[80];
WCHAR InstallSource[80];
WCHAR InstallDate[80];
WCHAR Contact[80];
WCHAR Comments[80];
WCHAR Image[80];
WCHAR ReadmeUrl[80];
WCHAR UpdateInfoUrl[80];
} INSTALLEDAPPW, *PINSTALLEDAPPW;
PINSTALLEDAPPW
GetInstalledAppsW (
IN OUT PGROWBUFFER Buffer,
OUT PUINT Count OPTIONAL
);
typedef PVOID MOVELISTW;
MOVELISTW
AllocateMoveListW (
IN POOLHANDLE PoolHandle
);
//
// Free move list by destrying the pool it was allocated from
//
BOOL
InsertMoveIntoListW (
IN MOVELISTW List,
IN PCWSTR Source,
IN PCWSTR Destination
);
MOVELISTW
RemoveMoveListOverlapW (
IN MOVELISTW List
);
BOOL
OutputMoveListW (
IN HANDLE File,
IN MOVELISTW List, OPTIONAL
IN BOOL AddNestedMoves
);
#ifdef UNICODE
#define g_BootDrivePath g_BootDrivePathW
#define g_BootDrive g_BootDriveW
#define g_BootDriveLetter g_BootDriveLetterW
#define MOVELIST MOVELISTW
#define AllocateMoveList AllocateMoveListW
#define InsertMoveIntoList InsertMoveIntoListW
#define RemoveMoveListOverlap RemoveMoveListOverlapW
#define OutputMoveList OutputMoveListW
#define VERSION_STRUCT VERSION_STRUCTW
#define PVERSION_STRUCT PVERSION_STRUCTW
#define CreateVersionStruct CreateVersionStructW
#define DestroyVersionStruct DestroyVersionStructW
#define EnumFirstVersionTranslation EnumFirstVersionTranslationW
#define EnumNextVersionTranslation EnumNextVersionTranslationW
#define EnumFirstVersionValue EnumFirstVersionValueW
#define EnumNextVersionValue EnumNextVersionValueW
#define PINSTALLEDAPP PINSTALLEDAPPW
#define GetInstalledApps GetInstalledAppsW
#define AddStringMappingPairEx AddStringMappingPairExW
#define AddStringMappingPair AddStringMappingPairW
#define MappingSearchAndReplaceEx MappingSearchAndReplaceExW
#define MappingSearchAndReplace MappingSearchAndReplaceW
#define MappingMultiTableSearchAndReplaceEx MappingMultiTableSearchAndReplaceExW
#define MappingMultiTableSearchAndReplace MappingMultiTableSearchAndReplaceW
#else
#define g_BootDrivePath g_BootDrivePathA
#define g_BootDrive g_BootDriveA
#define g_BootDriveLetter g_BootDriveLetterA
#define VERSION_STRUCT VERSION_STRUCTA
#define PVERSION_STRUCT PVERSION_STRUCTA
#define CreateVersionStruct CreateVersionStructA
#define DestroyVersionStruct DestroyVersionStructA
#define EnumFirstVersionTranslation EnumFirstVersionTranslationA
#define EnumNextVersionTranslation EnumNextVersionTranslationA
#define EnumFirstVersionValue EnumFirstVersionValueA
#define EnumNextVersionValue EnumNextVersionValueA
#define AddStringMappingPairEx AddStringMappingPairExA
#define AddStringMappingPair AddStringMappingPairA
#define MappingSearchAndReplaceEx MappingSearchAndReplaceExA
#define MappingSearchAndReplace MappingSearchAndReplaceA
#define MappingMultiTableSearchAndReplaceEx MappingMultiTableSearchAndReplaceExA
#define MappingMultiTableSearchAndReplace MappingMultiTableSearchAndReplaceA
#endif
#ifdef __cplusplus
}
#endif