windows-nt/Source/XPSP1/NT/base/mvdm/xms.486/xms.c
2020-09-26 16:20:57 +08:00

104 lines
2 KiB
C

/*
* xms.c - Main Module of XMS DLL.
*
* Sudeepb 15-May-1991 Craeted
* williamh 25-Sept-1992 added UMB support
* williamh 10-10-1992 added A20 line support
*/
#include <xms.h>
#include <suballoc.h>
#include "umb.h"
#include "memapi.h"
/* XMSInit - XMS Initialiazation routine. (This name may change when XMS is
* converted to DLL).
*
* Entry
* None
*
* Exit
* None
*/
ULONG xmsMemorySize = (ULONG)0; // Total XMS meory in K
extern BOOL VDMForWOW;
PVOID ExtMemSA;
BOOL XMSInit (int argc, char *argv[])
{
DWORD Size;
PVOID Address;
ULONG VdmAddress, XmsSize;
NTSTATUS Status;
if (!xmsMemorySize)
return FALSE;
Size = 0;
Address = NULL;
// commit all free UMBs.
ReserveUMB(UMB_OWNER_RAM, &Address, &Size);
XmsSize = xmsMemorySize * 1024 - (64*1024);
#ifndef i386
Status = VdmAllocateVirtualMemory(&VdmAddress,
XmsSize,
FALSE);
if (Status == STATUS_NOT_IMPLEMENTED) {
// Old emulator, just assume base address
#endif ; //i386
//
// Initialize the sub allocator
//
ExtMemSA = SAInitialize(
1024 * 1024 + 64*1024,
XmsSize,
xmsCommitBlock,
xmsDecommitBlock,
xmsMoveMemory
);
#ifndef i386
} else {
//
// New emulator. Make sure the reserve worked
//
if (!NT_SUCCESS(Status)) {
ASSERT(FALSE);
return FALSE;
}
//
// We only work correctly if emulator returned this value
//
if (VdmAddress != (1024 * 1024 + 64*1024)) {
ASSERT(FALSE);
return FALSE;
}
ExtMemSA = SAInitialize(
VdmAddress,
XmsSize,
VdmCommitVirtualMemory,
VdmDeCommitVirtualMemory,
xmsMoveMemory
);
}
#endif // i386
if (ExtMemSA == NULL) {
return FALSE;
}
return TRUE;
}