/*==========================================================================;
 *
 *  Copyright (C) 1994-1999 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       ddkcomp.h
 *  Content:	Compilation environment for Win9x code in NT kernel.
 *  History:
 *   Date	By	Reason
 *   ====	==	======
 *   03-Feb-98	DrewB   Keep common code for DDraw heap.
 *
 ***************************************************************************/

#ifndef __NTDDKCOMP__
#define __NTDDKCOMP__

#if DBG
#define DEBUG
#else
#undef DEBUG
#endif

#ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE NULL
#endif

typedef DD_DIRECTDRAW_LOCAL *LPDDRAWI_DIRECTDRAW_LCL;
typedef DD_DIRECTDRAW_GLOBAL *LPDDRAWI_DIRECTDRAW_GBL;
typedef DD_SURFACE_LOCAL *LPDDRAWI_DDRAWSURFACE_LCL;
typedef DD_SURFACE_GLOBAL *LPDDRAWI_DDRAWSURFACE_GBL;

typedef VIDEOMEMORYINFO VIDMEMINFO;
typedef VIDMEMINFO *LPVIDMEMINFO;
typedef VIDEOMEMORY VIDMEM;
typedef VIDMEM *LPVIDMEM;

#ifndef ZeroMemory
#define ZeroMemory(pv, cBytes) RtlZeroMemory(pv, cBytes)
#endif

#define ZwCloseKey             ZwClose

#define ABS(A)      ((A) <  0  ? -(A) : (A))

//
// Sundown: in GDI, there are lots of places SIZE_T are used as interchangeable
// as ULONG or UINT or LONG or INT.  On 64bit system, SIZE_T is int64 indeed.
// Since we are not making any GDI objects large objects right now, I just
// change all SIZE_T to ULONGSIZE_T here.
//
// The new type used is to easily identify the change later.
//
#define ULONGSIZE_T ULONG

#if defined(_X86_)

//
// Keep our own copy of this to avoid double indirections on probing
//
extern ULONG_PTR DxgUserProbeAddress;

#undef  MM_USER_PROBE_ADDRESS
#define MM_USER_PROBE_ADDRESS DxgUserProbeAddress
#endif // defined(_X86_)

//
// Macro to check memory allocation overflow.
//
#define MAXIMUM_POOL_ALLOC          (PAGE_SIZE * 10000)
#define BALLOC_OVERFLOW1(c,st)      (c > (MAXIMUM_POOL_ALLOC/sizeof(st)))
#define BALLOC_OVERFLOW2(c,st1,st2) (c > (MAXIMUM_POOL_ALLOC/(sizeof(st1)+sizeof(st2))))

//
// Debugger output macros
//
#define DDASSERT(Expr) ASSERTGDI(Expr, "DDASSERT")
#define VDPF(Args)

#ifdef DEBUG
    VOID  WINAPI DoRip(PSZ);
    VOID  WINAPI DoWarning(PSZ,LONG);

    #define RIP(x) DoRip((PSZ) x)
    #define ASSERTGDI(x,y) if(!(x)) DoRip((PSZ) y)
    #define WARNING(x)  DoWarning(x,0)
    #define WARNING1(x) DoWarning(x,1)

    #define RECORD_DRIVER_EXCEPTION() DbgPrint("Driver caused exception - %s line %u\n",__FILE__,__LINE__);

#else
    #define RIP(x)
    #define ASSERTGDI(x,y)
    #define WARNING(x)
    #define WARNING1(x)

    #define RECORD_DRIVER_EXCEPTION()

#endif

//
// Allocated memory is zero-filled.
//
#define MemAlloc(cBytes)           PALLOCMEM(cBytes, 'pddD')
#define MemFree(pv)                VFREEMEM(pv)

#define PALLOCMEM(cBytes,tag)      EngAllocMem(FL_ZERO_MEMORY,cBytes,tag)
#define PALLOCNOZ(cBytes,tag)      EngAllocMem(0,cBytes,tag)
#define PALLOCNONPAGED(cBytes,tag) EngAllocMem(FL_ZERO_MEMORY|FL_NONPAGED_MEMORY,cBytes,tag)

#define VFREEMEM(pv)               EngFreeMem(pv)

//
// From ntos\inc\pool.h
//
#define SESSION_POOL_MASK          32

//
// Error messages
//
#define SAVE_ERROR_CODE(x)         EngSetLastError((x))

//
// Macro to see if terminal server or not
//
#define ISTS()                     DxEngIsTermSrv()

//
// Macro to increment display uniqueness
//
#define INC_DISPLAY_UNIQUENESS()   DxEngIncDispUniq()

//
// Macro
//
#define VISRGN_UNIQUENESS()        DxEngVisRgnUniq()

//
// Macro
//
#define SURFOBJ_HOOK(pso)          ((FLONG)DxEngGetSurfaceData(pso,SURF_HOOKFLAGS))

#endif // __NTDDKCOMP__