mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
416 lines
15 KiB
416 lines
15 KiB
/*++ BUILD Version: 0001
|
|
*
|
|
* WOW v1.0
|
|
*
|
|
* Copyright (c) 1991, Microsoft Corporation
|
|
*
|
|
* WALIAS.H
|
|
* WOW32 16-bit handle alias support
|
|
*
|
|
* History:
|
|
* Created 27-Jan-1991 by Jeff Parsons (jeffpar)
|
|
* Modified 12-May-1992 by Mike Tricker (miketri) to add MultiMedia support
|
|
--*/
|
|
|
|
typedef HANDLE HAND32;
|
|
|
|
#define _WALIAS_
|
|
#include "wspool.h"
|
|
#include "wowuserp.h"
|
|
|
|
|
|
/* WOW class/handle type identifiers (see WARNING below)
|
|
*/
|
|
#define WOWCLASS_UNKNOWN 0 // here begin our "window handle" classes
|
|
#define WOWCLASS_WIN16 1
|
|
#define WOWCLASS_BUTTON 2
|
|
#define WOWCLASS_COMBOBOX 3
|
|
#define WOWCLASS_EDIT 4
|
|
#define WOWCLASS_LISTBOX 5
|
|
#define WOWCLASS_MDICLIENT 6
|
|
#define WOWCLASS_SCROLLBAR 7
|
|
#define WOWCLASS_STATIC 8
|
|
#define WOWCLASS_DESKTOP 9
|
|
#define WOWCLASS_DIALOG 10
|
|
#define WOWCLASS_ICONTITLE 11
|
|
#define WOWCLASS_MENU 12
|
|
#define WOWCLASS_SWITCHWND 13
|
|
#define WOWCLASS_COMBOLBOX 14
|
|
#define WOWCLASS_MAX 14 // Always equal to the last value used.
|
|
|
|
#define WOWCLASS_NOTHUNK 0xFF // not an actual class index
|
|
//
|
|
// WARNING! The above sequence and values must be maintained otherwise the
|
|
// table in WMSG16.C for message thunking must be changed. Same goes for
|
|
// table in WALIAS.C.
|
|
//
|
|
|
|
|
|
//
|
|
//
|
|
// The WC structure is present in every CLS structure in the system,
|
|
// although USER32 defines it as an array of 2 DWORDs. FindPWC(hwnd)
|
|
// returns a read-only pointer to the WC structure for a given window's
|
|
// class. Note that only classes registered by Win16 applications will
|
|
// have meaningful values in the structure. To change elements of the
|
|
// structure, use SETWC (== SetClassLong) with the appropriate GCL_WOW*
|
|
// offset defined below.
|
|
//
|
|
|
|
typedef struct _WC { /* wcd */
|
|
VPWNDPROC vpfnWndProc; // 16-bit window proc address
|
|
VPSZ vpszMenu; // pointer to original copy of menu name, if any
|
|
} WC, *PWC, **PPWC;
|
|
|
|
#define GCL_WOWvpfnWndProc GCL_WOWDWORD1
|
|
#define GCL_WOWvpszMenu GCL_WOWDWORD2
|
|
|
|
#define SETWC(hwnd, nIndex, l) SetClassLong(hwnd, nIndex, l)
|
|
|
|
#define GWL_WOWiClassAndflState GWL_WOWDWORD1
|
|
#define GWL_WOWvpfnWndProc GWL_WOWDWORD2
|
|
#define GWL_WOWvpfnDlgProc GWL_WOWDWORD3
|
|
|
|
#define SETWL(hwnd, nIndex, l) SetWindowLong(hwnd, nIndex, l)
|
|
#define MAKECLASSANDSTATE(class,state) MAKELONG((class),(state))
|
|
|
|
// defines for flState of WW struct.
|
|
|
|
#define WWSTATE_ICLASSISSET 0x00000001
|
|
#define WWSTATE_FAKEDIALOGCLASS 0x00000002
|
|
|
|
|
|
typedef struct _HDW {
|
|
struct _HDW *Next; // pointer to next hDDE alias
|
|
HANDLE hdwp32; // handle of WOW allocated 32 bit object
|
|
} HDW, *PHDW;
|
|
|
|
|
|
/* Handle mapping macros
|
|
*/
|
|
|
|
//
|
|
// The 32-bit hInstance for a 16-bit task will be hMod / hInst.
|
|
// The hModule/hInstnace for a 32-bit entity will be xxxx / 0000.
|
|
//
|
|
// FritzS 8/13/92
|
|
//
|
|
|
|
#define HINSTRES32(h16) ((h16)?HMODINST32(h16):(HANDLE)NULL)
|
|
|
|
//
|
|
// The THREADID32 and HTASK32 macros are nearly equivalent, but the
|
|
// WOWHandle mapping uses the one which will detect aliases (see WOLE2.C).
|
|
// Most other functions don't need alias detection and it is too late
|
|
// to test with the more general.
|
|
//
|
|
|
|
#ifdef DEBUG
|
|
|
|
//
|
|
// Check for task aliases that will cause us to fault if we dereference the NULL
|
|
// pointer returned by SEGPTR(htask16,0).
|
|
//
|
|
|
|
#define THREADID32(htask16) \
|
|
((htask16) \
|
|
? (ISTASKALIAS(htask16) \
|
|
? (WOW32ASSERTMSGF(FALSE, \
|
|
("WOW32 ERROR %s line %d Task alias " \
|
|
"to THREADID32, use HTASK32 instead.\n", \
|
|
szModule, __LINE__)), 0) \
|
|
: ((PTDB)SEGPTR((htask16),0))->TDB_ThreadID) \
|
|
: 0)
|
|
#else
|
|
#define THREADID32(htask16) ((htask16) \
|
|
? ((PTDB)SEGPTR((htask16),0))->TDB_ThreadID \
|
|
: 0)
|
|
#endif
|
|
|
|
#define HTASK32(htask16) (Htask16toThreadID32(htask16))
|
|
#define GETHTASK16(htask32) (ThreadID32toHtask16((DWORD)htask32))
|
|
|
|
#define ISINST16(h32) (((INT)(h32) & 0x0000ffff) != 0)
|
|
#define HMODINST32(h16) ((HANDLE) MAKELONG(h16, GetExePtr16(h16)))
|
|
#define GETHINST16(h32) ((HAND16)(INT)(h32))
|
|
#define GETHMOD16(h32) ((HAND16)(INT)(HIWORD(h32)))
|
|
|
|
#define ISMEM16(h32) (((INT)(h32) & 0xFFFF0000) == 0)
|
|
#define HMEM32(h16) ((HANDLE)(INT)(h16))
|
|
#define GETHMEM16(h32) ((HMEM16)(INT)(h32))
|
|
|
|
#define ISRES16(h32) ((INT)(h32)&1)
|
|
#define HRES32(p) ((p)?(HANDLE)((INT)(p)|1):(HANDLE)NULL)
|
|
#define GETHRES16(h32) ((PRES)((INT)(h32)&~1))
|
|
|
|
//
|
|
// USER handle mapping WARNING:
|
|
//
|
|
// When using any of the following macros, beware:
|
|
//
|
|
// Macro Safe function call equivalent
|
|
// --------------------- -----------------------------
|
|
// USER32 GetUser32
|
|
// HWND32 GetHwnd32
|
|
// HMENU32 GetHmenu32
|
|
//
|
|
// The macro versions of the USER handle mapping functions evaluate their
|
|
// argument twice, so be extra careful to avoid the following type of
|
|
// error:
|
|
//
|
|
// h32 = HWND32(callback16(...)); // WRONG!!
|
|
//
|
|
// The above statement calls CreateWindows twice! Instead use the equivalent
|
|
// function call from the table above, which is safe for arguments that must
|
|
// only be evaluated once:
|
|
//
|
|
// h32 = GetHwnd32(callback16(...)); // Correct
|
|
//
|
|
// Use the macro form only when it's safe to evaluate the argument twice:
|
|
//
|
|
// h32 = HWND32(h16); // Correct
|
|
//
|
|
|
|
#define USER32(h16) ((HAND32)(INT)(SHORT)(h16))
|
|
#define USER16(h32) ((HAND16)h32)
|
|
|
|
#define HWND32(h16) USER32(h16)
|
|
#define FULLHWND32(h16) (pfnOut.pfnGetFullUserHandle)(h16)
|
|
#define GETHWND16(h32) USER16(h32)
|
|
#define GETHWNDIA16(h32) GETHWND16(h32)
|
|
#define HWNDIA32(h16) HWND32(h16)
|
|
|
|
#define HMENU32(h16) USER32(h16)
|
|
#define GETHMENU16(h32) USER16(h32)
|
|
|
|
|
|
#define SERVERHANDLE(h) (HIWORD(h))
|
|
|
|
#define GDI32(h16) (HANDLE) hConvert16to32(h16)
|
|
#define GDI16(h32) (HAND16) (((DWORD) (h32)) << 2)
|
|
|
|
#define HGDI16(hobj32) GDI16((HAND32)(hobj32))
|
|
|
|
#define HDC32(hdc16) GDI32((HAND16)(hdc16))
|
|
#define GETHDC16(hdc32) GDI16((HAND32)(hdc32))
|
|
#define FREEHDC16(hdc16)
|
|
|
|
#define HFONT32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHFONT16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHFONT16(hobj16)
|
|
|
|
#define HMETA32(hobj16) ((HANDLE)HMFFromWinMetaFile((HAND16)(hobj16),FALSE))
|
|
#define GETHMETA16(hobj32) ((HAND16)WinMetaFileFromHMF((HMETAFILE)(hobj32),FALSE))
|
|
#define FREEHMETA16(hobj16)
|
|
|
|
#define HRGN32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHRGN16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHRGN16(hobj16)
|
|
|
|
#define HBITMAP32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHBITMAP16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHBITMAP16(hobj16)
|
|
|
|
#define HBRUSH32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHBRUSH16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHBRUSH16(hobj16)
|
|
|
|
#define HPALETTE32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHPALETTE16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHPALETTE16(hobj16)
|
|
|
|
#define HPEN32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHPEN16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHPEN16(hobj16)
|
|
|
|
#define HOBJ32(hobj16) GDI32((HAND16)(hobj16))
|
|
#define GETHOBJ16(hobj32) GDI16((HAND32)(hobj32))
|
|
#define FREEHOBJ16(hobj16)
|
|
|
|
#define HDROP32(hobj16) (HDROP)DropFilesHandler((HAND16)(hobj16), 0, HDROP_H16 | HDROP_ALLOCALIAS)
|
|
#define GETHDROP16(hobj32) (HAND16)DropFilesHandler(0, (HAND32)(hobj32), HDROP_H32 | HDROP_ALLOCALIAS)
|
|
#define FREEHDROP16(hobj16) (HDROP)DropFilesHandler((HAND16)(hobj16), 0, HDROP_H16 | HDROP_FREEALIAS)
|
|
|
|
#define HMODULE32(h16) ((HANDLE)(h16)) // bogus
|
|
#define GETHMODULE16(h32) ((HAND16)(h32)) // bogus
|
|
|
|
#define HLOCAL32(h16) ((HANDLE)(h16)) // bogus
|
|
#define GETHLOCAL16(h32) ((HAND16)(h32)) // bogus
|
|
|
|
#define HANDLE32(h16) ((HANDLE)(h16)) // bogus (used in wucomm.c)
|
|
#define GETHANDLE16(h32) ((HAND16)(h32)) // bogus (used in wucomm.c)
|
|
|
|
#define BOGUSHANDLE32(h16) ((DWORD)(h16)) // bogus
|
|
|
|
#define HDWP32(hdwp16) Prn32((HAND16)(hdwp16))
|
|
#define GETHDWP16(hdwp32) GetPrn16((HAND32)(hdwp32))
|
|
#define FREEHDWP16(h16) FreePrn((HAND16)(h16))
|
|
|
|
|
|
/*
|
|
* MultiMedia handle mappings - MikeTri 12-May-1992
|
|
*
|
|
* change WOWCLASS_UNKNOWN to WOWCLASS_WIN16 MikeTri 210292
|
|
*/
|
|
|
|
#define HDRVR32(hdrvr16) GetMMedia32((HAND16)(hdrvr16))
|
|
#define GETHDRVR16(hdrvr32) GetMMedia16((HAND32)(hdrvr32), WOWCLASS_WIN16)
|
|
#define FREEHDRVR16(hdrvr16) FreeMMedia16((HAND16)(hdrvr16))
|
|
|
|
#define HMMIO32(hmmio16) GetMMedia32((HAND16)(hmmio16))
|
|
#define GETHMMIO16(hmmio32) GetMMedia16((HAND32)(hmmio32), WOWCLASS_WIN16)
|
|
#define FREEHMMIO16(hmmio16) FreeMMedia16((HAND16)(hmmio16))
|
|
|
|
#define HMIDIIN32(hmidiin16) GetMMedia32((HAND16)(hmidiin16))
|
|
#define GETHMIDIIN16(hmidiin32) GetMMedia16((HAND32)(hmidiin32), WOWCLASS_WIN16)
|
|
#define FREEHMIDIIN16(hmidiin16) FreeMMedia16((HAND16)(hmidiin16))
|
|
|
|
#define HMIDIOUT32(hmidiout16) GetMMedia32((HAND16)(hmidiout16))
|
|
#define GETHMIDIOUT16(hmidiout32) GetMMedia16((HAND32)(hmidiout32), WOWCLASS_WIN16)
|
|
#define FREEHMIDIOUT16(hmidiout16) FreeMMedia16((HAND16)(hmidiout16))
|
|
|
|
#define HWAVEIN32(hwavein16) GetMMedia32((HAND16)(hwavein16))
|
|
#define GETHWAVEIN16(hwavein32) GetMMedia16((HAND32)(hwavein32), WOWCLASS_WIN16)
|
|
#define FREEHWAVEIN16(hwavein16) FreeMMedia16((HAND16)(hwavein16))
|
|
|
|
#define HWAVEOUT32(hwaveout16) GetMMedia32((HAND16)(hwaveout16))
|
|
#define GETHWAVEOUT16(hwaveout32) GetMMedia16((HAND32)(hwaveout32), WOWCLASS_WIN16)
|
|
#define FREEHWAVEOUT16(hwaveout16) FreeMMedia16((HAND16)(hwaveout16))
|
|
|
|
/* Function prototypes
|
|
*/
|
|
|
|
INT GetStdClassNumber(PSZ pszClass);
|
|
WNDPROC GetStdClassWndProc(DWORD iClass);
|
|
DWORD GetStdClassThunkProc(INT iClass);
|
|
|
|
PWC FindPWC (HANDLE h32);
|
|
PWC FindClass16 (LPCSTR pszClass, HINST16 hInst16);
|
|
PWW FindPWW (HAND32 h32, INT iClass);
|
|
|
|
HAND16 GetMMedia16 (HANDLE h32, INT iClass); //MultiMedia additions - MikeTri 12-May-1992
|
|
HANDLE GetMMedia32 (HAND16 h16);
|
|
VOID FreeMMedia16 (HAND16 h16);
|
|
|
|
HAND16 GetWinsock16 (INT h32, INT iClass); //Winsock additions - DavidTr 4-Oct-1992
|
|
DWORD GetWinsock32 (HAND16 h16);
|
|
VOID FreeWinsock16 (HAND16 h16);
|
|
|
|
BOOL MessageNeedsThunking (UINT uMsg);
|
|
|
|
DWORD Htask16toThreadID32(HTASK16 htask16);
|
|
|
|
/* Dialog function data
|
|
*/
|
|
|
|
typedef struct _DLGDATA { /* dlgdata */
|
|
VPPROC vpfnDlgProc; // 16-bit dialog function
|
|
DWORD dwUserInitParam; // user init param, if any
|
|
} DLGDATA, *PDLGDATA;
|
|
|
|
|
|
/* Data structure used in thunking LB_GETTEXT special case
|
|
*/
|
|
|
|
typedef struct _THUNKTEXTDWORD {
|
|
BOOL fDWORD; // dword used or text
|
|
DWORD dwDataItem; // dword
|
|
} THUNKTEXTDWORD, *PTHUNKTEXTDWORD;
|
|
|
|
typedef union _MSGTHUNKBUFFER {
|
|
MSG msg;
|
|
DRAWITEMSTRUCT ditem;
|
|
MEASUREITEMSTRUCT mitem;
|
|
DELETEITEMSTRUCT delitem;
|
|
COMPAREITEMSTRUCT cmpitem;
|
|
RECT rect;
|
|
DLGDATA dlgdata;
|
|
CREATESTRUCT cstruct;
|
|
WINDOWPOS winpos;
|
|
CLIENTCREATESTRUCT clcstruct;
|
|
MDINEXTMENU mnm;
|
|
MDICREATESTRUCT mdis;
|
|
DROPSTRUCT dps;
|
|
POINT pt[5]; // WM_GETMINMAXINFO
|
|
UINT uinteger[2]; // SBM_GETRANGE
|
|
BYTE cmdichild[sizeof(CREATESTRUCT) +
|
|
sizeof(MDICREATESTRUCT)]; // FinishThunking...
|
|
BYTE cmdiclient[sizeof(CREATESTRUCT) +
|
|
sizeof(CLIENTCREATESTRUCT)]; // FinishThunking...
|
|
BYTE calcsz[sizeof(NCCALCSIZE_PARAMS) +
|
|
sizeof(WINDOWPOS)];
|
|
THUNKTEXTDWORD thkdword; // LB_GETTEXT w/no HASSTRINGS
|
|
} MSGTHUNKBUFFER, *LPMSGTHUNKBUFFER;
|
|
|
|
typedef struct _MSGPARAMEX *LPMSGPARAMEX;
|
|
typedef BOOL (FASTCALL *LPFNTHUNKMSG16)(LPMSGPARAMEX lpmpex);
|
|
typedef VOID (FASTCALL *LPFNUNTHUNKMSG16)(LPMSGPARAMEX lpmpex);
|
|
|
|
typedef struct _MSGPARAMEX {
|
|
PARM16 Parm16;
|
|
HWND hwnd;
|
|
UINT uMsg;
|
|
UINT uParam;
|
|
LONG lParam;
|
|
LONG lReturn;
|
|
LPFNUNTHUNKMSG16 lpfnUnThunk16;
|
|
PWW pww;
|
|
INT iMsgThunkClass; // thunking aid
|
|
INT iClass;
|
|
MSGTHUNKBUFFER MsgBuffer[1];
|
|
} MSGPARAMEX;
|
|
|
|
#define MSG16NEEDSTHUNKING(lpmpex) ((lpmpex)->iClass != WOWCLASS_NOTHUNK)
|
|
|
|
// Used for compatibility sake. If app gets The hInstance of a 32bit window
|
|
// (the loword of 32bit hinstance is zero) then return a bogus gdt.
|
|
//
|
|
// Subsequently, if the app does a getmodulefilename on it we will return a
|
|
// a fake 32bit modulename.
|
|
//
|
|
// This is required for a couple of HDC apps and 16bit recorder.
|
|
//
|
|
// - Nanduri
|
|
//
|
|
|
|
#define BOGUSGDT 0xfff0
|
|
#define VALIDHMOD(h32) (((h32) && !(WORD)(h32)) ? BOGUSGDT : (WORD)(h32))
|
|
|
|
|
|
|
|
// For DEVMODE struct handling
|
|
// We add a little extra to devmode sizes that we return to 16-bit apps
|
|
// including a signature "DM31" at the end of the driver extra stuff
|
|
// See notes in wstruc.c
|
|
|
|
typedef struct _WOWDM31 {
|
|
DWORD dwWOWSig;
|
|
WORD dmSpecVersion;
|
|
WORD dmSize;
|
|
WORD dmDriverExtra;
|
|
WORD reserved; // pad to even DWORD (required for ptr arithmetic)
|
|
} WOWDM31;
|
|
typedef WOWDM31 UNALIGNED *PWOWDM31;
|
|
|
|
// WOW DEVMODE magic signature
|
|
#define WOW_DEVMODE31SIG 0x444d3331 // "DM31"
|
|
|
|
// Win3.1 DEVMODE spec
|
|
#define WOW_DEVMODE31SPEC 0x30A
|
|
|
|
// Constant we add to Win3.1 DevMode->DriverExtra to account for the NT Devmode
|
|
// fields not in the Win3.1 devmode & the WOW thunk info we add to the end
|
|
#define WOW_DEVMODEEXTRA ((sizeof(DEVMODE)-sizeof(DEVMODE31))+sizeof(WOWDM31))
|
|
|
|
|
|
|
|
extern WORD gUser16hInstance;
|
|
ULONG GetGCL_HMODULE(HWND hwnd);
|
|
|
|
#define ISFUNCID(dwcallid) (!((DWORD)(dwcallid) & 0xffff0000))
|
|
#define POSTMSG(dwLocal) (ISFUNCID(dwLocal = \
|
|
FRAMEPTR(CURRENTPTD()->vpStack)->wCallID) ? \
|
|
(aw32WOW[dwLocal].lpfnW32 == WU32PostMessage) : \
|
|
(dwLocal == (DWORD) WU32PostMessage))
|
|
|
|
ULONG WOW32FaxHandler(UINT iFun, LPSTR lpIn);
|