Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

434 lines
9.0 KiB

/*++
Copyright (c) 1998-1999 Microsoft Corporation
All rights reserved.
Module Name:
dbgstate.hxx
Abstract:
Status definitions.
Author:
Steve Kiraly (SteveKi) 2-Mar-1997
Revision History:
--*/
#ifndef _DBGSTATE_HXX_
#define _DBGSTATE_HXX_
#ifdef DBG
/********************************************************************
Automatic status logging.
Use TStatus instead of DWORD:
DWORD dwStatus; -> TStatus Status;
DWORD dwStatus = ERROR_ACCESS_DENIED -> TStatus Status = ERROR_ACCESS_DENIED;
dwStatus = ERROR_SUCCESS -> Status DBGNOCHK = ERROR_SUCCESS;
dwStatus = xxx; -> Status DBGCHK = xxx;
if(dwStatus){ -> if(Status != 0){
Anytime Status is set, the DBGCHK macro must be added before
the '=.'
If the variable must be set to a failure value at compile time
and logging is therefore not needed, then the DBGNOCHK macro
should be used.
There is a method to control the wether a message is
printed if an error value is assigned as well as 3 "benign"
errors that can be ignored.
DBGCFG(Status, DBG_ERROR);
DBGCFG1(Status, DBG_ERROR, ERROR_ACCESS_DENIED);
DBGCFG2(Status, DBG_ERROR, ERROR_INVALID_HANDLE, ERROR_ARENA_TRASHED);
DBGCFG3(Status, DBG_ERROR, ERROR_INVALID_HANDLE, ERROR_ARENA_TRASHED, ERROR_NOT_ENOUGH_MEMORY);
********************************************************************/
#define DBGCHK .pSetInfo(__LINE__, _T(__FILE__))
#define DBGNOCHK .pNoChk()
#define DBGCFG(TStatusX, Level) (TStatusX).pConfig((Level))
#define DBGCFG1(TStatusX, Level, Safe1) (TStatusX).pConfig((Level), (Safe1))
#define DBGCFG2(TStatusX, Level, Safe1, Safe2) (TStatusX).pConfig((Level), (Safe1), (Safe2))
#define DBGCFG3(TStatusX, Level, Safe1, Safe2, Safe3) (TStatusX).pConfig((Level), (Safe1), (Safe2), (Safe3))
/********************************************************************
Base class for DWORD status.
********************************************************************/
class TStatusBase {
public:
enum { kUnInitializedValue = 0xabababab };
virtual
TStatusBase::
~TStatusBase(
VOID
);
DWORD
TStatusBase::
dwGeTStatusBase(
VOID
) const;
TStatusBase&
TStatusBase::
pSetInfo(
IN UINT uLine,
IN LPCTSTR pszFile
);
TStatusBase&
TStatusBase::
pNoChk(
VOID
);
VOID
TStatusBase::
pConfig(
IN UINT uDbgLevel,
IN DWORD dwStatusSafe1 = -1,
IN DWORD dwStatusSafe2 = -1,
IN DWORD dwStatusSafe3 = -1
);
operator DWORD(
VOID
) const;
DWORD
TStatusBase::
operator=(
IN DWORD dwStatus
);
protected:
TStatusBase::
TStatusBase(
IN BOOL bStatus,
IN UINT uDbgLevel
);
private:
DWORD m_dwStatus;
DWORD m_dwStatusSafe1;
DWORD m_dwStatusSafe2;
DWORD m_dwStatusSafe3;
UINT m_uDbgLevel;
UINT m_uLine;
LPCTSTR m_pszFile;
};
/********************************************************************
DWORD status class.
********************************************************************/
class TStatus : public TStatusBase {
public:
TStatus::
TStatus(
IN DWORD dwStatus = kUnInitializedValue
);
TStatus::
~TStatus(
VOID
);
private:
//
// Don't let clients use operator= without going through the
// base class (i.e., using DBGCHK ).
//
// If you get an error trying to access private member function '=,'
// you are trying to set the status without using the DBGCHK macro.
//
// This is needed to update the line and file, which must be done
// at the macro level (not inline C++ function) since __LINE__ and
// __FILE__ are handled by the preprocessor.
//
DWORD
TStatus::
operator=(
DWORD dwStatus
);
};
/********************************************************************
Base class for BOOL status.
********************************************************************/
class TStatusBBase {
public:
enum { kUnInitializedValue = 0xabababab };
virtual
TStatusBBase::
~TStatusBBase(
VOID
);
BOOL
TStatusBBase::
bGetStatus(
VOID
) const;
TStatusBBase &
TStatusBBase::
pSetInfo(
IN UINT uLine,
IN LPCTSTR pszFile
);
TStatusBBase &
TStatusBBase::
pNoChk(
VOID
);
VOID
TStatusBBase::
pConfig(
IN UINT uDbgLevel,
IN DWORD dwStatusSafe1 = -1,
IN DWORD dwStatusSafe2 = -1,
IN DWORD dwStatusSafe3 = -1
);
operator BOOL(
VOID
) const;
BOOL
TStatusBBase::
operator=(
IN BOOL bStatus
);
protected:
TStatusBBase::
TStatusBBase(
IN BOOL bStatus,
IN UINT uDbgLevel
);
private:
BOOL m_bStatus;
DWORD m_dwStatusSafe1;
DWORD m_dwStatusSafe2;
DWORD m_dwStatusSafe3;
UINT m_uDbgLevel;
UINT m_uLine;
LPCTSTR m_pszFile;
};
/********************************************************************
BOOL status class.
********************************************************************/
class TStatusB : public TStatusBBase {
public:
TStatusB::
TStatusB(
IN BOOL bStatus = kUnInitializedValue
);
TStatusB::
~TStatusB(
VOID
);
private:
//
// Don't let clients use operator= without going through the
// base class (i.e., using DBGCHK ).
//
// If you get an error trying to access private member function '=,'
// you are trying to set the status without using the DBGCHK macro.
//
// This is needed to update the line and file, which must be done
// at the macro level (not inline C++ function) since __LINE__ and
// __FILE__ are handled by the preprocessor.
//
BOOL
TStatusB::
operator=(
IN BOOL bStatus
);
};
/********************************************************************
Base class for HRESULT status.
********************************************************************/
class TStatusHBase {
public:
enum { kUnInitializedValue = 0xabababab };
virtual
TStatusHBase::
~TStatusHBase(
VOID
);
HRESULT
TStatusHBase::
hrGetStatus(
VOID
) const;
TStatusHBase &
TStatusHBase::
pSetInfo(
IN UINT uLine,
IN LPCTSTR pszFile
);
TStatusHBase &
TStatusHBase::
pNoChk(
VOID
);
VOID
TStatusHBase::
pConfig(
IN UINT uDbgLevel,
IN DWORD hrStatusSafe1 = -1,
IN DWORD hrStatusSafe2 = -1,
IN DWORD hrStatusSafe3 = -1
);
operator HRESULT(
VOID
) const;
HRESULT
TStatusHBase::
operator=(
IN HRESULT hrStatus
);
protected:
TStatusHBase::
TStatusHBase(
IN HRESULT hrStatus,
IN UINT m_uDbgLevel
);
private:
HRESULT m_hrStatus;
HRESULT m_hrStatusSafe1;
HRESULT m_hrStatusSafe2;
HRESULT m_hrStatusSafe3;
UINT m_uDbgLevel;
UINT m_uLine;
LPCTSTR m_pszFile;
};
/********************************************************************
HRESULT status class.
********************************************************************/
class TStatusH : public TStatusHBase {
public:
TStatusH::
TStatusH(
IN HRESULT hrStatus = kUnInitializedValue
);
TStatusH::
~TStatusH(
VOID
);
private:
//
// Don't let clients use operator= without going through the
// base class (i.e., using DBGCHK ).
//
// If you get an error trying to access private member function '=,'
// you are trying to set the status without using the DBGCHK macro.
//
// This is needed to update the line and file, which must be done
// at the macro level (not inline C++ function) since __LINE__ and
// __FILE__ are handled by the preprocessor.
//
HRESULT
TStatusH::
operator=(
IN HRESULT hrStatus
);
};
#else
/********************************************************************
Non Debug version TStatusX
********************************************************************/
#define DBGCHK // Empty
#define DBGNOCHK // Empty
#define DBGCFG(TStatusX, Level) // Empty
#define DBGCFG1(TStatusX, Level, Safe1) // Empty
#define DBGCFG2(TStatusX, Level, Safe1, Safe2) // Empty
#define DBGCFG3(TStatusX, Level, Safe1, Safe2, Safe3) // Empty
#define TStatusB BOOL // BOOL in free build
#define TStatus DWORD // DWORD in free build
#define TStatusH HRESULT // HRESULT in free build
#endif // DBG
#endif // DBGSTATE_HXX