/*** ctxt.h - AML context structures and definitions * * Copyright (c) 1996,1997 Microsoft Corporation * Author: Michael Tsang (MikeTs) * Created 06/13/97 * * MODIFICATION HISTORY */ #ifndef _CTXT_H #define _CTXT_H /*** Type and Structure definitions */ typedef struct _ctxt CTXT, *PCTXT, **PPCTXT; typedef struct _heap HEAP, *PHEAP; typedef NTSTATUS (LOCAL *PFNPARSE)(PCTXT, PVOID, NTSTATUS); typedef NTSTATUS (LOCAL *PFN)(); typedef struct _framehdr { ULONG dwSig; //frame object signature ULONG dwLen; //frame object length ULONG dwfFrame; //frame flags PFNPARSE pfnParse; //frame object parse function } FRAMEHDR, *PFRAMEHDR; #define FRAMEF_STAGE_MASK 0x0000000f #define FRAMEF_CONTEXT_MASK 0xffff0000 typedef struct _post { FRAMEHDR FrameHdr; //frame header ULONG_PTR uipData1; //data1 ULONG_PTR uipData2; //data2 POBJDATA pdataResult; //points to result object } POST, *PPOST; #define SIG_POST 'TSOP' typedef struct _scope { FRAMEHDR FrameHdr; //frame header PUCHAR pbOpEnd; //points to the end of scope PUCHAR pbOpRet; //points to return address of scope PNSOBJ pnsPrevScope; //points to previous scope POBJOWNER pownerPrev; //points to previous object owner PHEAP pheapPrev; //points to previous heap POBJDATA pdataResult; //points to result object } SCOPE, *PSCOPE; #define SIG_SCOPE 'POCS' #define SCOPEF_FIRST_TERM 0x00010000 typedef struct _call { FRAMEHDR FrameHdr; //frame header struct _call *pcallPrev; //points to previous call frame POBJOWNER pownerPrev; //points to previous object owner PNSOBJ pnsMethod; //points to method object int iArg; //next argument to be parsed int icArgs; //number of arguments POBJDATA pdataArgs; //points to the argument array OBJDATA Locals[MAX_NUM_LOCALS]; //arrays of locals POBJDATA pdataResult; //points to result object } CALL, *PCALL; #define SIG_CALL 'LLAC' #define CALLF_NEED_MUTEX 0x00010000 #define CALLF_ACQ_MUTEX 0x00020000 #define CALLF_INVOKE_CALL 0x00040000 typedef struct _nestedctxt { FRAMEHDR FrameHdr; //frame header PNSOBJ pnsObj; //points to current object of evaluation PNSOBJ pnsScope; //points to current scope OBJDATA Result; //to hold result data PFNACB pfnAsyncCallBack; //async completion callback function POBJDATA pdataCallBack; //points to return data of eval. PVOID pvContext; //context data for async callback ULONG dwfPrevCtxt; //save previous context flags struct _nestedctxt *pnctxtPrev; //save previous nested context frame } NESTEDCTXT, *PNESTEDCTXT; #define SIG_NESTEDCTXT 'XTCN' typedef struct _term { FRAMEHDR FrameHdr; //frame header PUCHAR pbOpTerm; //points to opcode of this term PUCHAR pbOpEnd; //points to the end of the term PUCHAR pbScopeEnd; //points to the end of the scope PAMLTERM pamlterm; //points to AMLTERM for this term PNSOBJ pnsObj; //to store object created by this term int iArg; //next argument to be parsed int icArgs; //number of arguments POBJDATA pdataArgs; //points to the argument array POBJDATA pdataResult; //points to result object } TERM, *PTERM; #define SIG_TERM 'MRET' typedef struct _package { FRAMEHDR FrameHdr; //frame header PPACKAGEOBJ ppkgobj; //points to the package object int iElement; //next element to parse PUCHAR pbOpEnd; //points to package end } PACKAGE, *PPACKAGE; #define SIG_PACKAGE 'FGKP' typedef struct _acquire { FRAMEHDR FrameHdr; //frame header PMUTEXOBJ pmutex; //points to the mutex object data USHORT wTimeout; //timeout value POBJDATA pdataResult; //points to result object } ACQUIRE, *PACQUIRE; #define SIG_ACQUIRE 'FQCA' #define ACQF_NEED_GLOBALLOCK 0x00010000 #define ACQF_HAVE_GLOBALLOCK 0x00020000 #define ACQF_SET_RESULT 0x00040000 typedef struct _accfieldunit { FRAMEHDR FrameHdr; //frame header POBJDATA pdataObj; //points to field unit object data POBJDATA pdata; //points to source/result object } ACCFIELDUNIT, *PACCFIELDUNIT; #define SIG_ACCFIELDUNIT 'UFCA' #define AFUF_READFIELDUNIT 0x00010000 #define AFUF_HAVE_GLOBALLOCK 0x00020000 typedef struct _wrfieldloop { FRAMEHDR FrameHdr; //frame header POBJDATA pdataObj; //points to object to be written PFIELDDESC pfd; //points to FieldDesc PUCHAR pbBuff; //points to source buffer ULONG dwBuffSize; //source buffer size ULONG dwDataInc; //data write increment } WRFIELDLOOP, *PWRFIELDLOOP; #define SIG_WRFIELDLOOP 'LFRW' typedef struct _accfieldobj { FRAMEHDR FrameHdr; //frame header POBJDATA pdataObj; //object to be read PUCHAR pbBuff; //points to target buffer PUCHAR pbBuffEnd; //points to target buffer end ULONG dwAccSize; //access size ULONG dwcAccesses; //number of accesses ULONG dwDataMask; //data mask int iLBits; //number of left bits int iRBits; //number of right bits int iAccess; //index to number of accesses ULONG dwData; //temp. data FIELDDESC fd; } ACCFIELDOBJ, *PACCFIELDOBJ; #define SIG_ACCFIELDOBJ 'OFCA' typedef struct _preservewrobj { FRAMEHDR FrameHdr; //frame header POBJDATA pdataObj; //object to be read ULONG dwWriteData; //data to be written ULONG dwPreserveMask; //preserve bit mask ULONG dwReadData; //temp data read } PRESERVEWROBJ, *PPRESERVEWROBJ; #define SIG_PRESERVEWROBJ 'ORWP' typedef struct _wrcookacc { FRAMEHDR FrameHdr; //frame header PNSOBJ pnsBase; //points to opregion object PRSACCESS prsa; //points to RSACCESS ULONG dwAddr; //region space address ULONG dwSize; //size of access ULONG dwData; //data to be written ULONG dwDataMask; //data mask ULONG dwDataTmp; //temp. data BOOLEAN fPreserve; //TRUE if need preserve bits } WRCOOKACC, *PWRCOOKACC; #define SIG_WRCOOKACC 'ACRW' typedef struct _sleep { FRAMEHDR FrameHdr; //frame header LIST_ENTRY ListEntry; //to link the sleep requests together LARGE_INTEGER SleepTime; //wake up time PCTXT Context; //points to current context } SLEEP, *PSLEEP; #define SIG_SLEEP 'PELS' typedef struct _resource { ULONG dwResType; struct _ctxt *pctxtOwner; PVOID pvResObj; LIST list; } RESOURCE, *PRESOURCE; #define RESTYPE_MUTEX 1 typedef struct _heapobjhdr { ULONG dwSig; //heap object signature ULONG dwLen; //heap object length; PHEAP pheap; //points to beginning of heap LIST list; //links all free heap blocks } HEAPOBJHDR, *PHEAPOBJHDR; struct _heap { ULONG dwSig; //heap signature PUCHAR pbHeapEnd; //points to end of heap block PHEAP pheapHead; //points to head of heap chain PHEAP pheapNext; //points to next heap block PUCHAR pbHeapTop; //points to the last free heap block PLIST plistFreeHeap; //points to the free heap block list HEAPOBJHDR Heap; //beginning of heap memory }; #define SIG_HEAP 'PAEH' struct _ctxt { ULONG dwSig; //signature "CTXT" PUCHAR pbCtxtEnd; //points to end of context block LIST listCtxt; //links all allocated context LIST listQueue; //links for queuing context PPLIST pplistCtxtQueue; //points to queue head pointer PLIST plistResources; //links all owned resources ULONG dwfCtxt; //context flags PNSOBJ pnsObj; //points to current object of evaluation PNSOBJ pnsScope; //points to current scope POBJOWNER powner; //points to current object owner PCALL pcall; //points to current call frame PNESTEDCTXT pnctxt; //points to current nest ctxt frame ULONG dwSyncLevel; //current sync level for mutexs PUCHAR pbOp; //AML code pointer OBJDATA Result; //to hold result data PFNACB pfnAsyncCallBack; //async completion callback function POBJDATA pdataCallBack; //points to return data of eval. PVOID pvContext; //context data for async callback // #ifdef DEBUGGER // LARGE_INTEGER Timestamp; // #endif KTIMER Timer; //timeout timer if context is blocked KDPC Dpc; //DPC hook for the context PHEAP pheapCurrent; //current heap CTXTDATA CtxtData; //context data HEAP LocalHeap; //Local heap }; #define SIG_CTXT 'TXTC' #define CTXTF_TIMER_PENDING 0x00000001 #define CTXTF_TIMER_DISPATCH 0x00000002 #define CTXTF_TIMEOUT 0x00000004 #define CTXTF_READY 0x00000008 #define CTXTF_RUNNING 0x00000010 #define CTXTF_NEED_CALLBACK 0x00000020 #define CTXTF_IN_READYQ 0x00000040 #define CTXTF_NEST_EVAL 0x00000080 #define CTXTF_ASYNC_EVAL 0x00000100 typedef struct _ctxtq { ULONG dwfCtxtQ; PKTHREAD pkthCurrent; PCTXT pctxtCurrent; PLIST plistCtxtQ; ULONG dwmsTimeSliceLength; ULONG dwmsTimeSliceInterval; PFNAA pfnPauseCallback; PVOID PauseCBContext; MUTEX mutCtxtQ; KTIMER Timer; KDPC DpcStartTimeSlice; KDPC DpcExpireTimeSlice; WORK_QUEUE_ITEM WorkItem; } CTXTQ, *PCTXTQ; #define CQF_TIMESLICE_EXPIRED 0x00000001 #define CQF_WORKITEM_SCHEDULED 0x00000002 #define CQF_FLUSHING 0x00000004 #define CQF_PAUSED 0x00000008 typedef struct _syncevent { NTSTATUS rcCompleted; PCTXT pctxt; KEVENT Event; } SYNCEVENT, *PSYNCEVENT; typedef struct _restart { PCTXT pctxt; WORK_QUEUE_ITEM WorkItem; } RESTART, *PRESTART; #endif //ifndef _CTXT_H