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.
170 lines
4.3 KiB
170 lines
4.3 KiB
/*++
|
|
*
|
|
* WOW v1.0
|
|
*
|
|
* Copyright (c) 1992, Microsoft Corporation
|
|
*
|
|
* WKMEM.C
|
|
* WOW32 KRNL386 Virtual Memory Management Functions
|
|
*
|
|
* History:
|
|
* Created 3-Dec-1992 by Matt Felton (mattfe)
|
|
*
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include "memapi.h"
|
|
|
|
MODNAME(wkman.c);
|
|
|
|
|
|
LPVOID FASTCALL WK32VirtualAlloc(PVDMFRAME pFrame)
|
|
{
|
|
PVIRTUALALLOC16 parg16;
|
|
LPVOID lpBaseAddress;
|
|
#ifndef i386
|
|
NTSTATUS Status;
|
|
#endif
|
|
|
|
GETARGPTR(pFrame, sizeof(VIRTUALALLOC16), parg16);
|
|
|
|
|
|
#ifndef i386
|
|
Status = VdmAllocateVirtualMemory((PULONG)&lpBaseAddress,
|
|
parg16->cbSize,
|
|
TRUE);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
|
|
if (Status == STATUS_NOT_IMPLEMENTED) {
|
|
#endif // i386
|
|
|
|
lpBaseAddress = VirtualAlloc((LPVOID)parg16->lpvAddress,
|
|
parg16->cbSize,
|
|
parg16->fdwAllocationType,
|
|
parg16->fdwProtect);
|
|
|
|
|
|
#ifndef i386
|
|
} else {
|
|
|
|
lpBaseAddress = NULL;
|
|
}
|
|
|
|
}
|
|
#endif // i386
|
|
|
|
#ifdef i386
|
|
//BUGBUG we need to either get this working on the new emulator, or
|
|
// fix the problem the "other" way, by letting the app fault and
|
|
// zap in just enough 'WOW's to avoid the problem.
|
|
if (lpBaseAddress) {
|
|
// Virtual alloc Zero's the allocated memory. We un-zero it by
|
|
// filling in with ' WOW'. This is required for Lotus Improv.
|
|
// When no printer is installed, Lotus Improv dies with divide
|
|
// by zero error (while opening the expenses.imp file) because
|
|
// it doesn't initialize a relevant portion of its data area.
|
|
//
|
|
// So we decided that this a convenient place to initialize
|
|
// the memory to a non-zero value.
|
|
// - Nanduri
|
|
//
|
|
// Dbase 5.0 for windows erroneously loops through (past its valid
|
|
// data) its data buffer till it finds a '\0' at some location -
|
|
// Most of the time the loop terminates before it reaches the segment
|
|
// limit. However if the block that was allocated is a 'fresh' block' ie
|
|
// the block is filled with ' WOW' it never finds a NULL in the buffer
|
|
// and thus loops past the segment limit to its death
|
|
//
|
|
// So we initialize the buffer with '\0WOW' instead of ' WOW'.
|
|
// - Nanduri
|
|
|
|
WOW32ASSERT((parg16->cbSize % 4) == 0); // DWORD aligned?
|
|
RtlFillMemoryUlong(lpBaseAddress, parg16->cbSize, (ULONG)'\0WOW');
|
|
}
|
|
#endif
|
|
|
|
FREEARGPTR(parg16);
|
|
return (lpBaseAddress);
|
|
}
|
|
|
|
BOOL FASTCALL WK32VirtualFree(PVDMFRAME pFrame)
|
|
{
|
|
PVIRTUALFREE16 parg16;
|
|
BOOL fResult;
|
|
#ifndef i386
|
|
NTSTATUS Status;
|
|
#endif
|
|
|
|
GETARGPTR(pFrame, sizeof(VIRTUALFREE16), parg16);
|
|
|
|
#ifndef i386
|
|
Status = VdmFreeVirtualMemory((ULONG)parg16->lpvAddress);
|
|
fResult = NT_SUCCESS(Status);
|
|
|
|
if (Status == STATUS_NOT_IMPLEMENTED) {
|
|
#endif // i386
|
|
|
|
fResult = VirtualFree((LPVOID)parg16->lpvAddress,
|
|
parg16->cbSize,
|
|
parg16->fdwFreeType);
|
|
|
|
|
|
#ifndef i386
|
|
}
|
|
#endif // i386
|
|
|
|
FREEARGPTR(parg16);
|
|
return (fResult);
|
|
}
|
|
|
|
|
|
#if 0
|
|
BOOL FASTCALL WK32VirtualLock(PVDMFRAME pFrame)
|
|
{
|
|
PVIRTUALLOCK16 parg16;
|
|
BOOL fResult;
|
|
|
|
WOW32ASSERT(FALSE); //BUGBUG we don't appear to ever use this function
|
|
|
|
GETARGPTR(pFrame, sizeof(VIRTUALLOCK16), parg16);
|
|
|
|
fResult = VirtualLock((LPVOID)parg16->lpvAddress,
|
|
parg16->cbSize);
|
|
|
|
FREEARGPTR(parg16);
|
|
return (fResult);
|
|
}
|
|
|
|
BOOL FASTCALL WK32VirtualUnLock(PVDMFRAME pFrame)
|
|
{
|
|
PVIRTUALUNLOCK16 parg16;
|
|
BOOL fResult;
|
|
|
|
WOW32ASSERT(FALSE); //BUGBUG we don't appear to ever use this function
|
|
|
|
GETARGPTR(pFrame, sizeof(VIRTUALUNLOCK16), parg16);
|
|
|
|
fResult = VirtualUnlock((LPVOID)parg16->lpvAddress,
|
|
parg16->cbSize);
|
|
|
|
FREEARGPTR(parg16);
|
|
return (fResult);
|
|
}
|
|
#endif
|
|
|
|
|
|
VOID FASTCALL WK32GlobalMemoryStatus(PVDMFRAME pFrame)
|
|
{
|
|
PGLOBALMEMORYSTATUS16 parg16;
|
|
LPMEMORYSTATUS pMemStat;
|
|
|
|
GETARGPTR(pFrame, sizeof(GLOBALMEMORYSTATUS16), parg16);
|
|
GETVDMPTR(parg16->lpmstMemStat, 32, pMemStat);
|
|
|
|
GlobalMemoryStatus(pMemStat);
|
|
|
|
FREEVDMPTR(pMemStat);
|
|
FREEARGPTR(parg16);
|
|
}
|