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


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


Push_Client_State VMMcall Begin_Nest_Exec

; Индикатор, который будет равен нулю на выходе ; из функции, если запускаемый файл не содержит ; приложение Windows sub esi, esi

; Открываем файл с программой mov word ptr [ebp.Client_AX], 3D00h mov eax, 21h VMMcall Exec_Int

; Проверка ошибки test word ptr [ebp.Client_Flags], 1 jnz EndNest

; Сохраняем идентификатор файла mov ax, word ptr [ebp.Client_AX] push eax

; Заказываем 4 параграфа памяти mov word ptr [ebp.Client_AX], 4800h mov word ptr [ebp.Client_BX], 4 mov eax, 21h VMMcall Exec_Int

; Проверяем, выделена ли нам память mov ax, word ptr [ebp.Client_AX] or ax, ax jz CloseFile

; Читаем старый заголовок исполнимого файла ; (заголовок программы MS-DOS) ; Готовим ES для вызова функции освобождения ; памяти mov word ptr [ebp.Client_DS], ax mov word ptr [ebp.Client_ES], ax mov word ptr [ebp.Client_AX], 3F00h pop eax mov word ptr [ebp.Client_BX], ax mov word ptr [ebp.Client_CX], 40h ; читаем 40h байт mov word ptr [ebp.Client_DX], 0 mov eax, 21h VMMcall Exec_Int

; Проверка ошибки test word ptr [ebp.Client_Flags], 1 jnz FreeMem

; Если размер файла меньше 40h байт, это ; не приложение Windows cmp word ptr [ebp.Client_AX], 40h jl short FreeMem

; Получаем FLAT-адрес mov ax, (Client_DS shl 8) + Client_DX VMMcall Map_Flat

; Проверяем сигнатуру EXE-файла. Если это не ; EXE-файл, то мы имеем дело не с приложением ; Windows cmp word ptr [eax], "ZM" jne short FreeMem

; Проверяем смещение таблицы relocation table. ; Если оно меньше чем 40h, это программа MS-DOS cmp word ptr [eax + 18h], 40h jl short FreeMem

mov edi, eax

; Ищем заголовок NewEXE mov word ptr [ebp.Client_AX], 4200h mov bx, word ptr [eax + 3Ch] mov word ptr [ebp.Client_DX], bx mov bx, word ptr [eax + 3Eh] mov word ptr [ebp.Client_CX], bx mov eax, 21h VMMcall Exec_Int

test word ptr [ebp.Client_Flags], 1 jnz short FreeMem

; Читаем первое слово заголовка NewEXE mov word ptr [ebp.Client_AX], 3F00h mov word ptr [ebp.Client_CX], 2 mov word ptr [ebp.Client_DX], 0 mov eax, 21h VMMcall Exec_Int

test word ptr [ebp.Client_Flags], 1 jnz short FreeMem cmp word ptr [ebp.Client_AX], 2 jne short FreeMem

; Проверяем сигнатуру исполнимого сегмента. ; Допустимы сигнатуры "NE" (segmented executable) ; и "PE" (portable executable) cmp word ptr [edi], "EN" je short WinApp

cmp word ptr [edi], "EP" jne short FreeMem

WinApp:

; Устанавливаем индикатор - запускается ; приложение Windows inc esi

; Освобождаем память FreeMem: mov word ptr [ebp.Client_AX], 4900h mov eax, 21h VMMcall Exec_Int

; Закрываем файл CloseFile: mov word ptr [ebp.Client_AX], 3E00h mov eax, 21h VMMcall Exec_Int

EndNest: VMMcall End_Nest_Exec Pop_Client_State

or esi, esi ret EndProc IsWindowsApp

VxD_CODE_ENDS END

Заголовок виртуального драйвера VXDSRV мы описали раньше, поэтому не будем на нем останавливаться.




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



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