} HARDWARE_INFO;
#define CONV_MEM 0 /*обычная память*/
#define EXP_MEM 1 /*расширенная память*/
typedef struct mregn { /*дескриптор области памяти*/
unsigned char memory_type; /*CONV_MEM / EXP_MEM*/
unsignedint handle; /*CONV_MEM: 0, EXP_MEM: обработчик*/
unsigned int inutial_offset; /*CONV_MEM: 0 -65535,
EXP_MEM: 0 - 16383*/
unsigned int initial_seg_page; /*CONV_MEM: адрес сегмента,
EXP_MEM: номер страницы*/
} MREGN;
typedef struct move_xchg { /*структура передвижки/обмена*/
long region_length; /*0 - 1 Мбайт*/
MREGN source; /*дискриптор области-источника*/
MREGN dest; /*дескриптор области -приемника*/
} MOVE_XCHG;
-------------------------------------------------------------------
- 7-56 -
Листинг 7-4. EMMERMSG.C
------------------------------------------------------------------
/*
Наименование: emmermsg.c
Содержание: сообщения об ошибках для кодов ошибок спецификации
расширенной памяти LIM 4.0
Ссылка: Lotus(r)/Intel(r)/Microsoft(r) спецификация расширенной
памяти, версия 4.0, стр.А5-А10
*/
char *emmermsg[] = {
"EMM driver software failure", ; 1
"EMM driver detected hardware failure", ; 2
"EMM driver busy (doesn't happened any more)", ; 3
"Cannot find the specified handle", ; 4
"The function code is undefined", ; 5
"No handles are currently available", ; 6
"A mapping context restoration error has occured", ; 7
"Insufficient total pages for request", ; 8
"Insufficient unallocated pages for request", ; 9
"Zero logical pages have been requested from LIM 3.2
compatible function", ; 10
"Logical page out of range for specified handle", ; 11
"Physical page out of range", ; 12
"Mapping register context save area is full", ; 13
"Mapping register context stack already has a context ;
associated with the specified handle", ; 14
"Mapping register context stack does not have a context ;
associated with the specified handle", ; 15
"Undefined subfunction was requested", ; 16
"The attribute type is undefined", ; 17
"The system does not support nonvolatility", ; 18
"Partial source overwrite occured during move region", ; 19
"Expanded memory region is too big for specified handle",; 20
"Conventional memory region and expanded memory region
overlap", ; 21
"Offset within a logical page exceeds the length of
logical page", ; 22
"Region length exceeds 1-Mbyte limit", ; 23
"Source and destination expanded memory regions have the
same handle and overlap", ; 24
"Undefined/unsupported memory source and destination types",; 25
"Error code 0x99 is not used", ; 26
"Specified alternate map register set does not exist", ; 27
"All alternate map/DMA register sets are in use", ; 28
"Alternate map/DMA register sets are not supporte", ; 29
"Specified alternate map/DMA register set is not defined,
not allocated, or is the current one", ; 30
"Dedicated DMA channels are not supported", ; 31
"The specified dedicated DMA channel does not exist", ; 32
"No corresponding handle value could be found for the
specified handle name", ; 33
"A handle with the specified name already exists", ; 34
"Attempt to wrap around 1-Mbyte address space during
move or exchange", ; 35
"The contents of the user data structure passed to the
function were corrupt or meaningless", ; 36
"The operating system denied access to the function" ; 37
- 7-57 -
};
-------------------------------------------------------------------
1 - программная ошибка драйвера менеджера расширенной памяти, 2 -
драйвер менеджера расширенной памяти обнаружил ошибку в аппарату-
ре, 3 - драйвер менеджера расширенной памяти занят (других не ос-
талось), 4 - не найден указанный обработчик, 5 - код функции не-
определен, 6 - нет доступных обработчиков, 7 - произошла ошибка
восстановления контекста отображения, 8 - не хватает страниц для
запроса, 9 - не хватает размещенных страниц для запроса, 10 -
нуль логических страниц был запрошен от функции, совместимой со
спецификацией расширенной памяти LIM 3.2, 11 - логическая страни-
ца вне диапазона указанного обработчика, 12 -физическая страница
вне диапазона, 13 - область сохранения контекста регистров отоб-
ражения полна, 14 - у стека контекста регистров отображения уже
есть контекст, связанный с указанным обработчиком, 15 - у стека
контекста регистров отображения нет контекста, связанного с ука-
занным обработчиком, 16 - была запрошена неопределенная подфунк-
ция, 17 - тип атрибута неопределен, 18 - система не поддерживает
неразрущаемость, 19 - во время передвижки области произошла час-
тичная перезапись источника, 20 - область спецификации расширен-
ной памяти слишком велика для указанного обработчика, 21 - об-
ласть обычной памяти и область расширенной памяти перекрываются,
22 - смещение внутри логической страницы превышает размер логи-
ческой страницы, 23 - длина области превосходит предел в 1 Мбайт,
24 - область-источник и область-приемник расширенной памяти имеют
один и тот же обработчик и перекрываются, 25 - неопределенный/не-
поддерживаемый типы памяти-источника и приемника, 26 - код ошибки
0х99 не используется, 27 - указанный альтернативный набор регист-
ров не существует, 28 - все альтернативные наборы регистров отоб-
ражения/ПДП заняты, 29 - альтернативные наборы регистров отобра-
жения/ПДП не поддерживаются, 30 - указанный альтернативный набор
регистров отображения/ПДП не определен, не размещен или является
текущим набором, 31 -назначенные каналы ПДП не поддерживаются, 32
- назначенный указанный канал ПДП не существует, 33 - не найдено
значение, соответствующее указанному имени обработчика, 34 - об-
работчик с указанным именем уже существует, 35 - попытка цикли-
ческого перехода 1-Мбайтного адресного пространства во время пе-
редвижки или обмена, 36 - содержимое структуры данных
пользователя, переданное функции искажено или бессмысленно,
37 - операционная система запрещает доступ к данной функции
Листинг 7-5. EMMFUNC.C
------------------------------------------------------------------
#include
#include "emmconst.h"
#include "emmtypes.h"
#pragma check_stack(off)
#define CONTINUE_COL 32 /*колонка продолж-я сообщ-я об ошибке*/
static union REGS inregs, outregs;
static struct SREGS segregs;
static unt result;
void ShowEMMErr(errcode, lineno, filename)
unsigned int errcode;
unsigned int lineno;
char *filename;
- 7-58 -
{
unsigned int ec, func, len, line;
char *bp, *lp, *cp;
extern char *emmermsg[];
ec = errcode & 0x00FF;
func = inregs.x.ax;
printf("EMM error detected at line (%d) in source file(%s)\n",
lineno, filename);
if (ec < FRSTEMER || ec > LASTEMER)
printf("EMM Function (%04X) Error(%02X): Unknown Error
Code!\n", func, ec);
else {
printf("EMM Function (%04X) Error(%02X): ", func, ec);
lp = emmermsg[ec-FRSTEMERR];
line = 0;
while (*lp) {
for (cp = lp, len = 80 - CONTINUE_COL; *cp && len;
cp++, len --)
if (*cp == ' ')
bp = cp;
if (*cp)
*bp++ = '\0';
if (line++)
printf(" ");
printf("%s\n", lp);
lp = (*cp) ? bp : cp;
}
}
}
EMGGetStatus() /*тестирует наличие работающего менеджера расширен-
ной памяти*/
{
inregs.h.ah = 0x40; /*функция "Получить состояние" спе-
цификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
return(result);
}
EMSGetFrameAddr(pfa) /*возвращает удаленный адрес кадра
страниц менеджера расширенной памяти*/
char far **pfa;
{
inregs.h.ah = 0x41; /*функция "Получить адрес кадра
страниц" спецификации расширенной памя-
ти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
if (!result) {
FP_SEG(*pfa) = outregs.x.bx;
FP_OFF(*pfa) = 0;
}
return(result);
}
- 7-59 -
EMSGetPageCnt(una, tot) /*возвращает кол-во общих и неразме-
щенных страниц спецификации расширенной
памяти*/
unsigned int *una, *tot;
{
inregs.h.ah = 0x42; /*функция "Получить кол-во неразме-
щенных страниц" спецификации расширен-
ной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
if (!result) {
*una = outregs.x.bx;
*tot = outregs.x.dx;
}
return(result);
}
EMSAllocatePages(handle, pages) /*размещает обработчик с 'pages'
логических страниц*/
unsigned int *handle, pages;
{
inregs.h.ah = 0x43; /*функция "Разместить страницы"
спецификации расширенной памяти*/
inregs.x.bx = pages; /*кол-во логических страниц для