|
|
/*++
* * WOW v1.0 * * Copyright (c) 1991, Microsoft Corporation * * WCALL32.C * WOW32 16-bit resource support * * History: * Created 11-Mar-1991 by Jeff Parsons (jeffpar) --*/
#include "precomp.h"
#pragma hdrstop
MODNAME(wcall32.c);
//
// the 16-bit local handles are treated as 32-bit quantities.
// the low word contains the 16-bit handle and the high word
// contains the data segment for the block.
// when we do a callback to WOW16LocalAlloc it will
// return the DS in the high word (which is normally unused).
// on subsequent callbacks to realloc/lock/unlock/size/free
// the 16-bit code sets the DS to this value.
//
HANDLE APIENTRY W32LocalAlloc(UINT dwFlags, UINT dwBytes, HANDLE hInstance) {
//
// If hInstance is not ours, then make Win32 call and return the
// result to USER.
//
if (LOWORD (hInstance) == 0) { return (LocalAlloc(dwFlags, dwBytes)); }
#if !defined(i386)
if (dwBytes != 0) dwBytes += 4; #endif
return LocalAlloc16((WORD)dwFlags, (INT)dwBytes, hInstance); }
// This api takes an extra pointer which is optional
// In case of an edit control reallocating the memory inside apps memory
// space it is used to update the thunk data (see wparam.c)
HANDLE APIENTRY W32LocalReAlloc( HANDLE hMem, // memory to be reallocated
UINT dwBytes, // size to reallocate to
UINT dwFlags, // reallocation flags
HANDLE hInstance, // Instance to identify ptr
PVOID* ppv) // Pointer to the pointer that needs an update
{ //
// If hInstance is not ours, then make Win32 call and return the
// result to USER.
//
if (LOWORD (hInstance) == 0) { return (LocalReAlloc(hMem, dwBytes, dwFlags)); }
#if !defined(i386)
if (dwBytes != 0) dwBytes += 4; #endif
hMem = LocalReAlloc16(hMem, (INT)dwBytes, (WORD)dwFlags);
// this code is used in User/Client (edit control) to realloc
// memory for text storage
// update what ppv points to using wparam.c
if (NULL != ppv && NULL != *ppv) { *ppv = ParamMapUpdateNode((DWORD)*ppv, PARAM_32, NULL); }
return hMem; }
LPSTR APIENTRY W32LocalLock(HANDLE hMem, HANDLE hInstance) { VPVOID vp;
//
// If hInstance is not ours, then make Win32 call and return the
// result to USER.
//
if (LOWORD (hInstance) == 0) { return (LocalLock(hMem)); }
if (vp = LocalLock16(hMem)) { return (LPSTR)VDMPTR(vp, 0); } else return NULL; }
BOOL APIENTRY W32LocalUnlock(HANDLE hMem, HANDLE hInstance) {
//
// If hInstance is not ours, then make Win32 call and return the
// result to USER.
//
if (LOWORD (hInstance) == 0) { return (LocalUnlock(hMem)); }
return LocalUnlock16(hMem); }
DWORD APIENTRY W32LocalSize(HANDLE hMem, HANDLE hInstance) { DWORD dwSize;
//
// If hInstance is not ours, then make Win32 call and return the
// result to USER.
//
if (LOWORD (hInstance) == 0) { return (LocalSize(hMem)); }
dwSize = LocalSize16(hMem);
#if !defined(i386)
if (dwSize >= 4) dwSize -= 4; #endif
return dwSize; }
HANDLE APIENTRY W32LocalFree(HANDLE hMem, HANDLE hInstance) {
//
// If hInstance is not ours, then make Win32 call and return the
// result to USER.
//
if (LOWORD (hInstance) == 0) { return (LocalFree(hMem)); }
return LocalFree16(hMem); }
ULONG APIENTRY W32GetExpWinVer(HANDLE hInst) { PARM16 Parm16; ULONG ul;
// makes a direct call to krnl286:GetExpWinVer
//
if (LOWORD((DWORD)hInst) == (WORD) NULL) {
//
// Window is created by a 32 bit DLL, which is
// linked to NTVDM process. So, we should not
// passs it to the 16 bit kernel.
//
return (WOWRtlGetExpWinVer(hInst)); } else { LPBYTE lpNewExeHdr; VPVOID vp = (DWORD)hInst & 0xffff0000;
GETMISCPTR(vp, lpNewExeHdr); if (lpNewExeHdr) { ul = MAKELONG(*(PWORD16)&lpNewExeHdr[NE_LOWINVER_OFFSET], (*(PWORD16)&lpNewExeHdr[NE_HIWINVER_OFFSET] & FLAG_NE_PROPFONT)); } else { Parm16.WndProc.wParam = LOWORD(hInst); CallBack16(RET_GETEXPWINVER, &Parm16, 0, &ul ); } return ul; }
}
WORD APIENTRY W32GlobalAlloc16(UINT uFlags, DWORD dwBytes) { return HIWORD(GlobalAllocLock16((WORD)uFlags, dwBytes, NULL)); }
VOID APIENTRY W32GlobalFree16(WORD selector) { GlobalUnlockFree16(MAKELONG(0, selector)); return; }
int APIENTRY W32EditNextWord (LPSZ lpszEditText, int ichCurrentWord, int cbEditText, int action, DWORD dwProc16) { PARM16 Parm16; ULONG lReturn = 0; PBYTE lpstr16; VPVOID vpstr16; VPVOID vpfn;
if (vpstr16 = malloc16 (cbEditText)) { GETMISCPTR (vpstr16, lpstr16); if (lpstr16) { lstrcpy (lpstr16, lpszEditText);
// take out the marker bits and fix the RPL bits
UnMarkWOWProc (dwProc16, vpfn);
Parm16.WordBreakProc.action = GETINT16(action); Parm16.WordBreakProc.cbEditText = GETINT16(cbEditText); Parm16.WordBreakProc.ichCurrentWord = GETINT16(ichCurrentWord); Parm16.WordBreakProc.lpszEditText = vpstr16;
CallBack16(RET_SETWORDBREAKPROC, &Parm16, vpfn, (PVPVOID)&lReturn);
FREEMISCPTR (lpstr16); }
free16(vpstr16); }
return (INT32(LOWORD(lReturn))); }
/***************************************************************************\
* WOWRtlGetExpWinVer * * Returns the expected windows version, in the same format as Win3.1's * GetExpWinVer(). This takes it out of the module header. * * 09-9-92 ChandanC Created. \***************************************************************************/
DWORD WOWRtlGetExpWinVer( HANDLE hmod) { PIMAGE_NT_HEADERS pnthdr; DWORD dwMajor = 3; DWORD dwMinor = 0xA;
if (hmod != NULL) { try { pnthdr = (PIMAGE_NT_HEADERS)RtlImageNtHeader((PVOID)hmod); dwMajor = pnthdr->OptionalHeader.MajorSubsystemVersion; dwMinor = pnthdr->OptionalHeader.MinorSubsystemVersion; } except (EXCEPTION_EXECUTE_HANDLER) { dwMajor = 3; // just to be safe
dwMinor = 0xA; } }
// !!! HACK until linker is fixed!!! 05-Aug-1992 Bug #3211
if (((dwMajor == 3) && (dwMinor == 1)) || (dwMajor == 1)) { dwMajor = 0x3; dwMinor = 0xA; } #ifdef FE_SB
if (GetSystemDefaultLangID() == 0x411 && CURRENTPTD()->dwWOWCompatFlagsFE & WOWCF_FE_BCW45J_COMMDLG && dwMajor >= 4) { // When application display win3.x style DialogBox,
// System requires return value of version 3.10
dwMajor = 0x3; dwMinor = 0xA; } #endif // FE_SB
/*
* Return this is a win3.1 compatible format: * * 0x030A == win3.1 * 0x0300 == win3.0 * 0x0200 == win2.0, etc. * */
return (DWORD)MAKELONG(MAKEWORD((BYTE)dwMinor, (BYTE)dwMajor), 0); }
|