465 lines
16 KiB
C
465 lines
16 KiB
C
/*** 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
|