/****************************************************************************/ /* util.h */ /* */ /* Utility API header */ /* */ /* Copyright(C) Microsoft Corporation 1997-1999 */ /****************************************************************************/ #ifndef _H_UT #define _H_UT #define _H_AUTDATA #define _H_AUTAPI extern "C" { #include #include #include } #ifndef OS_WINCE #include "shlobj.h" #endif /****************************************************************************/ /* */ /* CONSTANTS */ /* */ /****************************************************************************/ #define UT_MAX_DOMAIN_LENGTH 52 #define UT_MAX_USERNAME_LENGTH 512 #define UT_MAX_PASSWORD_LENGTH 32 #define UT_FILENAME_MAX_LENGTH 15 #define UT_MAX_WORKINGDIR_LENGTH 512 #define UT_MAX_ALTERNATESHELL_LENGTH 512 #define UT_MAX_ADDRESS_LENGTH 256 #define UT_REGSESSION_MAX_LENGTH 32 #define UT_MAX_SUBKEY 265 #define UT_SALT_LENGTH 20 #define UT_COMPUTERNAME_SECTION "Network" #define UT_COMPUTERNAME_KEY "ComputerName" #define UT_COMPUTERNAME_FILE "SYSTEM.INI" #ifdef DC_DEBUG /****************************************************************************/ /* Random Failure iemIDs */ /****************************************************************************/ #define UT_FAILURE_BASE 0x3256 #define UT_FAILURE_ITEM(n) ((DCUINT) UT_FAILURE_BASE + (n) ) #define UT_FAILURE_MALLOC UT_FAILURE_ITEM(0) #define UT_FAILURE_MALLOC_HUGE UT_FAILURE_ITEM(1) #define UT_FAILURE_MAX_INDEX 1 #endif /* DC_DEBUG */ /****************************************************************************/ /* */ /* TYPEDEFS */ /* */ /****************************************************************************/ /****************************************************************************/ /* Structure passed into thread entry functions created by */ /* UT_StartThread(). */ /****************************************************************************/ typedef DCVOID (DCAPI * UTTHREAD_PROC)(PDCVOID); /****************************************************************************/ /* Structure: UT_THREAD_DATA */ /* */ /* Description: */ /****************************************************************************/ typedef struct tagUT_THREAD_DATA { DWORD threadID; ULONG_PTR threadHnd; } UT_THREAD_DATA, DCPTR PUT_THREAD_DATA; // forward declaration class CUT; /****************************************************************************/ /* Structure: UT_THREAD_INFO */ /* */ /* Description: Passes params to UTThreadEntry */ /****************************************************************************/ typedef struct tagUT_THREAD_INFO { UTTHREAD_PROC pFunc; ULONG_PTR sync; PDCVOID threadParam; } UT_THREAD_INFO, DCPTR PUT_THREAD_INFO; /****************************************************************************/ /* */ /* INLINE FUNCTIONS */ /* */ /****************************************************************************/ /****************************************************************************/ /* */ /* FUNCTION MACRO WRAPPERS */ /* */ /****************************************************************************/ #ifdef DC_DEBUG /****************************************************************************/ /* Use the comma operator because UT_... return values and so the entire */ /* macro must also return a value. */ /* Use different macros for non-DEBUG because TRC_NRM macros to nothing and */ /* the comma operator cannot take 'nothing' as its first parameter. */ /****************************************************************************/ #define UT_Malloc(utinst, X) (utinst)->UT_MallocDbg(X, trc_fn) #define UT_MallocHuge(utinst, X) \ (TRC_NRM((TB, _T("%s calling UT_MallocHuge for %#x bytes"), trc_fn, X)), \ (utinst)->UT_MallocHugeReal(X)) #define UT_Free(utinst, X) (TRC_NRM((TB, _T("%s freeing %p"), trc_fn, X)), \ (utinst)->UT_FreeReal(X)) #else #define UT_Malloc(utinst,X) LocalAlloc(LPTR, X) #define UT_MallocHuge(utinst, X) LocalAlloc(LPTR, X) #define UT_Free(utinst, X) LocalFree(X) #endif /****************************************************************************/ /* */ /* SIMPLE MACROS FOR BUFFER CHECKS */ /* */ /****************************************************************************/ // Check for lenInner= (LPBYTE)(pOuter)) && \ ((lenInner) <= (lenOuter)) && \ (((LPBYTE)(pInner)) + (lenInner) >= ((LPBYTE)(pOuter))) && \ (((LPBYTE)(pInner)) + (lenInner) <= ((LPBYTE)(pOuter)) + (lenOuter))) #define IsContainedPointer(pOuter,lenOuter,pInner) \ (((LPBYTE)(pInner) >= (LPBYTE)(pOuter)) && \ ((LPBYTE)(pInner) < ((LPBYTE)(pOuter)) + (lenOuter))) /****************************************************************************/ /* Automatic Session Info */ /****************************************************************************/ #define MAX_SESSIONINFO_NAME 32 #define MAX_SESSIONINFO_SECTIONNAME MAX_SESSIONINFO_NAME + sizeof(UTREG_SESSIONINFO_ROOT) #define MAKE_SESSIONINFO_SECTION(BUFF, SESSIONNAME) \ DC_TSTRCPY(BUFF, UTREG_SESSIONINFO_ROOT); \ DC_TSTRCAT(BUFF, SESSIONNAME) // // From autdata.h // /****************************************************************************/ /* */ /* External DLL */ /* * /****************************************************************************/ typedef union _FUNCTIONPORT { #ifndef OS_WINCE LPCSTR pszFunctionName; #else LPCTSTR pszFunctionName; #endif FARPROC lpfnFunction; } FUNCTIONPORT, *PFUNCTIONPORT; #if defined(OS_WIN32) /****************************************************************************/ /* IMM32 DLL */ /****************************************************************************/ typedef union _IMM32_FUNCTION { #ifndef OS_WINCE FUNCTIONPORT rgFunctionPort[3]; #else FUNCTIONPORT rgFunctionPort[2]; #endif struct { HIMC (CALLBACK* _ImmAssociateContext)( IN HWND hWnd, IN HIMC hImc ); BOOL (CALLBACK* _ImmGetIMEFileNameW)( IN HKL hkl, OUT LPWSTR lpwszFileName, OUT UINT uBufferLength ); #ifndef OS_WINCE BOOL (CALLBACK* _ImmGetIMEFileNameA)( IN HKL hkl, OUT LPSTR lpszFileName, OUT UINT uBufferLength ); #endif }; } IMM32_FUNCTION, *PIMM32_FUNCTION; typedef struct _IMM32DLL { HINSTANCE hInst; IMM32_FUNCTION func; } IMM32DLL, *PIMM32DLL; #define lpfnImmAssociateContext _UT.Imm32Dll.func._ImmAssociateContext #endif // OS_WIN32 #if !defined(OS_WINCE) /****************************************************************************/ /* WINNLS DLL */ /****************************************************************************/ #if !defined(OS_WINCE) #include #endif typedef union _WINNLS_FUNCTION { FUNCTIONPORT rgFunctionPort[3]; struct { BOOL (CALLBACK* _WINNLSEnableIME)( IN HANDLE hWnd, IN BOOL fEnable ); BOOL (CALLBACK* _IMPGetIMEW)( IN HWND hWnd, OUT LPIMEPROW lpImePro ); BOOL (CALLBACK* _IMPGetIMEA)( IN HWND hWnd, OUT LPIMEPROA lpImePro ); }; } WINNLS_FUNCTION, *PWINNLS_FUNCTION; typedef struct _WINNLSDLL { HINSTANCE hInst; WINNLS_FUNCTION func; } WINNLSDLL, *PWINNLSDLL; #define lpfnWINNLSEnableIME _UT.WinnlsDll.func._WINNLSEnableIME #endif // !defined(OS_WINCE) #if defined(OS_WINNT) /****************************************************************************/ /* F3AHVOAS DLL */ /****************************************************************************/ typedef union _F3AHVOASYS_FUNCTION { FUNCTIONPORT rgFunctionPort[1]; struct { VOID (CALLBACK* _FujitsuOyayubiControl)( IN DWORD dwImeOpen, IN DWORD dwImeConversionMode ); }; } F3AHVOASYS_FUNCTION, *PF3AHVOASYS_FUNCTION; typedef struct _F3AHVOASYSDLL { HINSTANCE hInst; F3AHVOASYS_FUNCTION func; } F3AHVOASYSDLL, *PF3AHVOASYSDLL; #define lpfnFujitsuOyayubiControl _UT.F3AHVOasysDll.func._FujitsuOyayubiControl #endif // OS_WINNT /****************************************************************************/ /* Prototypes */ /****************************************************************************/ /****************************************************************************/ /* Structure: UT_DATA */ /* */ /* Description: */ /****************************************************************************/ typedef struct tagUT_DATA { HKEY enumHKey; DCTCHAR sessionName[UT_REGSESSION_MAX_LENGTH]; #if defined(OS_WIN32) IMM32DLL Imm32Dll; #endif // OS_WIN32 #if !defined(OS_WINCE) WINNLSDLL WinnlsDll; #endif // !defined(OS_WINCE) #if defined(OS_WINNT) F3AHVOASYSDLL F3AHVOasysDll; #endif // OS_WINNT #ifdef DC_DEBUG DCINT failPercent[UT_FAILURE_MAX_INDEX + 1]; #endif /* DC_DEBUG */ DCINT osMinorType; HINSTANCE hInstance; #ifdef DC_DEBUG DWORD dwDebugThreadWaitTimeout; #endif } UT_DATA, DCPTR PUT_DATA; /****************************************************************************/ /* */ /* HOTKEY structure */ /* * /* */ /****************************************************************************/ typedef struct tagDCHOTKEY { DCUINT fullScreen; DCUINT ctrlEsc; DCUINT altEsc; DCUINT altTab; DCUINT altShifttab; DCUINT altSpace; DCUINT ctlrAltdel; } DCHOTKEY; typedef DCHOTKEY DCPTR PDCHOTKEY; /*Hotkey structure*/ VOID DisableIME(HWND hwnd); VOID UIGetIMEFileName(PDCTCHAR imeFileName, DCUINT Size); VOID UIGetIMEFileName16(PDCTCHAR imeFileName, DCUINT Size); class CUT { public: CUT(); ~CUT(); /****************************************************************************/ /* */ /* API FUNCTION PROTOTYPES */ /* */ /****************************************************************************/ DCVOID DCAPI UT_Init(DCVOID); DCVOID DCAPI UT_Term(DCVOID); DCBOOL DCAPI UT_StartThread(UTTHREAD_PROC entryFunction, PUT_THREAD_DATA pThreadData, PDCVOID pThreadParam); DCBOOL DCAPI UT_DestroyThread(UT_THREAD_DATA threadData, BOOL fPumpMessages = FALSE); static DWORD UT_WaitWithMessageLoop(HANDLE hEvent, ULONG Timeout); DCUINT DCINTERNAL UT_GetANSICodePage(DCVOID); PDCVOID DCAPI UT_MallocReal(DCUINT length); DCVOID DCAPI UT_FreeReal(PDCVOID pMemory); HPDCVOID DCAPI UT_MallocHugeReal(DCUINT32 length); DCVOID DCAPI UT_ReadRegistryString( PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pDefaultValue, PDCTCHAR pBuffer, DCINT bufferSize ); DCBOOL DCAPI UT_ReadRegistryExpandSZ(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR* ppBuffer, PDCINT pBufferSize ); DCINT DCAPI UT_ReadRegistryInt( PDCTCHAR pSection, PDCTCHAR pEntry, DCINT defaultValue ); DCVOID DCAPI UT_ReadRegistryBinary(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pBuffer, DCINT bufferSize); DCBOOL DCAPI UT_EnumRegistry( PDCTCHAR pSection, DCUINT32 index, PDCTCHAR pBuffer, PDCINT pBufferSize ); DCUINT DCAPI UT_WriteRegistryString( PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pDefaultValue, PDCTCHAR pBuffer ); DCUINT DCAPI UT_WriteRegistryInt( PDCTCHAR pSection, PDCTCHAR pEntry, DCINT defaultValue, DCINT value ); PRNS_UD_HEADER DCAPI UT_ParseUserData(PRNS_UD_HEADER pUserData, DCUINT userDataLen, DCUINT16 typeRequested); DCBOOL DCAPI UT_WriteRegistryBinary(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pBuffer, DCINT bufferSize); PDCVOID DCINTERNAL UT_GetCapsSet(DCUINT capsLength, PTS_COMBINED_CAPABILITIES pCaps, DCUINT capsSet); DCUINT DCAPI UT_SetScrollInfo(HWND hwnd, DCINT scrollBarFlag, LPSCROLLINFO pScrollInfo, DCBOOL redraw); DCBOOL DCINTERNAL UT_IsNEC98platform(DCVOID); DCBOOL DCINTERNAL UT_IsNX98Key(DCVOID); DCBOOL DCINTERNAL UT_IsNew106Layout(DCVOID); DCBOOL DCINTERNAL UT_IsFujitsuLayout(DCVOID); DCBOOL DCINTERNAL UT_IsKorean101LayoutForWin9x(DCVOID); DCBOOL DCINTERNAL UT_IsKorean101LayoutForNT351(DCVOID); DCBOOL DCAPI UT_GetComputerName(PDCTCHAR szBuff, DCUINT32 len); BOOL DCAPI UT_GetComputerAddressW(PDCUINT8 szBuff); BOOL DCAPI UT_GetComputerAddressA(PDCUINT8 szBuff); BOOL DCAPI UT_GetClientDirW(PDCUINT8 szBuff); DCBOOL DCINTERNAL UT_GetRealDriverNameNT( PDCTCHAR lpszRealDriverName, UINT cchDriverName); #ifdef OS_WINNT BOOL DCAPI UT_ValidateProductSuite(LPSTR SuiteName); BOOL DCAPI UT_IsTerminalServicesEnabled(VOID); #endif #if !defined(OS_WINCE) DCUINT DCINTERNAL UT_GetFullPathName(PDCTCHAR lpFileName, DCUINT nBufferLength, PDCTCHAR lpBuffer, PDCTCHAR *lpFilePart); #endif // !defined(OS_WINCE) #ifdef DC_DEBUG DCVOID DCAPI UT_SetRandomFailureItem(DCUINT itemID, DCINT percent); DCINT DCAPI UT_GetRandomFailureItem(DCUINT itemID); DCBOOL DCAPI UT_TestRandomFailure(DCUINT itemID); #endif /* DC_DEBUG */ // // Time functions // HANDLE UTCreateTimer( HWND hWnd, // handle of window for timer messages DCUINT nIDEvent, // timer identifier DCUINT uElapse ); // time-out value DCBOOL UTStartTimer( HANDLE hTimer ); DCBOOL UTStopTimer( HANDLE hTimer ); DCBOOL UTDeleteTimer( HANDLE hTimer ); HINSTANCE LoadExternalDll( LPCTSTR pszLibraryName, PFUNCTIONPORT rgFunction, DWORD dwItem ); VOID InitExternalDll( VOID ); public: // // Data members // UT_DATA _UT; public: #ifdef DC_DEBUG PDCVOID DCAPI UT_MallocDbg(DCUINT length, PDCTCHAR pCaller) { PDCVOID ptr; UNREFERENCED_PARAMETER( pCaller); DC_BEGIN_FN("UT_MallocDbg"); ptr = UT_MallocReal(length); TRC_NRM((TB, _T("%s allocated %d bytes at %p"), pCaller, length, ptr)); DC_END_FN(); return(ptr); } #endif /* DC_DEBUG */ /****************************************************************************/ /* Name: UT_GetCurrentTimeMS */ /* */ /* Purpose: Returns the current system timer value in milliseconds. */ /* */ /* Returns: Millisecond timestamp. */ /****************************************************************************/ DCUINT32 DCAPI UT_GetCurrentTimeMS(DCVOID) { DCUINT32 rc; DC_BEGIN_FN("UT_GetCurrentTimeMS"); rc = GetTickCount(); DC_END_FN(); return(rc); } /****************************************************************************/ /* Name: UT_InterlockedExchange */ /* */ /* Purpose: Exchanges a given data value with the value in a given */ /* location. */ /* */ /* Returns: Original data value from given location. */ /* */ /* Params: pData - pointer to data location */ /* val - new data value */ /****************************************************************************/ DCUINT32 DCAPI UT_InterlockedExchange(PDCUINT32 pData, DCUINT32 val) { DCUINT32 rc; #ifdef OS_WIN32 rc = (DCUINT32)InterlockedExchange((LPLONG)pData, (LONG)val); #else rc = *pData; *pData = val; #endif return(rc); } /****************************************************************************/ /* Name: UT_InterlockedIncrement */ /* */ /* Purpose: Increments a 32-bit variable in a thread-safe manner. */ /* */ /* Params: Pointer to the DCINT32 to increment. */ /****************************************************************************/ DCVOID UT_InterlockedIncrement(PDCINT32 pData) { #ifdef OS_WIN32 InterlockedIncrement((LPLONG)pData); #else *pData++; #endif } /* UT_InterlockedIncrement */ /****************************************************************************/ /* Name: UT_InterlockedDecrement */ /* */ /* Purpose: Decrements a 32-bit variable in a thread-safe manner. */ /* */ /* Params: Pointer to the DCINT32 to decrement. */ /****************************************************************************/ DCVOID UT_InterlockedDecrement(PDCINT32 pData) { #ifdef OS_WIN32 InterlockedDecrement((LPLONG)pData); #else *pData--; #endif } /* UT_InterlockedDecrement */ /****************************************************************************/ /* Name: UT_GetSessionName */ /* */ /* Purpose: Return name of registry section for this session */ /* */ /* Params: pName (returned) - name of Session */ /****************************************************************************/ DCVOID UT_GetSessionName(LPTSTR szName, UINT cchName) { HRESULT hr; DC_BEGIN_FN("UT_GetSessionName"); TRC_NRM((TB, _T("Name found >%s<"), _UT.sessionName)); hr = StringCchCopy(szName, cchName, _UT.sessionName); if (FAILED(hr)) { TRC_ERR((TB,_T("StringCchCopy failed: 0x%x"),hr)); } DC_END_FN(); } /* UT_GetSessionName */ /****************************************************************************/ /* Name: UT_GetOsMinorType */ /* */ /* Purpose: Get the OS type */ /* */ /* Returns: OS type (one of the TS_OSMINORTYPE constants) */ /****************************************************************************/ DCUINT DCAPI UT_GetOsMinorType(DCVOID) { DCUINT rc; DC_BEGIN_FN("UI_GetOsMinorType"); rc = _UT.osMinorType; DC_END_FN(); return(rc); } /* UI_GetOsMinorType */ /****************************************************************************/ /* Name: UT_GetInstanceHandle */ /* */ /* Purpose: Return application hInstance */ /* */ /* Returns: hInstance */ /****************************************************************************/ HINSTANCE DCAPI UT_GetInstanceHandle(DCVOID) { HINSTANCE rc; DC_BEGIN_FN("UT_GetInstanceHandle"); TRC_ASSERT((_UT.hInstance != 0), (TB, _T("Instance handle not set"))); rc = _UT.hInstance; TRC_DBG((TB, _T("Return %p"), rc)); DC_END_FN(); return(rc); } /* UT_GetInstanceHandle */ /****************************************************************************/ /* Name: UT_SetInstanceHandle */ /* */ /* Purpose: Return application hInstance */ /* */ /* Returns: hInstance */ /****************************************************************************/ DCVOID DCAPI UT_SetInstanceHandle(HINSTANCE hInstance) { DC_BEGIN_FN("UT_SetInstanceHandle"); TRC_ASSERT((_UT.hInstance == 0), (TB, _T("Set instance handle twice!"))); TRC_ASSERT((hInstance != 0), (TB, _T("invalid (zero) instance handle"))); _UT.hInstance = hInstance; DC_END_FN(); } /* UT_SetInstanceHandle */ static BOOL StringtoBinary(size_t cbInBuffer, PBYTE pbInBuffer, TCHAR *pszOutBuffer, DWORD *pcchOutBuffer); static BOOL BinarytoString(size_t cchInBuffer, TCHAR *pszInBuffer, PBYTE pbOutBuffer, DWORD *pcbOutBuffer); static BOOL ValidateServerName(LPCTSTR szServerName, BOOL fAllowPortSuffix); static INT GetPortNumberFromServerName(LPTSTR szServer); static VOID GetServerNameFromFullAddress(LPCTSTR szFullName, LPTSTR szServerOnly, ULONG len); static HRESULT GetCanonicalServerNameFromConnectString( IN LPCTSTR szConnectString, OUT LPTSTR szCanonicalServerName, ULONG cchLenOut ); static BOOL IsSCardReaderInstalled(); #ifndef OS_WINCE static BOOL NotifyShellOfFullScreen(HWND hwndMarkFullScreen, BOOL fNowFullScreen, ITaskbarList2** ppTsbl2, PBOOL pfQueriedForTaskbar); #endif // // Safe wrapper that validates a string length before doing the string copy // static HRESULT StringPropPut( LPTSTR szDestString, UINT cchDestLen, LPTSTR szSourceString ); // // IME Wrapper functions // // These wrappers manage dynamically loading the IME dlls // and the appropriate unicode conversions on 9x where the // Unicode API's may not be available // UINT UT_ImmGetIMEFileName(IN HKL, OUT LPTSTR, IN UINT uBufLen); #if ! defined (OS_WINCE) BOOL UT_IMPGetIME( IN HWND, OUT LPIMEPRO); #endif static BOOL UT_IsScreen8bpp() { BOOL fUse8BitDepth = FALSE; HDC hdcScreen = GetDC(NULL); if (hdcScreen) { fUse8BitDepth = (GetDeviceCaps(hdcScreen, BITSPIXEL) <= 8); ReleaseDC(NULL, hdcScreen); } return fUse8BitDepth; } static HPALETTE UT_GetPaletteForBitmap(HDC hDCSrc, HBITMAP hBitmap); // // Internal functions // private: DCVOID DCINTERNAL UTGetCurrentTime(PDC_TIME pTime); DCBOOL DCINTERNAL UTReadEntry(HKEY topLevelKey, PDCTCHAR pSection, PDCTCHAR pEntry, PDCUINT8 pBuffer, DCINT bufferSize, DCINT32 expectedDataType); DCBOOL DCINTERNAL UTEnumRegistry( PDCTCHAR pSection, DCUINT32 index, PDCTCHAR pBuffer, PDCINT pBufferSize ); DCBOOL DCINTERNAL UTWriteEntry(HKEY topLevelKey, PDCTCHAR pSection, PDCTCHAR pEntry, PDCUINT8 pData, DCINT dataSize, DCINT32 dataType); DCBOOL DCINTERNAL UTReadRegistryString(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pBuffer, DCINT bufferSize); DCBOOL DCINTERNAL UTReadRegistryExpandString(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR* ppBuffer, PDCINT pBufferSize); DCBOOL DCINTERNAL UTReadRegistryInt(PDCTCHAR pSection, PDCTCHAR pEntry, PDCINT pValue); DCBOOL DCINTERNAL UTReadRegistryBinary(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pBuffer, DCINT bufferSize); DCBOOL DCINTERNAL UTWriteRegistryString(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pBuffer); DCBOOL DCINTERNAL UTWriteRegistryInt(PDCTCHAR pSection, PDCTCHAR pEntry, DCINT value); DCBOOL DCINTERNAL UTWriteRegistryBinary(PDCTCHAR pSection, PDCTCHAR pEntry, PDCTCHAR pBuffer, DCINT bufferSize); DCBOOL DCINTERNAL UTDeleteEntry(PDCTCHAR pSection, PDCTCHAR pEntry); DCUINT DCINTERNAL UTSetScrollInfo(HWND hwnd, DCINT scrollBarFlag, LPSCROLLINFO pScrollInfo, DCBOOL redraw); DCUINT32 DCAPI UTInterlockedExchange(PDCUINT32 pData, DCUINT32 val); #include "wutint.h" }; //Old name #define SIZECHAR(x) sizeof(x)/sizeof(TCHAR) #define CHECK_READ_ONE_BYTE(pBuffer, pEnd, hr, trc ) \ {\ if (((BYTE*)(pBuffer)) >= (BYTE*)(pEnd)) { \ TRC_ABORT( trc ); \ hr = E_TSC_CORE_LENGTH; \ DC_QUIT; \ } \ } #define CHECK_READ_ONE_BYTE_2ENDED(pBuffer, pStart, pEnd, hr, trc ) \ {\ if (((BYTE*)(pBuffer)) >= (BYTE*)(pEnd) || \ (BYTE*)(pBuffer) < (BYTE*)(pStart)) { \ TRC_ABORT( trc ); \ hr = E_TSC_CORE_LENGTH; \ DC_QUIT; \ } \ } #define CHECK_WRITE_ONE_BYTE(pBuffer, pEnd, hr, trc ) \ {\ if (((BYTE*)(pBuffer)) >= (BYTE*)(pEnd)) { \ TRC_ABORT( trc ); \ hr = E_TSC_CORE_LENGTH; \ DC_QUIT; \ } \ } #define CHECK_WRITE_ONE_BYTE_NO_HR(pBuffer, pEnd, trc ) \ {\ if (((BYTE*)(pBuffer)) >= (BYTE*)(pEnd)) { \ TRC_ABORT( trc ); \ DC_QUIT; \ } \ } #define CHECK_READ_N_BYTES(pBuffer, pEnd, N, hr, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N))) { \ TRC_ABORT( trc ); \ hr = E_TSC_CORE_LENGTH; \ DC_QUIT; \ } \ } #define CHECK_READ_N_BYTES_NO_HR(pBuffer, pEnd, N, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N))) { \ TRC_ABORT( trc ); \ DC_QUIT; \ } \ } #define CHECK_READ_N_BYTES_2ENDED(pBuffer, pStart, pEnd, N, hr, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N)) || \ ((BYTE*)(pBuffer) < (BYTE*)(pStart)) ) { \ TRC_ABORT( trc ); \ hr = E_TSC_CORE_LENGTH; \ DC_QUIT; \ } \ } #define CHECK_READ_N_BYTES_2ENDED_NO_HR(pBuffer, pStart, pEnd, N, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N)) || \ ((BYTE*)(pBuffer) < (BYTE*)(pStart)) ) { \ TRC_ABORT( trc ); \ DC_QUIT; \ } \ } #define CHECK_WRITE_N_BYTES(pBuffer, pEnd, N, hr, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N))) { \ TRC_ABORT( trc ); \ hr = E_TSC_CORE_LENGTH; \ DC_QUIT; \ } \ } #define CHECK_WRITE_N_BYTES_NO_HR(pBuffer, pEnd, N, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N))) { \ TRC_ABORT( trc ); \ DC_QUIT; \ } \ } #define CHECK_WRITE_N_BYTES_2ENDED_NO_HR(pBuffer, pStart, pEnd, N, trc ) \ {\ if ((BYTE*)(pBuffer) > (BYTE*)(pEnd) || \ ((ULONG)((BYTE*)(pEnd) - (BYTE*)(pBuffer)) < (ULONG)(N)) || \ ((BYTE*)(pBuffer) < (BYTE*)(pStart)) ) { \ TRC_ABORT( trc ); \ DC_QUIT; \ } \ } #endif /* _H_UTIL */