Протоколы Internet


Сетевые драйверы - часть 9


/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

 


RECV:

RETF

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

 

<


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



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