360 lines
8.3 KiB
C
360 lines
8.3 KiB
C
|
#ifndef _WIN2KPROPAGATELAYER_H
|
||
|
#define _WIN2KPROPAGATELAYER_H
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include "nt.h"
|
||
|
#include "ntrtl.h"
|
||
|
#include "nturtl.h"
|
||
|
#include "zwapi.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#define SHIM_LIB_BUILD_FLAG
|
||
|
#include "vdmdbg.h"
|
||
|
#include "stddef.h"
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include "wownt32.h"
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// WINUSERP defines TAG type which conflicts
|
||
|
// with the definition available in shimdb.h
|
||
|
// we define it inside the separate namespace
|
||
|
// avoiding any conflicts
|
||
|
//
|
||
|
|
||
|
namespace NSWOWUSERP {
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#include "winuserp.h"
|
||
|
#include "wowuserp2k.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
typedef ULONG_PTR (WINAPI *_pfn_UserRegisterWowHandlers)(NSWOWUSERP::APFNWOWHANDLERSIN apfnWowIn,
|
||
|
NSWOWUSERP::APFNWOWHANDLERSOUT apfnWowOut);
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 16-bit TDB structure, stolen from base\mvdm\inc\tdb16.h
|
||
|
// Keep this in-sync
|
||
|
//
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Task Data Block - 16 Bit Kernel Data Structure
|
||
|
*
|
||
|
* Contains all 16 bit task specific data.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#define numTaskInts 7
|
||
|
#define THUNKELEM 8 // (62*8) = 512-16 (low arena overhead)
|
||
|
#define THUNKSIZE 8
|
||
|
|
||
|
|
||
|
|
||
|
#pragma pack(2)
|
||
|
|
||
|
typedef struct TDB { /* tdb16 */
|
||
|
|
||
|
WORD TDB_next ; // next task in dispatch queue
|
||
|
WORD TDB_taskSP ; // Saved SS:SP for this task
|
||
|
WORD TDB_taskSS ; //
|
||
|
WORD TDB_nEvents ; // Task event counter
|
||
|
BYTE TDB_priority ; // Task priority (0 is highest)
|
||
|
BYTE TDB_thread_ordinal ; // ordinal number of this thread
|
||
|
WORD TDB_thread_next ; // next thread
|
||
|
WORD TDB_thread_tdb ; // the real TDB for this task
|
||
|
WORD TDB_thread_list ; // list of allocated thread structures
|
||
|
WORD TDB_thread_free ; // free list of availble thread structures
|
||
|
WORD TDB_thread_count ; // total count of tread structures
|
||
|
WORD TDB_FCW ; // Floating point control word
|
||
|
BYTE TDB_flags ; // Task flags
|
||
|
BYTE TDB_filler ; // keep word aligned
|
||
|
WORD TDB_ErrMode ; // Error mode for this task
|
||
|
WORD TDB_ExpWinVer ; // Expected Windows version for this task
|
||
|
WORD TDB_Module ; // Task module handle to free in killtask
|
||
|
WORD TDB_pModule ; // Pointer to the module database.
|
||
|
WORD TDB_Queue ; // Task Event Queue pointer
|
||
|
WORD TDB_Parent ; // TDB of the task that started this up
|
||
|
WORD TDB_SigAction ; // Action for app task signal
|
||
|
DWORD TDB_ASignalProc ; // App's Task Signal procedure address
|
||
|
DWORD TDB_USignalProc ; // User's Task Signal procedure address
|
||
|
DWORD TDB_GNotifyProc ; // Task global discard notify proc.
|
||
|
DWORD TDB_INTVECS[numTaskInts] ; // Task specfic harare interrupts
|
||
|
WORD TDB_CompatFlags ; // Compatibility flags
|
||
|
WORD TDB_CompatFlags2 ; // Upper 16 bits
|
||
|
WORD TDB_CompatHandle ; // for dBase bug
|
||
|
WORD TDB_WOWCompatFlagsEx ; // More WOW Compatibility flags
|
||
|
WORD TDB_WOWCompatFlagsEx2 ; // Upper 16 bits
|
||
|
BYTE TDB_Free[3] ; // Filler to keep TDB size unchanged
|
||
|
BYTE TDB_cLibrary ; // tracks add/del of ALL libs in system EMS
|
||
|
DWORD TDB_PHT ; // (HANDLE:OFFSET) to private handle table
|
||
|
WORD TDB_PDB ; // MSDOS Process Data Block (PDB)
|
||
|
DWORD TDB_DTA ; // MSDOS Disk Transfer Address
|
||
|
BYTE TDB_Drive ; // MSDOS current drive
|
||
|
BYTE TDB_Directory[65] ; // *** not used starting with win95
|
||
|
WORD TDB_Validity ; // initial AX to be passed to a task
|
||
|
WORD TDB_Yield_to ; // DirectedYield arg stored here
|
||
|
WORD TDB_LibInitSeg ; // segment address of libraries to init
|
||
|
WORD TDB_LibInitOff ; // MakeProcInstance thunks live here.
|
||
|
WORD TDB_MPI_Sel ; // Code selector for thunks
|
||
|
WORD TDB_MPI_Thunks[((THUNKELEM*THUNKSIZE)/2)]; //
|
||
|
BYTE TDB_ModName[8] ; // Name of Module.
|
||
|
WORD TDB_sig ; // Signature word to detect bogus code
|
||
|
DWORD TDB_ThreadID ; // 32-Bit Thread ID for this Task (use TDB_Filler Above)
|
||
|
DWORD TDB_hThread ; // 32-bit Thread Handle for this task
|
||
|
WORD TDB_WOWCompatFlags; // WOW Compatibility flags
|
||
|
WORD TDB_WOWCompatFlags2; // WOW Compatibility flags
|
||
|
#ifdef FE_SB
|
||
|
WORD TDB_WOWCompatFlagsJPN; // WOW Compatibility flags for JAPAN
|
||
|
WORD TDB_WOWCompatFlagsJPN2; // WOW Compatibility flags for JAPAN
|
||
|
#endif // FE_SB
|
||
|
DWORD TDB_vpfnAbortProc; // printer AbortProc
|
||
|
BYTE TDB_LFNDirectory[260]; // Long directory name
|
||
|
|
||
|
} TDB;
|
||
|
typedef TDB UNALIGNED *PTDB;
|
||
|
|
||
|
// This bit is defined for the TDB_Drive field
|
||
|
#define TDB_DIR_VALID 0x80
|
||
|
#define TDB_SIGNATURE 0x4454
|
||
|
|
||
|
#define TDBF_OS2APP 0x8
|
||
|
#define TDBF_WINOLDAP 0x1
|
||
|
|
||
|
|
||
|
// NOTE TDB_ThreadID MUST be DWORD aligned or else it will fail on MIPS
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// DOSPDB structure, stolen from base\mvdm\inc\doswow.h
|
||
|
//
|
||
|
//
|
||
|
|
||
|
|
||
|
#pragma pack(1)
|
||
|
|
||
|
typedef struct _DOSPDB { // DOS Process Data Block
|
||
|
CHAR PDB_Not_Interested[44]; // Fields we are not interested in
|
||
|
USHORT PDB_environ; // segment of environment
|
||
|
DWORD PDB_User_stack;
|
||
|
USHORT PDB_JFN_Length; // JFT length
|
||
|
ULONG PDB_JFN_Pointer; // JFT pointer
|
||
|
} DOSPDB, *PDOSPDB;
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//
|
||
|
// Variables and functions that are local to this project
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// defined in wowprocesshistory.cpp
|
||
|
//
|
||
|
|
||
|
extern CHAR g_szCompatLayerVar[];
|
||
|
extern CHAR g_szProcessHistoryVar[];
|
||
|
extern CHAR g_szShimFileLogVar[];
|
||
|
|
||
|
extern WCHAR g_wszCompatLayerVar[];
|
||
|
|
||
|
extern BOOL g_bIsNTVDM;
|
||
|
extern BOOL g_bIsExplorer;
|
||
|
|
||
|
extern WCHAR* g_pwszCompatLayer;
|
||
|
|
||
|
//
|
||
|
// Function in Win2kPropagateLayer that allows us to create env from wow data
|
||
|
//
|
||
|
|
||
|
LPVOID
|
||
|
ShimCreateWowEnvironment_U(
|
||
|
LPVOID lpEnvironment, // pointer to the existing environment
|
||
|
DWORD* lpdwFlags, // process creation flags
|
||
|
BOOL bNewEnvironment // when set, forces us to clone environment ptr
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// functions in environment.cpp
|
||
|
//
|
||
|
PSZ
|
||
|
ShimFindEnvironmentVar(
|
||
|
PSZ pszName,
|
||
|
PSZ pszEnv,
|
||
|
PSZ* ppszVal
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
ShimGetEnvironmentSize(
|
||
|
PSZ pszEnv,
|
||
|
LPDWORD pStrCount
|
||
|
);
|
||
|
|
||
|
DWORD
|
||
|
ShimGetEnvironmentSize(
|
||
|
WCHAR* pwszEnv,
|
||
|
LPDWORD pStrCount
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ShimCloneEnvironment(
|
||
|
LPVOID* ppEnvOut,
|
||
|
LPVOID lpEnvironment,
|
||
|
BOOL bUnicode
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ShimFreeEnvironment(
|
||
|
LPVOID lpEnvironment
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ShimSetEnvironmentVar(
|
||
|
LPVOID* ppEnvironment,
|
||
|
WCHAR* pwszVarName,
|
||
|
WCHAR* pwszVarValue
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// stuff in wowtask.cpp
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Structure to reflect WOW environment values
|
||
|
//
|
||
|
|
||
|
typedef struct tagWOWENVDATA {
|
||
|
|
||
|
PSZ pszCompatLayer; // fully-formed compat layer variable
|
||
|
PSZ pszCompatLayerVal;
|
||
|
|
||
|
PSZ pszProcessHistory; // fully-formed process history variable
|
||
|
PSZ pszProcessHistoryVal;
|
||
|
|
||
|
PSZ pszShimFileLog; // file log variable
|
||
|
PSZ pszShimFileLogVal;
|
||
|
|
||
|
// buffer that we use for the accomulated process history,
|
||
|
PSZ pszCurrentProcessHistory;
|
||
|
|
||
|
} WOWENVDATA, *PWOWENVDATA;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// function to retrieve all the "interesting" things out of wow environment
|
||
|
//
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
ShimRetrieveVariablesEx(
|
||
|
PWOWENVDATA pData
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Store information about wow task
|
||
|
//
|
||
|
|
||
|
BOOL
|
||
|
UpdateWowTaskList(
|
||
|
WORD hTask16
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// wow task exits, cleanup the list
|
||
|
//
|
||
|
|
||
|
BOOL
|
||
|
CleanupWowTaskList(
|
||
|
WORD hTask16
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Functions in cleanup.cpp
|
||
|
//
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
CleanupRegistryForCurrentExe(
|
||
|
void
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// functions in win2kpropagatelayer.cpp
|
||
|
//
|
||
|
|
||
|
void
|
||
|
InitLayerStorage(
|
||
|
BOOL bDelete
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
AddSupport(
|
||
|
LPCWSTR lpCommandLine,
|
||
|
LPVOID* ppEnvironment,
|
||
|
LPDWORD lpdwCreationFlags
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
CheckAndShimNTVDM(
|
||
|
WORD hTask16
|
||
|
);
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Exception filter, proto for the function in WowProcessHistory.cpp
|
||
|
//
|
||
|
//
|
||
|
|
||
|
ULONG
|
||
|
Win2kPropagateLayerExceptionHandler(
|
||
|
PEXCEPTION_POINTERS pexi,
|
||
|
char * szFile,
|
||
|
DWORD dwLine
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Exception filter to use with our hooks
|
||
|
//
|
||
|
|
||
|
#define WOWPROCESSHISTORYEXCEPTIONFILTER \
|
||
|
Win2kPropagateLayerExceptionHandler(GetExceptionInformation(), __FILE__, __LINE__)
|
||
|
|
||
|
|
||
|
#endif // _WIN2KPROPAGATELAYER_H
|
||
|
|