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.
409 lines
7.4 KiB
409 lines
7.4 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
util.h
|
|
|
|
Abstract:
|
|
|
|
Header for util.cxx
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 31-Oct-1994
|
|
|
|
Revision History:
|
|
|
|
31-Oct-1994 rfirth
|
|
Created
|
|
|
|
--*/
|
|
|
|
#if !defined(__UTIL_H__)
|
|
#define __UTIL_H__
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
//
|
|
// manifests
|
|
//
|
|
|
|
#define PLATFORM_TYPE_UNKNOWN ((DWORD)(-1))
|
|
#define PLATFORM_TYPE_WIN95 ((DWORD)(0))
|
|
#define PLATFORM_TYPE_WINNT ((DWORD)(1))
|
|
#define PLATFORM_TYPE_UNIX ((DWORD)(2))
|
|
|
|
#define PLATFORM_SUPPORTS_UNICODE 0x00000001
|
|
|
|
// max header allowed by wininet in the cache
|
|
|
|
#define MAX_HEADER_SUPPORTED 2048
|
|
#define MAX_USERNAME 128
|
|
#define DEFAULT_MAX_EXTENSION_LENGTH 8
|
|
|
|
//
|
|
// types
|
|
//
|
|
|
|
//
|
|
// TRI_STATE - for places where we need to differentiate between TRUE/FALSE and
|
|
// uninitialized
|
|
//
|
|
|
|
typedef enum {
|
|
TRI_STATE_UNKNOWN = -1,
|
|
TRI_STATE_FALSE = 0,
|
|
TRI_STATE_TRUE = 1
|
|
} TRI_STATE;
|
|
|
|
//
|
|
// DLL_ENTRY_POINT - maps a name to an entry point in a DLL
|
|
//
|
|
|
|
typedef struct {
|
|
LPSTR lpszProcedureName;
|
|
FARPROC * lplpfnProcedure;
|
|
} DLL_ENTRY_POINT, * LPDLL_ENTRY_POINT;
|
|
|
|
//
|
|
// DLL_INFO - used to dynamically load/unload libraries
|
|
//
|
|
|
|
typedef struct {
|
|
LPSTR lpszDllName;
|
|
HINSTANCE hModule;
|
|
LONG LoadCount;
|
|
DWORD dwNumberOfEntryPoints;
|
|
LPDLL_ENTRY_POINT lpEntryPoints;
|
|
} DLL_INFO, * LPDLL_INFO;
|
|
|
|
//
|
|
// macros
|
|
//
|
|
|
|
#define IsPlatformWin95() \
|
|
(BOOL)((GlobalPlatformType == PLATFORM_TYPE_WIN95) ? TRUE : FALSE)
|
|
|
|
#define IsPlatformWinNT() \
|
|
(BOOL)((GlobalPlatformType == PLATFORM_TYPE_WINNT) ? TRUE : FALSE)
|
|
|
|
//#define IsUnicodeSupported() \
|
|
// (BOOL)((PlatformSupport() & PLATFORM_SUPPORTS_UNICODE) ? TRUE : FALSE)
|
|
|
|
#define DLL_ENTRY_POINT_ELEMENT(name) \
|
|
# name, (FARPROC *)&_I_ ## name
|
|
|
|
#define DLL_INFO_INIT(name, entryPoints) { \
|
|
name, \
|
|
NULL, \
|
|
0, \
|
|
ARRAY_ELEMENTS(entryPoints), \
|
|
(LPDLL_ENTRY_POINT)&entryPoints \
|
|
}
|
|
|
|
|
|
#define CompareFileTime(ft1, ft2) ( ((*(LONGLONG *)&ft1) > (*(LONGLONG *)&ft2)) ? 1 : \
|
|
( ((*(LONGLONG *)&ft1) == (*(LONGLONG *)&ft2)) ? 0 : -1 ) )
|
|
|
|
|
|
#define WRAP_REVERT_USER(fn, args, retVal) \
|
|
{ \
|
|
HANDLE hThreadToken = NULL; \
|
|
if (OpenThreadToken(GetCurrentThread(), (TOKEN_IMPERSONATE | TOKEN_READ), \
|
|
FALSE, \
|
|
&hThreadToken)) \
|
|
{ \
|
|
INET_ASSERT(hThreadToken != 0); \
|
|
RevertToSelf(); \
|
|
} \
|
|
retVal = fn args; \
|
|
if (hThreadToken) \
|
|
{ \
|
|
SetThreadToken(NULL, hThreadToken); \
|
|
CloseHandle(hThreadToken); \
|
|
} \
|
|
}
|
|
|
|
#define SAFE_WRAP_REVERT_USER(fn, args, retVal) \
|
|
{ \
|
|
HANDLE hThreadToken = NULL; \
|
|
if (OpenThreadToken(GetCurrentThread(), (TOKEN_IMPERSONATE | TOKEN_READ), \
|
|
FALSE, \
|
|
&hThreadToken)) \
|
|
{ \
|
|
INET_ASSERT(hThreadToken != 0); \
|
|
RevertToSelf(); \
|
|
} \
|
|
__try \
|
|
{ \
|
|
retVal = fn args; \
|
|
} \
|
|
__except(EXCEPTION_EXECUTE_HANDLER) \
|
|
{ \
|
|
} \
|
|
ENDEXCEPT \
|
|
if (hThreadToken) \
|
|
{ \
|
|
SetThreadToken(NULL, hThreadToken); \
|
|
CloseHandle(hThreadToken); \
|
|
} \
|
|
}
|
|
|
|
#define WRAP_REVERT_USER_VOID(fn, args) \
|
|
{ \
|
|
HANDLE hThreadToken = NULL; \
|
|
if (OpenThreadToken(GetCurrentThread(), (TOKEN_IMPERSONATE | TOKEN_READ), \
|
|
FALSE, \
|
|
&hThreadToken)) \
|
|
{ \
|
|
INET_ASSERT(hThreadToken != 0); \
|
|
RevertToSelf(); \
|
|
} \
|
|
fn args; \
|
|
if (hThreadToken) \
|
|
{ \
|
|
SetThreadToken(NULL, hThreadToken); \
|
|
CloseHandle(hThreadToken); \
|
|
} \
|
|
}
|
|
|
|
#define SAFE_WRAP_REVERT_USER_VOID(fn, args) \
|
|
{ \
|
|
HANDLE hThreadToken = NULL; \
|
|
if (OpenThreadToken(GetCurrentThread(), (TOKEN_IMPERSONATE | TOKEN_READ), \
|
|
FALSE, \
|
|
&hThreadToken)) \
|
|
{ \
|
|
INET_ASSERT(hThreadToken != 0); \
|
|
RevertToSelf(); \
|
|
} \
|
|
__try \
|
|
{ \
|
|
fn args; \
|
|
} \
|
|
__except(EXCEPTION_EXECUTE_HANDLER) \
|
|
{ \
|
|
} \
|
|
ENDEXCEPT \
|
|
if (hThreadToken) \
|
|
{ \
|
|
SetThreadToken(NULL, hThreadToken); \
|
|
CloseHandle(hThreadToken); \
|
|
} \
|
|
}
|
|
|
|
//
|
|
// prototypes
|
|
//
|
|
|
|
LPSTR
|
|
NewString(
|
|
IN LPCSTR String,
|
|
IN DWORD dwLen = 0
|
|
);
|
|
|
|
LPWSTR
|
|
NewStringW(
|
|
IN LPCWSTR String,
|
|
IN DWORD dwLen = 0
|
|
);
|
|
|
|
|
|
LPSTR
|
|
CatString (
|
|
IN LPCSTR lpszLeft,
|
|
IN LPCSTR lpszRight
|
|
);
|
|
|
|
HLOCAL
|
|
ResizeBuffer(
|
|
IN HLOCAL BufferHandle,
|
|
IN DWORD Size,
|
|
IN BOOL Moveable
|
|
);
|
|
|
|
LPSTR
|
|
_memrchr(
|
|
IN LPSTR lpString,
|
|
IN CHAR cTarget,
|
|
IN INT iLength
|
|
);
|
|
|
|
LPSTR
|
|
strnistr(
|
|
IN LPSTR str1,
|
|
IN LPSTR str2,
|
|
IN DWORD Length
|
|
);
|
|
|
|
LPSTR
|
|
FASTCALL
|
|
PrivateStrChr(
|
|
IN LPCSTR lpStart,
|
|
IN WORD wMatch
|
|
);
|
|
|
|
DWORD
|
|
PlatformType(
|
|
IN OUT LPDWORD lpdwVersion5os = NULL
|
|
);
|
|
|
|
DWORD
|
|
PlatformSupport(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
GetTimeoutValue(
|
|
IN DWORD TimeoutOption
|
|
);
|
|
|
|
DWORD
|
|
ProbeWriteBuffer(
|
|
IN LPVOID lpBuffer,
|
|
IN DWORD dwBufferLength
|
|
);
|
|
|
|
DWORD
|
|
ProbeReadBuffer(
|
|
IN LPVOID lpBuffer,
|
|
IN DWORD dwBufferLength
|
|
);
|
|
|
|
DWORD
|
|
ProbeAndSetDword(
|
|
IN LPDWORD lpDword,
|
|
IN DWORD dwValue
|
|
);
|
|
|
|
DWORD
|
|
ProbeString(
|
|
IN LPSTR lpString,
|
|
OUT LPDWORD lpdwStringLength
|
|
);
|
|
|
|
DWORD
|
|
ProbeStringW(
|
|
IN LPWSTR lpString,
|
|
OUT LPDWORD lpdwStringLength
|
|
);
|
|
|
|
DWORD
|
|
LoadDllEntryPoints(
|
|
IN OUT LPDLL_INFO lpDllInfo,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
//
|
|
// flags for LoadDllEntryPoints()
|
|
//
|
|
|
|
#define LDEP_PARTIAL_LOAD_OK 0x00000001 // ok if not all entry points can be loaded
|
|
|
|
DWORD
|
|
UnloadDllEntryPoints(
|
|
IN OUT LPDLL_INFO lpDllInfo,
|
|
IN BOOL bForce
|
|
);
|
|
|
|
DWORD
|
|
MapInternetError(
|
|
IN DWORD ErrorCode,
|
|
IN LPDWORD lpdwStatus = NULL
|
|
);
|
|
|
|
DWORD
|
|
CalculateHashValue(
|
|
IN LPSTR lpszString
|
|
);
|
|
|
|
VOID GetCurrentGmtTime(
|
|
LPFILETIME lpFt
|
|
);
|
|
|
|
LPTSTR
|
|
FTtoString(
|
|
IN FILETIME *pftTime
|
|
);
|
|
|
|
BOOL
|
|
PrintFileTimeInInternetFormat(
|
|
FILETIME *lpft,
|
|
LPSTR lpszBuff,
|
|
DWORD dwSize
|
|
);
|
|
|
|
DWORD
|
|
ConvertSecurityInfoIntoCertInfoStruct(
|
|
IN LPINTERNET_SECURITY_INFO pSecInfo,
|
|
OUT INTERNET_CERTIFICATE_INFO *pCertificate,
|
|
IN OUT DWORD *pcbCertificate
|
|
);
|
|
|
|
BOOL
|
|
CertHashToStr(
|
|
IN LPSTR lpMD5Hash,
|
|
IN DWORD dwMD5HashSize,
|
|
IN OUT LPSTR *lplpszHashStr
|
|
);
|
|
|
|
//DWORD
|
|
//UnicodeToUtf8(
|
|
// IN LPCWSTR pwszIn,
|
|
// IN DWORD dwInLen,
|
|
// OUT LPBYTE pszOut,
|
|
// IN OUT LPDWORD pdwOutLen
|
|
// );
|
|
|
|
DWORD
|
|
CountUnicodeToUtf8(
|
|
IN LPCWSTR pwszIn,
|
|
IN DWORD dwInLen,
|
|
IN BOOL bEncode
|
|
);
|
|
|
|
DWORD
|
|
ConvertUnicodeToUtf8(
|
|
IN LPCWSTR pwszIn,
|
|
IN DWORD dwInLen,
|
|
OUT LPBYTE pszOut,
|
|
IN DWORD dwOutLen,
|
|
IN BOOL bEncode
|
|
);
|
|
|
|
BOOL
|
|
StringContainsHighAnsi(
|
|
IN LPSTR pszIn,
|
|
IN DWORD dwInLen
|
|
);
|
|
|
|
DWORD
|
|
GetTickCountWrap();
|
|
|
|
#ifdef DONT_USE_IERT
|
|
char *
|
|
StrTokEx(
|
|
IN OUT char ** pstring,
|
|
IN const char * control);
|
|
|
|
double
|
|
StrToDbl(
|
|
IN const char *str,
|
|
IN OUT char **strStop);
|
|
#endif //DONT_USE_IERT
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
|
|
DWORD
|
|
WideCharToAscii(PCWSTR pszW, char ** ppszA);
|
|
|
|
DWORD
|
|
AsciiToWideChar_UsingGlobalAlloc(const char * pszA, LPWSTR * ppszW);
|
|
|
|
#endif // defined(__UTIL_H__)
|