Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

103 lines
2.0 KiB

/*
* 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;
}