windows-nt/Source/XPSP1/NT/public/internal/windows/inc/shimlib.h
2020-09-26 16:20:57 +08:00

322 lines
8 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
ShimLib.h
Abstract:
Routines available in ShimLib.lib
Notes:
None
History:
08/13/2001 robkenny Created.
08/14/2001 robkenny Inserted inside the ShimLib namespace.
08/15/2001 robkenny Merged several include files.
09/11/2001 mnikkel Modified DPFN and LOGN to retain LastError
--*/
#pragma once
#include <Windows.h>
// ***************************************************************************
// ***************************************************************************
namespace ShimLib
{
// Debug levels
typedef enum
{
eDbgLevelBase = 0,
eDbgLevelError,
eDbgLevelWarning,
eDbgLevelInfo,
eDbgLevelSpew = 9,
} DEBUGLEVEL;
extern BOOL g_bFileLogEnabled; // Is the LOG() routine logging to a file.
// Environment variable with the name of the log file
#define szFileLogEnvironmentVariable "SHIM_FILE_LOG"
#define wszFileLogEnvironmentVariable L"SHIM_FILE_LOG"
// Debug environment variable, values = 0 -> 9
#define szDebugEnvironmentVariable "SHIM_DEBUG_LEVEL"
void APPBreakPoint(void);
VOID ShimLogList(LPCSTR szShimName, DEBUGLEVEL dwDbgLevel, LPCSTR pszFmt, va_list arglist);
VOID ShimLog( LPCSTR szShimName, DEBUGLEVEL dwDbgLevel, LPCSTR pszFmt, ...);
BOOL InitFileLogSupport(char* pszShim);
VOID __cdecl FileLog(DWORD dwDetail, LPSTR pszFmt, ...);
#if DBG
VOID DebugPrintfList(LPCSTR szShimName, DEBUGLEVEL dwDetail, LPCSTR szFmt, va_list vaArgList);
VOID DebugPrintf( LPCSTR szShimName, DEBUGLEVEL dwDetail, LPCSTR szFmt, ...);
#endif
// ***************************************************************************
// ***************************************************************************
/*++
Shim debug routines.
--*/
// Our own version of ASSERT
#ifdef ASSERT
#undef ASSERT
#endif
#if DBG
VOID DebugAssert(LPCSTR szFile, DWORD dwLine, BOOL bAssert, LPCSTR szHelpString);
#define ASSERT(a, b) DebugAssert(__FILE__, __LINE__, a, b)
#else
#pragma warning(disable : 4002)
#define ASSERT(a, b)
#pragma warning(default : 4002)
#endif
inline void DPF(LPCSTR szShimName, DEBUGLEVEL dwDetail, LPSTR pszFmt, ...)
{
#if DBG
// This must be the first line of this routine to preserve LastError.
DWORD dwLastError = GetLastError();
va_list vaArgList;
va_start(vaArgList, pszFmt);
DebugPrintfList(szShimName, dwDetail, pszFmt, vaArgList);
va_end(vaArgList);
// This must be the last line of this routine to preserve LastError.
SetLastError(dwLastError);
#else
szShimName;
dwDetail;
pszFmt;
#endif
}
inline void LOG(LPCSTR szShimName, DEBUGLEVEL dwDetail, LPSTR pszFmt, ...)
{
if (g_bFileLogEnabled)
{
// This must be the first line of this routine to preserve LastError.
DWORD dwLastError = GetLastError();
va_list vaArgList;
va_start(vaArgList, pszFmt);
ShimLogList(szShimName, dwDetail, pszFmt, vaArgList);
va_end(vaArgList);
// This must be the last line of this routine to preserve LastError.
SetLastError(dwLastError);
}
}
}; // end of namespace ShimLib
// ***************************************************************************
// ***************************************************************************
/*++
The shim system uses its own heap.
Malloc, free, new and delete are redirected to these routines:
--*/
namespace ShimLib
{
void * __cdecl ShimMalloc(size_t size);
void __cdecl ShimFree(void * memory);
void * __cdecl ShimCalloc(size_t num, size_t size);
void * __cdecl ShimRealloc(void * memory, size_t size);
}; // end of namespace ShimLib
// We override malloc/free with our own versions using a private heap.
#define malloc(size) ShimLib::ShimMalloc(size)
#define free(memory) ShimLib::ShimFree(memory)
#define calloc(num, size) ShimLib::ShimCalloc(num, size)
#define realloc(memory, size) ShimLib::ShimRealloc(memory, size)
inline void * __cdecl operator new(size_t size)
{
return ShimLib::ShimMalloc(size);
}
inline void * operator new[]( size_t size )
{
return ShimLib::ShimMalloc(size);
}
inline void __cdecl operator delete(void * memory)
{
ShimLib::ShimFree(memory);
}
inline void operator delete[]( void * memory )
{
ShimLib::ShimFree(memory);
}
#include "ShimCString.h"
// ***************************************************************************
// ***************************************************************************
/*++
ShimLib routines
--*/
namespace ShimLib
{
/*++
Prototypes for various helper routines.
--*/
PVOID HookCallback( PVOID pfnOld, PVOID pfnNew );
UINT GetDriveTypeFromHandle(HANDLE hFile);
UINT GetDriveTypeFromFileNameA(LPCSTR lpFileName, char *lpDriveLetter = NULL);
UINT GetDriveTypeFromFileNameW(LPCWSTR lpFileName, WCHAR *lpDriveLetter = NULL);
inline BOOL IsOnCDRom(HANDLE hFile) { return GetDriveTypeFromHandle(hFile) == DRIVE_CDROM; }
inline BOOL IsOnCDRomA(LPCSTR lpFileName) { return GetDriveTypeFromFileNameA(lpFileName) == DRIVE_CDROM; }
inline BOOL IsOnCDRomW(LPCWSTR lpFileName) { return GetDriveTypeFromFileNameW(lpFileName) == DRIVE_CDROM; }
BOOL IsImage16BitA(LPCSTR lpFileName);
BOOL IsImage16BitW(LPCWSTR lpFileName);
WCHAR * ToUnicode(const char * lpszAnsi);
char * ToAnsi(const WCHAR * lpszUnicode);
LPWSTR * _CommandLineToArgvW(LPCWSTR lpCmdLine, int * pNumArgs);
LPSTR * _CommandLineToArgvA(LPCSTR lpCmdLine, int * pNumArgs);
char * StringDuplicateA(const char * strToCopy);
WCHAR * StringDuplicateW(const WCHAR * wstrToCopy);
char * StringNDuplicateA(const char * strToCopy, int stringLength);
WCHAR * StringNDuplicateW(const WCHAR * wstrToCopy, int stringLength);
int SafeStringCopyW(WCHAR *lpDest, DWORD nDestChars, const WCHAR *lpSrc, DWORD nSrcChars);
VOID SkipBlanksW(const WCHAR *& str);
BOOL PatternMatchW(LPCWSTR szPattern, LPCWSTR szTestString);
// stristr is *not* DBCS safe
char * __cdecl stristr(const char* string, const char * strCharSet);
WCHAR * __cdecl wcsistr(const WCHAR* string, const WCHAR * strCharSet);
char * __cdecl _strtok(char *strToken, const char *strDelimit);
BOOL bIsSafeDisc1();
BOOL bIsSafeDisc2();
BOOL IsNTVDM(void);
WCHAR * W9xPathMassageW(const WCHAR * uncorrect);
BOOL MakeShimUnloadLast(HMODULE hMod);
DEBUGLEVEL GetDebugLevel(void);
}; // end of namespace ShimLib
// ***************************************************************************
// ***************************************************************************
/*++
AppAndCommandLine is a class used to parse lpApplicationName and lpCommandline
exactly as it would be by CreateProcess().
--*/
namespace ShimLib
{
class AppAndCommandLine
{
protected:
CString csApplicationName;
CString csCommandLine;
CString csCommandLineNoAppName;
CString csShortCommandLine;
BOOL GetAppnameAndCommandline(const WCHAR * lpcApp, const WCHAR * lpcCl);
public:
AppAndCommandLine(const char * lpcApplicationName, const char * lpcCommandLine);
AppAndCommandLine(const WCHAR * lpcApplicationName, const WCHAR * lpcCommandLine);
inline const CString & GetApplicationName() const;
inline const CString & GetCommandline() const;
inline const CString & GetCommandlineNoAppName() const;
const CString & GetShortCommandLine();
};
inline const CString & AppAndCommandLine::GetApplicationName() const
{
return csApplicationName;
}
inline const CString & AppAndCommandLine::GetCommandline() const
{
return csCommandLine;
}
inline const CString & AppAndCommandLine::GetCommandlineNoAppName() const
{
return csCommandLineNoAppName;
}
}; // end of namespace ShimLib
// ***************************************************************************
// ***************************************************************************