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.
 
 
 
 
 
 

464 lines
16 KiB

/*** amlipriv.h - AML Interpreter Private Definitions
*
* Copyright (c) 1996,1997 Microsoft Corporation
* Author: Michael Tsang (MikeTs)
* Created 08/14/96
*
* MODIFICATION HISTORY
*/
#ifndef _AMLIPRIV_H
#define _AMLIPRIV_H
/*** Macros
*/
/*XLATOFF*/
#define MODNAME "AMLI"
#ifndef DEBUG
#define AMLI_WARN(x)
#define AMLI_ERROR(x)
#define CHKGLOBALHEAP()
#else
#define AMLI_WARN(x) ConPrintf(MODNAME "_WARN: "); \
ConPrintf x; \
ConPrintf("\n");
#define AMLI_ERROR(x) ConPrintf(MODNAME "_ERROR: "); \
ConPrintf x; \
ConPrintf("\n"); \
KdBreakPoint(); \
CHKDEBUGGERREQ();
#define CHKGLOBALHEAP()
#endif
#ifndef DEBUGGER
#define PRINTF
#define AMLI_LOGERR(rc,p) (rc)
#define RESETERR()
#define CHKDEBUGGERREQ()
#define LOGSCHEDEVENT(ev,d1,d2,d3)
#define LOGEVENT(ev,d1,d2,d3,d4,d5,d6,d7)
#define LOGMUTEXEVENT(ev,d1,d2,d3,d4,d5,d6,d7)
#else
#define PRINTF ConPrintf
#define AMLI_LOGERR(rc,p) (LogError(rc), CatError p, (rc))
#define RESETERR() {gDebugger.rcLastError = STATUS_SUCCESS;\
gDebugger.szLastError[0] = '\0'; \
}
#define CHKDEBUGGERREQ() if (gDebugger.dwfDebugger & DBGF_DEBUGGER_REQ) \
{ \
ConPrintf("\nProcess AML Debugger Request.\n");\
gDebugger.dwfDebugger &= \
~DBGF_DEBUGGER_REQ; \
AMLIDebugger(FALSE); \
}
#define LOGEVENT LogEvent
#define LOGSCHEDEVENT LogSchedEvent
#define LOGMUTEXEVENT(ev,d1,d2,d3,d4,d5,d6,d7) \
if (gDebugger.dwfDebugger & DBGF_LOGEVENT_MUTEX)\
{ \
LogEvent(ev,d1,d2,d3,d4,d5,d6,d7); \
}
#endif
#define LOCAL __cdecl
#define DEREF(x) ((x) = (x))
#define BYTEOF(d,i) (((PUCHAR)&d)[i])
#define WORDOF(d,i) (((PUSHORT)&d)[i])
//
// NTRAID#60804-2000/06/20-splante Remove dependence on static translation
//
#define HalTranslateBusAddress(InterfaceType,BusNumber,BusAddress,AddressSpace,TranslatedAddress) \
(*(TranslatedAddress) = (BusAddress), TRUE)
//
// The various tags
//
#define CTOBJ_TAG 'ClmA'
#define HPOBJ_TAG 'HlmA'
#define PRIV_TAG 'IlmA'
#define PHOBJ_TAG 'PlmA'
#define RSOBJ_TAG 'RlmA'
#define SYOBJ_TAG 'SlmA'
#define RTOBJ_TAG 'TlmA'
// Memory management macros
#define ALLOCPOOL ExAllocatePool
#define ALLOCPOOLWITHTAG ExAllocatePoolWithTag
#ifdef DEBUG
#ifndef MAXWINNT_DEBUG
#define MALLOC_PAGED(n,t) (++gdwcMemObjs, \
ALLOCPOOLWITHTAG( \
(gdwfAMLI & AMLIF_LOCKED)? \
NonPagedPool: PagedPool, n, t))
#define MALLOC_LOCKED(n,t) (++gdwcMemObjs, \
ALLOCPOOLWITHTAG( \
NonPagedPool, n, t))
#else
#define MALLOC_PAGED(n,t) (++gdwcMemObjs, \
ExAllocatePoolWithTagPriority( \
(gdwfAMLI & AMLIF_LOCKED)? \
NonPagedPool: PagedPool, n, t, \
HighPoolPrioritySpecialPoolOverrun))
#define MALLOC_LOCKED(n,t) (++gdwcMemObjs, \
ExAllocatePoolWithTagPriority( \
NonPagedPool, n, t, \
HighPoolPrioritySpecialPoolOverrun))
#endif
#define MALLOC MALLOC_LOCKED
#define MFREE(p) FreeMem(p, &gdwcMemObjs)
#define NEWHPOBJ(n) (++gdwcHPObjs, MALLOC(n, HPOBJ_TAG))
#define FREEHPOBJ(p) {MFREE(p); --gdwcHPObjs;}
#define NEWSYOBJ(n) (++gdwcSYObjs, MALLOC_LOCKED(n, SYOBJ_TAG))
#define FREESYOBJ(p) {MFREE(p); --gdwcSYObjs;}
#define NEWRSOBJ(n) (++gdwcRSObjs, MALLOC_LOCKED(n, RSOBJ_TAG))
#define FREERSOBJ(p) {MFREE(p); --gdwcRSObjs;}
#define NEWPHOBJ(n) (++gdwcPHObjs, MALLOC_LOCKED(n, PHOBJ_TAG))
#define FREEPHOBJ(p) {MFREE(p); --gdwcPHObjs;}
#define NEWRESTOBJ(n) (MALLOC_LOCKED(n, RTOBJ_TAG))
#define FREERESTOBJ(p) (MFREE(p))
#define NEWOBJDATA(h,p) NewObjData(h, p)
#define FREEOBJDATA(p) FreeObjData(p)
#define NEWODOBJ(h,n) (++gdwcODObjs, HeapAlloc(h, 'TADH', n))
#define FREEODOBJ(p) {HeapFree(p); --gdwcODObjs;}
#define NEWNSOBJ(h,n) (++gdwcNSObjs, HeapAlloc(h, 'OSNH', n))
#define FREENSOBJ(p) {HeapFree(p); --gdwcNSObjs;}
#define NEWOOOBJ(h,n) (++gdwcOOObjs, HeapAlloc(h, 'NWOH', n))
#define FREEOOOBJ(p) {HeapFree(p); --gdwcOOObjs;}
#define NEWSDOBJ(h,n) (++gdwcSDObjs, HeapAlloc(h, 'RTSH', n))
#define FREESDOBJ(p) {HeapFree(p); --gdwcSDObjs;}
#define NEWBDOBJ(h,n) (++gdwcBDObjs, HeapAlloc(h, 'FUBH', n))
#define FREEBDOBJ(p) {HeapFree(p); --gdwcBDObjs;}
#define NEWPKOBJ(h,n) (++gdwcPKObjs, HeapAlloc(h, 'GKPH', n))
#define FREEPKOBJ(p) {HeapFree(p); --gdwcPKObjs;}
#define NEWBFOBJ(h,n) (++gdwcBFObjs, HeapAlloc(h, 'DFBH', n))
#define FREEBFOBJ(p) {HeapFree(p); --gdwcBFObjs;}
#define NEWFUOBJ(h,n) (++gdwcFUObjs, HeapAlloc(h, 'UDFH', n))
#define FREEFUOBJ(p) {HeapFree(p); --gdwcFUObjs;}
#define NEWKFOBJ(h,n) (++gdwcKFObjs, HeapAlloc(h, 'FKBH', n))
#define FREEKFOBJ(p) {HeapFree(p); --gdwcKFObjs;}
#define NEWFOBJ(h,n) (++gdwcFObjs, HeapAlloc(h, 'ODFH', n))
#define FREEFOBJ(p) {HeapFree(p); --gdwcFObjs;}
#define NEWIFOBJ(h,n) (++gdwcIFObjs, HeapAlloc(h, 'FXIH', n))
#define FREEIFOBJ(p) {HeapFree(p); --gdwcIFObjs;}
#define NEWOROBJ(h,n) (++gdwcORObjs, HeapAlloc(h, 'GROH', n))
#define FREEOROBJ(p) {HeapFree(p); --gdwcORObjs;}
#define NEWMTOBJ(h,n) (++gdwcMTObjs, HeapAlloc(h, 'TUMH', n))
#define FREEMTOBJ(p) {HeapFree(p); --gdwcMTObjs;}
#define NEWEVOBJ(h,n) (++gdwcEVObjs, HeapAlloc(h, 'NVEH', n))
#define FREEEVOBJ(p) {HeapFree(p); --gdwcEVObjs;}
#define NEWMEOBJ(h,n) (++gdwcMEObjs, HeapAlloc(h, 'TEMH', n))
#define FREEMEOBJ(p) {HeapFree(p); --gdwcMEObjs;}
#define NEWPROBJ(h,n) (++gdwcPRObjs, HeapAlloc(h, 'SRPH', n))
#define FREEPROBJ(p) {HeapFree(p); --gdwcPRObjs;}
#define NEWPCOBJ(h,n) (++gdwcPCObjs, HeapAlloc(h, 'ORPH', n))
#define FREEPCOBJ(p) {HeapFree(p); --gdwcPCObjs;}
#define NEWCROBJ(h,n) (++gdwcCRObjs, HeapAlloc(h, 'RNWO', n))
#define FREECROBJ(p) {HeapFree(p); --gdwcCRObjs;}
#else
#define MALLOC_PAGED(n,t) ALLOCPOOLWITHTAG(PagedPool, n, t)
#define MALLOC_LOCKED(n,t) ALLOCPOOLWITHTAG(NonPagedPool, n, t)
#define MALLOC MALLOC_LOCKED
#define MFREE(p) ExFreePool(p)
#define NEWHPOBJ(n) MALLOC(n, HPOBJ_TAG)
#define FREEHPOBJ(p) MFREE(p)
#define NEWSYOBJ(n) MALLOC_LOCKED(n, SYOBJ_TAG)
#define FREESYOBJ(p) MFREE(p)
#define NEWRSOBJ(n) MALLOC_LOCKED(n, RSOBJ_TAG)
#define FREERSOBJ(p) MFREE(p)
#define NEWPHOBJ(n) MALLOC_LOCKED(n, PHOBJ_TAG)
#define FREEPHOBJ(p) MFREE(p)
#define NEWRESTOBJ(n) MALLOC_LOCKED(n, RTOBJ_TAG)
#define FREERESTOBJ(p) MFREE(p)
#define NEWOBJDATA(h,p) NewObjData(h,p)
#define FREEOBJDATA(p) FreeObjData(p)
#define NEWODOBJ(h,n) HeapAlloc(h, 'TADH', n)
#define FREEODOBJ(p) HeapFree(p)
#define NEWNSOBJ(h,n) HeapAlloc(h, 'OSNH', n)
#define FREENSOBJ(p) HeapFree(p)
#define NEWOOOBJ(h,n) HeapAlloc(h, 'NWOH', n)
#define FREEOOOBJ(p) HeapFree(p)
#define NEWSDOBJ(h,n) HeapAlloc(h, 'RTSH', n)
#define FREESDOBJ(p) HeapFree(p)
#define NEWBDOBJ(h,n) HeapAlloc(h, 'FUBH', n)
#define FREEBDOBJ(p) HeapFree(p)
#define NEWPKOBJ(h,n) HeapAlloc(h, 'GKPH', n)
#define FREEPKOBJ(p) HeapFree(p)
#define NEWBFOBJ(h,n) HeapAlloc(h, 'DFBH', n)
#define FREEBFOBJ(p) HeapFree(p)
#define NEWFUOBJ(h,n) HeapAlloc(h, 'UDFH', n)
#define FREEFUOBJ(p) HeapFree(p)
#define NEWKFOBJ(h,n) HeapAlloc(h, 'FKBH', n)
#define FREEKFOBJ(p) HeapFree(p)
#define NEWFOBJ(h,n) HeapAlloc(h, 'ODFH', n)
#define FREEFOBJ(p) HeapFree(p)
#define NEWIFOBJ(h,n) HeapAlloc(h, 'FXIH', n)
#define FREEIFOBJ(p) HeapFree(p)
#define NEWOROBJ(h,n) HeapAlloc(h, 'GROH', n)
#define FREEOROBJ(p) HeapFree(p)
#define NEWMTOBJ(h,n) HeapAlloc(h, 'TUMH', n)
#define FREEMTOBJ(p) HeapFree(p)
#define NEWEVOBJ(h,n) HeapAlloc(h, 'NVEH', n)
#define FREEEVOBJ(p) HeapFree(p)
#define NEWMEOBJ(h,n) HeapAlloc(h, 'TEMH', n)
#define FREEMEOBJ(p) HeapFree(p)
#define NEWPROBJ(h,n) HeapAlloc(h, 'SRPH', n)
#define FREEPROBJ(p) HeapFree(p)
#define NEWPCOBJ(h,n) HeapAlloc(h, 'ORPH', n)
#define FREEPCOBJ(p) HeapFree(p)
#define NEWCROBJ(h,n) HeapAlloc(h, 'RNWO', n)
#define FREECROBJ(p) HeapFree(p)
#endif
#define MEMCPY RtlCopyMemory
#define MEMZERO RtlZeroMemory
#define ISLEADNAMECHAR(c) (((c) >= 'A') && ((c) <= 'Z') || ((c) == '_'))
#define ISNAMECHAR(c) (ISLEADNAMECHAR(c) || ((c) >= '0') && ((c) <= '9'))
#define SHIFTLEFT(d,c) (((c) >= 32)? 0: (d) << (c))
#define SHIFTRIGHT(d,c) (((c) >= 32)? 0: (d) >> (c))
#define MIN(a,b) (((a) > (b))? (b): (a))
#define MAX(a,b) (((a) > (b))? (a): (b))
/*XLATON*/
/*** Constants
*/
// These are internal error codes which aren't really errors
#define AMLISTA_DONE 0x00008000
#define AMLISTA_BREAK 0x00008001
#define AMLISTA_RETURN 0x00008002
#define AMLISTA_CONTINUE 0x00008003
#define AMLISTA_PENDING 0x00008004
#define AMLISTA_TIMEOUT 0x00008005
// Global AMLI flags
#define AMLIF_LOCKED 0x00000001
#define AMLIF_IN_LOCKPHASE 0x00000002
#define AMLIF_LOADING_DDB 0x80000000
// Error Log
#define READ_ERROR_NOTED 0x00000001
#define WRITE_ERROR_NOTED 0x00000002
//
// AMLI Override FLAGS
//
#define AMLI_OVERRIDE_IO_ADDRESS_CHECK 0x00000001
// Global Hack flags
#define HACKF_OLDSLEEP 0x00000001
//
// AMLI Reg Attributes key
//
#define AMLI_ATTRIBUTES "AMLIAttributes"
#define ARGTYPE_NAME 'N' //name argument
#define ARGTYPE_DATAOBJ 'O' //data argument
#define ARGTYPE_DWORD 'D' //numeric dword argument
#define ARGTYPE_WORD 'W' //numeric word argument
#define ARGTYPE_BYTE 'B' //numeric byte argument
#define ARGTYPE_SNAME 'S' //supername argument
#define ARGTYPE_SNAME2 's' //supername argument
// object can be non-existing
#define ARGTYPE_OPCODE 'C' //opcode argument
// Argument object type (used for type validation)
#define ARGOBJ_UNKNOWN 'U' //OBJTYPE_UNKNOWN - don't care
#define ARGOBJ_INTDATA 'I' //OBJTYPE_INTDATA
#define ARGOBJ_STRDATA 'Z' //OBJTYPE_STRDATA
#define ARGOBJ_BUFFDATA 'B' //OBJTYPE_BUFFDATA
#define ARGOBJ_PKGDATA 'P' //OBJTYPE_PKGDATA
#define ARGOBJ_FIELDUNIT 'F' //OBJTYPE_FIELDUNIT
#define ARGOBJ_OBJALIAS 'O' //OBJTYPE_OBJALIAS
#define ARGOBJ_DATAALIAS 'A' //OBJTYPE_DATAALIAS
#define ARGOBJ_BASICDATA 'D' //INTDATA,STRDATA,BUFFDATA
#define ARGOBJ_COMPLEXDATA 'C' //BUFFDATA,PKGDATA
#define ARGOBJ_REFERENCE 'R' //OBJALIAS,DATAALIAS,BUFFFIELD
#define MAX_BYTE 0xff
#define MAX_WORD 0xffff
#define MAX_DWORD 0xffffffff
#define MAX_NUM_LOCALS 8
#define MAX_NUM_ARGS 7
#define MAX_NAME_LEN 255
#if defined (_WIN64)
#define DEF_CTXTBLK_SIZE (4096*4) //16K context block
#else
#define DEF_CTXTBLK_SIZE (4096*2) //8K context block
#endif
#define DEF_CTXTMAX_SIZE 16 //16 Contexts
#define DEF_GLOBALHEAPBLK_SIZE (4096*16) //64K global heap block
#define DEF_TIMESLICE_LENGTH 100 //100ms
#define DEF_TIMESLICE_INTERVAL 100 //100ms
#if defined(_WIN64)
#define DEF_HEAP_ALIGNMENT 8 //QWord aligned
#else
#define DEF_HEAP_ALIGNMENT 4 //DWord aligned
#endif
#define AMLI_REVISION 1
#define NAMESEG_ROOT 0x5f5f5f5c // "\___"
#define NAMESEG_BLANK 0x5f5f5f5f // "____"
#define NAMESEG_NONE 0x00000000 // ""
#define NAMESTR_ROOT "\\"
#define CREATORID_MSFT "MSFT"
#define MIN_CREATOR_REV 0x01000000
// dwfNS local flags
#define NSF_EXIST_OK 0x00010000 //for CreateNameSpaceObject
#define NSF_WARN_NOTFOUND 0x80000000 //for GetNameSpaceObject
/*** Type and Structure definitions
*/
typedef NTSTATUS (LOCAL *PFNOP)(PFRAME, PPNSOBJ);
typedef struct _amlterm
{
PSZ pszTermName;
ULONG dwOpcode;
PSZ pszArgTypes;
ULONG dwTermClass;
ULONG dwfOpcode;
PFNOH pfnCallBack;
ULONG dwCBData;
PFNOP pfnOpcode;
} AMLTERM, *PAMLTERM;
// dwfOpcode flags
#define OF_VARIABLE_LIST 0x00000001
#define OF_ARG_OBJECT 0x00000002
#define OF_LOCAL_OBJECT 0x00000004
#define OF_DATA_OBJECT 0x00000008
#define OF_STRING_OBJECT 0x00000010
#define OF_NAME_OBJECT 0x00000020
#define OF_DEBUG_OBJECT 0x00000040
#define OF_REF_OBJECT 0x00000080
#define OF_CALLBACK_EX 0x80000000
// dwTermClass
#define TC_NAMESPACE_MODIFIER 0x00000001
#define TC_NAMED_OBJECT 0x00000002
#define TC_OPCODE_TYPE1 0x00000003
#define TC_OPCODE_TYPE2 0x00000004
#define TC_OTHER 0x00000005
typedef struct _opcodemap
{
ULONG dwOpcode;
PAMLTERM pamlterm;
} OPCODEMAP, *POPCODEMAP;
typedef struct _objowner
{
LIST list;
ULONG dwSig;
PNSOBJ pnsObjList;
} OBJOWNER, *POBJOWNER;
#define SIG_OBJOWNER 'RNWO'
typedef struct _evhandle
{
PFNHND pfnHandler;
ULONG_PTR uipParam;
} EVHANDLE, *PEVHANDLE;
typedef struct _rsaccess
{
struct _rsaccess *prsaNext;
ULONG dwRegionSpace;
PFNCA pfnCookAccess;
ULONG_PTR uipCookParam;
PFNRA pfnRawAccess;
ULONG_PTR uipRawParam;
} RSACCESS, *PRSACCESS;
typedef struct _passivehook
{
struct _ctxt *pctxt;
ULONG_PTR uipAddr;
ULONG dwLen;
PULONG_PTR puipMappedAddr;
WORK_QUEUE_ITEM WorkItem;
} PASSIVEHOOK, *PPASSIVEHOOK;
typedef struct _mutex
{
KSPIN_LOCK SpinLock;
KIRQL OldIrql;
} MUTEX, *PMUTEX;
typedef struct _badioaddr
{
ULONG BadAddrBegin;
ULONG BadAddrSize;
ULONG OSVersionTrigger;
} BADIOADDR, *PBADIOADDR;
typedef struct _AMLI_Log_WorkItem_Context
{
BOOLEAN fRead;
ULONG Address;
ULONG Index;
PIO_WORKITEM pIOWorkItem;
} AMLI_LOG_WORKITEM_CONTEXT, *PAMLI_LOG_WORKITEM_CONTEXT;
#endif //ifndef _AMLIPRIV_H