Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы


Листинг 5.1. Файл vxdsrv\vxdsrv.asm - часть 7


; Для определения текущего пути VM MS-DOS ; заказываем буфер размером 64 байта в адресном ; пространстве VM MS-DOS, пользуясь функцией 4800h ; прерывания INT 21h mov ax, 4800h mov word ptr [ebp.Client_AX], ax

; Размер буфера задается в параграфах (по 16 байт) mov ax, 0004h mov word ptr [ebp.Client_BX], ax mov eax, 21h VMMcall Exec_Int

; Сохраняем сегментную компоненту адреса ; (смещение полученного буфера всегда равно 0) mov ax, word ptr [ebp.Client_AX] mov wPathSeg, ax

; В маловероятном случае, когда в VM MS-DOS ; совсем нет свободной памяти (даже 64 байт), ; мы не заполняем строку параметров: ; если памяти нет, все равно нельзя запустить ; ни программу MS-DOS, ни приложение Windows mov ax, wPathSeg cmp ax, 0 jz DoNotGetPath

; Определяем FLAT-адрес полученного буфера mov [ebp.Client_ES], ax mov [ebp.Client_BX], 0 mov ax, (Client_ES shl 8) + Client_BX VMMcall Map_Flat mov flatpPathBuf, eax

; Получаем строку текущего каталога VM MS-DOS, ; для чего вызываем функцию 4700h прерывания ; INT 21h. Перед вызовом этой функции нужно ; предоставить в DS:SI адрес буфера размером ; 64 байта, в который и будет записана строка mov ax, wPathSeg mov word ptr [ebp.Client_DS], ax mov ax, 0 mov word ptr [ebp.Client_SI], ax mov ax, 0 mov word ptr [ebp.Client_DX], ax mov ax, 4700h mov word ptr [ebp.Client_AX], ax mov eax, 21h VMMcall Exec_Int

; Копируем строку текущего каталога в буфер ; CallbackBuf со смещением 1 байт mov ecx, flatpPathBuf mov edx, CallbackBuf add edx, 1 call short StrCpy

; Освобождаем буфер, полученный в адресном ; пространстве VM MS-DOS mov ax, wPathSeg mov word ptr [ebp.Client_ES], ax mov ax, 4900h mov word ptr [ebp.Client_AX], ax mov eax, 21h VMMcall Exec_Int

VMMcall End_Nest_Exec

DoNotGetPath:

Pop_Client_State popad ret EndProc GetCurDir

; --------------------------------------------------- ; IsWindowsApp ; Проверка файла запускаемой программы ; ; Функция возвращает флаг Z = 0, если запускается ; приложение Windows в формате NE или PE, и Z != 0, ; если запускается программа MS-DOS ; ; Входные параметры: ; [ebp.Client_DS] - сегмент буфера, в котором находится ; путь к запускаемой программе ; [ebp.Client_DX] - смещение буфера, в котором находится ; путь к запускаемой программе ; --------------------------------------------------- ; Copyright (C) Сергей Ноженко, 1995 ; --------------------------------------------------- BeginProc IsWindowsApp




Начало  Назад  Вперед



Книжный магазин