winrar, panda activescan, winrar, win rar, резервное копирование файлов, .

hardenworld.narod.ru

 
 На сайте
   Главная
   Links

 Разделы
asplinux deluxe
Отказоустойчивые системы
win архиваторы
win архиваторы
asplinux
офисные программы
Навигационные системы
перевод с английского на русский
avast home
архиватор rar
1с бухгалтерия
 Главная  Links
{img1} avast antivirus
длина имени файла 3 file_nlen_0 db ? ;действит.длина имени файла 3 file_name_0 db 50 dup (?) ;буфер имени файла 3 file_hand_1 dw ? ;заголовок файла 3 file_nmax_1 db 49 ;макс. длина имени файла 3 file_nlen_1 db ? ;действит.длина имени файла 3 file_name_1 db 50 dup (?) ;буфер имени файла ------------------------------------------------------------------ В добавление к директиве REPT мы также использовали счетчик. Счетчик - это переменная, имеющая цифровое значение.
файловый менеджер
{img2} архиватор rar
Так как его значение может меняться, он должен быть определен при помощи опе- ратора присваивания (=). (В MASM для определения переменных, име- ющих статические значения, используется оператор equ (прирав- нять), в то время как для определения переменных, чьи значения могут изменяться, применяется знак равенства (=).) Счетчик, при- меняемый в макро file_head, называется fcnt (счетчик файла). Счетчик fcnt увеличивается на 1 при каждом проходе file_head.
домашняя бухгалтерия
{img3} резервное копирование баз данных
Но почему метки находятся в file_head2, file_hand_0 и т.д., а не в file_hand_fcnt? Каким образом имя fcnt заменяется на свое значе- ние? Ответ заключается в операторе "%",стоящем в вызове file_head2 перед fcnt. Знак процента предписывает замену символа на его значение.
утилиты резервного копирования

текстовые редакторы

winrar, panda activescan, winrar, win rar, резервное копирование файлов, .
 

avast 4 professional

Это макро может быть усовершенствовано. Что необходимо сообщить программе пофайлового копирования, если мы хотим одновременно обрабатывать два файла? Нам следует дважды вызвать file_head (описатель файла): file_head 1 ;1-ый блок файла file_head 2 ;2-ой блок файла Вместо этого, используя директиву REPT (повторить), мы можем написать file_head так, чтобы он определял столько блоков, сколь- ко необходимо. Такой макрос приведен в Листинге 1-3. Листинг 1-3. Описание блока доступа к файлу ------------------------------------------------------------ fcnt = 0 ;определить и иниц-ать символ file_head2 MACRO fnum file_hand_&fnum dw ? ;заголовок файла file_nmax_&fnum db 49 ;макс.длина имени файла file_nlen_&fnum db ? ;действ.длина имени файла file_name_&fnum db 50 dup (?) ;буфер имени файла ENDM file_head MACRO fnum REPT fnum ;повторить блок "fnum" раз file_head2 %fcnt ;создать блок #"fcnt" fcnt = fcnt + 1 ENDM ;закончить блок повторения ENDM ;закончить макро file_head ------------------------------------------------------------- Как показано в Листинге 1-4, при вызове макро file_head оно, в свою очередь, дважды вызывает макро file_head2, используя каждый раз новое значение fnum. Конечно, это макрорасширение со значени- ем статуса листинга, установленного по умолчанию, не показывает явно обращения к file_head2. Однако результат работы REPT мы мо- жем видеть по двум созданным блокам управления файлами. Заметим, - 1-11 - что директива REPT должна заканчиваться строкой ENDM, равно как и директива MACRO. Вcе блоки повторения должны заканчиваться ENDM (конец макро). Аналогично ENDM должно появляться в конце каждого макроопределения. Листинг 1-4. Макрорасширение блока описания доступа к файлу ----------------------------------------------------------------- file_head 2 3 file_hand_0 dw ? ;заголовок файла 3 file_nmax_0 db 49 ;макс.


panda


 
 

CNews: Новости | e-Business | Hi-Tech | Telecom List.ru - каталог ресурсов интернет Directrix џ­¤ҐЄб жЁвЁа®ў ­Ёп
Сайт создан в системе uCoz
ширенной памяти, версия 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; /*кол-во логических страниц для размещения*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; if (!result) /*функция завершилась успешно*/ *handle = outregs.x.dx; /*обработчик менеджера расширенной памяти для работы с этими страницами*/ return(result); } EMSMapHandlePage(handle, page, frame) /*отображает логическую страницу в 'кадр'*/ unsigned int handle, page, frame; { inregs.h.ah = 0x44; /*функция "Отобразить/перестать отоб- ражать страницы спецификации расширенной памяти*/ inregs.h.al = frame & 0x00ff; /*кадр целевой страницы*/ inregs.x.bx = page; /*номер логической страницы, в которую отображать*/ inregs.x.dx = handle; /*обработчик, которому принадлежит логическая страница*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; return(result); } EMSDeallocatePages(handle) /*освобождает обработчик и все его страницы*/ unsigned int handle; { inregs.h.ah = 0x45; /*функция "Освободить страницы" спецификации расширенной памяти*/ inregs.x.dx = handle; /*обработчик, назначенный для осво- бождения менеджеру расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; - 7-60 - return(result); } EMSGetVersion(emsver) /*возвращает номер версии программного обеспечения менеджера расширенной памяти*/ char *emsver; { inregs.h.ah = 0x46; /*функция "Получить версию" спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs); if (!(result & 0xFF00)) { /*функция завершилась успешно*/ emsver[0] = ((result & 0x00F0) >> 4) + '0'; emsver[1] = '.'; emsver[2] = (result & 0x000F) + '0'; emsver[3] = '\0'; } return(result >> 8); } EMSSavePageMap(handle) /*сохраняет контекст менеджера расширенной памяти в области сохранения контекста менеджера расширенной памяти*/ unsigned int handle; { inregs.h.ah = 0x47; /*функция "Сохранить отображение страниц" спецификации расширенной памяти*/ inregs.x.dx = handle; /*обработчик, для которого выполняет- ся сохранение*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; return(result); } EMSRestorePageMap(handle) /*восстанавливает контекст менеджера расширенной памяти из области сохране- ния контекста менеджера расширенной памяти*/ unsigned int handle; { inregs.h.ah = 0x48; /*функция "Восстановить отображение стра- ниц" спецификации расширенной памяти*/ inregs.x.dx = handle; /*область контекста, откуда выполня- ется восстановление*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; return(result); } EMSGetHandleCnt(hcnt) /*возвращает кол-во открытых обработчиков (1 - 255*/ unsigned int *hсnt; { inregs.h.ah = 0x4B; /*функция "Получить кол-во обработ- чиков спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; if (!result) { /*функция завершилась успешно*/ *hcnt = outregs.x.bx; } return(result); } - 7-61 - EMSGetHandlePages(handle, pages) /*возвращает кол-во страниц, размещенных для обработчика*/ unsigned int handle, *pages; { inregs.h.ah = 0x4С; /*функция "Получить страницы обработ- чика" спецификации расширенной памяти*/ inregs.x.dx = handle; /*обработчик, которому, полагается, принадлежат страницы*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8; if (!result) /*функция завершилась успешно*/ *pages = outregs.x.bx; return(result); } EMSGetAllHandlePages(hp, hpcnt) /*возвращает кол-во страниц, размещенных всем обработчикам*/ HANDLE_PAGE *hp; unsigned int *hpcnt; { segread(&segregs); /*заполнить регистры сегментов*/ inregs.h.ah = 0x4D; /*функция "Получить страницы всех обработчиков" спецификации расширенной памяти*/ segregs.es = segregs.ds; /*сегмент массива HANDLE_PAGE*/ inregs.x.di = (unsigned int) hp; /*смещение массива HANDLE_ PAGE*/ result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; if (!result) /*функция завершилась успешно*/ *hpcnt = outregs.x.bx; return(result); } EMSGetPageMap(map) /*получает контекст менеджера расширенной па- мяти в область сохранения контекста пользователя*/ PMAP *map; { segread(&segregs); /*заполнить регистры сегментов*/ segregs.es = segregs.ds; /*использовать es = ds*/ inregs.x.ax = 0x4E00; /*функция "Получить отображение стра- ниц" спецификации расширенной памяти*/ inregs.x.di = (unsigned int) map; /*указатель на массив отоб- ражения*/ result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSSetPageMap(map) /*устанавливает контекст менеджера расширенной памяти из области сохранения контекста пользователя*/ PMAP *map; { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax = 0x4E01; /*функция "Установить отображение стра- ниц" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) map; /*указатель на массив отоб- ражения*/ - 7-62 - result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSGetSetPageMap(srcmap, destmap) /*сохраняет контекст менеджера сширенной памяти в destmap и затем устанавливает контекст менеджера расширенной памяти из srcmap*/ PMAP *srcmap, *destmap; { segread(&segregs); /*заполнить регистры сегментов*/ segregs.es = segregs.ds; /*оба отображения в ds*/ inregs.x.ax = 0x4E02; /*функция "Получить и установить отоб- ражение страниц" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) srcmap; /*указатель на массив отображения-источника*/ inregs.x.di = (unsigned int) destmap; /*указатель на массив отображения-приемника*/ result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSGetPageMapeSize(size) /*получает размер области сохранения контекста пользователя*/ unsigned int *size; { inregs.x.ax = 0x4E03; /*функция "Получить размер отображе- ния страниц" спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs); if (!(result) & 0xFF00)) /*функция завершилась успешно*/ *size = outregs.h.al; return(result >> 8); } EMSGetPPageMap(pmap, savearea) /*получает частичный контекст ме- неджера расширенной памяти в область со- хранения пользователя*/ PPMAP *pmap; PCONTEXT *savearea; { segread(&segregs); /*заполнить регистры сегментов*/ segregs.es = segregs.ds; /*использует es = ds*/ inregs.x.ax = 0x4F00; /*функция "Получить частичное отобра- жение страниц" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) pmap; /*какие кадры мы хотим*/ inregs.x.di = (unsigned int) savearea; /*указатель на массив отображения*/ result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSSetPPageMap(savearea) /*устанавливает частичный контекст ме- неджера расширенной памяти из области сохранения пользователя*/ PCONTEXT *savearea; - 7-63 - { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax = 0x4F01; /*функция "Установить частичное отобра- жение страниц" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) savearea; /*кадры, которые мы хо- тим восстановить*/ result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSGetPPageMapeSize(count,size) /*получает размер области, необ- ходимой для сохранения*/ unsigned int count,*size; { inregs.x.ax =0x4F02; /*функция "Получить размер частично- го отображения страниц" специфи- кации расширенной памяти*/ inregs.x.bx = count; /*кол-во кадров для сохранения*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs); if (!(result) & 0xFF00)) /*функция завершилась успешно*/ *size = outregs.h.al; return(result >> 8); } EMSMapMultPages(handle, map, method, count) /*отображает count страниц в map для handle*/ unsigned int handle; /*обработчик, для которого отображаются страницы*/ LOG_TO_PHYS *map; /*отображение логических страниц в физи- ческие*/ unsigned int method; /*используются номера кадра страниц или адреса отображаемых сегментов*/ unsigned int count; /*кол-во элементов в отображении*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.h.ah =0x50; /*функция "Отобразить много страниц обработчика" спецификации расширенной памяти*/ inregs.h.al = (unsigned char) method; inregs.x.cx = count; /*кол-во страниц для отображения*/ inregs.x.dx = handle; /*обработчик, которому эти страницы принадлежат*/ inregs.x.si = (unsigned int) map; /*страницы для отображения*/ result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSReallocPages(handle, pages) /*изменяет размещение handle для pages*/ unsigned int handle, *pages; { inregs.h.ah =0x51; /*функция "Переразместить страницы" спецификации расширенной памяти*/ inregs.x.bx = *pages; /*кол-во логических страниц, которое будет после выполнения*/ inregs.x.dx = handle; /*обработчик, для которого переразме- - 7-64 - щается страница*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >> 8; if (!result) /*функция завершилась успешно*/ *pages = outregs.x.bx; /*новое кол-во страниц*/ return(result); } EMSGetHandleAttr(handle, attr) /*получает атрибут обработчика*/ unsigned int handle, *attr; { inregs.x.ax =0x5200; /*функция "Получить атрибут обра- ботчика спецификации расширенной памяти*/ inregs.x.dx = handle; result = (unsigned int) int86(EMM_INT, &inregs, &outregs); if (!(result & 0xFF00)) /*функция завершилась успешно*/ *attr = outregs.h.al; /*атрибут*/ return(result >> 8); } EMSSetHandleAttr(handle, attr) /*устанавливает атрибут обработ- чика*/ unsigned int handle, attr; { inregs.x.ax =0x5201; /*функция "Установить атрибут об- работчика спецификации расширенной памяти*/ inregs.x.dx = handle; inregs.h.bl = attr & 0x00FF; result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>> 8; return(result); } EMSGetAttrCap(cap) /*получить возможности атрибута*/ unsigned int *cap; { inregs.x.ax =0x5202; /*функция "Получить возможности ат- рибута спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs); if (!(result & 0xFF00)) /*успех */ *cap = outregs.h.al; return(result >> 8); } EMSGetHandleName(handle, name) /*получает имя обработчика handle*/ unsigned int handle; /*обработчик, для которого получается имя*/ char *name; /*буфер для получения имени обработчика*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5300; /*функция "Получить имя обработчика"*/ segregs.es = segregs.ds; inregs.x.di = (unsigned int) name; inregs.x.dx = handle; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSSetHandleName(handle, name) /*устанавливает имя обработчика handle*/ unsigned int handle; /*обработчик, для которого устанавл. имя*/ - 7-65 - char *name; /*буфер с именем обработчика*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5301; /*функция "Установить имя обработч."*/ inregs.x.si = (unsigned int) name; inregs.x.dx = handle; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSGetHandleDir(hnt, hn_cnt) /*получает имя каталога обработчика handle*/ HANDLE_NAMES *hnt; /*указатель на таблицу имен обработчиков*/ unsigned int *hn_cnt; /*возвращенное кол-во элементов*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5400; /*функция "Получить каталог обработчи- ка" спецификации расширенной памяти*/ inregs.x.di = (unsigned int) hnt; segregs.es = segregs.ds; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs); if (!(result & 0xFF00)) /*функция завершилась успешно*/ *hn_cnt = outregs.h.al; /*возврат кол-ва полученных имен обработчиков*/ return(result >> 8); } EMSSearhHandleName(name, handle) /*поиск названного обработчика*/ char *name; /*имя, которое нужно искать*/ unsigned int *handle; /*возвращаемый номер обработчика*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5401; /*функция "Поиск названного обработчи- ка" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) name; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; if (!result) /*функция завершилась успешно*/ *handle = outregs.x.dx; /*возврат значения обработчика*/ return(result); } EMSGetTotalHandles(handle_count) /*Получить общее кол-во обработ- чиков*/ unsigned int *handle_count; { inregs.x.ax =0x5402; /*подфункция "Получить общее кол-во обработчиков" спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) *handle_count = outregs.x.bx; return(result); } - 7-66 - EMSMoveRegion(rp) /*передвинуть область*/ MOVE_XCHG *rp; /*указатель на дескриптор области*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5700; /*функция "Передвинуть область" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) rp; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSExchangeRegion(rp) /*обменять область*/ MOVE_XCHG *rp; /*указатель на дескриптор области*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5701; /*функция "Обменять область" спецификации расширенной памяти*/ inregs.x.si = (unsigned int) rp; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSGetMapAddrArray(mpaa, mpa_cnt) /*получить массив отображаемых физических адресов*/ MAP_PHYS_PAGE *mpaa; /*указатель на массив отображаемых физических адресов*/ unsigned int *mpa_cnt; /*кол-во возвращенных элементов*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5800; /*функция "Получить массив отображаемых физических адресов"*/ inregs.x.di = (unsigned int) mpaa; segregs.es = segregs.ds; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; if (!result) >> 8); /*функция завершилась успешно*/ *mpa_cnt = outregs.x.cx; /*возврат кол-ва отображаемых физических страниц*/ return(result); } EMSGetMapAddrCount(mpa_cnt) /*получить кол-во отображаемых физических адресов*/ unsigned int *mpa_cnt; /*кол-во отображаемых физических страниц*/ { inregs.x.ax =0x5801; /*функция "Получить кол-во отображаемых физических адресов"*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) /*функция завершилась успешно*/ *mpa_cnt = outregs.x.cx; /*возврат кол-ва отображаемых физических страниц*/ return(result); } - 7-67 - EMSGetHardwareInfo(hwp) /*получить информацию об обору- довании спецификации расширенной памяти*/ HARDWARE_INFO *hwp; /*указатель на область для получе- ния информации об оборудовании*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5900; /*функция "Получить информацию об оборудовании спецификации расширенной памяти*/ inregs.x.di = (unsigned int) hwp; segregs.es = segregs.ds; result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; return(result); } EMSGetRawPageCount(rpg_cnt, urpg_cnt) /*получить кол-во исходных страниц*/ unsigned int *rpg_cnt; /*кол-во исходных страниц*/ unsigned int *urpg_cnt; /*кол-во неразмещенных исходных страниц*/ { inregs.x.ax =0x5901; /*функция "Получить кол-во исходных страниц спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) { /*функция завершилась успешно*/ *rpg_cnt = outregs.x.dx; /*общее кол-во исходных страниц*/ *urpg_cnt = outregs.x.bx; /*кол-во неразмещенных исходных страниц*/ } return(result); } EMSAllocateStdPages(handle, pages) /*размещает обработчик с 'pag- es' стандартных страниц*/ unsigned int handle, *pages; { inregs.x.ax =0x5A00; /*функция "Разместить стандартные страницы" спецификации расширенной памяти*/ inregs.x.bx = pages; /*кол-во логических страниц для раз- мещения*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >> 8; if (!result) /*функция завершилась успешно*/ *handle = outregs.x.dx; /*обработчик менеджера расширенной памяти для применения с этими страницами*/ return(result); } EMSAllocateRawPages(handle, pages) /*размещает обработчик с 'pag- es' исходных страниц*/ unsigned int handle, *pages; { inregs.x.ax =0x5A01; /*функция "Разместить исходные стра- ницы" спецификации расширенной памяти*/ inregs.x.bx = pages; /*кол-во логических страниц для раз- мещения*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >> 8; if (!result) /*функция завершилась успешно*/ *handle = outregs.x.dx; /*обработчик менеджера расширенной - 7-68 - памяти для применения с этими страницами*/ return(result); } EMSGetAltMapRegSet(set,pmap) /*получает альтернативный набор ре- гистров отображения спецификации расширенной памяти*/ unsigned int *set; /*текущий альтернативный набор ре- гистров отображения*/ PMAP far **pmap; /*указатель на указатель области со- хранения контекста*/ { inregs.x.ax =0x5B00; /*функция "Получить альтернативный на- бор регистров отображения"*/ segread(&segregs); result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; if (!result) { *set = outregs.h.bi; /*текущий активный набор*/ if (*set == 0) { /*фальшивый альтернативный набор ре- гистров*/ FP_OFF(*pmap) = outregs.x.di; /*смещение области кон- текста операционной среды (OS)*/ FP_SEG(*pmap) = segregs.es; /*сегмент области кон- текста операционной среды (OS)*/ } } return(result); } EMSSetAltMapRegSet(set,pmap) /*устанавливает альтернативный набор регистров отображения спецификации расширенной памяти*/ unsigned int set; /*новый альтернативный набор ре- гистров отображения*/ PMAP *pmap; /*указатель области сохранения контекста*/ { segread(&segregs); /*заполнить регистры сегментов*/ inregs.x.ax =0x5B01; /*функция "Установить альтернативный на- бор регистров отображения"*/ inregs.h.bl = set & 0x00FF; if (set == 0) { /*фальшивый альтернативный набор ре- гистров*/ inregs.x.di = (unsigned int) pmap; segregs.es = segregs.ds; } result = (unsigned int) int86x(EMM_INT, &inregs, &outregs, &segregs) >> 8; if (!result) } EMSGetAltMapArraySize(size) /*получает размер массива сохранения альтернативного отображения*/ unsigned int size; /*кол-во отображаемых физических страниц*/ { inregs.x.ax =0x5B02; /*функция "Получить размер массива со- хранения альтернативного отображения"*/ - 7-69 - result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) /*успех*/ *size = outregs.x.dx; /*размер массива*/ return(result); } EMSAllocAltMapRegSet(set) /*размещает альтернативный набор регис- тров отображения*/ unsigned int *set; /*номер, размещенного набора*/ { inregs.x.ax =0x5B03; /*функция "Разместить альтернативный набор регистров отображения"*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) /*успех*/ *set = outregs.h.bl; /*номер размещенного набора*/ return(result); } EMSDeallocAltMapRegSet(set) /*освобождает альтернативный набор ре- гистров отображения*/ unsigned int set; /*номер, освобождаемого набора*/ { inregs.x.ax =0x5B04; /*функция "Освободить альтернативный набор регистров отображения"*/ inregs.h.bl = set & 0x00FF; result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; return(result); } EMSAllocDMARegSet(set) /*размещает набор регистров ПДП*/ unsigned int *set; /*номер, размещаемого набора*/ { inregs.x.ax =0x5B05; /*функция "Разместить набор регистров ПДП" спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) /*успех*/ *set = outregs.h.bl; /*номер размещенного набора*/ return(result); } EMSEnableDMARegSet(set, channel) /*разрешает набор регистров ПДП*/ unsigned int set; /*номер, разрешаемого набора*/ unsigned int channel; /*номер канала ПДП для связыва-*/ ния с регистром отображения*/ { inregs.x.ax =0x5B06; /*функция "Разрешить набор регис- тров ПДП" спецификации расширенной памяти*/ inregs.h.bl = set & 0x00FF; inregs.h.dl = channel & 0x00FF; result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; return(result); } EMSDisableDMARegSet(set) /*запрещает набор регистров ПДП*/ unsigned int set; /*номер запрещаемого набора*/ { inregs.x.ax =0x5B07; /*функция "Запретить набор регистров ПДП" спецификации расширенной памяти*/ - 7-70 - inregs.h.bl = set & 0x00FF; result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; return(result); } EMSDDeallocDMARegSet(set) /*освобождает набор регистров ПДП*/ unsigned int set; /*номер освобождаемого набора*/ { inregs.x.ax =0x5B08; /*функция "Освободить набор регистров ПДП" спецификации расширенной памяти*/ inregs.h.bl = set & 0x00FF; result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; return(result); } EMSPrepareForWarmboot() /*подготавливает оборудование специфи- кации расширенной памяти к программному перезапуску*/ { inregs.h.ah =0x5C; /*функция "Подготовиться к программному перезапуску" спецификации расширенной памяти*/ result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; return(result); } EMSEnableOSFunc(key) /*разрешить набор функций операционной среды*/ long *key; /*ключ доступа к операционной среде - должен быть равен 0, когда применяется первый раз*/ { inregs.x.ax =0x5D00; /*функция "Разрешить набор функций опе- рационной среды" спецификации расширенной памяти*/ if (*key !=0) { inregs.x.bx = FP_OFF(*key); inregs.x.cx = FP_SEG(*key); } result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; if (!result) { FP_OFF(*key) = outregs.x.bx; FP_SEG(*key) = outregs.x.cx; } } return(result); } EMSDisableOSFunc(key) /*запретить набор функций операционной среды*/ long *key; /*ключ доступа к операционной среде - должен быть равен 0, когда применяется первый раз*/ { inregs.x.ax =0x5D01; /*функция "Запретить набор функций опе- рационной среды" спецификации расширенной памяти*/ if (*key !=0) { inregs.x.bx = FP_OFF(*key); inregs.x.cx = FP_SEG(*key); } result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; - 7-71 - if (!result) { FP_OFF(*key) = outregs.x.bx; FP_SEG(*key) = outregs.x.cx; } } return(result); } EMSReturnAccessKey(key) /*возвращает ключ доступа к операционной среде менеджеру расширенной памяти*/ long *key; /*ключ доступа к операционной среде*/ { inregs.x.ax =0x5D02; /*функция "Возвратить ключ доступа к операционной среде" спецификации расширенной памяти*/ inregs.x.bx = FP_OFF(key); inregs.x.cx = FP_SEG(key); result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8; return(result); } ------------------------------------------------------------------ Листинг 7-6. EMMFUNC.H ------------------------------------------------------------------ extern void ShowEMMErr(unsigned int errcode,unsigned int lineno, char *filename); extern int EMSGetStatus(void); extern int EMSGetFrameAddr(char far * *pfa); extern int EMSGetPageCnt(unsigned int *una,unsigned int *tot); extern int EMSAllocatePages(unsigned int *handle,unsigned int pages); extern int EMSMapHandlePage(unsigned int handle,unsigned int page, unsigned int frame); extern int EMSDeallocatePages(unsigned int handle); extern int EMSGetVersion(char *emsver); extern int EMSSavePageMap(unsigned int handle); extern int EMSRestorePageMap(unsigned int handle); extern int EMSGetHandleCnt(unsigned int *hcnt); extern int EMSGetHandlePages(unsigned int handle,unsigned int *pages); extern int EMSGetAllHandlePages(struct handle_page *hp,unsigned int *hpcnt); extern int EMSGetPageMap(unsigned int *map); extern int EMSSetPageMap(unsigned int *map); extern int EMSGetSetPageMap(unsigned int *srcmap,unsigned int *destmap); extern int EMSGetPPageMapSize(unsigned int *size); extern int EMSGetPPageMap(struct ppmap *pmap,unsigned char *savearea); extern int EMSSetPPageMap(unsigned char *savearea); extern int EMSGetPPageMapSize(unsigned int count,unsigned int *size); extern int EMSMapMultPages(unsigned int handle,struct log_to_phys *map,unsigned int method,unsigned int count); extern int EMSReallocaPages(unsigned int handle,unsigned int *pages); extern int EMSGetHandleAttr(unsigned int handle,unsigned int *attr); - 7-72 - extern int EMSSetHandleAttr(unsigned int handle,unsigned int attr); extern int EMSGetAttrCap(unsigned int *cap); extern int EMSGetHandleName(unsigned int handle,char *name); extern int EMSSetHandleName(unsigned int handle,char *name); extern int EMSGetHandleDir(struct handle_names *hnt,unsigned int *hn_cnt); extern int EMSSearchHandleName(char *name,unsigned int *handle); extern int EMSGetTotalHandles(unsigned int *handle_count); extern int EMSMoveRegion(struct move_xchg *rp); extern int EMSExchangeRegion(struct move_xchg *rp); extern int EMSGetMapAddrArray(struct map_phys_page *mpaa,unsigned int *mpa_cnt); extern int EMSGetMapAddrCount(unsigned int *mpa_cnt); extern int EMSGetHardwareInfo(struct hardware_info *hwp); extern int EMSGetRawPageCount(unsigned int *rpg_cnt,unsigned int *urpg_cnt); extern int EMSAllocateStdPages(unsigned int *handle,unsigned int pages); extern int EMSAllocateRawPages(unsigned int *handle,unsigned int pages); extern int EMSGetAltMapRegSet(unsigned int *set,unsigned char far * *pmap); extern int EMSSetAltMapRegSet(unsigned int set,unsigned char *pmap); extern int EMSGetAltMapArraySize(unsigned int *size); extern int EMSAllocAltMapRegSet(unsigned int *set); extern int EMSDeallocAltMapRegSet(unsigned int set); extern int EMSAllocDMARegSet(unsigned int *set); extern int EMSEnableDMARegSet(unsigned int set,unsigned int channel); extern int EMSDisableDMARegSet(unsigned int set); extern int EMSDeallocDMARegSet(unsigned int set); extern int EMSPrepareForWarmboot(void); extern int EMSEnableOSFunc(long *key); extern int EMSDisableOSFunc(long *key); extern int EMSReturnAccessKey(long key); ------------------------------------------------------------------- Листинг 7-7. EMMEXIST.C ------------------------------------------------------------------ #include #include #include #include #include "emmconst" #define DOS_INT 0x21 /*диспетчер функций DOS*/ #define DOS_IOCTL 0x44 /*функция IOCTL DOS*/ #define IOCTL_GETINFO 0x00 /*подфункция "Получить информа- цию об устройстве" IOCTL*/ #define IOCTL_OUTSTAT 0x07 /*подфункция "Получить состояние вывода" IOCTL*/ #define READY_OUTPUT 0xFF /*устройство готово к выводу*/ #define IS_DEVICE 0x0080 /*обработчик принадлежит устрой- ству*/ - 7-73 - static char device_name[9] = EMM_DEVICE; /* Контролируется наличие расширенной памяти с помощью метода "открытого обработчика". Устанавливает emm_present в '1', если расширенная память присутствует, в '0' - если нет. Функция возвращает '0', если тест наличия завершился успеш- но. В противном случае возвращается код ошибки DOS вызова функции DOS, которая не выполнилась во время теста наличия расширенной памяти. */ emm_exists(emm_present) int *emm_present; /*указатель на индикатор наличия менеджера расширенной памяти*/ { int return_code; /*код возврата операции с файлом*/ int handle; /*обработчик файлов*/ unsigned int dev_attr; /*атрибуты драйвера устройства*/ unsigned int dev_status; /*выходное состояние устройства*/ if (_dos_open(device_name, O_RDONLY, &handle)) { /*не удалось открыть файл*/ if (errno == ENOENT) { /*файл не существует*/ return_code = 0; /*мы ожидали, что это могло случиться*/ *emm_present = 0; /*менеджер расширенной памяти определенно отсутствует*/ } else return_code = errno; /*тест наличия завершился безуспешно*/ } else if (!(return_code = ioctl_getattr(handle, &dev_attr))) { /*получен атрибут*/ if (!(return_code = ioctl_outstat(handle, &dev_status))) /*получено выходное состояние*/ /*менеджер расширенной памяти присутству- ет, если обработчик принадлежит устрой- ству и готов к выводу*/ *emm_present = ((dev_status == READY_OUTPUT) && (dev_attr & IS_DEVICE)) ? 1 : 0; close(handle); /*закрывается обработчик файла*/ } return(return_code); } /* Получается слово атрибутов DOS для открытого обpаботчика, связанного с открытым файлом или устройством.

архиватор rar


 
 
CNews: Новости | e-Business | Hi-Tech | Telecom List.ru - каталог ресурсов интернет Directrix џ­¤ҐЄб жЁвЁа®ў ­Ёп
Сайт создан в системе uCoz