201 lines
6.3 KiB
C
201 lines
6.3 KiB
C
|
//-----------------------------------------------------------------------
|
||
|
//
|
||
|
// APC.H - Asynchronous Procedure Call Interface File for Ring 3
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
//
|
||
|
// Author: Mike Toutonghi
|
||
|
// Copyright: 1993 Microsoft
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
// File Description:
|
||
|
// Provides an interface to both USER and KERNEL level APCs under
|
||
|
// Chicago. This file must be kept in sync with APC.INC
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
// Revision History:
|
||
|
// 2/26/93 - created (miketout)
|
||
|
//
|
||
|
//-----------------------------------------------------------------------
|
||
|
|
||
|
#ifdef WOW32_EXTENSIONS
|
||
|
#define AssertSignature(x)
|
||
|
#else // WOW32_EXTENSIONS
|
||
|
#ifdef DEBUG
|
||
|
#define AssertCreate(x, p) ((p)->x##_dwSignature = x##_SIGNATURE)
|
||
|
#define AssertDestroy(x, p) ((p)->x##_dwSignature = 0x44414544)
|
||
|
#define AssertSignature(x) ULONG x##_dwSignature;
|
||
|
#define AssertP(x, p) Assert((p)->x##_dwSignature == x##_SIGNATURE)
|
||
|
#else
|
||
|
#define AssertCreate(x, p)
|
||
|
#define AssertDestroy(x, p)
|
||
|
#define AssertSignature(x)
|
||
|
#define AssertP(x, p)
|
||
|
#endif
|
||
|
#endif // else WOW32_EXTENSIONS
|
||
|
|
||
|
//---------------------------------------------------------------------
|
||
|
// SUPPORT STRUCTURES
|
||
|
//---------------------------------------------------------------------
|
||
|
|
||
|
typedef void (APIENTRY *PAPCFUNC)( DWORD dwParam );
|
||
|
|
||
|
#ifndef PUAPC
|
||
|
typedef struct _userapcrec *PUAPC;
|
||
|
typedef struct _kernelapcrec *PKAPC;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Structure for a sync APC. Sync APCs are APCs which are
|
||
|
// queueable at interrupt or event time, and synchronize
|
||
|
// a function with the Win32 synchronization objects.
|
||
|
//
|
||
|
// By using a sync APC, interrupt service routines can signal
|
||
|
// Win32 events, decrement semaphores, queue APCs, and set timers.
|
||
|
//
|
||
|
typedef struct _syncapcrec {
|
||
|
PUAPC sar_nextapc; // next APC in list
|
||
|
DWORD sar_dwparam1; // first parameter
|
||
|
DWORD sar_dwparam2; // second parameter for APC
|
||
|
PAPCFUNC sar_apcaddr; // function to invoke
|
||
|
DWORD sar_dwparam3; // third parameter
|
||
|
AssertSignature(SYNCAPCREC)
|
||
|
} SYNCAPCREC;
|
||
|
|
||
|
#define SYNCAPCREC_SIGNATURE 0x20524153
|
||
|
|
||
|
//
|
||
|
// Structure for a user APC
|
||
|
//
|
||
|
typedef struct _userapcrec {
|
||
|
PUAPC uar_nextapc; // next APC in list
|
||
|
DWORD uar_apcstate; // state (APC_DELIVERED)
|
||
|
DWORD uar_dwparam; // parameter for APC
|
||
|
PAPCFUNC uar_apcaddr; // function to invoke
|
||
|
PAPCFUNC uar_apcR0rundown; // call if can't deliver APC
|
||
|
AssertSignature(USERAPCREC)
|
||
|
} USERAPCREC;
|
||
|
|
||
|
#define USERAPCREC_SIGNATURE 0x20524155
|
||
|
|
||
|
// APC state flags
|
||
|
#define APC_DELIVERED 0 // bit set when an APC is delivered
|
||
|
#define APC_DELIVERED_MASK (1 << APC_DELIVERED)
|
||
|
#define APC_FLAG_LAST 0 // last flag
|
||
|
|
||
|
//
|
||
|
// Structure for a kernel APC
|
||
|
//
|
||
|
typedef struct _kernelapcrec {
|
||
|
PKAPC kar_nextapc; // next kernel APC in list
|
||
|
DWORD kar_dwparam; // kernel APC parameter
|
||
|
PAPCFUNC kar_apcaddr; // APC function
|
||
|
PAPCFUNC kar_event; // used if an event is queued for APC
|
||
|
DWORD kar_savedeax; // saved eax for parameter
|
||
|
DWORD kar_savedeip; // eip for same reason as above
|
||
|
WORD kar_savedcs; // saved ring 3 cs to return w/o stk
|
||
|
WORD kar_apcstate; // state (KAR_FLAG...)
|
||
|
AssertSignature(KERNELAPCREC)
|
||
|
} KERNELAPCREC;
|
||
|
|
||
|
#define KERNELAPCREC_SIGNATURE 0x2052414b
|
||
|
|
||
|
// KERNEL APC specific flags
|
||
|
#define KAR_FLAG_BUSY 0
|
||
|
#define KAR_FLAG_BUSY_MASK (1 << KAR_FLAG_BUSY)
|
||
|
#define KAR_FLAG_STATIC (KAR_FLAG_BUSY+1)
|
||
|
#define KAR_FLAG_STATIC_MASK (1 << KAR_FLAG_STATIC)
|
||
|
#define KAR_FLAG_CALLBACK (KAR_FLAG_STATIC+1)
|
||
|
#define KAR_FLAG_CALLBACK_MASK (1 << KAR_FLAG_CALLBACK)
|
||
|
|
||
|
//
|
||
|
// Terminate Process Info structure for local reboot init dialog
|
||
|
//
|
||
|
typedef struct tpi_s {
|
||
|
struct tpi_s *tpi_ptpiNext;
|
||
|
void *tpi_hwnd;
|
||
|
struct _pdb *tpi_ppdb;
|
||
|
struct _tdb *tpi_ptdb;
|
||
|
DWORD tpi_flags;
|
||
|
int tpi_nIndex;
|
||
|
AssertSignature(TPI)
|
||
|
} TPI;
|
||
|
|
||
|
typedef TPI *PTPI;
|
||
|
|
||
|
#define TPI_SIGNATURE 0x20495054
|
||
|
|
||
|
#define TPIF_HUNG 0x00000001
|
||
|
#define TPIF_PROCESSNAME 0x00000002
|
||
|
|
||
|
//
|
||
|
// TerminateThread parameter packet. Allocated at ring 3, passed to
|
||
|
// VxDTerminateThread.
|
||
|
//
|
||
|
typedef struct termdata_s {
|
||
|
struct _tdb *term_ptdb; // thread to terminate
|
||
|
DWORD term_ptcbAPC; // thread to receive user APC
|
||
|
DWORD term_pfnAPC; // user APC function address
|
||
|
DWORD term_hAPC; // handle of kernel APC
|
||
|
DWORD term_htimeout; // handle of time out when nuking
|
||
|
DWORD term_pfrinfo; // force/restore crsts info pointer
|
||
|
AssertSignature(TERMDATA)
|
||
|
} TERMDATA;
|
||
|
|
||
|
typedef TERMDATA *PTERMDATA;
|
||
|
|
||
|
#define TERMDATA_SIGNATURE 0x4d524554
|
||
|
|
||
|
typedef union tpiterm_u {
|
||
|
TERMDATA tpiterm_term;
|
||
|
TPI tpiterm_tpi;
|
||
|
} TPITERM;
|
||
|
|
||
|
//
|
||
|
// Parameter packet used to start a ring 0 thread
|
||
|
//
|
||
|
typedef struct _kernthreadstartdata {
|
||
|
DWORD StartAddress; // start address in ring 3
|
||
|
DWORD dwThreadParam; // parameter for ring 3 startup function
|
||
|
DWORD dwKTStackSize; // ring 3 stack size
|
||
|
DWORD dwCreationFlags; // thread creation flags
|
||
|
DWORD pRing3Event; // set after thread is created
|
||
|
DWORD dwThreadID; // handle for new thread or NULL
|
||
|
DWORD dwErrorCode; // error code if error
|
||
|
} KERNTHREADSTARTDATA;
|
||
|
|
||
|
//
|
||
|
// Parameter packet used to start a ring 0 thread
|
||
|
//
|
||
|
typedef struct _r0startdata {
|
||
|
DWORD R0StartAddress; // start address in ring 0
|
||
|
DWORD dwR0ThreadParam; // parameter for ring 0 startup function
|
||
|
DWORD dwR3StackSize; // ring 3 stack size
|
||
|
DWORD pRing0Event; // set after thread is created
|
||
|
DWORD R0FailCallBack; // or invoke this callback on failure
|
||
|
DWORD dwRing3ThreadID; // ID for thread
|
||
|
DWORD dwRing0ThreadID; // same for ring 0
|
||
|
} R0THREADSTARTDATA;
|
||
|
|
||
|
// include the TDBX structure
|
||
|
#include <tdbx.h>
|
||
|
|
||
|
#ifndef WOW32_EXTENSIONS
|
||
|
|
||
|
typedef VOID (KERNENTRY *PFN_KERNEL_APC)(PVOID);
|
||
|
typedef VOID (KERNENTRY *PFN_USER_APC)(PVOID);
|
||
|
|
||
|
DWORD __cdecl VWIN32_QueueKernelAPC(PFN_KERNEL_APC, DWORD, LPVOID, DWORD);
|
||
|
DWORD __cdecl VWIN32_QueueUserApc(PFN_USER_APC, DWORD, LPVOID);
|
||
|
DWORD __cdecl VWIN32_QueueUserApcEx(PFN_USER_APC, DWORD, LPVOID, LPVOID);
|
||
|
|
||
|
// Queue the kernel or user APC to the kernel services thread.
|
||
|
#define APC_KERNEL_SERVICE_THREAD ((LPVOID)0xFFFFFFFF)
|
||
|
|
||
|
DWORD __cdecl FreeAPCList();
|
||
|
|
||
|
DWORD CancelKernelAPC();
|
||
|
DWORD CancelSuspendAPC();
|
||
|
DWORD __stdcall SuspendAPCHandler(DWORD);
|
||
|
#endif // ndef WOW32_EXTENSIONS
|