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


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


; Сохраняем смещение и селектор процедуры обратного ; вызова, расположенной в фиксированном сегменте ; кода DLL-библиотеки d2w.dll

movzx eax, [ebp.Client_CX] ; смещение mov [CallbackOff], eax mov ax, [ebp.Client_DX] ; селектор mov [CallbackSel], ax

; Преобразуем адрес буфера во flat-адрес

mov ax, (Client_SI shl 8) + Client_DI VMMcall Map_Flat mov [CallbackBuf], eax

; Создаем семафор с начальным значением 1 mov ecx, 1 VMMcall Create_Semaphore mov hSem, eax ; сохраняем идентификатор семафора

clc ret

RW_CallFromRealMode: stc ret EndProc vxdapiRegisterWnd

; --------------------------------------------------- ; vxdapiUnregister, номер = 2 ; --------------------------------------------------- BeginProc vxdapiUnregisterWnd

; Можно вызывать только из защищенного режима mov eax, V86CallFlag cmp eax, 0 jnz short UW_CallFromRealMode

mov eax, 0 mov [CallbackOff], eax mov [CallbackSel], ax mov [CallbackBuf], eax

; Уничтожаем семафор mov eax, hSem VMMcall Destroy_Semaphore

clc ret

UW_CallFromRealMode: stc ret EndProc vxdapiUnregisterWnd

; --------------------------------------------------- ; StrCpy, копирование строки ASCIIZ ; [ecx] - исходный адрес ; [edx] - адрес буфера ; --------------------------------------------------- BeginProc StrCpy push eax push ecx push edx

StrCpyLoop: mov al, [ecx] mov [edx], al cmp al, 0 jz short StrCpyEnd inc ecx inc edx jmp short StrCpyLoop StrCpyEnd:

pop edx pop ecx pop eax ret EndProc StrCpy

; --------------------------------------------------- ; CopyParm, копирование строки параметров ; --------------------------------------------------- BeginProc CopyParm push eax push ebx push ecx push edx

; Вычисляем адрес строки параметров в буфере mov edx, CallbackBuf add edx, 65 + 128

; Определяем размер строки параметров mov ecx, flatpParmLine movzx ebx, byte ptr [ecx] inc ecx

; Если параметров нет, закрываем строку нулем cmp ebx, 0 jz short ParmCopyEnd

; Цикл копирования строки параметров ParmCopyLoop: cmp ebx, 0 jz short ParmCopyEnd




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



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