/*++ Copyright (c) 1996 Microsoft Corporation Module Name: faxlib.h Abstract: Fax driver library header file Environment: Fax driver, kernel and user mode Revision History: 01/09/96 -davidx- Created it. dd-mm-yy -author- description --*/ #ifndef _FAXLIB_H_ #define _FAXLIB_H_ #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #endif #include #include #include #include #include #include #include #include #include #ifndef KERNEL_MODE #include #include #include #include #define FAXUTIL_ADAPTIVE #define FAXUTIL_DEBUG #include #else // !KERNEL_MODE #include #ifdef USERMODE_DRIVER #include #include #endif #endif #ifndef _FAXAPI_ typedef struct _FAX_TIME { WORD Hour; WORD Minute; } FAX_TIME, *PFAX_TIME; #endif #include "devmode.h" #include "prndata.h" #include "registry.h" // // Nul terminator for a character string // #define NUL 0 #define IsEmptyString(p) ((p)[0] == NUL) #define SizeOfString(p) ((_tcslen(p) + 1) * sizeof(TCHAR)) #define IsNulChar(c) ((c) == NUL) #define AllocString(cch) MemAlloc(sizeof(TCHAR) * (cch)) #define AllocStringZ(cch) MemAllocZ(sizeof(TCHAR) * (cch)) // // Result of string comparison // #define EQUAL_STRING 0 // // Maximum value for signed and unsigned integers // #ifndef MAX_LONG #define MAX_LONG 0x7fffffff #endif #ifndef MAX_DWORD #define MAX_DWORD 0xffffffff #endif #ifndef MAX_SHORT #define MAX_SHORT 0x7fff #endif #ifndef MAX_WORD #define MAX_WORD 0xffff #endif // // Path separator character // #define PATH_SEPARATOR '\\' // // Filename extension character // #define FILENAME_EXT '.' // // Deal with the difference between user and kernel mode functions // #if defined(KERNEL_MODE) && !defined(USERMODE_DRIVER) #define WritePrinter EngWritePrinter #define GetPrinterData EngGetPrinterData #define EnumForms EngEnumForms #define GetPrinter EngGetPrinter #define GetForm EngGetForm #define SetLastError EngSetLastError #define GetLastError EngGetLastError #define MulDiv EngMulDiv #define MemAlloc(size) EngAllocMem(0, size, DRIVER_SIGNATURE) #define MemAllocZ(size) EngAllocMem(FL_ZERO_MEMORY, size, DRIVER_SIGNATURE) #define MemFree(ptr) { if (ptr) EngFreeMem(ptr); } #else // !KERNEL_MODE #ifndef MemAlloc #define MemAlloc(size) ((PVOID) LocalAlloc(LPTR, (size))) #endif #ifndef MemAllocZ #define MemAllocZ(size) ((PVOID) MemAlloc((size))) #endif #ifndef MemFree #define MemFree(ptr) { if (ptr) LocalFree((HLOCAL) (ptr)); } #endif #endif // // Copy Unicode or ANSI string from source to destination // VOID CopyStringW( PWSTR pDest, PWSTR pSrc, INT destSize ); VOID CopyStringA( PSTR pDest, PSTR pSrc, INT destSize ); #ifdef UNICODE #define CopyString CopyStringW #else // !UNICODE #define CopyString CopyStringA #endif // // Make a duplicate of the given character string // LPTSTR DuplicateString( LPCTSTR pSrcStr ); // // Strip the directory prefix from a filename (ANSI version) // PCSTR StripDirPrefixA( PCSTR pFilename ); // // Wrapper function for GetPrinter spooler API // PVOID MyGetPrinter( HANDLE hPrinter, DWORD level ); // // Wrapper function for GetPrinterDriver spooler API // PVOID MyGetPrinterDriver( HANDLE hPrinter, DWORD level ); // // Wrapper function for GetPrinterDriverDirectory spooler API // LPTSTR MyGetPrinterDriverDirectory( LPTSTR pServerName, LPTSTR pEnvironment ); // // These macros are used for debugging purposes. They expand // to white spaces on a free build. Here is a brief description // of what they do and how they are used: // // _debugLevel // A variable which controls the amount of debug messages. To generate // lots of debug messages, enter the following line in the debugger: // // ed _debugLevel 1 // // Verbose // Display a debug message if VERBOSE is set to non-zero. // // Verbose(("Entering XYZ: param = %d\n", param)); // // Error // Display an error message along with the filename and the line number // to indicate where the error occurred. // // Error(("XYZ failed")); // // ErrorIf // Display an error message if the specified condition is true. // // ErrorIf(error != 0, ("XYZ failed: error = %d\n", error)); // // Assert // Verify a condition is true. If not, force a breakpoint. // // Assert(p != NULL && (p->flags & VALID)); #if DBG extern ULONG __cdecl DbgPrint(CHAR *, ...); extern INT _debugLevel; #if defined(KERNEL_MODE) && !defined(USERMODE_DRIVER) #define DbgBreakPoint EngDebugBreak #else extern VOID DbgBreakPoint(VOID); #endif #define Warning(arg) {\ DbgPrint("WRN %s (%d): ", StripDirPrefixA(__FILE__), __LINE__);\ DbgPrint arg;\ } #define Error(arg) {\ DbgPrint("ERR %s (%d): ", StripDirPrefixA(__FILE__), __LINE__);\ DbgPrint arg;\ } #define Verbose(arg) { if (_debugLevel > 0) DbgPrint arg; } #define ErrorIf(cond, arg) { if (cond) Error(arg); } #define Assert(cond) {\ if (! (cond)) {\ DbgPrint("ASSERT: file %s, line %d\n", StripDirPrefixA(__FILE__), __LINE__);\ DbgBreakPoint();\ }\ } #else // !DBG #define Verbose(arg) #define ErrorIf(cond, arg) #define Assert(cond) #define Warning(arg) #define Error(arg) #endif #endif //!_FAXLIB_H_