#if !defined(_KSDEBUG_)
#define _KSDEBUG_

#if !defined(REMIND)
#define QUOTE(x) #x
#define QQUOTE(y) QUOTE(y)
#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") : " str
#endif

#if defined(__cplusplus)
extern "C" {
#endif
#if defined(_NTDDK_)

#define DEBUGLVL_ERROR   0
#define DEBUGLVL_TERSE   1
#define DEBUGLVL_VERBOSE 2
#define DEBUGLVL_BLAB    3



#if (DBG)

#if defined(IRPMJFUNCDESC)
static const PCHAR IrpMjFuncDesc[] =
{
 "IRP_MJ_CREATE",
 "IRP_MJ_CREATE_NAMED_PIPE",
 "IRP_MJ_CLOSE",
 "IRP_MJ_READ",
 "IRP_MJ_WRITE",
 "IRP_MJ_QUERY_INFORMATION",
 "IRP_MJ_SET_INFORMATION",
 "IRP_MJ_QUERY_EA",
 "IRP_MJ_SET_EA",
 "IRP_MJ_FLUSH_BUFFERS",
 "IRP_MJ_QUERY_VOLUME_INFORMATION",
 "IRP_MJ_SET_VOLUME_INFORMATION",
 "IRP_MJ_DIRECTORY_CONTROL",
 "IRP_MJ_FILE_SYSTEM_CONTROL",
 "IRP_MJ_DEVICE_CONTROL",
 "IRP_MJ_INTERNAL_DEVICE_CONTROL",
 "IRP_MJ_SHUTDOWN",
 "IRP_MJ_LOCK_CONTROL",
 "IRP_MJ_CLEANUP",
 "IRP_MJ_CREATE_MAILSLOT",
 "IRP_MJ_QUERY_SECURITY",
 "IRP_MJ_SET_SECURITY",
 "IRP_MJ_SET_POWER",
 "IRP_MJ_QUERY_POWER"
};
#endif
#endif

#if (DBG)
  #if !defined( DEBUG_LEVEL )
      #if defined( DEBUG_VARIABLE )
          #if defined( KSDEBUG_INIT )
              ULONG DEBUG_VARIABLE = DEBUGLVL_TERSE;
          #else
              extern ULONG DEBUG_VARIABLE;
          #endif
      #else
          #define DEBUG_VARIABLE DEBUGLVL_TERSE
      #endif
  #else
      #if defined( DEBUG_VARIABLE )
          #if defined( KSDEBUG_INIT )
              ULONG DEBUG_VARIABLE = DEBUG_LEVEL;
          #else
              extern ULONG DEBUG_VARIABLE;
          #endif
      #else
          #define DEBUG_VARIABLE DEBUG_LEVEL
      #endif
  #endif

   #define _DbgPrintFEx(component, lvl, strings) \
   { \
    if ((lvl) <= DEBUG_VARIABLE)\
    {\
        DbgPrintEx(component, lvl, STR_MODULENAME);\
        DbgPrintEx(component, lvl, strings);\
        DbgPrintEx(component, lvl, "\n");\
        if ((lvl) == DEBUGLVL_ERROR)\
        {\
            DbgBreakPoint();\
        } \
    } \
   }

   #define _DbgPrintF(lvl, strings)\
   { \
    if (((lvl)==DEBUG_VARIABLE) || (lvl < DEBUG_VARIABLE))\
    {\
      DbgPrint(STR_MODULENAME);\
      DbgPrint##strings;\
      DbgPrint("\n");\
      if ((lvl) == DEBUGLVL_ERROR)\
      {\
         DbgBreakPoint();\
      } \
    } \
   }
#else
  #define  _DbgPrintF(lvl, strings)
  #define  _DbgPrintFEx(component, lvl, strings)
#endif
#endif


#if defined(__cplusplus)
}
#endif
#endif