|
|
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
debug.h
Abstract:
This file defines the debugging interfaces available to the FAX compoments.
Author:
Wesley Witt (wesw) 22-Dec-1995
Environment:
User Mode
--*/
#ifndef _FAXUTIL_
#define _FAXUTIL_
#ifdef __cplusplus
extern "C" { #endif
#define OffsetToString( Offset, Buffer ) ((Offset) ? (LPTSTR) ((Buffer) + ((ULONG_PTR) Offset)) : NULL)
#define StringSize(_s) (( _s ) ? (_tcslen( _s ) + 1) * sizeof(TCHAR) : 0)
#define MAX_GUID_STRING_LEN 39 // 38 chars + terminator null
#define FAXBITS 1728
#define FAXBYTES (FAXBITS/BYTEBITS)
#define MAXHORZBITS FAXBITS
#define MAXVERTBITS 3000 // 14inches plus
#define MINUTES_PER_HOUR 60
#define MINUTES_PER_DAY (24 * 60)
#define SECONDS_PER_MINUTE 60
#define SECONDS_PER_HOUR (SECONDS_PER_MINUTE * MINUTES_PER_HOUR)
#define SECONDS_PER_DAY (MINUTES_PER_DAY * SECONDS_PER_MINUTE)
#define FILETIMETICKS_PER_SECOND 10000000 // 100 nanoseconds / second
#define FILETIMETICKS_PER_DAY ((LONGLONG) FILETIMETICKS_PER_SECOND * (LONGLONG) SECONDS_PER_DAY)
#define MILLISECONDS_PER_SECOND 1000
#ifndef MAKELONGLONG
#define MAKELONGLONG(low,high) ((LONGLONG)(((DWORD)(low)) | ((LONGLONG)((DWORD)(high))) << 32))
#endif
#define HideWindow(_hwnd) SetWindowLong((_hwnd),GWL_STYLE,GetWindowLong((_hwnd),GWL_STYLE)&~WS_VISIBLE)
#define UnHideWindow(_hwnd) SetWindowLong((_hwnd),GWL_STYLE,GetWindowLong((_hwnd),GWL_STYLE)|WS_VISIBLE)
#define DWord2FaxTime(pFaxTime, dwValue) (pFaxTime)->hour = LOWORD(dwValue), (pFaxTime)->minute = HIWORD(dwValue)
#define FaxTime2DWord(pFaxTime) MAKELONG((pFaxTime)->hour, (pFaxTime)->minute)
#define EMPTY_STRING L""
#define IsSmallBiz() (ValidateProductSuite( VER_SUITE_SMALLBUSINESS | VER_SUITE_SMALLBUSINESS_RESTRICTED))
#define IsCommServer() (ValidateProductSuite( VER_SUITE_COMMUNICATIONS ))
#define IsProductSuite() (ValidateProductSuite( VER_SUITE_SMALLBUSINESS | VER_SUITE_SMALLBUSINESS_RESTRICTED | VER_SUITE_COMMUNICATIONS ))
typedef GUID *PGUID;
//
// debugging information
//
#ifndef FAXUTIL_DEBUG
#if DBG
#define Assert(exp) if(!(exp)) {AssertError(TEXT(#exp),TEXT(__FILE__),__LINE__);}
#define DebugPrint(_x_) dprintf _x_
#define DebugStop(_x_) {\
dprintf _x_;\ dprintf(TEXT("Stopping at %s @ %d"),TEXT(__FILE__),__LINE__);\ __try {\ DebugBreak();\ } __except (UnhandledExceptionFilter(GetExceptionInformation())) {\ }\ }
#else
#define Assert(exp)
#define DebugPrint(_x_)
#define DebugStop(_x_)
#endif
extern BOOL ConsoleDebugOutput;
void dprintf( LPCTSTR Format, ... );
VOID AssertError( LPCTSTR Expression, LPCTSTR File, ULONG LineNumber );
#endif
//
// list management
//
#ifndef NO_FAX_LIST
#define InitializeListHead(ListHead) {\
(ListHead)->Flink = (ListHead)->Blink = (ListHead);\ Assert((ListHead)->Flink && (ListHead)->Blink);\ }
#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))
#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\ PLIST_ENTRY _EX_ListHead;\ _EX_ListHead = (ListHead);\ _EX_Flink = _EX_ListHead->Flink;\ (Entry)->Flink = _EX_Flink;\ (Entry)->Blink = _EX_ListHead;\ _EX_Flink->Blink = (Entry);\ _EX_ListHead->Flink = (Entry);\ Assert((ListHead)->Flink && (ListHead)->Blink && (Entry)->Blink && (Entry)->Flink);\ }
#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\ PLIST_ENTRY _EX_ListHead;\ _EX_ListHead = (ListHead);\ _EX_Blink = _EX_ListHead->Blink;\ (Entry)->Flink = _EX_ListHead;\ (Entry)->Blink = _EX_Blink;\ _EX_Blink->Flink = (Entry);\ _EX_ListHead->Blink = (Entry);\ Assert((ListHead)->Flink && (ListHead)->Blink && (Entry)->Blink && (Entry)->Flink);\ }
#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\ PLIST_ENTRY _EX_Flink;\ Assert((Entry)->Blink && (Entry)->Flink);\ _EX_Flink = (Entry)->Flink;\ _EX_Blink = (Entry)->Blink;\ _EX_Blink->Flink = _EX_Flink;\ _EX_Flink->Blink = _EX_Blink;\ }
#define RemoveHeadList(ListHead) \
Assert((ListHead)->Flink);\ (ListHead)->Flink;\ {RemoveEntryList((ListHead)->Flink)}
#endif
//
// memory allocation
//
#ifndef FAXUTIL_MEM
#define HEAP_SIZE (1024*1024)
#ifdef FAX_HEAP_DEBUG
#define HEAP_SIG 0x69696969
typedef struct _HEAP_BLOCK { LIST_ENTRY ListEntry; ULONG Signature; ULONG Size; ULONG Line; #ifdef UNICODE
WCHAR File[22]; #else
CHAR File[20]; #endif
} HEAP_BLOCK, *PHEAP_BLOCK;
#define MemAlloc(s) pMemAlloc(s,__LINE__,__FILE__)
#define MemReAlloc(d,s) pMemReAlloc(d,s,__LINE__,__FILE__)
#define MemFree(p) pMemFree(p,__LINE__,__FILE__)
#define MemFreeForHeap(h,p) pMemFreeForHeap(h,p,__LINE__,__FILE__)
#define CheckHeap(p) pCheckHeap(p,__LINE__,__FILE__)
#else
#define MemAlloc(s) pMemAlloc(s)
#define MemReAlloc(d,s) pMemReAlloc(d,s)
#define MemFree(p) pMemFree(p)
#define MemFreeForHeap(h,p) pMemFreeForHeap(h,p)
#define CheckHeap(p)
#endif
typedef LPVOID (WINAPI *PMEMALLOC) (DWORD); typedef LPVOID (WINAPI *PMEMREALLOC) (LPVOID,DWORD); typedef VOID (WINAPI *PMEMFREE) (LPVOID);
#define HEAPINIT_NO_VALIDATION 0x00000001
#define HEAPINIT_NO_STRINGS 0x00000002
HANDLE HeapInitialize( HANDLE hHeap, PMEMALLOC pMemAlloc, PMEMFREE pMemFree, DWORD Flags );
BOOL HeapExistingInitialize( HANDLE hExistHeap );
BOOL HeapCleanup( VOID );
#ifdef FAX_HEAP_DEBUG
VOID pCheckHeap( PVOID MemPtr, ULONG Line, LPSTR File );
VOID PrintAllocations( VOID );
#else
#define PrintAllocations()
#endif
PVOID pMemAlloc( ULONG AllocSize #ifdef FAX_HEAP_DEBUG
,ULONG Line ,LPSTR File #endif
);
PVOID pMemReAlloc( PVOID dest, ULONG AllocSize #ifdef FAX_HEAP_DEBUG
,ULONG Line ,LPSTR File #endif
);
VOID pMemFree( PVOID MemPtr #ifdef FAX_HEAP_DEBUG
,ULONG Line ,LPSTR File #endif
);
VOID pMemFreeForHeap( HANDLE hHeap, PVOID MemPtr #ifdef FAX_HEAP_DEBUG
,ULONG Line ,LPSTR File #endif
);
#endif
//
// file functions
//
#ifndef FAXUTIL_FILE
typedef struct _FILE_MAPPING { HANDLE hFile; HANDLE hMap; LPBYTE fPtr; DWORD fSize; } FILE_MAPPING, *PFILE_MAPPING;
BOOL MapFileOpen( LPTSTR FileName, BOOL ReadOnly, DWORD ExtendBytes, PFILE_MAPPING FileMapping );
VOID MapFileClose( PFILE_MAPPING FileMapping, DWORD TrimOffset );
#endif
//
// printer functions
//
PVOID MyEnumPrinters( LPTSTR pServerName, DWORD level, PDWORD pcPrinters, DWORD dwFlags );
//
// string functions
//
#ifndef FAXUTIL_STRING
LPTSTR StringDup( LPCTSTR String );
LPWSTR AnsiStringToUnicodeString( LPCSTR AnsiString );
LPSTR UnicodeStringToAnsiString( LPCWSTR UnicodeString );
VOID FreeString( LPVOID String );
VOID MakeDirectory( LPCTSTR Dir );
VOID DeleteDirectory( LPTSTR Dir );
VOID HideDirectory( LPTSTR Dir );
LPTSTR ConcatenatePaths( LPTSTR Path, LPCTSTR Append );
int MyLoadString( HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax, LANGID LangID );
VOID ConsoleDebugPrint( LPCTSTR buf );
int FormatElapsedTimeStr( FILETIME *ElapsedTime, LPTSTR TimeStr, DWORD StringSize );
LPTSTR ExpandEnvironmentString( LPCTSTR EnvString );
LPTSTR GetEnvVariable( LPCTSTR EnvString );
#endif
//
// product suite functions
//
#ifndef FAXUTIL_SUITE
BOOL ValidateProductSuite( WORD Mask );
DWORD GetProductType( VOID );
#endif
//
// registry functions
//
#ifndef FAXUTIL_REG
typedef BOOL (WINAPI *PREGENUMCALLBACK) (HKEY,LPTSTR,DWORD,LPVOID);
HKEY OpenRegistryKey( HKEY hKey, LPCTSTR KeyName, BOOL CreateNewKey, REGSAM SamDesired );
//
// caution!!! this is a recursive delete function !!!
//
BOOL DeleteRegistryKey( HKEY hKey, LPCTSTR SubKey );
DWORD EnumerateRegistryKeys( HKEY hKey, LPCTSTR KeyName, BOOL ChangeValues, PREGENUMCALLBACK EnumCallback, LPVOID ContextData );
LPTSTR GetRegistryString( HKEY hKey, LPCTSTR ValueName, LPCTSTR DefaultValue );
LPTSTR GetRegistryStringExpand( HKEY hKey, LPCTSTR ValueName, LPCTSTR DefaultValue );
LPTSTR GetRegistryStringMultiSz( HKEY hKey, LPCTSTR ValueName, LPCTSTR DefaultValue, LPDWORD StringSize );
DWORD GetRegistryDword( HKEY hKey, LPCTSTR ValueName );
LPBYTE GetRegistryBinary( HKEY hKey, LPCTSTR ValueName, LPDWORD DataSize );
DWORD GetSubKeyCount( HKEY hKey );
DWORD GetMaxSubKeyLen( HKEY hKey );
BOOL SetRegistryStringExpand( HKEY hKey, LPCTSTR ValueName, LPCTSTR Value );
BOOL SetRegistryString( HKEY hKey, LPCTSTR ValueName, LPCTSTR Value );
BOOL SetRegistryDword( HKEY hKey, LPCTSTR ValueName, DWORD Value );
BOOL SetRegistryBinary( HKEY hKey, LPCTSTR ValueName, const LPBYTE Value, LONG Length );
BOOL SetRegistryStringMultiSz( HKEY hKey, LPCTSTR ValueName, LPCTSTR Value, DWORD Length );
#endif
//
// shortcut routines
//
#ifndef FAXUTIL_SHORTCUT
BOOL ResolveShortcut( LPTSTR pLinkName, LPTSTR pFileName );
BOOL CreateShortcut( LPTSTR pLinkName, LPTSTR pFileName );
BOOL IsCoverPageShortcut( LPCTSTR pLinkName );
BOOL GetServerCpDir( LPCTSTR ServerName OPTIONAL, LPTSTR CpDir, DWORD CpDirSize );
BOOL GetClientCpDir( LPTSTR CpDir, DWORD CpDirSize );
BOOL GetSpecialPath( int Id, LPTSTR DirBuffer );
#endif
//
// fax adaptive answer modem routines
//
#ifndef FAXUTIL_ADAPTIVE
#include <setupapi.h>
LPVOID InitializeAdaptiveAnswerList( HINF hInf );
BOOL IsModemAdaptiveAnswer( LPVOID ModemList, LPCTSTR ModemId );
#endif
//
// The following macros are used to establish the semantics needed
// to do a return from within a try-finally clause. As a rule every
// try clause must end with a label call try_exit. For example,
//
// try {
// :
// :
//
// try_exit: NOTHING;
// } finally {
//
// :
// :
// }
//
// Every return statement executed inside of a try clause should use the
// try_return macro. If the compiler fully supports the try-finally construct
// then the macro should be
//
// #define try_return(S) { return(S); }
//
// If the compiler does not support the try-finally construct then the macro
// should be
//
// #define try_return(S) { S; goto try_exit; }
//
// This was borrowed from fatprocs.h
#ifdef DBG
#define try_fail(S) { DebugPrint(( TEXT("Failure in FILE %s LINE %d"), TEXT(__FILE__), __LINE__ )); S; goto try_exit; }
#else
#define try_fail(S) { S; goto try_exit; }
#endif
#define try_return(S) { S; goto try_exit; }
#define NOTHING
#ifdef __cplusplus
} #endif
#endif
|