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


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


mov al, [ecx] mov [edx], al

dec ebx inc ecx inc edx jmp short ParmCopyLoop

ParmCopyEnd:

; Закрываем строку нулем mov al, 0 mov [edx], al

pop edx pop ecx pop ebx pop eax ret EndProc CopyParm

; --------------------------------------------------- ; V86_Int21_Handler ; Фильтр для функции 4B00h прерывания INT 21h, ; вызываемого из виртуальной машины MS-DOS ; (эта функция выполняет запуск программы MS-DOS) ; --------------------------------------------------- BeginProc V86_Int21_Handler

pushad

; Проверяем номер функции. Нас интересует только ; запуск программ mov ax, word ptr [ebp.Client_AX] cmp ax, 4B00h jnz HandlerExit

; Если окно приложения dos2win не зарегистрировано, ; ничего не делаем mov eax, CallbackBuf cmp eax, 0 jz HandlerExit

; Если запускается программа MS-DOS, ничего ; не делаем call short IsWindowsApp jz HandlerExit

; Для исключения реентерабельных вызовов выполняем ; ожидание семафора mov eax, hSem mov ecx,(Block_Enable_Ints OR Block_Svc_If_Ints_Locked) VMMcall Wait_Semaphore

; Получаем текущий диск и каталог call short GetCurDir

; Сохраняем номер текущего диска mov edx, CallbackBuf mov al, nCurDisk mov byte ptr [edx], al

; Определяем FLAT-адрес командной строки mov ax, (Client_DS shl 8) + Client_DX VMMcall Map_Flat mov flatpCmdLine, eax

; Определяем FLAT-адрес блока EPB mov ax, (Client_ES shl 8) + Client_BX VMMcall Map_Flat

; Загружаем в DX:BX адрес строки параметров mov bx, [eax + 2] mov dx, [eax + 4]

; Определяем FLAT-адрес строки параметров

push dword ptr [ebp.Client_ES] push [ebp.Client_EBX]

mov [ebp.Client_ES], dx mov [ebp.Client_BX], bx mov ax, (Client_ES shl 8) + Client_BX VMMcall Map_Flat mov flatpParmLine, eax

pop [ebp.Client_EBX] pop dword ptr [ebp.Client_ES]

; Копируем командную строку в буфер, который ; находится в DLL-библиотеке d2w.dll mov ecx, flatpCmdLine mov edx, CallbackBuf add edx, 65 call short StrCpy

; Выполняем копирование строки параметров call short CopyParm

; Определяем идентификатор текущей VM VMMCall Get_Cur_VM_Handle mov edx, ebx




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



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