Подпрограмма RECEIVER, вызываемая при получении
/p>
NOBAD:
|
MOV AX, 1FFH
|
; Запрашиваем информацию о драйвере
|
|
MOV BX, _PARAM.HANDLES
|
; Устанавливаем указатель
|
|
call INT_PKT
|
|
|
JNC N_BAD
|
|
|
MOV _PARAM.ER_CODE, 272
|
; Ошибка при получении информации о драйвере
|
|
POP DS
|
|
|
JMP OKAY
|
|
N_BAD:
|
PUSH DS
|
|
PUSH SS
|
&nsp;
|
POP DS
|
|
MOV ES, SAFE
|
|
MOV _PARAM.L1, BX
|
; Версия драйвера
|
|
MOV _PARAM.L2, CX
|
; номер/класс
|
|
MOV _PARAM.L3, DX
|
; Тип
|
|
MOV _PARAM.L4, AX
|
; Функциональность
|
|
LEA BX, _PARAM._NAME
|
|
|
POP DS
|
|
|
MOV CX, 8
|
|
ZFIND:
|
CMP byte ptr [SI], 0
|
|
|
MOV AL, byte ptr [SI]
|
|
|
MOV byte ptr ES:[BX], AL
|
|
|
JE ZERO_
|
|
|
INC SI
|
|
|
INC BX
|
|
|
LOOP ZFIND
|
|
ZERO_:
|
POP DS
|
|
|
MOV AH, 21
|
; Запрашиваем код режима приема пакетов
|
|
MOV BX, _PARAM.HANDLES
|
|
|
call INT_PKT
|
|
|
MOV _PARAM.MODE, AX
|
; Записываем код режима
|
.........................
OKAY:
|
POP DS
|
|
POP ES
|
|
POP DI
|
|
POP SI
|
|
MOV SP, BP
|
|
POP BP
|
|
RET
|
RECEIVER:
|
; Подпрограмма RECEIVER, вызываемая при получении пакета
|
|
OR AX, AX
|
; Первый или второй вызов?
|
|
JNE RECV
|
|
|
MOV AX, seg _Q.beg
|
; Указатель буфера ES:DI
|
|
MOV ES, AX
|
|
|
MOV DI, offset _Q.beg
|
|
2. Организация доступа для пакетов данного типа
access_type(if_class, if_type, if_number, type, typelen, receiver)
AH ==2 (код запроса)
Запрос access_type инициализирует доступ для пакетов определенного типа (type). Аргумент typelen – длина спецификации типа в байтах, для PC/TCP равна 5 (наименьшее значение - 2, для IP и ARP). Аргумент receiver является указателем на подпрограмму, которая вызывается при приеме пакета. Получая пакет, драйвер дважды обращается к этой программе. Первый раз (при AX==0) это делается с целью получения адреса буфера, куда должен быть положен пакет. Прикладная программа в этом случае должна выдать указатель буфера в регистры ES:DI. Если прикладной процесс не имеет свободного буфера,то возвращается значение 0:0. Пакет выбрасывается и повторное обращение к программе receiver отменяется. Форма реализации запроса аналогична приведенному для driver_info:
Int
|
if_class; AL
|
; класс интерфейса
|
Int
|
if_type; BX
|
; тип интерфейса
|
Int
|
if_number; DL
|
; номер интерфейса
|
Char
|
far *type; DS:SI
|
|
Unsigned
|
typelen; CX
|
|
Int
|
(far *receiver); ES:DI
|
|
<
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий