658 lines
11 KiB
C
658 lines
11 KiB
C
/*++
|
|
|
|
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
|