/* * Win95 Flat Thunk data structures * * Copyright 1998 Ulrich Weigand */ #ifndef __WINE_FLATTHUNK_H #define __WINE_FLATTHUNK_H #include "windef.h" struct ThunkDataCommon { char magic[4]; /* 00 */ DWORD checksum; /* 04 */ }; struct ThunkDataLS16 { struct ThunkDataCommon common; /* 00 */ SEGPTR targetTable; /* 08 */ DWORD firstTime; /* 0C */ }; struct ThunkDataLS32 { struct ThunkDataCommon common; /* 00 */ DWORD * targetTable; /* 08 */ char lateBinding[4]; /* 0C */ DWORD flags; /* 10 */ DWORD reserved1; /* 14 */ DWORD reserved2; /* 18 */ DWORD offsetQTThunk; /* 1C */ DWORD offsetFTProlog; /* 20 */ }; struct ThunkDataSL16 { struct ThunkDataCommon common; /* 00 */ DWORD flags1; /* 08 */ DWORD reserved1; /* 0C */ struct ThunkDataSL * fpData; /* 10 */ SEGPTR spData; /* 14 */ DWORD reserved2; /* 18 */ char lateBinding[4]; /* 1C */ DWORD flags2; /* 20 */ DWORD reserved3; /* 20 */ SEGPTR apiDatabase; /* 28 */ }; struct ThunkDataSL32 { struct ThunkDataCommon common; /* 00 */ DWORD reserved1; /* 08 */ struct ThunkDataSL * data; /* 0C */ char lateBinding[4]; /* 10 */ DWORD flags; /* 14 */ DWORD reserved2; /* 18 */ DWORD reserved3; /* 1C */ DWORD offsetTargetTable; /* 20 */ }; struct ThunkDataSL { #if 0 This structure differs from the Win95 original, but this should not matter since it is strictly internal to the thunk handling routines in KRNL386 / KERNEL32. For reference, here is the Win95 layout: struct ThunkDataCommon common; /* 00 */ DWORD flags1; /* 08 */ SEGPTR apiDatabase; /* 0C */ WORD exePtr; /* 10 */ WORD segMBA; /* 12 */ DWORD lenMBATotal; /* 14 */ DWORD lenMBAUsed; /* 18 */ DWORD flags2; /* 1C */ char pszDll16[256]; /* 20 */ char pszDll32[256]; /*120 */ We do it differently since all our thunk handling is done by 32-bit code. Therefore we do not need do provide easy access to this data, especially the process target table database, for 16-bit code. #endif struct ThunkDataCommon common; DWORD flags1; struct SLApiDB * apiDB; struct SLTargetDB * targetDB; DWORD flags2; char pszDll16[256]; char pszDll32[256]; }; struct SLTargetDB { struct SLTargetDB * next; DWORD process; DWORD * targetTable; }; struct SLApiDB { DWORD nrArgBytes; DWORD errorReturnValue; }; #endif /* __WINE_FLATTHUNK_H */