Leaked source code of windows server 2003
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.
 
 
 
 
 
 

263 lines
8.8 KiB

;/*
; * Microsoft Confidential
; * Copyright (C) Microsoft Corporation 1988 - 1991
; * All Rights Reserved.
; */
/* MEMEX.C - expanded and extended memory handling functions for MEM.C.
*/
#include "ctype.h"
#include "conio.h" /* need for kbhit prototype */
#include "stdio.h"
#include "dos.h"
#include "string.h"
#include "stdlib.h"
#include "msgdef.h"
#include "version.h" /* MSKK02 07/18/89 */
#include "mem.h"
#include "xmm.h"
#include "versionc.h"
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
void DisplayEMSDetail()
{
#define EMSGetHandleName 0x5300 /* get handle name function */
#define EMSGetHandlePages 0x4c00 /* get handle name function */
#define EMSCODE_83 0x83 /* handle not found error */
#define EMSMaxHandles 256 /* max number handles */
int HandleIndex; /* used to step through handles */
char HandleName[9]; /* save area for handle name */
unsigned long int HandleMem; /* memory associated w/handle */
char TitlesPrinted = FALSE; /* flag for printing titles */
HandleName[0] = NUL; /* initialize the array */
Sub0_Message(NewLineMsg,STDOUT,Utility_Msg_Class);
segread(&SegRegs);
SegRegs.es = SegRegs.ds;
for (HandleIndex = 0; HandleIndex < EMSMaxHandles; HandleIndex++)
{
InRegs.x.ax = EMSGetHandleName; /* get handle name */
InRegs.x.dx = HandleIndex; /* handle in question */
InRegs.x.di = (unsigned int) HandleName; /* point to handle name */
int86x(EMS, &InRegs, &OutRegs, &SegRegs);
HandleName[8] = NUL; /* make sure terminated w/nul */
if (OutRegs.h.ah != EMSCODE_83)
{
InRegs.x.ax = EMSGetHandlePages; /* get pages assoc w/this handle */
InRegs.x.dx = HandleIndex;
int86x(EMS, &InRegs, &OutRegs, &SegRegs);
HandleMem = OutRegs.x.bx;
HandleMem *= (long) (16l*1024l);
if (!TitlesPrinted)
{
Sub0_Message(Title3Msg,STDOUT,Utility_Msg_Class);
Sub0_Message(Title4Msg,STDOUT,Utility_Msg_Class);
TitlesPrinted = TRUE;
}
if (HandleName[0] == NUL) strcpy(HandleName," ");
EMSPrint(HandleMsg,
STDOUT,
Utility_Msg_Class,
&HandleIndex,
HandleName,
&HandleMem);
}
} /* end for (HandleIndex = 0; HandleIndex < EMSMaxHandles;HandleIndex++) */
return;
} /* end of DisplayEMSDetail */
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
void DisplayExtendedSummary()
{
unsigned long int EXTMemoryTot;
unsigned long int XMSMemoryTot;
unsigned long int HMA_In_Use;
unsigned DOS_Is_High,DOS_in_ROM;
InRegs.h.ah = (unsigned char) 0x52; /* Get SysVar Pointer ;an001; dms;*/
intdosx(&InRegs,&OutRegs,&SegRegs); /* Invoke interrupt ;an001; dms;*/
FP_SEG(SysVarsPtr) = SegRegs.es; /* put pointer in var ;an001; dms;*/
FP_OFF(SysVarsPtr) = OutRegs.x.bx; /* ;an001; dms;*/
if ((SysVarsPtr) -> ExtendedMemory != 0) /* extended memory? ;an001; dms;*/
{ /* yes ;an001; dms;*/
EXTMemoryTot = (long) (SysVarsPtr) -> ExtendedMemory; /* get total EM size ;an001; dms;*/
EXTMemoryTot *= (long) 1024l; /* at boot time ;an001; dms;*/
Sub0_Message(NewLineMsg,STDOUT,Utility_Msg_Class); /* print blank line ;an001; dms;*/
Sub1_Message(EXTMemoryMsg,STDOUT,Utility_Msg_Class,&EXTMemoryTot); /* print total EM mem ;an001; dms;*/
OutRegs.x.cflag = 0; /* clear carry flag ;an001; dms;*/
InRegs.x.ax = GetExtended; /* get extended mem ;an001; dms;*/
/* available */
int86(CASSETTE, &InRegs, &OutRegs); /* INT 15h call ;an001; dms;*/
EXTMemoryTot = (unsigned long) OutRegs.x.ax * 1024l; /* returns 1K mem blocks;an001; dms;*/
/* subtract out VDisk usage. Note assumption that VDisk usage doesn't
* exceed 64Mb. Don't bother if there is no extended memory
*/
if (EXTMemoryTot != 0)
EXTMemoryTot -= (unsigned long) (CheckVDisk() * 1024l);
Sub1_Message(EXTMemAvlMsg,STDOUT,Utility_Msg_Class,&EXTMemoryTot); /* display available ;an001; dms;*/
/* if an XMS driver is present, INT 15 may return 0 as the amount
* of extended memory available. In that case, call the XMS
* driver to find out the amount of XMS free. Don't call XMS
* unconditionally, because that will cause it to claim memory
* if it has not already done so.
*
* However, it is possible, with the newer versions of Himem,
* for XMS memory and INT 15 memory to coexist. There is no
* completely reliable way to detect this situation, but we
* do know that if Himem is installed, DOS is high, and INT 15
* memory exists, then we are configured that way. In that case,
* we can make calls to Himem without disrupting the memory environment.
* Otherwise we can't.
*/
if (XMM_Installed())
{
InRegs.x.ax = 0x3306; /* get DOS version info */
intdos(&InRegs, &OutRegs); /* call DOS */
DOS_Is_High = (OutRegs.h.dh & DOSHMA);
DOS_in_ROM = (OutRegs.h.dh & DOSROM);
if (DOS_Is_High || EXTMemoryTot == 0)
{ /* make this check only if we won't disrupt environment */
/* get and display XMS memory available */
XMSMemoryTot = XMM_QueryTotalFree() * 1024l;
Sub1_Message(XMSMemAvlMsg,STDOUT,Utility_Msg_Class,
&XMSMemoryTot);
}
/* get and display HMA status */
/* DOS High implies HMA is in use */
if (DOS_Is_High)
if (DOS_in_ROM)
Sub0_Message(ROMDOSMsg,STDOUT,Utility_Msg_Class);
else
Sub0_Message(HMADOSMsg,STDOUT,Utility_Msg_Class);
/* DOS isn't, check if HMA in use, but only if we can quietly */
else if (EXTMemoryTot == 0)
{
HMA_In_Use = XMM_RequestHMA(0xffff);
if (HMA_In_Use)
Sub0_Message(HMANotAvlMsg,STDOUT,Utility_Msg_Class);
else
{
XMM_ReleaseHMA();
Sub0_Message(HMAAvlMsg,STDOUT,Utility_Msg_Class);
}
}
}
}
} /* end of DisplayExtendedSummary */
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
void DisplayEMSSummary()
{
unsigned long int EMSFreeMemoryTot;
unsigned long int EMSAvailMemoryTot;
Sub0_Message(NewLineMsg,STDOUT,Utility_Msg_Class);
InRegs.x.ax = EMSGetFreePgs; /* get total number unallocated pages */
int86x(EMS, &InRegs, &OutRegs, &SegRegs);
EMSFreeMemoryTot = OutRegs.x.bx; /* total unallocated pages in BX */
EMSFreeMemoryTot *= (long) (16l*1024l);
EMSAvailMemoryTot = OutRegs.x.dx; /* total pages */
EMSAvailMemoryTot *= (long) (16l*1024l);
Sub1_Message(EMSTotalMemoryMsg,STDOUT,Utility_Msg_Class,&EMSAvailMemoryTot);
Sub1_Message(EMSFreeMemoryMsg,STDOUT,Utility_Msg_Class,&EMSFreeMemoryTot);
return;
} /* end of DisplayEMSSummary */
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
char EMSInstalled()
{
unsigned int EMSStatus;
unsigned int EMSVersion;
char EmsName[8];
void far *EmsNameP;
if (EMSInstalledFlag == 2)
{
EMSInstalledFlag = FALSE;
InRegs.h.ah = GET_VECT; /* get int 67 vector */
InRegs.h.al = EMS;
intdosx(&InRegs,&OutRegs,&SegRegs);
/* only want to try this if vector is non-zero */
if ((SegRegs.es != 0) && (OutRegs.x.bx != 0))
{
EmsNameP = EmsName;
movedata(SegRegs.es, 0x000a, FP_SEG(EmsNameP), FP_OFF(EmsNameP), 8);
if (strncmp(EmsName, "EMMXXXX0", 8))
return (EMSInstalledFlag);
InRegs.x.ax = EMSGetStat; /* get EMS status */
int86x(EMS, &InRegs, &OutRegs, &SegRegs);
EMSStatus = OutRegs.h.ah; /* EMS status returned in AH */
InRegs.x.ax = EMSGetVer; /* get EMS version */
int86x(EMS, &InRegs, &OutRegs, &SegRegs);
EMSVersion = OutRegs.h.al; /* EMS version returned in AL */
if ((EMSStatus == 0) && (EMSVersion >= DOSEMSVER))
EMSInstalledFlag = TRUE;
} /* end ((SegRegs.es != 0) && (OutRegs.x.bx != 0)) */
} /* end if (EMSInstalledFlag == 2) */
return(EMSInstalledFlag);
}