diff options
Diffstat (limited to 'loader/wine/winnt.h')
-rw-r--r-- | loader/wine/winnt.h | 2663 |
1 files changed, 0 insertions, 2663 deletions
diff --git a/loader/wine/winnt.h b/loader/wine/winnt.h deleted file mode 100644 index cb9984a1c4..0000000000 --- a/loader/wine/winnt.h +++ /dev/null @@ -1,2663 +0,0 @@ -/* - * Win32 definitions for Windows NT - * - * Copyright 1996 Alexandre Julliard - */ - -#ifndef MPLAYER_WINNT_H -#define MPLAYER_WINNT_H - -#include "windef.h" - -#ifndef RC_INVOKED -#include <string.h> -#endif - -#include "pshpack1.h" -/* Defines */ - -/* Argument 1 passed to the DllEntryProc. */ -#define DLL_PROCESS_DETACH 0 /* detach process (unload library) */ -#define DLL_PROCESS_ATTACH 1 /* attach process (load library) */ -#define DLL_THREAD_ATTACH 2 /* attach new thread */ -#define DLL_THREAD_DETACH 3 /* detach thread */ - - -/* u.x.wProcessorArchitecture (NT) */ -#define PROCESSOR_ARCHITECTURE_INTEL 0 -#define PROCESSOR_ARCHITECTURE_MIPS 1 -#define PROCESSOR_ARCHITECTURE_ALPHA 2 -#define PROCESSOR_ARCHITECTURE_PPC 3 -#define PROCESSOR_ARCHITECTURE_SHX 4 -#define PROCESSOR_ARCHITECTURE_ARM 5 -#define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF - -/* dwProcessorType */ -#define PROCESSOR_INTEL_386 386 -#define PROCESSOR_INTEL_486 486 -#define PROCESSOR_INTEL_PENTIUM 586 -#define PROCESSOR_INTEL_860 860 -#define PROCESSOR_MIPS_R2000 2000 -#define PROCESSOR_MIPS_R3000 3000 -#define PROCESSOR_MIPS_R4000 4000 -#define PROCESSOR_ALPHA_21064 21064 -#define PROCESSOR_PPC_601 601 -#define PROCESSOR_PPC_603 603 -#define PROCESSOR_PPC_604 604 -#define PROCESSOR_PPC_620 620 -#define PROCESSOR_HITACHI_SH3 10003 -#define PROCESSOR_HITACHI_SH3E 10004 -#define PROCESSOR_HITACHI_SH4 10005 -#define PROCESSOR_MOTOROLA_821 821 -#define PROCESSOR_SHx_SH3 103 -#define PROCESSOR_SHx_SH4 104 -#define PROCESSOR_STRONGARM 2577 -#define PROCESSOR_ARM720 1824 /* 0x720 */ -#define PROCESSOR_ARM820 2080 /* 0x820 */ -#define PROCESSOR_ARM920 2336 /* 0x920 */ -#define PROCESSOR_ARM_7TDMI 70001 - -#define ANYSIZE_ARRAY 1 - -#define MINCHAR 0x80 -#define MAXCHAR 0x7f -#define MINSHORT 0x8000 -#define MAXSHORT 0x7fff -#define MINLONG 0x80000000 -#define MAXLONG 0x7fffffff -#define MAXBYTE 0xff -#define MAXWORD 0xffff -#define MAXDWORD 0xffffffff - -#define FIELD_OFFSET(type, field) \ - ((LONG)(INT)&(((type *)0)->field)) - -#define CONTAINING_RECORD(address, type, field) \ - ((type *)((PCHAR)(address) - (PCHAR)(&((type *)0)->field))) - -/* Types */ - -/* TCHAR data types definitions for Winelib. */ -/* These types are _not_ defined for the emulator, because they */ -/* depend on the UNICODE macro that only exists in user's code. */ - -# ifdef UNICODE -typedef WCHAR TCHAR, *PTCHAR; -typedef LPWSTR PTSTR, LPTSTR; -typedef LPCWSTR PCTSTR, LPCTSTR; -#define TEXT(string) L##string /*probably wrong */ -# else /* UNICODE */ -typedef char TCHAR, *PTCHAR; -typedef LPSTR PTSTR, LPTSTR; -typedef LPCSTR PCTSTR, LPCTSTR; -#define TEXT(string) string -# endif /* UNICODE */ - -typedef BYTE BOOLEAN; -typedef BOOLEAN *PBOOLEAN; - -typedef struct LIST_ENTRY { - struct LIST_ENTRY *Flink; - struct LIST_ENTRY *Blink; -} LIST_ENTRY, *PLIST_ENTRY; - -typedef struct SINGLE_LIST_ENTRY { - struct SINGLE_LIST_ENTRY *Next; -} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY; - -/* Heap flags */ - -#define HEAP_NO_SERIALIZE 0x00000001 -#define HEAP_GROWABLE 0x00000002 -#define HEAP_GENERATE_EXCEPTIONS 0x00000004 -#define HEAP_ZERO_MEMORY 0x00000008 -#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 -#define HEAP_TAIL_CHECKING_ENABLED 0x00000020 -#define HEAP_FREE_CHECKING_ENABLED 0x00000040 -#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080 -#define HEAP_CREATE_ALIGN_16 0x00010000 -#define HEAP_CREATE_ENABLE_TRACING 0x00020000 -#define HEAP_WINE_SEGPTR 0x01000000 /* Not a Win32 flag */ -#define HEAP_WINE_CODESEG 0x02000000 /* Not a Win32 flag */ -#define HEAP_WINE_CODE16SEG 0x04000000 /* Not a Win32 flag */ -#define HEAP_WINE_SHARED 0x08000000 /* Not a Win32 flag */ - -/* Processor feature flags. */ -#define PF_FLOATING_POINT_PRECISION_ERRATA 0 -#define PF_FLOATING_POINT_EMULATED 1 -#define PF_COMPARE_EXCHANGE_DOUBLE 2 -#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 -#define PF_PPC_MOVEMEM_64BIT_OK 4 -#define PF_ALPHA_BYTE_INSTRUCTIONS 5 -/* based on wine-20010510 -- alex */ -#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 -#define PF_AMD3D_INSTRUCTIONS_AVAILABLE 7 -#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 -#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 - -/* The Win32 register context */ - -/* CONTEXT is the CPU-dependent context; it should be used */ -/* wherever a platform-specific context is needed (e.g. exception */ -/* handling, Win32 register functions). */ - -/* CONTEXT86 is the i386-specific context; it should be used */ -/* wherever only a 386 context makes sense (e.g. DOS interrupts, */ -/* Win16 register functions), so that this code can be compiled */ -/* on all platforms. */ - -#define SIZE_OF_80387_REGISTERS 80 - -typedef struct FLOATING_SAVE_AREA -{ - DWORD ControlWord; - DWORD StatusWord; - DWORD TagWord; - DWORD ErrorOffset; - DWORD ErrorSelector; - DWORD DataOffset; - DWORD DataSelector; - BYTE RegisterArea[SIZE_OF_80387_REGISTERS]; - DWORD Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; - -typedef struct CONTEXT86 -{ - DWORD ContextFlags; - - /* These are selected by CONTEXT_DEBUG_REGISTERS */ - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr6; - DWORD Dr7; - - /* These are selected by CONTEXT_FLOATING_POINT */ - FLOATING_SAVE_AREA FloatSave; - - /* These are selected by CONTEXT_SEGMENTS */ - DWORD SegGs; - DWORD SegFs; - DWORD SegEs; - DWORD SegDs; - - /* These are selected by CONTEXT_INTEGER */ - DWORD Edi; - DWORD Esi; - DWORD Ebx; - DWORD Edx; - DWORD Ecx; - DWORD Eax; - - /* These are selected by CONTEXT_CONTROL */ - DWORD Ebp; - DWORD Eip; - DWORD SegCs; - DWORD EFlags; - DWORD Esp; - DWORD SegSs; -} CONTEXT86; - -#define CONTEXT_X86 0x00010000 -#define CONTEXT_i386 CONTEXT_X86 -#define CONTEXT_i486 CONTEXT_X86 - -#define CONTEXT86_CONTROL (CONTEXT_i386 | 0x0001) /* SS:SP, CS:IP, FLAGS, BP */ -#define CONTEXT86_INTEGER (CONTEXT_i386 | 0x0002) /* AX, BX, CX, DX, SI, DI */ -#define CONTEXT86_SEGMENTS (CONTEXT_i386 | 0x0004) /* DS, ES, FS, GS */ -#define CONTEXT86_FLOATING_POINT (CONTEXT_i386 | 0x0008L) /* 387 state */ -#define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x0010L) /* DB 0-3,6,7 */ -#define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER | CONTEXT86_SEGMENTS) - -/* i386 context definitions */ -#if ARCH_X86_32 - -#define CONTEXT_CONTROL CONTEXT86_CONTROL -#define CONTEXT_INTEGER CONTEXT86_INTEGER -#define CONTEXT_SEGMENTS CONTEXT86_SEGMENTS -#define CONTEXT_FLOATING_POINT CONTEXT86_FLOATING_POINT -#define CONTEXT_DEBUG_REGISTERS CONTEXT86_DEBUG_REGISTERS -#define CONTEXT_FULL CONTEXT86_FULL - -typedef CONTEXT86 CONTEXT; - -#endif /* ARCH_X86_32 */ - -/* Alpha context definitions */ -#if defined(_ALPHA_) || defined(__alpha__) - -#define CONTEXT_ALPHA 0x00020000 - -#define CONTEXT_CONTROL (CONTEXT_ALPHA | 0x00000001L) -#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002L) -#define CONTEXT_INTEGER (CONTEXT_ALPHA | 0x00000004L) -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -typedef struct CONTEXT -{ - /* selected by CONTEXT_FLOATING_POINT */ - ULONGLONG FltF0; - ULONGLONG FltF1; - ULONGLONG FltF2; - ULONGLONG FltF3; - ULONGLONG FltF4; - ULONGLONG FltF5; - ULONGLONG FltF6; - ULONGLONG FltF7; - ULONGLONG FltF8; - ULONGLONG FltF9; - ULONGLONG FltF10; - ULONGLONG FltF11; - ULONGLONG FltF12; - ULONGLONG FltF13; - ULONGLONG FltF14; - ULONGLONG FltF15; - ULONGLONG FltF16; - ULONGLONG FltF17; - ULONGLONG FltF18; - ULONGLONG FltF19; - ULONGLONG FltF20; - ULONGLONG FltF21; - ULONGLONG FltF22; - ULONGLONG FltF23; - ULONGLONG FltF24; - ULONGLONG FltF25; - ULONGLONG FltF26; - ULONGLONG FltF27; - ULONGLONG FltF28; - ULONGLONG FltF29; - ULONGLONG FltF30; - ULONGLONG FltF31; - - /* selected by CONTEXT_INTEGER */ - ULONGLONG IntV0; - ULONGLONG IntT0; - ULONGLONG IntT1; - ULONGLONG IntT2; - ULONGLONG IntT3; - ULONGLONG IntT4; - ULONGLONG IntT5; - ULONGLONG IntT6; - ULONGLONG IntT7; - ULONGLONG IntS0; - ULONGLONG IntS1; - ULONGLONG IntS2; - ULONGLONG IntS3; - ULONGLONG IntS4; - ULONGLONG IntS5; - ULONGLONG IntFp; - ULONGLONG IntA0; - ULONGLONG IntA1; - ULONGLONG IntA2; - ULONGLONG IntA3; - ULONGLONG IntA4; - ULONGLONG IntA5; - ULONGLONG IntT8; - ULONGLONG IntT9; - ULONGLONG IntT10; - ULONGLONG IntT11; - ULONGLONG IntRa; - ULONGLONG IntT12; - ULONGLONG IntAt; - ULONGLONG IntGp; - ULONGLONG IntSp; - ULONGLONG IntZero; - - /* selected by CONTEXT_FLOATING_POINT */ - ULONGLONG Fpcr; - ULONGLONG SoftFpcr; - - /* selected by CONTEXT_CONTROL */ - ULONGLONG Fir; - DWORD Psr; - DWORD ContextFlags; - DWORD Fill[4]; -} CONTEXT; - -#define QUAD_PSR_OFFSET HighSoftFpcr -#define QUAD_FLAGS_OFFSET HighFir - -#endif /* _ALPHA_ */ - -/* Mips context definitions */ -#ifdef _MIPS_ - -#define CONTEXT_R4000 0x00010000 - -#define CONTEXT_CONTROL (CONTEXT_R4000 | 0x00000001) -#define CONTEXT_FLOATING_POINT (CONTEXT_R4000 | 0x00000002) -#define CONTEXT_INTEGER (CONTEXT_R4000 | 0x00000004) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -typedef struct CONTEXT -{ - DWORD Argument[4]; - /* These are selected by CONTEXT_FLOATING_POINT */ - DWORD FltF0; - DWORD FltF1; - DWORD FltF2; - DWORD FltF3; - DWORD FltF4; - DWORD FltF5; - DWORD FltF6; - DWORD FltF7; - DWORD FltF8; - DWORD FltF9; - DWORD FltF10; - DWORD FltF11; - DWORD FltF12; - DWORD FltF13; - DWORD FltF14; - DWORD FltF15; - DWORD FltF16; - DWORD FltF17; - DWORD FltF18; - DWORD FltF19; - DWORD FltF20; - DWORD FltF21; - DWORD FltF22; - DWORD FltF23; - DWORD FltF24; - DWORD FltF25; - DWORD FltF26; - DWORD FltF27; - DWORD FltF28; - DWORD FltF29; - DWORD FltF30; - DWORD FltF31; - - /* These are selected by CONTEXT_INTEGER */ - DWORD IntZero; - DWORD IntAt; - DWORD IntV0; - DWORD IntV1; - DWORD IntA0; - DWORD IntA1; - DWORD IntA2; - DWORD IntA3; - DWORD IntT0; - DWORD IntT1; - DWORD IntT2; - DWORD IntT3; - DWORD IntT4; - DWORD IntT5; - DWORD IntT6; - DWORD IntT7; - DWORD IntS0; - DWORD IntS1; - DWORD IntS2; - DWORD IntS3; - DWORD IntS4; - DWORD IntS5; - DWORD IntS6; - DWORD IntS7; - DWORD IntT8; - DWORD IntT9; - DWORD IntK0; - DWORD IntK1; - DWORD IntGp; - DWORD IntSp; - DWORD IntS8; - DWORD IntRa; - DWORD IntLo; - DWORD IntHi; - - /* These are selected by CONTEXT_FLOATING_POINT */ - DWORD Fsr; - - /* These are selected by CONTEXT_CONTROL */ - DWORD Fir; - DWORD Psr; - - DWORD ContextFlags; - DWORD Fill[2]; -} CONTEXT; - -#endif /* _MIPS_ */ - -/* PowerPC context definitions */ -#ifdef __PPC__ - -#define CONTEXT_CONTROL 0x0001 -#define CONTEXT_FLOATING_POINT 0x0002 -#define CONTEXT_INTEGER 0x0004 -#define CONTEXT_DEBUG_REGISTERS 0x0008 -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -typedef struct -{ - /* These are selected by CONTEXT_FLOATING_POINT */ - double Fpr0; - double Fpr1; - double Fpr2; - double Fpr3; - double Fpr4; - double Fpr5; - double Fpr6; - double Fpr7; - double Fpr8; - double Fpr9; - double Fpr10; - double Fpr11; - double Fpr12; - double Fpr13; - double Fpr14; - double Fpr15; - double Fpr16; - double Fpr17; - double Fpr18; - double Fpr19; - double Fpr20; - double Fpr21; - double Fpr22; - double Fpr23; - double Fpr24; - double Fpr25; - double Fpr26; - double Fpr27; - double Fpr28; - double Fpr29; - double Fpr30; - double Fpr31; - double Fpscr; - - /* These are selected by CONTEXT_INTEGER */ - DWORD Gpr0; - DWORD Gpr1; - DWORD Gpr2; - DWORD Gpr3; - DWORD Gpr4; - DWORD Gpr5; - DWORD Gpr6; - DWORD Gpr7; - DWORD Gpr8; - DWORD Gpr9; - DWORD Gpr10; - DWORD Gpr11; - DWORD Gpr12; - DWORD Gpr13; - DWORD Gpr14; - DWORD Gpr15; - DWORD Gpr16; - DWORD Gpr17; - DWORD Gpr18; - DWORD Gpr19; - DWORD Gpr20; - DWORD Gpr21; - DWORD Gpr22; - DWORD Gpr23; - DWORD Gpr24; - DWORD Gpr25; - DWORD Gpr26; - DWORD Gpr27; - DWORD Gpr28; - DWORD Gpr29; - DWORD Gpr30; - DWORD Gpr31; - - DWORD Cr; - DWORD Xer; - - /* These are selected by CONTEXT_CONTROL */ - DWORD Msr; - DWORD Iar; - DWORD Lr; - DWORD Ctr; - - DWORD ContextFlags; - DWORD Fill[3]; - - /* These are selected by CONTEXT_DEBUG_REGISTERS */ - DWORD Dr0; - DWORD Dr1; - DWORD Dr2; - DWORD Dr3; - DWORD Dr4; - DWORD Dr5; - DWORD Dr6; - DWORD Dr7; -} CONTEXT; - -typedef struct STACK_FRAME_HEADER -{ - DWORD BackChain; - DWORD GlueSaved1; - DWORD GlueSaved2; - DWORD Reserved1; - DWORD Spare1; - DWORD Spare2; - - DWORD Parameter0; - DWORD Parameter1; - DWORD Parameter2; - DWORD Parameter3; - DWORD Parameter4; - DWORD Parameter5; - DWORD Parameter6; - DWORD Parameter7; -} STACK_FRAME_HEADER,*PSTACK_FRAME_HEADER; - -#endif /* __PPC__ */ - -#ifdef __sparc__ - -/* - * FIXME: - * - * There is no official CONTEXT structure defined for the SPARC - * architecture, so I just made one up. - * - * This structure is valid only for 32-bit SPARC architectures, - * not for 64-bit SPARC. - * - * Note that this structure contains only the 'top-level' registers; - * the rest of the register window chain is not visible. - * - * The layout follows the Solaris 'prgregset_t' structure. - * - */ - -#define CONTEXT_SPARC 0x10000000 - -#define CONTEXT_CONTROL (CONTEXT_SPARC | 0x00000001) -#define CONTEXT_FLOATING_POINT (CONTEXT_SPARC | 0x00000002) -#define CONTEXT_INTEGER (CONTEXT_SPARC | 0x00000004) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER) - -typedef struct CONTEXT -{ - DWORD ContextFlags; - - /* These are selected by CONTEXT_INTEGER */ - DWORD g0; - DWORD g1; - DWORD g2; - DWORD g3; - DWORD g4; - DWORD g5; - DWORD g6; - DWORD g7; - DWORD o0; - DWORD o1; - DWORD o2; - DWORD o3; - DWORD o4; - DWORD o5; - DWORD o6; - DWORD o7; - DWORD l0; - DWORD l1; - DWORD l2; - DWORD l3; - DWORD l4; - DWORD l5; - DWORD l6; - DWORD l7; - DWORD i0; - DWORD i1; - DWORD i2; - DWORD i3; - DWORD i4; - DWORD i5; - DWORD i6; - DWORD i7; - - /* These are selected by CONTEXT_CONTROL */ - DWORD psr; - DWORD pc; - DWORD npc; - DWORD y; - DWORD wim; - DWORD tbr; - - /* FIXME: floating point registers missing */ - -} CONTEXT; - -#endif /* __sparc__ */ - -#if !defined(CONTEXT_FULL) && !defined(RC_INVOKED) -#warning You need to define a CONTEXT for your CPU -typedef void CONTEXT; -#endif - -typedef CONTEXT *PCONTEXT; -typedef HANDLE *PHANDLE; - -/* Macros for easier access to i386 context registers */ - -#define EAX_reg(context) ((context)->Eax) -#define EBX_reg(context) ((context)->Ebx) -#define ECX_reg(context) ((context)->Ecx) -#define EDX_reg(context) ((context)->Edx) -#define ESI_reg(context) ((context)->Esi) -#define EDI_reg(context) ((context)->Edi) -#define EBP_reg(context) ((context)->Ebp) - -#define CS_reg(context) ((context)->SegCs) -#define DS_reg(context) ((context)->SegDs) -#define ES_reg(context) ((context)->SegEs) -#define FS_reg(context) ((context)->SegFs) -#define GS_reg(context) ((context)->SegGs) -#define SS_reg(context) ((context)->SegSs) - -#define EFL_reg(context) ((context)->EFlags) -#define EIP_reg(context) ((context)->Eip) -#define ESP_reg(context) ((context)->Esp) - -#define AX_reg(context) (*(WORD*)&EAX_reg(context)) -#define BX_reg(context) (*(WORD*)&EBX_reg(context)) -#define CX_reg(context) (*(WORD*)&ECX_reg(context)) -#define DX_reg(context) (*(WORD*)&EDX_reg(context)) -#define SI_reg(context) (*(WORD*)&ESI_reg(context)) -#define DI_reg(context) (*(WORD*)&EDI_reg(context)) -#define BP_reg(context) (*(WORD*)&EBP_reg(context)) - -#define AL_reg(context) (*(BYTE*)&EAX_reg(context)) -#define AH_reg(context) (*((BYTE*)&EAX_reg(context)+1)) -#define BL_reg(context) (*(BYTE*)&EBX_reg(context)) -#define BH_reg(context) (*((BYTE*)&EBX_reg(context)+1)) -#define CL_reg(context) (*(BYTE*)&ECX_reg(context)) -#define CH_reg(context) (*((BYTE*)&ECX_reg(context)+1)) -#define DL_reg(context) (*(BYTE*)&EDX_reg(context)) -#define DH_reg(context) (*((BYTE*)&EDX_reg(context)+1)) - -#define SET_CFLAG(context) (EFL_reg(context) |= 0x0001) -#define RESET_CFLAG(context) (EFL_reg(context) &= ~0x0001) -#define SET_ZFLAG(context) (EFL_reg(context) |= 0x0040) -#define RESET_ZFLAG(context) (EFL_reg(context) &= ~0x0040) - -#define ISV86(context) (EFL_reg(context) & 0x00020000) -#define V86BASE(context) ((context)->Dr7) /* ugly */ - - -/* Macros to retrieve the current context */ - -#if ARCH_X86_32 - -#ifdef NEED_UNDERSCORE_PREFIX -# define ASM_NAME(name) "_" name -#else -# define ASM_NAME(name) name -#endif - -#ifdef __GNUC__ -# define ASM_GLOBAL_FUNC(name,code) \ - __asm__( ".align 4\n\t" \ - ".globl " ASM_NAME(#name) "\n\t" \ - ".type " ASM_NAME(#name) ",@function\n" \ - ASM_NAME(#name) ":\n\t" \ - code ); -#else /* __GNUC__ */ -# define ASM_GLOBAL_FUNC(name,code) \ - void asm_dummy_##name(void) { \ - __asm__( ".align 4\n\t" \ - ".globl " ASM_NAME(#name) "\n\t" \ - ".type " ASM_NAME(#name) ",@function\n" \ - ASM_NAME(#name) ":\n\t" \ - code ); \ - } -#endif /* __GNUC__ */ - -#define DEFINE_REGS_ENTRYPOINT( name, fn, args ) \ - ASM_GLOBAL_FUNC( name, \ - "call " ASM_NAME("CALL32_Regs") "\n\t" \ - ".long " ASM_NAME(#fn) "\n\t" \ - ".byte " #args ", " #args ) -#define DEFINE_REGS_ENTRYPOINT_0( name, fn ) \ - DEFINE_REGS_ENTRYPOINT( name, fn, 0 ) -#define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) \ - DEFINE_REGS_ENTRYPOINT( name, fn, 4 ) -#define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) \ - DEFINE_REGS_ENTRYPOINT( name, fn, 8 ) -#define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) \ - DEFINE_REGS_ENTRYPOINT( name, fn, 12 ) -#define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) \ - DEFINE_REGS_ENTRYPOINT( name, fn, 16 ) - -#endif /* ARCH_X86_32 */ - -#ifdef __sparc__ -/* FIXME: use getcontext() to retrieve full context */ -#define GET_CONTEXT \ - CONTEXT context; \ - do { memset(&context, 0, sizeof(CONTEXT)); \ - context.ContextFlags = CONTEXT_CONTROL; \ - context.pc = (DWORD)__builtin_return_address(0); \ - } while (0) - -#define DEFINE_REGS_ENTRYPOINT_0( name, fn ) \ - void WINAPI name ( void ) \ - { GET_CONTEXT; fn( &context ); } -#define DEFINE_REGS_ENTRYPOINT_1( name, fn, t1 ) \ - void WINAPI name ( t1 a1 ) \ - { GET_CONTEXT; fn( a1, &context ); } -#define DEFINE_REGS_ENTRYPOINT_2( name, fn, t1, t2 ) \ - void WINAPI name ( t1 a1, t2 a2 ) \ - { GET_CONTEXT; fn( a1, a2, &context ); } -#define DEFINE_REGS_ENTRYPOINT_3( name, fn, t1, t2, t3 ) \ - void WINAPI name ( t1 a1, t2 a2, t3 a3 ) \ - { GET_CONTEXT; fn( a1, a2, a3, &context ); } -#define DEFINE_REGS_ENTRYPOINT_4( name, fn, t1, t2, t3, t4 ) \ - void WINAPI name ( t1 a1, t2 a2, t3 a3, t4 a4 ) \ - { GET_CONTEXT; fn( a1, a2, a3, a4, &context ); } - -#endif /* __sparc__ */ - -#ifndef DEFINE_REGS_ENTRYPOINT_0 -#warning You need to define DEFINE_REGS_ENTRYPOINT macros for your CPU -#endif - -#if ARCH_X86_32 -# define GET_IP(context) ((LPVOID)(context)->Eip) -#endif -#ifdef __sparc__ -# define GET_IP(context) ((LPVOID)(context)->pc) -#endif - -#if !defined(GET_IP) && !defined(RC_INVOKED) -#warning You must define GET_IP for this CPU -#endif - -/* - * Exception codes - */ - -#define STATUS_SUCCESS 0x00000000 -#define STATUS_WAIT_0 0x00000000 -#define STATUS_ABANDONED_WAIT_0 0x00000080 -#define STATUS_USER_APC 0x000000C0 -#define STATUS_TIMEOUT 0x00000102 -#define STATUS_PENDING 0x00000103 - -#define STATUS_GUARD_PAGE_VIOLATION 0x80000001 -#define STATUS_DATATYPE_MISALIGNMENT 0x80000002 -#define STATUS_BREAKPOINT 0x80000003 -#define STATUS_SINGLE_STEP 0x80000004 -#define STATUS_BUFFER_OVERFLOW 0x80000005 -#define STATUS_NO_MORE_FILES 0x80000006 -#define STATUS_WAKE_SYSTEM_DEBUGGER 0x80000007 - -#define STATUS_HANDLES_CLOSED 0x8000000A -#define STATUS_NO_INHERITANCE 0x8000000B -#define STATUS_GUID_SUBSTITUTION_MADE 0x8000000C -#define STATUS_PARTIAL_COPY 0x8000000D -#define STATUS_DEVICE_PAPER_EMPTY 0x8000000E -#define STATUS_DEVICE_POWERED_OFF 0x8000000F -#define STATUS_DEVICE_OFF_LINE 0x80000010 -#define STATUS_DEVICE_BUSY 0x80000011 -#define STATUS_NO_MORE_EAS 0x80000012 -#define STATUS_INVALID_EA_NAME 0x80000013 -#define STATUS_EA_LIST_INCONSISTENT 0x80000014 -#define STATUS_INVALID_EA_FLAG 0x80000015 -#define STATUS_VERIFY_REQUIRED 0x80000016 -#define STATUS_EXTRANEOUS_INFORMATION 0x80000017 -#define STATUS_RXACT_COMMIT_NECESSARY 0x80000018 -#define STATUS_NO_MORE_ENTRIES 0x8000001A -#define STATUS_FILEMARK_DETECTED 0x8000001B -#define STATUS_MEDIA_CHANGED 0x8000001C -#define STATUS_BUS_RESET 0x8000001D -#define STATUS_END_OF_MEDIA 0x8000001E -#define STATUS_BEGINNING_OF_MEDIA 0x8000001F -#define STATUS_MEDIA_CHECK 0x80000020 -#define STATUS_SETMARK_DETECTED 0x80000021 -#define STATUS_NO_DATA_DETECTED 0x80000022 -#define STATUS_REDIRECTOR_HAS_OPEN_HANDLES 0x80000023 -#define STATUS_SERVER_HAS_OPEN_HANDLES 0x80000024 -#define STATUS_ALREADY_DISCONNECTED 0x80000025 -#define STATUS_LONGJUMP 0x80000026 - -#define STATUS_UNSUCCESSFUL 0xC0000001 -#define STATUS_NOT_IMPLEMENTED 0xC0000002 -#define STATUS_INVALID_INFO_CLASS 0xC0000003 -#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004 -#define STATUS_ACCESS_VIOLATION 0xC0000005 -#define STATUS_IN_PAGE_ERROR 0xC0000006 -#define STATUS_PAGEFILE_QUOTA 0xC0000007 -#define STATUS_INVALID_HANDLE 0xC0000008 -#define STATUS_BAD_INITIAL_STACK 0xC0000009 -#define STATUS_BAD_INITIAL_PC 0xC000000A -#define STATUS_INVALID_CID 0xC000000B -#define STATUS_TIMER_NOT_CANCELED 0xC000000C -#define STATUS_INVALID_PARAMETER 0xC000000D -#define STATUS_NO_SUCH_DEVICE 0xC000000E -#define STATUS_NO_SUCH_FILE 0xC000000F -#define STATUS_INVALID_DEVICE_REQUEST 0xC0000010 -#define STATUS_END_OF_FILE 0xC0000011 -#define STATUS_WRONG_VOLUME 0xC0000012 -#define STATUS_NO_MEDIA_IN_DEVICE 0xC0000013 -#define STATUS_UNRECOGNIZED_MEDIA 0xC0000014 -#define STATUS_NONEXISTENT_SECTOR 0xC0000015 -#define STATUS_MORE_PROCESSING_REQUIRED 0xC0000016 -#define STATUS_NO_MEMORY 0xC0000017 -#define STATUS_CONFLICTING_ADDRESSES 0xC0000018 -#define STATUS_NOT_MAPPED_VIEW 0xC0000019 -#define STATUS_UNABLE_TO_FREE_VM 0xC000001A -#define STATUS_UNABLE_TO_DELETE_SECTION 0xC000001B -#define STATUS_INVALID_SYSTEM_SERVICE 0xC000001C -#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D -#define STATUS_INVALID_LOCK_SEQUENCE 0xC000001E -#define STATUS_INVALID_VIEW_SIZE 0xC000001F -#define STATUS_INVALID_FILE_FOR_SECTION 0xC0000020 -#define STATUS_ALREADY_COMMITTED 0xC0000021 -#define STATUS_ACCESS_DENIED 0xC0000022 -#define STATUS_BUFFER_TOO_SMALL 0xC0000023 -#define STATUS_OBJECT_TYPE_MISMATCH 0xC0000024 -#define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025 -#define STATUS_INVALID_DISPOSITION 0xC0000026 -#define STATUS_UNWIND 0xC0000027 -#define STATUS_BAD_STACK 0xC0000028 -#define STATUS_INVALID_UNWIND_TARGET 0xC0000029 -#define STATUS_NOT_LOCKED 0xC000002A -#define STATUS_PARITY_ERROR 0xC000002B -#define STATUS_UNABLE_TO_DECOMMIT_VM 0xC000002C -#define STATUS_NOT_COMMITTED 0xC000002D -#define STATUS_INVALID_PORT_ATTRIBUTES 0xC000002E -#define STATUS_PORT_MESSAGE_TOO_LONG 0xC000002F -#define STATUS_INVALID_PARAMETER_MIX 0xC0000030 -#define STATUS_INVALID_QUOTA_LOWER 0xC0000031 -#define STATUS_DISK_CORRUPT_ERROR 0xC0000032 -#define STATUS_OBJECT_NAME_INVALID 0xC0000033 -#define STATUS_OBJECT_NAME_NOT_FOUND 0xC0000034 -#define STATUS_OBJECT_NAME_COLLISION 0xC0000035 -#define STATUS_PORT_DISCONNECTED 0xC0000037 -#define STATUS_DEVICE_ALREADY_ATTACHED 0xC0000038 -#define STATUS_OBJECT_PATH_INVALID 0xC0000039 -#define STATUS_OBJECT_PATH_NOT_FOUND 0xC000003A -#define STATUS_PATH_SYNTAX_BAD 0xC000003B -#define STATUS_DATA_OVERRUN 0xC000003C -#define STATUS_DATA_LATE_ERROR 0xC000003D -#define STATUS_DATA_ERROR 0xC000003E -#define STATUS_CRC_ERROR 0xC000003F -#define STATUS_SECTION_TOO_BIG 0xC0000040 -#define STATUS_PORT_CONNECTION_REFUSED 0xC0000041 -#define STATUS_INVALID_PORT_HANDLE 0xC0000042 -#define STATUS_SHARING_VIOLATION 0xC0000043 -#define STATUS_QUOTA_EXCEEDED 0xC0000044 -#define STATUS_INVALID_PAGE_PROTECTION 0xC0000045 -#define STATUS_MUTANT_NOT_OWNED 0xC0000046 -#define STATUS_SEMAPHORE_LIMIT_EXCEEDED 0xC0000047 -#define STATUS_PORT_ALREADY_SET 0xC0000048 -#define STATUS_SUSPEND_COUNT_EXCEEDED 0xC000004A -#define STATUS_LOCK_NOT_GRANTED 0xC0000054 /* FIXME: not sure */ -#define STATUS_FILE_LOCK_CONFLICT 0xC0000055 /* FIXME: not sure */ -#define STATUS_UNKNOWN_REVISION 0xC0000058 -#define STATUS_INVALID_SECURITY_DESCR 0xC0000079 -#define STATUS_DISK_FULL 0xC000007F -#define STATUS_SECTION_NOT_EXTENDED 0xC0000087 -#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C -#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D -#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E -#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F -#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090 -#define STATUS_FLOAT_OVERFLOW 0xC0000091 -#define STATUS_FLOAT_STACK_CHECK 0xC0000092 -#define STATUS_FLOAT_UNDERFLOW 0xC0000093 -#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094 -#define STATUS_INTEGER_OVERFLOW 0xC0000095 -#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096 -#define STATUS_MEDIA_WRITE_PROTECTED 0XC00000A2 -#define STATUS_INVALID_PARAMETER_2 0xC00000F0 -#define STATUS_STACK_OVERFLOW 0xC00000FD -#define STATUS_DIRECTORY_NOT_EMPTY 0xC0000101 -#define STATUS_TOO_MANY_OPENED_FILES 0xC000011F -#define STATUS_CONTROL_C_EXIT 0xC000013A -#define STATUS_PIPE_BROKEN 0xC000014B -#define STATUS_NOT_REGISTRY_FILE 0xC000015C -#define STATUS_PARTITION_FAILURE 0xC0000172 -#define STATUS_INVALID_BLOCK_LENGTH 0xC0000173 -#define STATUS_DEVICE_NOT_PARTITIONED 0xC0000174 -#define STATUS_UNABLE_TO_LOCK_MEDIA 0xC0000175 -#define STATUS_UNABLE_TO_UNLOAD_MEDIA 0xC0000176 -#define STATUS_EOM_OVERFLOW 0xC0000177 -#define STATUS_NO_MEDIA 0xC0000178 -#define STATUS_NO_SUCH_MEMBER 0xC000017A -#define STATUS_INVALID_MEMBER 0xC000017B -#define STATUS_KEY_DELETED 0xC000017C -#define STATUS_NO_LOG_SPACE 0xC000017D -#define STATUS_TOO_MANY_SIDS 0xC000017E -#define STATUS_LM_CROSS_ENCRYPTION_REQUIRED 0xC000017F -#define STATUS_KEY_HAS_CHILDREN 0xC0000180 -#define STATUS_CHILD_MUST_BE_VOLATILE 0xC0000181 -#define STATUS_DEVICE_CONFIGURATION_ERROR0xC0000182 -#define STATUS_DRIVER_INTERNAL_ERROR 0xC0000183 -#define STATUS_INVALID_DEVICE_STATE 0xC0000184 -#define STATUS_IO_DEVICE_ERROR 0xC0000185 -#define STATUS_DEVICE_PROTOCOL_ERROR 0xC0000186 -#define STATUS_BACKUP_CONTROLLER 0xC0000187 -#define STATUS_LOG_FILE_FULL 0xC0000188 -#define STATUS_TOO_LATE 0xC0000189 -#define STATUS_NO_TRUST_LSA_SECRET 0xC000018A -#define STATUS_NO_TRUST_SAM_ACCOUNT 0xC000018B -#define STATUS_TRUSTED_DOMAIN_FAILURE 0xC000018C -#define STATUS_TRUSTED_RELATIONSHIP_FAILURE 0xC000018D -#define STATUS_EVENTLOG_FILE_CORRUPT 0xC000018E -#define STATUS_EVENTLOG_CANT_START 0xC000018F -#define STATUS_TRUST_FAILURE 0xC0000190 -#define STATUS_MUTANT_LIMIT_EXCEEDED 0xC0000191 -#define STATUS_NETLOGON_NOT_STARTED 0xC0000192 -#define STATUS_ACCOUNT_EXPIRED 0xC0000193 -#define STATUS_POSSIBLE_DEADLOCK 0xC0000194 -#define STATUS_NETWORK_CREDENTIAL_CONFLICT 0xC0000195 -#define STATUS_REMOTE_SESSION_LIMIT 0xC0000196 -#define STATUS_EVENTLOG_FILE_CHANGED 0xC0000197 -#define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 0xC0000198 -#define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT 0xC0000199 -#define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT 0xC000019A -#define STATUS_DOMAIN_TRUST_INCONSISTENT 0xC000019B -#define STATUS_FS_DRIVER_REQUIRED 0xC000019C - -#define STATUS_RESOURCE_LANG_NOT_FOUND 0xC0000204 - -#define MAXIMUM_WAIT_OBJECTS 64 -#define MAXIMUM_SUSPEND_COUNT 127 - - -/* - * Return values from the actual exception handlers - */ - -#define ExceptionContinueExecution 0 -#define ExceptionContinueSearch 1 -#define ExceptionNestedException 2 -#define ExceptionCollidedUnwind 3 - -/* - * Return values from filters in except() and from UnhandledExceptionFilter - */ - -#define EXCEPTION_EXECUTE_HANDLER 1 -#define EXCEPTION_CONTINUE_SEARCH 0 -#define EXCEPTION_CONTINUE_EXECUTION -1 - -/* - * From OS/2 2.0 exception handling - * Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD - */ - -#define EH_NONCONTINUABLE 0x01 -#define EH_UNWINDING 0x02 -#define EH_EXIT_UNWIND 0x04 -#define EH_STACK_INVALID 0x08 -#define EH_NESTED_CALL 0x10 - -#define EXCEPTION_CONTINUABLE 0 -#define EXCEPTION_NONCONTINUABLE EH_NONCONTINUABLE - -/* - * The exception record used by Win32 to give additional information - * about exception to exception handlers. - */ - -#define EXCEPTION_MAXIMUM_PARAMETERS 15 - -typedef struct EXCEPTION_RECORD -{ - DWORD ExceptionCode; - DWORD ExceptionFlags; - struct EXCEPTION_RECORD *ExceptionRecord; - - LPVOID ExceptionAddress; - DWORD NumberParameters; - DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD, *PEXCEPTION_RECORD; - -/* - * The exception pointers structure passed to exception filters - * in except() and the UnhandledExceptionFilter(). - */ - -typedef struct EXCEPTION_POINTERS -{ - PEXCEPTION_RECORD ExceptionRecord; - PCONTEXT ContextRecord; -} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; - - -/* - * The exception frame, used for registering exception handlers - * Win32 cares only about this, but compilers generally emit - * larger exception frames for their own use. - */ - -struct EXCEPTION_FRAME; - -typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD, struct EXCEPTION_FRAME*, - PCONTEXT, struct EXCEPTION_FRAME **); - -typedef struct EXCEPTION_FRAME -{ - struct EXCEPTION_FRAME *Prev; - PEXCEPTION_HANDLER Handler; -} EXCEPTION_FRAME, *PEXCEPTION_FRAME; - -#include "poppack.h" - -/* - * function pointer to a exception filter - */ - -typedef LONG CALLBACK (*PTOP_LEVEL_EXCEPTION_FILTER)(PEXCEPTION_POINTERS ExceptionInfo); -typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER; - -DWORD WINAPI UnhandledExceptionFilter( PEXCEPTION_POINTERS epointers ); -LPTOP_LEVEL_EXCEPTION_FILTER -WINAPI SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER filter ); - -/* status values for ContinueDebugEvent */ -#define DBG_CONTINUE 0x00010002 -#define DBG_TERMINATE_THREAD 0x40010003 -#define DBG_TERMINATE_PROCESS 0x40010004 -#define DBG_CONTROL_C 0x40010005 -#define DBG_CONTROL_BREAK 0x40010008 -#define DBG_EXCEPTION_NOT_HANDLED 0x80010001 - -typedef struct NT_TIB -{ - struct EXCEPTION_REGISTRATION_RECORD *ExceptionList; - PVOID StackBase; - PVOID StackLimit; - PVOID SubSystemTib; - union { - PVOID FiberData; - DWORD Version; - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; - struct NT_TIB *Self; -} NT_TIB, *PNT_TIB; - -struct TEB; -/* -#if ARCH_X86_32 && defined(__GNUC__) -inline struct TEB * WINAPI NtCurrentTeb(void); -inline struct TEB * WINAPI NtCurrentTeb(void) -{ - struct TEB *teb; - __asm__(".byte 0x64\n\tmovl (0x18),%0" : "=r" (teb)); - return teb; -} -#else -struct TEB * WINAPI NtCurrentTeb(void); -#endif -*/ - -/*< |