Глава 21. Программирование в локальних сетях.

„тятя, тятя, паши сети...

А.С.Пушкин

Данную главу следует рассматривать как введение в программирование сетевых протоколов IPX и SPX, а также управление файловой системой в сети. В целом же материал по локальным сетям столь обширен, что для изложения его не хватит и всей нашей книги. Поэтому, если Вы всерьез собираетесь заниматься программированием в локальных сетях, рассматривайте эту главу как промежуточный этап. В локальных сетях Microsoft Windows следует использовать сетевые API функции, которые можно найти в соответствующем справочнике (см. главы 24,25). Данная глава рассматривает программирование на рабочих станциях, подключенных к сети Novel и работающих под управлением операционной системы MS DOS.

I. Общие замечания.

Все рассмотрения в этой главе касаются в первую очередь сетевой операционной системы NOVEL NETWARE. Однако практически весь материал, относящийся к ра­боте с протоколами 1РХи SPX, носит более универсальный характер. В частности, его можно использовать и с такими системами, как NWLite и Personal Netware.

Конечно, если Ваша программа предполагает использование возможностей локаль­ной сети, то она в первую очередь должна определить, подключен компьютер к сети или нет. Наиболее просто это можно сделать, используя функцию 44Н DOS. Подфун­кция 9Н этой функции как раз и определяет, являетсяданноеустройство сетевым или нет. Ниже (Рис. 21.1) представлена простая программа, определяющая наличие в сис­теме сетевыхустройств. Данная программа будет работать не только cNOVEL'obckhmh сетями.

CODE

BEGIN:

LOO:

SEGMENT

ASSUME CS:CODE,   DS:CODE, SS:CODE

ORG 100H

MOV BL,1 MOV CX,33

MOV AX,4409H

INT 21H AND DX,1000H JNZ YES INC BL LOOP LOO

; сетевых   устройств   не обнаружено LEA DX,TEXT1 MOV АН, 9

int 21h RET

YES:

LEA DX,TEXT2 MOV AH, 9

int 21h

RET

;блок сообщений

TEXT1   DB   1 Сетевых устройств не  обнаружено.', 13,10, '$' ТЕХТ2  DB   1 Найдены сетевые устройства.', 13,10,'$'

CODE ENDS

END BEGIN

Рис. 21.1. Простая программа, позволяющая определить наличие сетевых

устройств.

Имейте, однако, в виду, что драйвер устройства CD-ROM откликается так же, как сетевое устройство. И здесь можно только посоветовать обратиться к функции 15Н этого драйвера (прерывание 2FH, подфункция 0). В ВХэтафункциявозвращаетколи-чество устройств CD-ROM. Если в ВХО, то здесь все ясно. В противном случае Вам придется проводитьдополнительныеисследования,используяфункциидрайвераСО-ROM. Впрочем, познакомившись с материалом, представленным ниже, Вы, без со­мнения, найдете сетевые функции, которые помогут определить, является данное уст­ройство сетевым или нет, например, функции, обслуживающие файловую систему.

Наличие сетевого устройства не является необходимым условием того, что дан­ный компьютер является сетевой рабочей станцией. Более полную и точную информа­цию о сети можно получить, используя диагностические средства IPX протокола (см. ниже).

0 сети NOVEL.

Не вдаваясь в подробное описание локальных сетей (Л С), рассмотрим основные особенности сети на базе ОС NOVEL NETWARE. Технические особенности - платы, кабеля, репитеры ит.п. здесь упоминаться не будут вообще. Предполагается, что чита­тель хорошо подготовлен для работы в сети как с теоретической, так и с практической позиции. Итак, вот эти особенности:

1 .Данная сеть является сетью с централизованным управлением. Это означает, что среди всех компьютеров сети выделены один или более. них работает специ­альная многозадачная операционная система. Они управляют работой ЛС, а также предоставляют ресурсы компьютера, на котором она работает, другим компьютерам. Такие выделенные компьютеры называются серверами. В одноранговых сетях (Personal Netware, Lantastic, локальная сеть Windows и др.) любая из рабочих станций может

13 - 4072одновременно быть и сервером. Поэтому почти все, что далее будет говориться о ра­боте с сервером, будет в значительной степени относиться и к серверам в одноранго­вой сети.

2. Другие компьютеры называются рабочими станциями. На них работает обыч­ная операционная система MS DOS или какая-нибудь другая ОС. Кроме того, чтобы компьютер стал рабочей станцией, на нем должны быть запущены специальные про­граммы, которые и осуществляют его вхождение в сеть. Эти программы, постоянно находясь в памяти, позволяют осуществлять управление локальной сетью с рабочей станции.

3. После подсоединения к сети рабочая станция получает возможность использо­вать дисковые ресурсы серверов. Это осуществляется посредством появления на ком­пьютере одного или нескольких сетевых устройств, которые работают в основном так же, как и другие блоковые устройства - гибкие диски и разделы жестких дисков. По­средством выделения общих сетевых устройств рабочие станции могут взаимодей­ствовать друг с другом - использовать общие БД ит.п. Крометого, рабочие станции могут взаимодействовать с другом посредством специальных сетевых протоко­лов (см. ниже).

Можно выделить пять уровней программирования в локальной сети:

1. Программа не знает, что она работает в локальной сети. Поскольку сетевые дис­ки по своим свойствам в основном не отличаются от обычных разделов жесткого дис­ка, то для многих целей при программировании не стоит задумываться над тем, будет программа использоваться  сети или нет.

2. Программа знает, что она работает в локальной сети. Например, для ее работы требуется знать, является устройство сетевым или нет.

3. Программы, работающие на разных рабочих станциях, должны синхронизиро­вать свою работу. Допустим, они работают с общей базой данных. Здесь может воз­никнуть конфликт: например, при одновременномредактировании одной итойже за­писи. Программы могут блокировать и разблокировать записи и файлы и использо­вать механизм транзакций.

4. Программы, работающие на разных рабочих станциях, обмениваются данны­ми, минуя сервер, используя один из сетевых протоколов.

5. Программы могут использовать ресурсы сервера: подключаться к сети, менять пароли, иметь дополнительные возможности управление файловой системой.

Протоколы передачи.

Связь между программами на рабочих станциях может осуществляться по одному из следующих протоколов: IPX, SPX.58 Существуют и другие протоколы, но мы с ними работать не будем. Поддержку работы того или иного протокола осуществляют со сто­роны рабочей станции резидентные драйверы. Ниже представлена программа, опре­деляющая присутствие поддержки протоколов IPX и SPX. Вначале программа опре­деляет точку входа - POINT. Через эту точку входа осуществляется вызов функций поддержки протоколов IPX и SPX. Прерывание же 2FH является лишь средством оп­

Протокол NetBios несколько устарел для современных разветвленных локальных сетей.ределения этой точки входа. Может возникнуть вопрос: почемуи саму связь сдрайве-ром не осуществлять через это прерывание? Ответ прост: это прерывание могут пере­хватывать многие программы, и от этого скорость его работы может сильно замед­литься.

CODE SEGMENT

ASSUME  CS : CODE, DS : CODE ORG 100H

BEGIN:

;проверить присутствие сетевого драйвера MOV АХ,7А00Н INT 2FH CMP AL, OFFH JZ OKI LEA DX,TEXT2 JMP SHORT END

OKI:

LEA DX,TEXT1

CALL WRITE ;сохранить точку входа в драйвер MOV   POINT,DI

MOV POINT+2,ES MOV AX,0

MOV    BX,10H      /функция SPX

/проверяем наличие   протокола SPX CALL  DWORD  PTR POINT CMP    AL,OFFH

JZ OK2

LEA DX,TEXT4

JMP    SHORT _END

OK2:

LEA

_END:

CALL WRITE

RET ■

/процедура вывода строки WRITE PROC

■ - MOV АН , 9

INT 21H ■ RET

WRITE ENDP /сообщения

TEXT1 DB   'Протокол IPX присутствует.',13,10,'$' TEXT2 DB   'Протокол IPX отсутствует.1,13,10,'$'

13*

ТЕХТЗ DB 'Протокол SPX присутствует.',13,10,'$' ТЕХТ4 DB   'Протокол SPX отсутствует.',13,10, Т ;точка входа в драйвер POINT DW ?

DW ? CODE ENDS

END BEGIN

Рис. 21.2. Программа, определяющая присутствие драйверов поддержки

протоколов IPXu SPX.

П. Протокол IPX. Пакет в протоколе IPX.

Данные в протоколе IPX (как, впрочем, и в других протоколах) передаются в виде пакетов. Ниже показана структура этого пакета.

- контрольная сумма -общая длина пакета в байтах -счетчик пройденных мостов

- тип пакета

- номер сети получателя пакета адрес станции получателя

сокет программы получателя номер сети отправителя пакета адрес станции отправителя

сокет программы отправителя передаваемые байт)

Контрольная сумма - 2 байта: хранится контрольная сумма передаваемых паке­тов, подсчет контрольной суммы осуществляет сетевой драйвер.

Общая длина пакета - 2 байта, длина пакета вместе с заголовком. Длина заголовка составляет 30 байт. Длину определяет сетевой драйвер.

Счетчик пройденных мостов -1 байт, каждый раз, когда пакет проходит через мост, значение счетчика увеличивается на 1.

Тип пакета -1 байт, протоколу IPX соответствует значение байта 4.

Номер сети получателя - 4 байта, заполняется передающей программой.

Адрес станции получателя - б байт, заполняется передающей программой.

Сокет программы получателя - 2 байта, предназначен для адресации программы, которой предназначается данный пакет. Заполняется передающей программой.

Номер сети отправителя - 4 байта, заполняется передающей программой. Адрес

станции отправителя - 6 байт. Сокет программы отправителя - 2 байта. Данные - от О до 546 байт.

Адрес программы в сети складывается трех составляющих: адрес сети (сегмен­та сети), адрес рабочей станции (определяется сетевой платой), адрес программы, ко­торый мы будем называть сокетом (SOCKET)59. Необходимость введения сокета обус­ловлена возможностью работы на рабочей станции одновременно нескольких про­грамм. Поскольку для хранения сокета используется двухбайтовое число, то его диа­пазон FFFFH. Диапазон зарезервирован за конкретным программным обеспечением фирмойХЕГЮХ, автором протокола IPX. В свою очередь, фирма NOVEL также резервирует часть сокетов, так что для обычного программного обеспечения остается диапазон больший 4000Н и меньший 8000Н. Если Вы связываете рабочие станции, находящиеся в разных сегментах (сетях), то Вам понадобится, кроме знания адресов сегментов (сетей), также адрес моста. Адрес моста определяется сетевой пла­той, которая играет роль моста.

Для приема и передачи пакета сетевая программа должна создать EVENT

CONTROL BLOCK (ECB) - блок управления событием. Подготовив такой блок, про­грамма передает его адрес сетевому драйверу. Ниже представлен формат этого блока.

LINK -указатель на следующий ЕСВ

ESRADDRESS - адрес программы ESR

. ЕСВ

CCODE - код завершения

SOCKET - сокет для приема или передачи

IPXWORKSPACE . рабочий буфер для IPX

DRIVERWORKSPACE - рабочий буфер

для драйвера адаптера 12 байт 1MMADDRESS - адрес для передачи пакета

FRAGNENTCNT - количество фрагментов в пакете ADDRESS - адрес фрагмента

SIZE - размер фрагмента ADDRESS - адрес фрагмента SIZE - размер фрагмента

т.д.

ФОРМАТ БЛОКА ЕСВ

59 Термин "сокет" довольно непривычен нашему уху. Встречается в литературе и другое назва­ние - "гнездо", что и является переводом английского слова "сокет".

Рассмотрим ряд замечаний по содержимому ЕСВ. LINK - ссылка на следующий блок. Используется сетевым драйвером. ESRADDRES - адрес подпрограммы, которая будет вызвана по завершению про­цесса передачи или получения пакета. ESR - EVENT SERVICE ROUTINE.

INUSE - при завершении операции флагполучает нулевое значение. Проверяя флаг, можно определить, завершена операция передачи или приема пакета. Вот возможные значения этого поля:

FF- ЕСВ используетсядля передачи пакета,

FE - ЕСВ используется для приема пакета,

FD - ЕСВ используется функциями асинхронного управления событиями, ЕВ-пакетданныхпереданилипринят,ноЕСВнаходитсявовнутреннейочереди1РХ.

код результата, при приеме данных: 00 - пакет принят без ошибок,

не был предварительно открыт, FD - переполнение пакета,

FC - запрос на прием данных был отменен специальной функцией;

при передаче данных:

00 - данные переданы без ошибок,

- пакет невозможно передать физически,

- пакет невозможно доставить по назначению,

FD - произошел сбой,

FC - запрос на передачу данных был отменен специальной функцией. SOCKET - сокет данной программы,

IPXWORKSPACE - зарезервировано для сетевого драйвера, DRIVER WORKSPACE - зарезервировано для сетевого драйвера, IMMADDRES - адрес рабочей станции назначения либо адрес моста, если адресу­емая рабочая станция находится в другой сети (через мост).

FRAGMENTCNT-кoличecтвoфpaгмeнтoв,нaкoтopыйpaзбивaeтcяпepeдaющий пакет, обычно 2 (см. ниже).

Хочу заметить, что все адреса и в пакете, и в ЕСВ должны указываться в обратном

порядке (см. ниже).

III. Сетевые функции IPX.

Ниже представлены сетевые функции, позволяющие программам осуществлять связь через протокол IPX.

Открыть сокет.

Вход:

ВХ=0 AL=0 - коротко живущий (закрывается по окончанию работы программы),

0FFH - долго живущий.

Выход:

- сокет открыт,был открыт раньше,

FEH - переполниласьтаблицасокетов. DX - назначенный номер гнезда. Закрыть сокет.

Вход:

ВХ=1,

- номер закрываемого Любые события, связанные с этим сокетом отменяются. Закрытие уже закрытого

сокета не вызывает никаких последствий.

Вычисление непосредственного адреса.

ВХ=2

ES:SI - указатель на буфер длиной 12 байт, содержащий полньгй сетевой адрес станции, на которую будет послан пакет.

ES:DI - указатель на буфер длиной б байт, в который будет записан непосредствен­ный адрес (либо рабочей станции, либо моста).

Выход:

СХ - время доставки, AL - 0 - успешно,

FEH нет пути к адресу назначения.

Вычисление своего адреса. вх=9

ES:DI - указатель на буфер длиной 10 байт, куда будет записан адрес станции, на которой работает данная программа (без сокета). Структура:

DEST_NUMBERDB 4 DUP(?)

DUP(?)

Принять пакет. ВХ=4

еблг-указательназаполненныйблокЕСВ. Необходимо заполнить поля:

ESRADDRES;

SOCKET;

FRAGMEOTCNT;

указатель на буферы фрагментов, размеры фрагментов. Код завершения:

AL - 0 - успешно, FFH - сокет не найден.

Послать пакет. ВХ=3

ES:DI - указатель на заполненный блокЕСВ. Необходимо заполнить поля:

ESRADDRES;

SOCKET; IMMADDRES;указатели на буферы фрагментов ДОБРОЇ; размеры фрагментов.

В заголовке пакета необходимо заполнить:

РАКЕТТУРЕ;

БЕвТЫЕШОК-К;

ВЕЗТЛЧОВЕ;

БЕЗТСОСКЕТ.

Освобождение канала связи. ВХ=0ВН

Е8:81 - указатель на структуру, содержащую сетевой адрес станции. Функция посылает сообщение сетевому драйверу, что данная программа больше не будет посылать пакеты на указанную станцию. Не вызывается из Е8Р.

Функция сброса поля 1М)8Е.

ВХ=5,

АХ - время задержки в тиках, Е&81 - указатель на блок ЕСВ.

Функция немедленно возвращает управление вызвавшей программе, а через ука­занный промежуток времени сбрасывается в нуль флаг ЕЧШЕ, и вызывается програм­ма Е8Р (если таковая предполагалась).

Функция измерения временных интервалов.

Вход:

ВХ=8

Выход:

АХ - интервальный маркер.

Для измерения времени междудвумя событиями. Функция возвращает засечку времени, измеряемую втикахтаймера (в 1 с. прим. 18.2тика). Следующее обращение к этой функции вернет засечку с большим значением. Вычитая одно значение из дру­гого, можно получить значение интервала времени. Этой командой, естественно, не

могут измеряться интервалы большие одного часа.

Функция отмены ожидания.

Вход:

ВХ=6,

Е8:81 - указатель на блок ЕСВ. Выход:

АЕ=00- без ошибок,

Е9Н - обработка ЕСВ не может быть отменена, ЕЕН - указанный ЕСВ не используется.

Отменяет ожидание события с указанным ЕСВ. ЕЗЯне вызывается. ССОВЕ уста­навливается в ЕСН.

Функция выделения сетевому драйверу необходимого времени. ВХ=0АН

Вызывается в цикле ожидания (см. ниже в программах).

Ниже представлены две сетевые программы. Программа 1 - ожидает прихода со­общения отпрограммы2. Предполагается, что программа2 знаетполный адрес про­граммы В частности, известен адрес рабочей станции, на которой запущена про­грамма І.Обратитевниманиенато, как записаны в программе все адреса. Передавае­мый пакет разбивается на два блока FRAGNENTCNT=2. В первом блоке передается заголовокпакета,имеющий всегдафиксированнуюдлину, равную 30 байтам. Во вто­ром блоке передается строка. Длина второго блока составляет 32 байта (SIZ=32). Мак­симальная длина блокаданныхсоставляет - 540 байт. Ожидающая программа в цикле проверяет поле INUSE - нулевое значение является признаком, что пакет получен. ОбращаюВашевниманиенато,чтоотправляющаяпрограмматакжепроверяетполе INUSE. При успешной посылке пакета полетакже обращается в 0. Речь идет именно о посылкепакета. Принят липакет,посылающаяпрограммазнатьнеможет-впротоко-ле ІРХтакого подтверждения нет. Длятого, чтобы точно знать, получен пакетилинет, получившая программа должна гама в ответ послать пакет, подтверждающий получе­ние. Обесвязывающиесяпрограммыдолжныоткрытьсвоисокеты.Передвыходомиз программы долго живущие сокеты следует закрыть.

l

;сетевая программа  -  сервер (принимает)

-  4001Н,  в перевернутом виде 1004Н

DATA SEGMENT

TEXT   DB не удалось

ТЕХТ1  DB   ' Функция принятия пакета не выполнена1, 13,10, '$' /заголовок пакета   (30 байт)

CHECKSUM

DB

2

DUP(?)

LEN

DB

2

DUP(?)

TRANS PORTCONTROL

DB

?

 

PACKETTYPE

DB

?

 

DESTNETWORK

DB

4

DUP(?)

DESTNODE

DB

6

DUP{?)

DESTSOCKET

DB

2

DUP(?)

SOURCENETWORK

DB

4

DUP (?)

SOURCENODE

DB

6

DUP (?)

SOURCESOCKET

DB

2

DUP(?)

данные STROKA    DB  32 DUP(?) /здесь блок ECB

LINK DB 4 DUP(?)

ESRADDRES DB 4 DUP(0)

INUSE DB ?

CCODE DB ?

SOCKET DW 1004H

IPXWORKSPACE DB 4 DUP(?)

DRIVERWORKSPACE DB 12 DUP(?)

IMMADDRESS FRAGNENTCNT

ADDRESS1

DB 6 DUP(?)

DW 2

DW OFFSET CHECKSUM

DW SEG CHECKSUM

DW 30

DW OFFSET STROKA

DW SEG STROKA

DW 32

ADDRESS2

SIZ

DATA ENDS

ST1   SEGMENT STACK 'STACK' DW 100 DUP(?)

ST1 ENDS

CODE SEGMENT

ASSUME CS:CODE,   DS:DATA, SS:ST1 BEGIN:

MOV AX,DATA MOV DS,AX CALL WHAT_POINT CMP    AL,OFFH JZ OKI JMP _END

;открыть сокет данной программы MOV ВХ, 0 MOV AL,OFFH

MOV DX,1004H

CALL   DWORD   PTR CS:NET_POINT CMP AL,0 JZ OKJDPEN ; сокет не удалось открыть MOV АН,9 LEA  DX,TEXT INT 21H

JMP   SHORT _END OKJDPEN:

;дать команду ожидания

PUSH DS

POP ES LEA  SI,LINK MOV BX,04H ;вызов функции ожидания

CALL  DWORD  PTR CS:NET_POINT CMP    AL,OFFH JNZ WAI MOV   AH, 9

OKI:

LEA DX,TEXT1 INT 21H

JMP    SHORT _CLOSE ;цикл ожидания WAI :

MOV AH, 1 INT     16H . JNZ _CLOSE CALL FOR_WAIT CMP DS:INUSE,0 JNZ WAI

; пакет получен, выдать информацию MOV АН, 9

LEA DX,STROKA INT 21H /закрыть сокет _CLOSE:

MOV BX, 1 MOV DX,1004H

CALL  DWORD   PTR CS:NET_POINT ;выход из программы _END:

MOV АН,4CH

INT 21H /раздел процедур

/определение точки  входа  в  сетевой драйвер

WHAT_POINT PROC

MOV АХ,7АООН INT 2FH CMP AL,OFFH JNZ NO_IPX MOV CS:NET_POINT, DI MOV CS:NET_POINT+2,ES NO_IPX:

RET

WHAT_POINT ENDP

/процедура,   вызываемая  при ожидании FOR_WAIT PROC

PUSH BX

MOV BX,OAH

CALL  DWORD  PTR CS:NET_POINT

;точка входа   в   сетевой драйвер NET_POTNT DW ? DW ?

CODE ENDS

END BEGIN

2

/сетевая программа  - рабочая станция (посылает) ;сокет -  4002Н,   в перевернутом виде 2004Н

DATA SEGMENT

TEXT    DB не удалось

TEXT1  DB   'Пакет отправлен.',13,10, '$ '

пакета

CHECKSUM DB  2 DUP(?)

LEN DB  2 DUP(?)

TRANSPORTCONTROL    DB ?

PACKETTYPE DB 4

сети

DESTNETWORK DB 0

DB 0 DB 19H

DB 58H

рабочей станции где находится

1

DESTNODE DB ООН

DB DB DB DB DB

OCHH 6CH

23H

54H 27H

/сокет 4001H

DESTSOCKET

SOURCENETWORK

программы 1

DW DB

SOURCENODE DB

SOURCESOCKET DB /здесь данные -  32 байта

STROKA

/здесь блок ЕСВ

1004H

4 DUP(?) 6 DUP(?)

2 DUP(?)

DB   'Эта строка передается по сети',13,10,'$'

LINK

DB

4

DUP(?)

ESRADDRES

DB

4

DUP(0)

INUSE

DB

1

 

CCODE

DB

о

 

SOCKET

DW

2004H

IPXWORKS РАСЕ

DB

4

DUP(?)

DRIVERWORKSPACE IMMADDRESS

DB 12 DUP(?) DB ООН

DB DB

OCOH 6CH

DW DW

DW    OFFSET STROKA

DW 32

DB 23H DB 54H DB   2 7H FRAGNENTCNT ADDRESS1

DW     SEG CHECKSUM DW     3 0 ADDRESS2 DW     SEG STROKA SIZ

DATA ENDS

ST1   SEGMENT  STACK 'STACK' DW 100 DUP(?)

ST1 ENDS CODE SEGMENT

ASSUME CS:CODE,   DS:DATA, BEGIN:

MOV AX,DATA MOV DS,AX . CALL WHAT_POINT CMP    AL,OFFH JZ OKI JMP _END

OKI:

/открыть сокет данной программы MOV ВХ,0 MOV AL,OFFH

MOV DX,2004H

CALL   DWORD   PTR CS:NET_POINT CMP AL,0 JZ OK_OPEN ;не удалось открыть MOV АН,9 LEA  DX,TEXT INT 21H

JMP   SHORT _END OK_OPEN:

/дать команду  посылки пакета MOV ВХ,3

PUSH DS

OFFSET CHECKSUM

SS:ST1

POP ES

LEA    SI,DS:LINK ;вызов функции посылки

CALL  DWORD  PTR CS: NET__POINT ,-цикл ожидания WAI:

MOV   AH, 1

INT 16H

JNZ _CLOSE

CALL FOR_WAIT

CMP DS:INUSE,0

JNZ WAI ;пакет отправлен

MOV AH,9

LEA DX,TEXT1

INT 21H ;закрыть сокет _CLOSE:

MOV BX,1

MOV DX,2 004H

CALL  DWORD PTR CS:NET_POINT

;выход из программы _END:

MOV AH,4CH

INT 21H ;раздел процедур

; определение точки входа в сетевой драйвер WHAT_POINT PROC

MOV АХ,7АООН

INT  2FH .

CMP AL,OFFH

JNZ NO_IPX

MOV CS:NET_POINT,DI

MOV CS:NET_POINT+2,ES NO_IPX:

RET

WHAT_POINT ENDP

/процедура,   вызываемая при ожидании FOR_WAIT PROC

PUSH BX

MOV BX,OAH

CALL  DWORD  PTR CS:NETJ?OINTвхода в сетевой драйвер

NET POINT  DW ? DW ?

CODE ENDS

END BEGIN

Рис. 21.3. Пример двух программ, передающих и принимающих сообщение по

протоколу IPX.

Ниже приведен еще один пример обмена данными по протоколу IPX. Представле­ны две программы NETS и NETW. Вначале программа W посылает данные, ис-пользуятакназываемый широковещательный адрес - FFFFFFFFFFFFH. Если исполь­зовать этот адрес, то пакет будет передаваться всем рабочим станциям данного сег­мента. Программа NETS получает пакет. В блоке ESR при этом будет записан адрес рабочей станции, откуда пришел пакет. Таким образомм, программа NETS будет знать точный адрес программы NETW. Затем программа NETS уже по конкретному адресу посылает свои данные. После приема пакета в программе NETS стоит небольшая за­держка. Это сделано для того, чтобы рабочая станция с программой NETW успела настроиться на прием. Такая пауза необходима только в том случае, если программа NETW запущена на медленном компьютере. Разумеется, более корректным был бы другой подход: на каждое посланное сообщение программа должна ждать подтверж­дения, т.е. программа NETS должна посылать свое сообщение до тех пор, пока не получит от программы NETW подтверждения. Мы, однако, не используем это, дабы не усложнить программы.

Заметим, что программа NETW осуществляет прием пакета посредством установ­ки специальной процедуры прерывания - PROCJNT. Вызов этой процедуры осуще­ствляет сетевой драйвер по приходу пакета.

/данная программа NETS вначале ждет прихода сообщения программы NETW и узнает тем самым ее адрес по адресу посылает сообщение

программы -  4001Н,   в перевернутом виде 1004Н DATA SEGMENT

TEXT   DB не удалось открыть

ТЕХТ1  DB  'Функция принятия пакета не выполнена1,13,10,'$' ТЕХТ2 DB  'Пакет отправлен.',13,10,'$'

строка передается в ответ на полученное сообщение STROK DB передаваемая пакета

CHECKSUM DB 2 DUP(?)

LEN DB 2 DUP(?)

TRANSPORTCONTROL    DB ?

PACKETTYPE DB 4

DESTNETWORK DB 0

DB 0

DB б

DW 2004Н

DUP(?) DUP(?) DW 1004H

DB DB

DB DB DB DB

DW

DB

DB DB DW

DW

DW

DUP(?) DUP(O)

DB 19H

DB 58H

DESTNODE

DESTSOCKET

SOURCENETWORK

SOURCENODE

SOURCESOCKET ;здесь данные STROKA    DB  32 DUP(?) ;здесь блок ECВ

LINK

ESRADDRES

INUSE

CCODE

SOCKET

IPXWORKSPACE DRIVERWORKSPACE IMMADDRESS

FRAGNENTCNT ADDRESS1

DW     SEG CHECKSUM DW 30

ADDRESS2 DW   SEG STROKA

SIZ

DATA ENDS

ST1   SEGMENT  STACK 'STACK'

DW 100 DUP(?) STl ENDS

CODE SEGMENT

ASSUME CS:CODE,   DS:DATA, SS:ST1 BEGIN:

MOV AX,DATA MOV DS,AX

4 4 ? 9

1004H 4 DUP(?) 12 DUP(?) 6 DUP(?)

2

OFFSET CHECKSUM

OFFSET STROKA

DW 32

WHAT_POINT

AL,0FFH OKI

_END

CALL

CMP JZ JMP

OKI:

;открыть сокет MOV BX,0 MOV AL,0FFH MOV  DX, 1004H .

CALL  DWORD  PTR CS:NET "POINT

данной программы

CMP AL,О

JZ OK_OPEN ;сокет не удалось открыть MOV АН,9 LEA  DX,TEXT INT 21H JMP _END OK_OPEN:

,*дать команду ожидания

PUSH DS

POP ES

LEA   SI,LINK

MOV BX,04H /вызов функции ожидания

CALL  DWORD   PTR CS:NET_POINT

CMP    AL,OFFH

JNZ WAI

MOV   AH, 9

LEA DX,TEXT1

INT     21H .

JMP     SHORT _CLOSE

ожидания

WAI:

■ MOV    AH, 1 INT 16H

JNZ _CLOSE

CALL FOR_WAIT CMP DS:INUSE,0

JNZ WAI

/пакет получен,   выдать информацию MOV АН,9 LEA DX,STROKA INT 21H

адрес LEA     DI,DESTNODE LEA  SI,IMMADDRESS MOV сх,б

LOOQ:

LODSB STOSB

LOOP LOOQ

MOV DESTSOCKET,2004H

MOV SOCKET,1004H

MOV SOURCESOCKET,1004H

;переслать строку,  которая будет пересылаться обратно

LEA SI,STROK

LEA DI,STROKA

KLL:

LODSB

CMP AL,   ' $ '

JZ PAU

STOSB

JMP     SHORT KLL /здесь пауза,   чтобы программа NETW настроилась на прием PAU:

CALL   PAUSE 1 ;дать команду посылки пакета MOV ВХ,3

PUSH DS

POP ES

LEA    SI,DS:LINK ;вызов функции посылки

CALL   DWORD  PTR CS:NET_POINT ;цикл ожидания WAI1:

MOV    AH, 1

INT 16H JNZ _CLOSE CALL FOR_WAIT CMP DS:INUSE,0 JNZ WAIl /пакет отправлен MOV AH,9 LEA DX,TEXT2 INT 21H сокет

_CLOSE:

MOV BX, 1

MOV DX,1004H

CALL   DWORD   PTR CS:NET_POINT

из программы

_END:

MOV АН,4CH

INT 21H ;раздел процедур

/определение точки "входа  в   сетевой драйвер WHAT_POINT PROC

MOV АХ,7А00Н

INT 2FH

CMP AL,OFFH

JNZ NO_IPX

MOV CS:NETJ?OINT,DI

MOV CS:NET_POINT+2,ES

NO_IPX:

RET

WHAT_POINT ENDP

/процедура,   вызываемая  при ожидании FOR_WAIT PROC

PUSH BX

MOV BX,OAH

CALL DWORD  PTR CS:NET_POINT

POP BX RET

FOR_WAIT ENDP PAUSE PROC

PUSH CX

MOV CX,20

DAL:

PUSH CX

MOV CX,OFFFFH

PA:    LOOP PA

POP CX LOOP DAL POP CX RET

PAUSE ENDP

/точка входа  в сетевой драйвер NET_POINT DW ? DW ?

CODE ENDS

END BEGIN

/программа NETW,   посылает вначале на  все рабочие

/станции сообщение,   это сообщение должна принять /и программа NETS

/затем программа ждет ответного сообщения /сокет - 4002Н, в перевернутом виде 2004Н DATA SEGMENT

TEXT   DB   'Сокет не удалось открыть. ',13,10, '$'

ТЕХТ1 DB   'Пакет отправлен.', 13,10,'$'

ТЕХТ2  DB   'Функция принятия пакета не выполнена', 13,10, 1 $ '

/заголовок пакета

CHECKSUM DB  2 DUP(?)

' LEN DB  2 DUP(?)

488ЕМВЬЕЕ. Учебный курс

TRANS PORTCONTROL

DB

PACKETTYPE

DESTNETWORK

DB 19H

DB

4

DB

5BH

DB 0

DB 0

/широковещательный адрес

DESTNODE

DB

OFFH

РВ О'РРН РВ ОРРН РВ ОРРН РВ ОРРН

РВ ОРРН

иЕЭТЗОСКЕТ Ж 1004Н

SOURCENETWORK БВ 4 ии"Р(?)

ЗОШСЕЖЮЕ "         РВ 6 иир<?)

ЗОШСЕЭОСКЕТ Т)Щ 2 004Н /здесь данные

ЭТИОКА БВ 'Эта строка передается по сети', 13,10, '$' /здесь блок ЕСВ

LINK

DB

4 DUP(?)

ESRADDRES

DB

4 DUP(O)

INUSE

DB

1

CCODE

DB

7

SOCKET

DW

2004Н

IPXWORKSPACE

DB

4 DUP(?)

DRIVERWORKSPACE

DB

12   DUP(?)

IMMADDRESS

DB

OFFH

DB OFFH

 

 

DB OFFH

 

 

DB OFFH

 

 

DB OFFH

 

 

DB OFFH

 

 

FRAGNENTCNT

DW

2

ADDRESS1 ■

DW

OFFSET CHECKSUM

DW     SEG CHECKSUM

 

 

DW 30

 

 

ADDRESS2

DW

OFFSET STROKA

DW     SEG STROKA

 

 

SIZ

DW

32

DATA ENDS

ST1   SEGMENT   STACK    ' STACK1 DW   100 DUP(?)

ST1 ENDS

CODE SEGMENT

ASSUME CSrCODE,   DS: DATA, SS:ST1

BEGIN:

MOV AX,DATA MOV DS,AX CALL WHATJPOINT CMP    AL,OFFH JZ OKI JMP END

OKI:

/открыть сокет

программы MOV BX, 0 MOV AL,OFFH

MOV DX,2004H

CALL DWORD PTR CS:NET_POINT

CMP AL, 0 JZ OK_OPEN

удалось открыть MOV AH, 9 LEA  DX,TEXT

INT 21H

JMP   SHORT _END OKJDPEN:

команду посылки пакета

будет передаваться на  все станции MOV BX,3

PUSH DS

POP ES

LEA     SI, DS:LINK /вызов функции посылки

CALL   DWORD   PTR CS:NET_POINT ожидания

WAI:

MOV   AH, І INT     16H -JNZ _CLOSE CALL FOR_WAIT CMP DS:INUSE,0 JNZ WAI

отправлен MOV AH,9 LEA DX,TEXT1 /теперь ждем прихода пакета уже  по  конкретному адресу, ;т.е. по адресу,   по которому находится данная программа ;установим адрес  процедуры обработки прерывания

PUSH CS

POP ВХ

MOV    WORD  PTR ESRADDRES+2, BX

LEA    BX,PROC_INT

MOV    WORD PTR ESRADDRES, BX

команду ожидания

PUSH DS

POP    ES ■    ■ ■

LEA  SI,LINK MOV BX,04H ;вызов функции ожидания

CALL  DWORD  PTR CS:NET_POINT

CMP    AL,OFFH

JNZ WAI1

MOV   AH, 9

LEA DX,TEX.T1

INT 21H

JMP     SHORT _CLOSE ожидания

WAI1:

;ждем прихода  пакета либо нажатия клавиши MOV   АН, О INT 16Н

сокет

_CLOSE:

MOV BX,1

MOV   DX,2 004H

CALL   DWORD   PTR CS:NET_POINT ;выход из программы _END:

MOV AH,4CH

INT 21H процедур

/определение точки входа  в  сетевой драйвер WHAT_POINT PROC MOV АХ,7АООН INT 2FH CMP AL,0FFH JNZ NO_IPX MOV CS:NET_POINT,DI MOV CS:NET_POINT+2,ES

NO_IPX:

RET

WHAT_POINT ENDP

вызываемая   при ожидании FOR_WAIT PROC

PUSH ВХ

MOV BX,0AH

CALL DWORD PTR CS:NET_POINT

POP BX

RET

FOR_WAIT ENDP

обработки   ситуации   прихода пакета

PROC_INT PROC

;пакет получен,    выдать информацию MOV АН,9 LEA   DX,STROKA

INT 21H

; послать в буфер клавиатуры символ M0VAH,5 MOVCL,32

INT 16H

RETF PROCINT ENDP

;точка входа в сетевой драйвер NET POINT  DW ? DW ?

CODE ENDS

END BEGIN

Рис. 21.4. Еще две программы, связывающиеся друг с другом по сети.

Диагностика сети.

Для успешной работы Вашей сетевой программы она должна уметь получать ин­формацию о сети. Особенно это важно в сложных сетях, содержащих несколько сег­ментов. Один из способов получения информации—это использование специально­го диагностического сокета - 456Н. Идея заключается в следующем: программа долж­на послать специальный запрос по широковещательному адресу (FFFFFFFFFFFFH), а затем ждать ответа от всех станций. Анализируя приходящую информацию, програм­ма определяет сетевые адреса мостов и номера подключенных к ним сетей. Посылая в эти сети запросы, можно получить и их конфигурацию. Двигаясь таким образом, мож­но узнать конфигурацию всей сети.

Для посылки запроса следует сформировать обычный заголовок в 30 байт. Блок данных имеет следующую структуру:

Exclusions db ?

listl db 6 dup(?)

Iist80        db 6 dup(?)

В заголовке пакета может стоять адрес конкретной        Тогда информация

будет получена только отнее. Если указан широковещательный адрес, то в блоке дан­ных можно указать адреса станций, от которых не требуется информации.

В блокеЕСВІггшіАаагезтакжеук^^ адреса мостов. Сокет456Нне нужно открывать или закрывать. Он используется для форми­рования адреса. Для передачи же запроса и приема ответа следует открьпъсвой сокет.

Пришедший пакет состоит из стандартного заголовка и блока данных. Блок дан­ных состоит из двух частей.

Первая часть:

DB ? ; старшая часть версии диагностического сервиса DB ? ; младшая часть версии диагностического сервиса DW ?   ;   номер SPX-сокета для диагностики

DB  ?        количество компонентов программного и аппаратного ;   обеспечения,   информация о которых содержится в данном пакете

Вторая часть.

Состоитизотдельныхкомпонент. Компонентаначинаетсяс байта-идентификато­ра. байт говорит нам том, какая структура далее будет использована: простая или расширенная. Простая структура состоит всего из одного байта.

Значение этого байта:

О-драйвер IPX/SPX,

1 - драйвер программного обеспечения моста,

2 - драйвер сетевой оболочки рабочей станции,

3 - сетевая оболочка,

4 - сетевая оболочка в виде VAP-процесса.

Расширенная структура сама по себе имеет две части: фиксированную и перемен-нойдлины.

Вот структура фиксированной части:

DB ? /идентификатор

DB ?  /количество сетей,  подключенных к мосту <ид.=5)

Значение идентификатора: 5 - внешний мост, 6 - файл-сервер с внутренним мос­том, У - невыделенный файл-сервер

Переменная часть описывает сети, подключенные к мосту Вот структура,

описывающая сеть:

DB ? ; тип сети

DB 4 DUP(?)  ;номер сети

DB 6 DUP(?) ;сетевой адрес адаптера

Типы сетей:

0 - сеть, к которой подключен сетевой адаптер

1 - сеть с виртуальным сетевым адаптером (невыделенный файл-сервер)

2 - переназначенная удаленная линия (связь через модем).

Пример программы, которая тестирует локальную сеть указанным средством, Вы найдете в книге [31].

Хочу заметить, что диагностические средства IPX могут понадобиться Вам при создании сетевых приложений, обменивающихся информацией друг сдругом. Дело в том, что сеть может состоять из нескольких сегментов, которые соединяются друг с другом мостами. Ваша программа должна найти программу, с которой она хочет свя­заться в этой сложной системе. Ничего не поделаешь, но придется выяснять адреса мостов, затем посылать диагностические пакеты через эти мосты и т.д. Алгоритм по­иска напоминает поиск файла по дереву каталогов, т.е. рекурсивен.

IV. Протокол SPX.

Протокол SPX(SequencedPacket Exchange) является протоколом более высокого уров­ня, чем IPX. В своей работе он использует средства протокола IPX. Протокол БРХдает более надежный способ обмена информацией, таккак в основе его лежит установка кана­ла между двумя программами, работающими в сети. Можно сказать, что посредством про­токола ЗРХосуществляется синхронная связь (асинхронная в случае протокола IPX).

Формат пакета SPX совпадает с форматом пакета IPX, но в конце добавляется еще 12 байт, то есть длина заголовка пакета становится равной 42 байта. Ниже представ­лен формат последних 12 байт.

Длина

Название

Предназначение

1

CONNCONTROL

набор битовых флагов 01-08Н - зарезервировано ЮН -бит может использоваться программой для сигнализации об окончании передачи данных 20Н -игнорируется SPX 40H - используется драйвером SPX 80Н - используется драйвером SPX

1

DATASTREAMTYPE

Набор битовых флагов OOH-FDH - игнорируются IPX, FEH - команда завершения связи посылает пакет с установленным данными битами, FFH - системный пакет, подтверждающий завершение связи

2

SOURCECONN1D

номер канала связи передающей программы

2

DESTCONNID

номер канала связи принимающей стороны

2

SEQNUMBER

счетчик пакетов, переданных по каналу в одном направлении

2

ACKNUMBER

номер следующего пакета, который должен быть = принят драйвером SPX

2

ALLOCNUMBER

количество буферов, распределенных для приема пакета.

IPX.

Сетевые функции SPX.

Функция разрыва соединения.

Вход:

ВХ=14Н

DX - номер соединения.

Инициализация SPX.

Вход:

ВХ=10Н

AL=0

Выход:

AL=Q      не инсталлирован инсталлирован часть номера версии SPX часть номера версии SPX СХ-максимальноечислосоединений DX-доступноечисло соединений.

Создать соединение между исходной станцией и заданной станцией назначения.

Вход:

ВХ=11Н

попыток

АН-флаг сканирования соединения

ES:SI - указатель на ЕСВ Выход:

код завершения О - успешно (SPX пытается создать соединение) EFH - локальнаятаблицасоединений полна FDH-ошибка в ЕСВ FFH - посылающий сокетне открыт

Окончательный код завершения:

QQ - соединение установлено EDH- нет ответа из узла назначения EFH- таблица соединений полна

FCH- отправляющий сокет закрыт во время фоновой обработки FDH-ошибкавЕСВ

FFH- посылающее гнездо не открыто.

Функция возвращения статуса существующего соединения.

Вход:

ВХ=15Н

соединения ES:SI - указатель на буфер ответа

Выход:

AL-QQ успешный

ЕЕН нет такого соединения

Функция ожидания соединения.

Вход: ВХ=12Н

AL-число попыток

АН-флаг сканирования соединения.

ES:SI - указатель на ЕСВ

Выход:

окончательный код завершения

00 - соединение установлено

EFH - локальная таблица соединений полна

FCH - снято ожидание

FFH - сокет не открыт

Функция ожидания пакета.

Вход:

ВХ=17Н

ES:SI - указатель на ЕСВ.

Выход:

окончательный код завершения 00-успешно

EDH - соединение разрушено FCH - соединениеснято FDH-буфер очень мал FFH - сокет не открыт

Функция посылки пакета.

Вход:

ВХ=16Н

DX-номер соединения ES:SI - указатель на ЕСВ

Выход:

окончательный код завершения 00 - успешно

ЕСН - другая станция закрыла соединение

EDH - соединение разрушено

ЕЕН - нет такого соединения

FCH-сокет не открыт

FDH - пакетслишком большой

Функция разрыва соединения.

Вход:

ВХ=13Н

- номер соединения ES:SI - указатель на ЕСВ

Выход:

окончательный код завершения 00 - успешно

ECH -другая станция закрыла соединение EDH - соединение разрушено ЕЕН - нет такого соединения FCH - сокетне открыт FDH - буфер очень большой

Ниже приводятся две программы, устанавливающие между собой канал SPX свя­зи. Программы не обмениваются пакетами - я считаю, что читатель сможет самостоя­тельно добавить соответствующие процедуры.

Обращаю Вашевниманиенапятикратныйвызовфункцииприемапакета(функ-ция ПН) перед установкой связи. Для нашего случая в принципе достаточно было бы и одинарного вызова. Не считая себя глубоким специалистом в области механизмов работы драйвера протокола 8РХ,ялишь сошлюсь на [30,31] и приведу цитату из [30]: "Выполните 5 вызовов функции 17Н, чтобы передать SPX пул блоков ЕСВ и буферов пакетов. SPX использует несколько из этих внутренним образом прозрачно для вашей программы."

/программа,  использующая протокол SPX (1) /программа работает на сокете 7001Н (1007Н) /ждет соединения DATA SEGMENT

/пять пакетов и блоков ЕСВ для вызова функции /приема пакета

.******************************************

/заголовок пакета 1 CHECKSUM LEN

TRANSPORTCONTROL

PACKETTYPE DESTNETWORK

DB 2 DUP(?) DB 2 DUP(?)

DB 0

DB 5

DB 4 DUP(?) DB  6 DUP(?)

DB 2 DUP(?) DB 4 DUP(?)

DB

DW 1007H

DESTNODE

DESTSOCKET SOURCENETWORK

SOURCENODE

SOURCESOCKET / SPX

CONNCONTROL

DATASTREAMTYPE SOURCECONNID

DW ?

DB ?

DB

DESTCONNID

DW

SEQNUMBER

ACKNUMBER

ALLOCNUMBER

DW ?

DW ?

DW ?

DUP(?) DUP (0)

/Здесь данные STROKA    DB   534 DUP(?) /блок ЕСВ 1 LINK1 DB ESRADDRES1 DB INUSE1 DB CCODE1 DB SOCKET1 DW IPXWORKS РАСЕ1 DB DRIVERWORKSPACEl DB IMMADDRESS1 DB FRAGNENTCNT1 DW ADDRESS11 DW

DW     SEG CHECKSUM

DW 42

ADDRESS21 DW DW   SEG STROKA

SIZ1 DW 534

i ******************************************

;заголовок пакета З

4 4

•> о

1007H

4 DUP(?)

12 DUP(?) 6 DUP(?) 2

OFFSET CHECKSUM

OFFSET STROKA

/SPX

CHECKSUM3

DB

2

DUP(?)

LEN3

DB

2

DUP(?)

TRANSPORTCONTROL3

DB

0

 

PACKETTYPE3

DB

5

 

DESTNETWORK3

DB

4

DUP(?)

DESTNODE3 '

DB

6

DUP(?)

DESTSOCKET3

DB

2

DUP(?)

SOURCENETWORK3

DB

4

DUP(?)

SOURCENODE3

DB

6

DUP(?)

SOURCESOCKET3

DW

1007H

CONNCONTROL3

DB

?

 

DATASTREAMTYPE3

DB

•>

 

SOURCECONNID3

DW

■?

 

DESTCONNID3

DW

?

 

SEQNUMBER3

DW

 

 

ACKNUMBER3

DW

?

 

ALLOCNUMBER3

DW

 

 

данные STROKA3   DB   534 DUP(?) /блок ЕСВ 3

LINK3

ESRADDRES3 INUSE3

DB DB

DB

DUP DUP (?) (0)

CCODE3

S0CKET3

IPXWORKS PACE З

3

IMMADDRESS3

FRAGNENTCNT3

ADDRESS13

SEG

DW 42

ADDRESS23

DW   SEG STROKA3

SIZ3

. **********************

t

пакета 4

DB ?

DW 1007H

DB 4 DUP(?>

DB 12 DUP(?)

DB 6 DUP(?)

DW 2

DW OFFSET

DW OFFSET STROKA3 DW 534

;Spx

CHECKSUM4

DB

2

DUP(?)

LEN4

DB

2

DUP(?)

TRAN S PORTCONTROL 4

DB

0

 

РАСКЕТТУРЕ 4

DB

5

 

DESTNETW0RK4

DB

4

DUP(?)

DESTNODE4

DB

6

DUP(?)

DESTSOCKET4

DB

2

DUP(?)

SOU[RCENETWORK4

DB

4

DUP(?)

SOURCENODE4

DB

6

DUP(?)

SOURCESOCKET4

DW

1007H

CONNCONTROL4

DB

?

 

DATASTREAMTYPE4

DB

?

 

SOURCECONNID4

DW

?

 

-DESTC0NNID4

DW

?

 

SEQNUMBER4

DW

?

 

ACKNUMBER4

DW

?

 

ALLOCNUMBER4

DW

?

 

данные STROKA4   DB 534 ;блок ЕСВ 4

DUP(?)

LINK4

DB

4

DUP(?)

ESRADDRES4

DB

4

DUP (0)

INUSE4

DB

?

 

CCODE4

DB

?

 

S0CKET4

DW

1007H

IPXWORKSPACE4

DB

4

DUP(?)

DRIVERWORKSPACE4

DB

12

DUP{?)

IMMADDRESS4

DB

6

DUP(?)

FRAGNENTCNT 4

DW

2

 

OFFSET CHECKSUM4

DW   OFFSET STROKA4

DW

SEG

DW 42 ADDRESS24

DW SEG

SIZ4 DW 534

пакета 5

;SPX

CHECKSUMS

DB

2

DUP(?)

LEN5

DB

2

DUP(?)

TRANSP0RTC0NTR0L5

DB

0

 

PACKETTYPE5

DB

5

 

DESTNETW0RK5

DB

4

DUP(?)

DESTNODE5

DB

6

DUP(?)

DESTSOCKET5

DB

2

DUP(?)

SOURCENETWORK5

db

4

DUP(?)

S0URCEN0DE5

DB

6

DUP(?)

SOURCESOCKET5

DW

1007H

CONNCONTROL5

DB

?

 

DATASTREAMTYPE5

DB

?

 

SOURCECONNID5

DW

?

 

DESTCONNID5

DW

?

 

SEQNUMBER5

DW

?

 

ACKNUMBER5

DW

?

 

ALL0CNUMBER5

DW

?

 

данные STR0KA5  DB  534 DUP(?) ;блок ЕСВ 5

LINK5

ESRADDRES5

inuse5

CCODE5

S0CKET5

IPXW0RKSPACE5

DRIVERW0RKSPACE5

IMMADDRESS5

FRAGNENTCNT 5

ADDRESS15

DW SEG

DW 42

ADDRESS25

DW   SEG STROKA5

SIZ5

DB DB DB DB DW DB

4 DUP(?) 4 DUP(O)

? ?

1007H 4 DUP(?)

DB 12 DB DW DW

DUP(?)

6 DUP(?)

2

OFFSET CHECKSUM5

DW OFFSET STROKA5 DW 534

.******************************************

пакета 6

;SPX

CHECKSUM6

DB

2

DUP(?)

LEN6

DB

2

DUP (?)

TRANSP0RTC0NTR0L6

db

0

 

PACKETTYPE6

db

5

 

DESTNETW0RK6

DB

4

DUP(?)

DESTN0DE6

DB

6

DUP(?)

DESTSOCKET6

db

2

DUP(?)

SOURCENETWORK 6

DB

4

DUP(?)

SOURCENODE6

DB

6

DUP(?)

SOURCESOCKET6

DW

1007H

CONNCONTROL6

DB

7

 

DATASTREAMTYPE6

DB

?

 

SOURCECONNID6

DW

7

 

DESTCONNID6

DW

7

 

SEQNUMBER6

DW

7

 

ACKNUMBER6

DW

7

 

ALLOCNUMBER 6

DW

7

 

данные STROKA6   DB   534 DUP(?) /блок ЕСВ б

LINK6

ESRADDRES6

INUSE6

CCODE6 SOCKET6

IPXWORKS PACE б DRIVERWORKSPACE6 IMMADDRESS6 FRAGNENTCNT б ADDRESS 16

SEG

DW 42 ADDRESS26

DW

SIZ6

DB

db db db

DW

DB DB DB

DW DW

DUP(?) DUP(O)

4

4

7 7

1007H 4 DUP(?) 12 DUP(?)

6   DUP(?)

2

OFFSET

CHECKSUM6

OFFSET STROKA6

;пакет   и блок ЕСВ для установления связи ,•*////***********•****************** \\ \ *********** *

заголовок пакета 2

CHECKSUM2 DB  2 DUP(?)

LEN2 DB  2 DUP(?)

TRANSPORTCONTROL2 DB ;SPX

PACKETTYPE2

DB

5

 

 

DESTNETWORK2

DB

4

DUP1

(?)

DESTNODE2

DB

6

DUP'

(?)

DESTSOCKET2

DB

2

DUP.

(?)

SOURCENETWORK2

DB

4

DUP'

(?)

SOURCENODE2

DB

6

DUP

(?)

SOURCESOCKET2

DW

1007H

 

CONNCONTROL2

DB

О

 

 

DATASTREAMTYPE2

DB

О

 

 

SOURCECONNID2

DW

О

 

 

DESTCONNID2

DW

О

 

 

SEQNUMBER2

DW

О

 

 

ACKNUMBER2

DW

О

 

 

ALL0CNUMBER2

DW

О

 

 

DB  534 DUP(?)

DB DB

DB DB DW

DB

DUP(?) DUP(O)

4 4

? ?

1007H

4 DUP(?)

DB 12 )

DB

DW

DW

DW

DUP i

)

;Здесь данные

STROKA2

;блок ЕСВ 1

LINK

ESRADDRES

INUSE CCODE SOCKET

IPXWORKSPACE DRIVERWORKS PACE IMMADDRESS

FRAGNENTCNT

ADDRESS1

DW   SEG CHECKSUM2

DW 42

ADDRESS2 DW   SEG STROKA2

SIZ

;область сообщений

TEXT1   DB   "Сетевые  функции отсутствуют.",13,10, 1 $• TEXT2   DB   "Сокет не удалось  открыть.",13,10,'$1 ТЕХТЗ  DB   "Канал установлен.", 13,10, '$ '

_DX DW ?

DATA ENDS

STAC SEGMENT STACK

DW  100 DUP(?)

STAC ENDS CODE SEGMENT

ASSUME CS:CODE,

14-4072

6 1

OFFSET CHECKSUM2

OFFSET STROKA2

DW 534

DS:DATA,   SS:STAC,   ES:DATA

BEGIN:

MOV   AX,DATA MOV DS,AX CALL WHAT_POINT CMP AL,OFFH JZ _OK1 LEA DX,TEXT1 MOV AH, 9 INT 21H JMP END

_OKl:

; протокол   SPX присутствует ; открыть сокет

XOR BX,BX

MOV   AL,OH .

MOV DX,1007H

CALL DWORD PTR CS:NET_POINT CMP AL,0

JZ OK_OPEN ;сокет не удалось открыть LEA DX,TEXT2 MOV AH,9 INT 21H JMP _END OK_OPEN:

открыт

PUSH DS

POP ES

/пятикратный вызов   функции приема  пакета (17Н) LEA SI,DS:LINK1 MOV BX,17H

CALL  DWORD   PTR CS:NET_POINT LEA SI,DS:LINK3 MOV BX,17H

CALL  DWORD  PTR CS:NET_POINT LEA SI,DS:LINK4 MOV BX,17H

CALL  DWORD  PTR CS:NET_POINT LEA SI,DS:LINK5

MOV BX,17H

CALL DWORD PTR CS:NET_POINT

LEA SI,DS:LINK6 MOV BX,17H

CALL  DWORD  PTR CS:NET POINT

Глава 21.. Программирование в локальных сетях

; ждать соединения

MOV ВХ, 12Н

MOV AL, О

MOV АН,О

LEA SI, ES:LINK

CALL DWORD PTR CS:NET_POINT ;ждем установления канала WAI:

MOV AH, 1 INT     16H

JNZ _CLOSE

CALL FOR_WAIT

CMP DS: INUSE, 0

JNZ WAI

MOV _DX,DX ;канал установлен

LEA DX,TEXT3

MOV AH,9

INT 21H _ABORT:

MOV DX,_DX

MOV BX,14H

CALL  DWORD   PTR CS:NET_POINT

канал

_CLOSE:

MOV BX, 1

MOV DX,1007H

CALL DWORD PTR CS:NET_POINT

_END:

MOV AX,4C00H

INT 21H /область процедур

;определение наличия  сетевых протоколов и /определение точки входа  в  сетевой драйвер WHAT__POINT PROC

MOV АХ,7А00Н

INT 2FH

CMP AL,OFFH

JNZ NO_IPX_SPX

MOV  CS:NET_POINT, DI

MOV  CS:NET_P0INT+2,ES наличие SPX

XOR AL,AL ■

MOV BX,10H

CALL   DWORD   PTR  CS:NET POINT

14*

NO_IPX_SPX:

RETN WHAT_POINT ENDP

/процедура, вызываемая при ожидании FOR_WAIT PROC

PUSH BX

MOV BX, OAH

CALL  DWORD  PTR CS:NET_POINT

POP BX RET

FOR_WAIT ENDP

PAUSE PROC

PUSH CX

MOV CX,20

DAL:

PUSH CX

MOV    CX,OFFFFH

PA: LOOP PA

POP CX

LOOP DAL

POP CX RET

PAUSE ENDP

;адрес вызова  сетевых процедур NET_POINT    DW ? DW ?

CODE ENDS

END BEGIN

/программа,   использующая протокол SPX   (2)/программа работает

на   сокете   /7002Н (2007Н)

соединение

DATA SEGMENT

/пять пакетов  и блоков  ЕСВ для  вызова функции пакета

(.************************************

пакета 1

CHECKSUM DB 2 DUP(?)

LEN DB 2 DUP(?)

TRANSPORTCONTROL DB 0

PACKETTYPE DB 5

DESTNETWORK DB 4 DUP(O)

DESTNODE DB  6 DUP(O)

Гдава 21. Программирование в локальных сетях

DESTSOCKET DW

SOURCENETWORK DB SOURCENODE SOURCESOCKET ; SPX '

CONNCONTROL DB

DATASTREAMTYPE DB

SOURCECONNID DW

DESTCONNID DW

SEQNUMBER DW

ACKNUMBER DW ALLOCNUMBER DW

; здесь данные STROKA

DUP (?)

DB 6 DUP(?) DB  2 DUP(?)

DB  534 DUP(?) .************************************

; здесь  блок ЕСВ 1

LINK1

ESRADDRES1

INUSE1 CCODE1 SOCKET1

IPXW0RKSPACE1 DRIVERWORKS РАСЕ1

IMMADDRESS1

FRAGNENTCNT1 ADDRESS11

4

4 DUP(O)

1

7

2007H 4 DUP(?)

DB   12   DUP ( ? )

DB DB

DB

DB

DW

DB

DB

DW DW DW DW

ADDRESS21 DW

DW

SIZ1 DW f. *******************

/заголовок пакета 3

CHECKSUM3 DB

LEN3 DB

TRANSP0RTC0NTR0L3 DB

PACKETTYPE3 DESTNETWORK3

DESTNODE3

DESTSOCKET3 DW

SOURCENETWORK3 DB

SOURCENODE3 DB

SOURCESOCKET3 DB

;SPX 5 DUP(O)

OFFSET CHECKSUM SEG CHECKSUM

42

OFFSET STROKA

SEG STROKA

534

*****************

DUP (?) DUP (?)

DB

DB 4 DUP(O)

DB   6 DUP(O)

DUP(?)

DUP (?) DUP(?)

ASSEMBLER. Учебпыйкурс

CONNCONTROL3

DB

7

 

 

DATASTREAMTYPE3

DB

7

 

 

SOURCECONNID3

DW

•>

 

 

DESTCONNID3

DW

7

 

 

SEQNUMBER3

DW

7

 

 

ACKNUMBER3

DW

7

 

 

ALL0CNUMBER3

DW

7

 

 

; здесь данные

 

 

 

 

STROKA3

DB

534 DUP(?)

/. ****************

******

• * * *

***********

; здесь  блок ЕСВ 3

 

 

 

 

LINK3

DB

4

DUP (?)

ESRADDRES3

DB

4

DUP(0)

INUSE3

DB

1

 

 

CCODE3

DB

7

 

 

S0CKET3

DW

2007H

IPXW0RKSPACE3

DB

4

DUP(?)

DRIVERWORKSPACE3

DB

12

DUP(? )

IMMADDRESS3

DB

6

DUP

(0)

FRAGNENTCNT3

DW

2

 

 

ADDRESS31

DW

OFFSET CHECKSUM3

 

DW

SEG <

CHECKSUM3

 

DW

42

 

ADDRESS32

DW

OFFSET STROKA3

 

DW

SEG

STROKA3

SIZ3

DW

534

 

/*****************

' * if-kr * *

***■

***********

;заголовок пакета

4

 

 

 

CHECKSUM4

DB

2

DUP

(?)

LEN4

DB

2

DUP

(?)

TRANS P0RTC0NTR0L4

DB

0

 

 

PACKETTYPE4

DB

5

 

 

DESTNETWORK4

DB

4

DUP

(0)

DESTNODE4

DB

6

DUP

(0)

DESTSOCKET4

DW

0

 

 

SOURCENETWORK 4

DB

4

DUP

(?)

SOURCENODE4

DB

6

DUP

(?)

SOURCESOCKET4

DB

2

DUP

(?)

;SPX

 

 

 

 

CONNCONTROL4

DB

7

 

 

DATASTREAMTYPE4

DB

7

 

 

SOURCECONNID4

DW

7

 

 

DESTCONNID4

DW

7

 

 

SEQNUMBER4

DW

9

 

 

Глава 21. Программирование в локальных сетях

ACKNUMBER4

DW

?

 

ALL0CNUMBER4

DW

?

 

данные

 

 

 

STROKA4

DB

534 DUP(?)

********

 

j                              ^   ^   ^   ^   ^   ^   ^   ^   ^   ^  ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^   ^    ^    ^1    1 1

;здесь блок ЕСВ 4

 

LINK4

DB

4

 

ESRADDRES4

DB

4 DUP(O)

 

INUSE4

DB

1

 

CCODE4

DB

?

 

SOCKET4

DW

2007H

 

IPXW0RKSPACE4

DB

4 DUP(?)

 

DRIVE RWORK S РАС Е 4

DB

12 DUP(?)

 

IMMADDRESS4

DB

6 DUP(O)

 

FRAGNENTCNT4

DW

2

 

ADDRESS41

DW

OFFSET

 

 

DW

SEG CHECKSUM4

 

 

dw

42

 

ADDRESS42

DW

OFFSET  STROKA4

 

 

DW

SEG STROKA4

 

SIZ4

DW

534

 

/.************************************

 

пакета

5

 

 

CHECKSUMS

DB

2

 

LENS

DB

2 DUP(?)

 

TRANSP0RTC0NTR0L5

DB

0

 

PACKETTYPE5

DB

5

 

DESTNETWORK5       DB 4

DUP(0)

 

DESTNODE5

DB

6 DUP(O)

 

DESTSOCKET5

DW

0

 

SOURCENETWORK5

DB

4 DUP(?)

 

SOURCENODE5

DB

6 DUP(?)

 

SOURCESOCKET5

DB

2 DUP(?)

 

;SPX

 

 

 

CONNCONTROL5

DB

?

 

DATASTREAMTYPE5

DB

?

 

SOURCECONNID5

DW

?

 

DESTC0NNID5

DW

?

 

SEQNUMBER5

DW

?

 

ACKNUMBER5

DW

?

 

ALL0CNUMBER5

DW

?

 

данные

 

 

 

STROKA5

DB

534

 

. ************************************

 

блок ЕСЕ 5

 

 

LINK5

DB

4 DUP(?)

ESRADDRES5

DB

4 DUP(O)

INUSE5

DB

1

CCODE5

DB

?

S0CKET5

DW

2007H

IPXW0RKSPACE5

DB

4 DUP(?)

DRIVERWORKSPACES

DB

12 DUP(?)

IMMADDRESS5

DB

6 DUP(O)

FRAGNENTCNT5

DW

2

ADDRESS51

DW

OFFSET CHECKSUM5

 

DW

SEG CHECKSUM5

 

DW

42

ADDRESS52

DW

OFFSET STROKA5

 

DW

SEG STROKA5

SIZ5

DW

534

* *************************************

;заголовок пакета

б

 

CHECKSUM6

DB

2 DUP(?)

LEN6

DB

2 DUP(?)

TRANSPORTCONTROL6

DB

0

PACKETTYPE6

DB

5

DB 4 DUP(O)

DESTNODE6

DB

6 DUP(O)

DESTSOCKET6

DW

0

SOURCENETWORK 6

DB

4 DUP(?)

SOURCENODE6

DB

6 DUP(?)

SOURCESOCKET б

DB

2 DUP(?)

;SPX

 

 

CONNCONTROL 6

DB

7

DATASTREAMTYPE6

DB

7

SOURCECONNID6

DW

7

DESTCONNID6

DW

7

SEQNUMBER6

DW

7

ACKNUMBER6

DW

7

ALLOCNUMBER6

DW

7

данные

 

 

STROKA6

DB

534

.*******************

r

*****************

;здесь  блок ЕСЕ б

LINK6 DB 4 DUP(?)

ESRADDRES6 DB 4 DUP(O)

INUSE6 DB 1

CCODE6 DB ?

S0CKET6

DW

2007H

IPXWORKS РАСЕ б

DB

4 DUP(?)

DRIVE RWORK S РАС Е 6

DB

12 DUP(?)

IMMADDRESS6

DB

6 DUP(O)

FRAGNENTCNT6

DW

2

ADDRESS 61

DW

OFFSET CHECKSUM6

 

DW

SEG

 

DW

42

ADDRESS 62

DW

OFFSET STROKA6

 

DW

SEG STROKA6

SIZ6

DW

534

; пакет и блок ЕСВ для установления связи

. **/////**********************************\\\\\******

;заголовок пакета 2  для установления связи

CHECKSUM2

DB

2

LEN2

DB

2 DUP(O)

TRANS PORTCONTROL2

DB

0

PACKETTYPE2

DB

5

DESTNETWORK2

DB

00

 

DB

00

 

DB

19H

 

DB

58H

DESTNODE2

DB

ООН

 

DB

40H

 

DB

95H

 

DB

OEOH

 

DB

9FH

 

DB

67H

DESTSOCKET2

DW

1007H

SOURCENETWORK2

DB

4 DUP(?)

SOURCENODE2

DB

6 DUP(?)

SOURCESOCKET2

DB

2 DUP(?)

;SPX

 

 

CONNCONTROL2

DB

0

DATASTREAMTYPE2

DB

0

SOURCECONNID2

DW

0

DESTCONNID2

DW

0

SEQNUMBER2

DW

0

ACKNUMBER2

DW

0

ALLOCNUMBER2

DW

0

/- **************************

; здесь блок ЕСВ 2

LINK DB    4 DUP(O)

ESRADDRES DB    4 DUP(O)

INUSE

CCODE SOCKET

IPXWORKSPACE DRIVERWORKSPACE

IMMADDRESS

DB DB DW

DB

0 0

2007H 4 DUP(?)

DB 12 DUP(?)

DB ООН

DB 40H

DB 95H

DB OEOH

DB 9FH

DB 67H

FRAGNENTCNT

ADDRESS1

DW DW DW DW

1

OFFSET CHECKSUM2 SEG CHECKSUM2

42

;область сообщений

TEXT1   DB   "Сетевые   функции  отсутствуют. ", 13, 10, 1 $ ' TEXT2   DB   "Сокет не удалось  открыть",13, 10, '$' ТЕХТЗ   DB   "Канал установлен.",13,10, 1 $' TEXT4  DB   "Канал не устанавливается.", 13,10, "$"

_DX DW ?

DATA ENDS

STAC SEGMENT STACK

DW 100 DUP(?)

STAC ENDS CODE SEGMENT

ASSUME CS:C0DE,   DS:DATA,   SSrSTAC,   ES:DATA

BEGIN:

MOV    AX,DATA MOV    DS,AX

CALL WHAT_POINT CMP AL,0FFH JZ __OKl LEA DX,TEXT1 MOV AH,9

INT 21H

JMP _END

_OKl :

SPX присутствует ;открыть сокет

XOR BX,BX

MOV   AL, OH MOV DX,2007H

CALL   DWORD   PTR CS:NET POINT

Глава 21. Программировапиев локальных сетях

CMP AL,0

JZ OKJDPEN ;сокет не удалось открыть

LEA DX,TEXT2

MOV АН,9

INT 21H

JMP _END OKJDPEN:

открыт

PUSH DS

POP ES

/пятикратный вызов  функции приема пакета (17Н) LEA SI,ES:LINK1

MOV BX,17H

CALL  DWORD  PTR CS:NETJ?OINT LEA SI,ES:LINK3

MOV BX,17H

' CALL  DWORD   PTR CS:NET_POINT LEA SI,ES:LINK4 MOV BX,17H

CALL   DWORD   PTR CS:NET_POINT LEA SI,ES:LINK5

MOV BX,17H

CALL   DWORD   PTR CS:NET_POINT LEA SI,ES:LINK6

MOV BX,17H

CALL   DWORD   PTR CS:NETJPOINT

t

/установить соединение .

MOV BX,11H

MOV AL, 0

MOV AH,0

LEA   SI, ES:LINK

CALL  DWORD  PTR CS:NETjPOINT /проверить,   нет ли ошибки

CMP   AL, 0

JZ WAI

LEA DX,TEXT4

MOV AH,9

INT 21H

JMP SHORT _CLOSE

/ждем установления канала WAI:

MOV AH,1

INT 16H

JNZ _CLOSE CALL FOR_WAIT CMP DS:INUSE,0 JNZ WAI MOV __DX, DX . ;канал установлен LEA DX,TEXT3 MOV AH, 9 INT 21H _ABORT:

MOV DX,_DX MOV BX,14H

CALL  DWORD  PTR CS:NET_POINT _CLOSE:

MOV BX,1

MOV DX,2007H

CALL   DWORD   PTR CS:NET_POINT

_END:

MOV AX,4C00H

INT 21H ;область процедур

; определение наличия   сетевык  протоколов и /определение точки входа  в  сетевой драйвер WHAT_POINT PROC

MOV АХ,7АООН

INT 2FH

CMP AL,0FFH

JNZ NO_IPX_SPX

MOV CS:NET_POINT,DI

MOV CS:NET_POINT+2,ES наличие SPX

XOR AL,AL

MOV BX,10H

CALL  DWORD  PTR CS:NET_POINT NO_IPX_SPX: RETN

WHAT_POINT ENDP

/процедура,   вызываемая при ожидании FOR_WAIT PROC PUSH BX MOV BX,0AH

CALL  DWORD   PTR CS:NET_POINT

POP BX

FOR_WAIT ENDP PAUSE PROC

PUSH CX

MOV CX,20

DAL:

PUSH CX

MOV    CX,OFFFFH PA:      LOOP PA POP CX LOOP DAL POP CX RET

PAUSE ENDP

/адрес вызова  сетевых процедур NET POINT   DW ? DW ?

CODE ENDS

END BEGIN

Рис. 21.5 Пример двух программ, устанавливающих канал друг с другом по ЯРХ

протоколу.

V. Работа с сервером (интерфейс 21-го прерывания). Предварительные замечания.

Сетевые программы, запускаемые на рабочих станциях, не только поддерживают сетевые протоколы, но и работу сетевых устройств. Осуществляется это посредством перехвата 21-го прерывания. Если запрос, идущий через это прерывание относится к несетевому устройству, то сетевой обработчик передает управление стандартному обработчику. Еслиже запрос касается сетевого устройства, то сетевой обработчик берет его на себя и передает соответствующие команды на сервер. Сигналы от сервера о результате выполненной операции преобразуются им в стандартный Б08-овский от­клик. Таким образм, большинство программ может работать с сетевыми устройства­ми так же, как с обычными разделами жесткого диска или дискетами.

Все функции 21-го прерывания, которые беретнасебя сетевой обработчик, можно разделить на три класса:

1. Стандартные Б08-овские процедуры, но по отношению к каталогам и файлам на сетевых устройствах. Это функции открытия файла, закрытия файла, записи в файл и т.д. Нужно только помнить, что все это делает не операционная система на рабочей станции, а сетевой обработчик и ОС на сервере.

2. Функции работы с сетевыми каталогами и файлами, дополняющими стандартные.

3. Дополнительные функции, расширяющие возможности управления локальной сетью с рабочей станции.

Ниже перечисленыфункции, относящиеся ко 2-й и 3-й группам, и приведены при­меры их использования.

Краткий справочник. Типы объектов.

Тип объекта

Название

0

неизвестный объект

1

пользователь

2

группа пользователей

3

очередь печати

4

файл-сервер

5

прикладной сервер

6

шлюз

7

сервер печати

8

очередь архивирования

9

сервер для архивирования

А

очередь заданий

В

администратор

26Н

удаленный мост

до8000Н

зарезервировано

 

универсальный тип

Объект имеет следующие характеристики.

Идентификатор - число, размером 4 байта, являющееся уникальным для данного файл-сервера.

Имя объекта - строка, не превышающая 47 байт. При поиске объекта в базе объек­тов допускаются шаблоны, подобные используемым в MS DOS.

Флаг объекта - характеризует время жизни объекта. О - статический объект, 1 -динамический, т.е. удаляется автоматически при исчезновении соответствующего се­тевого ресурса.

Байт доступа - определяет права объекта, первые четыре бита - отвечают за чте­ние, старшие - за запись.

Вот возможные значения уровней доступа:

0 - объект не зарегистрирован.

1 зарегистрирован.

2 - объект подключен к файл-серверу с именем и паролем.

3 - объект имеет права супервизора.

4 - объект имеет права операционной системы.

Флаг свойства объекта показывает, обладает ли объект некоторым свойством: 0 -нет свойств, FFH - имеет по крайней мере одно свойство.

Для каждого свойства имеются: имя свойства - идентифицирует свойство и может содержать до 15 символов, флаги свойства - показывают две вещи - является ли свой­ство статическим или динамическим и является ли оно единичным или множествен­ным. Это определяется двумя младшими битами:

хО-статическое, х1 - динамическое Ох - отдельное 1х-наборсвойств.

Имя пользователя пример единичного свойства, список пользователей группы -пример множественного свойства.

Защита свойства - определяет, кто может иметь доступ к свойству для просмотра и изменения (аналогично, как и для объекта)

Флаг значений свойства - как и для объекта.

Значение свойства хранятся в виде 128-байтовых сегментов. Может существовать более чем один сегмент. Каждый сегмент нумеруется, и каждая операция чтения или записи осуществляется над одним целым сегментом.

Перечень функций по группам.

1. Подключение к файл-серверу.

Проверка присутствия сетевой оболочки. Вход:

АХ=ОЕА01Н

Е8ЮГ= указатель на буфер размером 40 байт, в который будет записано текстовое описание среды рабочей станции. Описание состоит из 4 строк:

- название операционной системы,

- версия операционной системы,

- модель компьютера,

- фирма-производитель компьютера. Выход:

ВН=верхний номер версии сетевой ОС или 0, если сетевая оболочка не загружена или ее номер меньше 2.1,

номер версии, СЕ=номеризменения.

Создание канала с файл-сервером.

Вход:

АН=Е1Н

ЛЕ= 0 - создать канал с файл-сервером, используя номер в БЕ = 1 - отключить пользователя и удалить канал, заданный в БЕ. = 2 - отключить пользователя от файл-сервера, номер канала в БЕ.

Выход:

ЛЕ=0, если операция выполнена успешно или номер ошибки. Задание серверов.

Вход:

АН=0РН,

АЕ=0-установитьпредпочштельныйфайл-сервер,номерканалакоторогозаданврегистреВЕ, = 1 -определитьтекущий предпочтительный сервер, номерсервераюзвращаетсяврегистреАЕ, = 2 - получить в регистре ЛЕ номер текущего сервера,

= 4 - установить первичный файл-сервер, номер канала которого задан в регистре БЕ, = 5 - получить в регистре ЛЕ номер первичного файл-сервера

Отсоединение станции от файл-сервера.

Вход:

АН = ОИН АЬ=1

БЬ=идентификатор соединения. Выход:

АЬ - код завершения = 0 успешно

= БРН соединения не существует Информация об объекте.

Функция возвращает информацию об объекте с известным номером.

Вход:

АН = ЕЗН

В8:81 - указатель на входной буфер Е8 :Б1 - указатель на выходной буфер.

Выход:

АЬ = 0 завершение успешно. Входной буфер:

Б\У? ;длина буфера

БВ?;іуре-16Н

БВ ? ;номер соединения Выходной буфер:

Б\¥?;длина буфера

ББ? ;номер объекта. Перевернутый формат

Б\¥? ;тип объекта. Перевернутый формат.

БВ 48 сшр(?) ;имя объекта

БВ 7 сшр(?) ;время регистрации Формат времени регистрации: 1-годот0до99(0 =1980) 2 - месяц (1-12) 3-день (1-31)

4 - час (0-24)

5 - минуты (0 - 59)

6 - секунды (0-59)

7 - день недели, 0-6 (0 - воскресенье)

Получить номер соединения.

Вход:

АН=БСН

Выход:

АЬ = номер соединения

СЬ=первая цифра номера соединения

СН = вторая цифра номера соединения.

Получить адрес соединения в сети.

Адрес состоит из номера сети, адреса рабочей станции и сокета, который можно использовать только для работы с сервером.

Вход:

АН = ЕЗН

- указатель на входной буфер

Е&БІ - указатель на выходной буфер Входной буфер:

Б\У? ;длина буфера

БВ?;іуре-13Н

БВ ? ;номер соединения Выходной буфер:

Б\У? ;длина буфера

БВ 4 аир(?) ;номер сети

БВ 6 <1ир(?) ;номер рабочей станции

БВ 2 сСир(?) ;сокет

Получить номер соединения объекта.

Возвращает массив номеров соединений, под которыми данный объект зарегист­рирован.

Вход:

АН = ЕЗН

Б&81 - указатель на входной буфер Е8:БІ - указатель на выходной буфер

Выход:

АЬ = 0 - успешно. Входной буфер:

Б\¥? дайна буфера БВ?;1уре=15Н

Б\¥ ? ;тип объекта (перевернутый формат) БВ ? имени БВ 48 сСир(?) ;имя объекта Выходной буфер: Б\У? ущина буфера БВ ? ;число соединений БВ 100 аир(?) щомерасоединений

Регистрация объекта на файловом сервере по умолчанию.

Вход:

АН = ЕЗН

Б&81 - указатель на входной буфер Е&БІ - указатель на выходной буфер

Выход:

АЬ = 0 успешно

= ЕЕН неверный пароль Входной буфер:

Б\У? ;длина буфера БВ?;іуре- 14Н

? ;тип объекта (перевернутый формат)

БВ ? ;длинаимени объекта

БВ 48 аир(?) ;имя объекта (заглавные буквы) ОВ ? даинапароля

ВВ 128с1ир(?) ;пароль (заглавные буквы и зашифрован) Выходной буфер: Б\¥? дайна буфера

Завершение сеанса со всеми серверами.

Вход:

АН = Б7Н

Завершение сеанса с данным сервером.

Вход:

АН = Е1Н

АЬ = 2

БЬ = идентификатор соединения сервера (1-8) Получение даты и времени на сервере.

Вход:

АН = Е7Н

В&ВХ - адрес буфера, размером 7 байт. Выход:

Выходной буфер: Байт 0 год 0 до 99, значения меньше 80 относятся к XXI веку

1 месяц (1-12)

2 день месяца (1-31)

3 час (0-23)

4 минуты (0-59)

5 секунды (0-59)

6 день недели (0-6, 0 - воскресенье) Установка даты и времени на сервере.

Вход:

АН = Е1Н

Б8:81 - входной буфер, Е8:В1 - выходной буфер.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У? дайна буфера

БВ ? ;гуре = 202

ВВ?;год

БВ ? ;месяц

БВ ? ;день

БВ ? ;часы

БВ ? ;минуты

БВ ? ;секунды Выходной буфер:

Б\У? дайна буфера

Останов файл-сервера.

Вход:

АН=ЕЗН

DS:SI - входной буфер

ES:DI - выходной

Выход:

АЬОиликод ошибки. Входной буфер:

DW? ;длина буфера

DB?;type = 211

DB ? ;FFH - завершить в любом случае

00 - завершить, если нет открытых файлов Выходной буфер: В\У?;длина буфера

Запрет и разрешение подключения к серверу.

Вход:

АН = ЕЗН

DS:SI - входной буфер

ES:DI - выходной

Выход:

АЬОили код ошибки. Входной буфер:

DW? ;длинабуфера

DB ? ;type = 203 - запретить, 204 - разрешить. Выходной буфер: DW? ;длина буфера

2. Работа с томами и каталогами.

Здесь представлены дополнительные функции (по отношению к функциям MS DOS) работы с каталогами.

Соответствие между именем тома и его номером (имя по номеру тома).

Вход:

АН = Е2Н

DS:SI - указатель на входной буфер

ES:DI - указатель на вьгходной буфер Входной буфер:

DW? дайна буфера

DB ? ;type - 6 ? тома Выходной буфер:

DW? ;длинабуфера

DB ? имени тома

DB 16dup(?) дгмятома Если нет соответствия, то длина имени тома будет равна нулю.

Соответствие между именем тома и его номером (номер по имени). Вход:

АН = Е2Н

ББ^І - указатель на входной буфер

Е8:Б1 - указатель на выходной буфер Входной буфер:

Б\¥? ;длина буфера

БВ ? ;1уре - 5

БВ ? дайна имени тома

БВ 16 сшр(?) ;имятома Выходной буфер:

БУ/? дайна буфера ? ;номер тома.

Информация о томе.

Вход:

АН = Е2Н

= номер тома. Е8:Б1 - указатель на выходной буфер

Выход:

А1=0иликод ошибки. Выходной буфер:

ВУ/? .-секторов на блок ВУ/?;всего блоков БУ/? доступных блоков

? каталогов БУ/? количество каталогов, которые можно создать с!Ы6с1ир(?) ;имятома

? тома

Отображение локального диска на сетевой каталог.

Вход:

АН = Е2Н

Б&БІ - указатель на входной буфер ЕБ:БІ - указатель на выходной буфер

Выход:

АЬ - 0 или код ошибки.

Входной буфер:

БУ/? дайна буфера

ВВ?;1уре-18

БВ ? каталога

? диск БВ ? пути к каталогу

БВ ?       к каталогу Выходной буфер: БУ/? даинабуфера

БВ ? ;новыйиндекс каталога

БВ ? ;маска прав доступа Для временного отображения можно воспользоваться также функцией, нос полем 1уре= 19. Для удаления соответствующего отображения, можно воспользоваться той же функцией с таким входным буфером:

БАУ? ;длина буфера

БВ ? ;1уре - 20

БВ ? каталога

Получение адресов таблиц. Вход:

АН=ЕГДІ

АЬ = 0 - получить адрес таблицы индексов дисковых устройств (32 байта), 1 - получить адрес таблицы флагов дисковых устройств (32 байта), возможные флаги:

0 - диска нет,

1 - диск постоянно отображен на сетевой,

2 - диск временно отображен на сетевой, ВОН-локальныйдиск,

81Н-локальный диск постоянно отображенный на сетевой, 82Н - локальный диск временно отображенный на сетевой.

2 - получить адрестаблицы номеров каналов дисковых устройств (32 байта),

3 - получить адрес таблицы номеров каналов,

4 - получить адрес таблицы имен серверов (48 байт).

Выход:

Е8:81-адрес таблицы.

Просмотр подкаталога в заданном подкаталоге.

Вход:

АН = Е2Н

ББ:БІ - указатель на входной буфер ЕБ:БІ - указатель на выходной буфер Входной буфер:

? пакета ВВ?цуре-2

БВ ? каталога вначале 0, затем значение

;из выходного буфера, оба значения имеют перевернутый формат

? номер БВ ? пути БВ ? ;путь Выходной буфер: Б\У? ;длинабуфера БВ 16 Б1Л°(?) ;имя найденного каталога БВ 2 БЦР(?) ;дата создания БВ 2 ;время создания

БВ 4 БЕ1Р(?) ;идентификатор пользователя, создавшего кат.

БВ ?; маска прав доступа БВ ?; резерв

Б\У?; номер подкаталога в каталоге Создание каталога.

Вход:

АН = Е2Н

ББ^І - указатель на входной буфер

ЕБ:БІ - указатель на выходной буфер Выход:

АЬ - 0 или код ошибки. Входнойбуфер:

Б\У? ;длинабуфера

БВ?;1уре- 10

БВ ? ;индекс каталога

БВ ? ;маска прав каталога БВ ? пути к каталогу

БВ ? ;путь к каталогу

Для удаления каталога та же функция со следующим буфером.

Входной буфер:

В\У?;длина буфера

БВ ? ;1уре - 11

БВ ? каталога

БВ ? ;не используется

БВ ? дайна пути к каталогу

БВ ? ;путь к каталогу

Для изменения имени каталога та же функция со следующим буфером.

Входной буфер:

Б\У? дайна буфера БВ?;1уре-15

БВ ? ;индекс каталога

БВ ? пути к каталогу

БВ ? к каталогу

БВ ? нового пути к каталогу

БВ ? путь к каталогу

Получить права доступа к каталогу.

Вход:

АН=е2н

БЗЗІ - указатель на входной буфер

Е&БІ - указатель на выходной буфер Выход:

АЬ - 0 иликод ошибки. Входной буфер:

Б\У? дайна буфера

DB ? ;type - 3

DB ? ;индекс каталога

DB ? пути к каталогу

DB ? ;путь к каталогу

Изменение атрибута каталога.

Вход:

АН = Е2Н

DS:SI - указатель на входной буфер ES:DI - указатель на выходной буфер

Выход:

AL - 0 или код ошибки. Входной буфер:

DW? ;длинабуфера DB ? ;type - 3

DB ? ;индекс каталога

DB 4 DUP(?) ;новыедата и время DB 4 dup(?) ;идентификатор владельца DB ? прав доступа

DB ? дайна пути к каталогу DB ?       к каталогу

Для изменения маски прав доступа используется та же функция со следующим входным буфером.

Входной буфер:

DW? дайна буфера

DB ? ;type - 4

DB ? каталога

DB ? права доступа

DB ? добавляемые права доступа

DB ? пути к каталогу

DB ?       к каталогу

CODE SEGMENT

ORG 100Н

ASSUME CS.-CODE,   DS:CODE,   SS:CODE, ES:CODE

BEGIN:

LEA SI,BUF_IN LEA   DI, BUF_OUT

MOV BYTE PTR OFFH ; вводим длины буферов

MOV WORD  PTR BUF_IN,4       ;длина входного буфера MOV WORD  PTR BUF_0UT,19   ;длина выходного буфера

CON:

INC   BYTE   PTR N_VOL MOV АН,0E2H

INT 21H CMP AL,0

JZ OK

LEA DX,MES_ER MOV AH, 9

INT 21H

JMP   SHORT _END

OK:

;проверим длину

CMP LEN,0    ;если О  -  список томов кончился JZ _END .;вывод имени тома MOV  BL,LEN

XOR BH,BH

MOV BYTE   PTR NAM+[BX],13 MOV BYTE   PTR NAM+[BX]+1, 10

MOV  BYTE   PTR NAM+[BX]+2, '$' LEA   DX, NAM MOV AH,9

INT   21H ■

JMP SHORT CON

_END:

RET

;блок данных BUF_IN    DW ? DB 6

N_VOL DB 0 BUF_OUT DW ? LEN DB ?

NAM DB   16 DUP(?)

MES_ER    DB   'Произошла ошибка!',13,10,'$'

CODE ENDS

END BEGIN

Puc. 21.6. Вывод имен томов сервера по умолчанию.

CODE SEGMENT

ORG 100Н

ASSUME CS:CODE,   DS:CODE,   ES:CODE, SS:CODE

BEGIN:

MOV BUF_IN,17   /длина входного буфера

MOV BUF_OUT, 4   /длина выходного буфера

LEA SI,BUF_IN

LEA DI,BUF_OUT

MOV

INT 21H

CMP AL,О

JZ _END

;сообщение об ошибке LEA DX,MES MOV АН,9

INT 21H

_END:

ret

данных ;входной буфер

BUF_IN      DW ?       ;17. . . . . .     ■ ■

DB 18

DB О не заполняем

DISK DB   'G'  ;имя устройства

DB 11

DB   'SYS:PUBLIC',0 /каталог для отображения /выходной буфер

BUF_OUT     DW   ? /4 IND_NEW    DB ?

DB ?

MES DB   'Произошла ошибка.', 13,10, '$'

CODE ENDS

END BEGIN

Рис. 21.7. Простая программа, отображающая устройство G: на сетевой каталог

SYS:PUBUC.

3. Работа с файлами.

было сказано, сетевая перехватывает   -е прерывание и контро-

лирует все обращения к сетевому диску, преобразуя соответствующие команды в зап­росы серверу. Здесь, естественно, приводятся только дополнительные файловые фун­кции, предоставляемые сетевой оболочкой.

Поиск файла в каталоге.

Вход:

АН = ЕЗН

DS:SI - указатель на входной буфер ES:DI - указатель на выходной буфер

Выход:

AL = 0 или код ошибки. Входной буфер:

Б\У?;длинабуфера DB?;type= 15

Б\¥ ? ;вначале БРЕГН, а затем декремент из аналогичного поля выходного буфера

БВ ? ;индекс устройства

БВ ? ;тип файла

БВ ? дайна пути

БВ ? ;путь Выходной буфер:

ВЛУ ? дайна пакета

Б\У? ;номердля входного буфера

БВ 15<1ир(?) ;имя файла

БВ?;атрибутфайла

БВ ? расширенный атрибут файла

БВ4с1ир(?) дайна файла

БВ 2 оир(?) дата создания

БВ 2 Оир(?) дата последнего доступа

БВ 4 <іир(?) дата и время обновления

БВ 4 Оир(?) дата и время выгрузки

БВ 60 Оир(?) ;резерв Атрибуты для поиска: О - обычные файлы, 2 - обычные и скрытые файлы, 4 - обычные и системные файлы, 6 - обычные, скрытые и системные.

Изменение атрибута файла и другой информации.

Вход:

АН = ЕЗН

Б&БІ - указатель на входной буфер

Б&БІ - указатель на выходной буфер Выход:

АЬ = 0 или код ошибки. Входной буфер:

ВУУ? дайна буфера

БВ?;1уре=16

БВ ? ;атрибутфайла

БВ ? расширенный атрибут файла

БВ 4 оир(?) ;резерв

БВ 2 оир(?) дата создания

БВ 2 оир(?) дата последнего доступа БВ 4 <іир(?) дата и время обновления БВ 4 Оир(?) дата и время выгрузки

БВ 60 оир(?) ;резерв

БВ ? каталога

БВ ? ;тип файла для поиска

БВ ? пути

БВ ? ;путь

Получение и изменение расширенных атрибутов.

Вход:

АН = В6Н

AL = 0 - получить атрибут 1 - изменить атрибут. DS:DX - адрес пути к файлу CL-новое значение атрибута

Выход:

AL - 0 или код ошибки

CL - значение расширенного атрибута.

Копирование файлов.

Вход:

АН = F3H

ES:DI - адрес входного буфера

Выход:

AL - 0 или код ошибки

DX:CX - количество скопированных байт.

Входной буфер:

DW ? дескриптор входного файла DW ? дескриптор выходного файла DB 4 dup(?) ;смещение входного файла DB 4 dup(?) ;смещение выходного файла DB 4 dup(?) ;сколько байт копировать

Дескрипторы файлов получаются при помощи стандартных функций DOS. Если копируется весь файл, то смещения равны нулю.

code segment

org 100Н

ASSUME CS:CODE,   DS:CODE,   SS:CODE,   ES:CODE

BEGIN:

MOV AH,0E3H LEA SI,BUF_IN

LEA

INT 21H

CMP AL, 0

JNZ   END    /выход,  если ошибка или список кончился

имени MOV СХ, 12 LEA ВХ,NAM

mov ан, 2

LOO:

MOV DL, [BX]

INT 21H INC BX LOOP LOO

MOV DL, 13 INT 21H MOV DL, 10

INT 21H /новый номер

MOV DX,NOM_OU

MOV

JMP BEGIN

_END:

RET

данных ;входной буфер

BUF_IN      DW  23   /длина  входного буфера

DB 15

NOM_IN     DW OFFFFH файла

DB О

DB  б   /атрибут,    б-все файлы DB  14 строки без нуля

DB   'SYS:PUBLIC\*.*',0

буфер

BUF_OUT

DW

97

/длина

NOM_OU

DW

?

 

NAM

DB

15

DUP(?)

ATR

DB

?

 

ATR_EX

DB

?

 

LEN

DB

4

DUP(?)

DAT1

DB

2

DUP(?)

DAT2

DB

2

DUP(?)

DAT3

DB

4

DUP(?)

DAT4

DB

4

DUP(?)

RES

DB

60

DUP(?)

CODE ENDS

 

 

/длина выходного буфера

END BEGIN

Рис. 21.8. Программа выводит список файлов каталога БУЗ-.РиВЫСцсполъзуя

сетевые средства.

4. Передача и прием сообщений.

Определение режима приема сообщений.

Вход:

АН = DEH

DL = 4

Выход:

AL - номер текущего режима (0,1,2,3)

0 - режим устанавливается по умолчанию. По приходу сообщения на рабо­чую станцию, оно автоматически отображается в низу экрана (текстовый режим).

1 - файл сервер запоминает в буфере приходящие от пользователей сообще­ния, на рабочей станции отображаются только сообщения, пришедшие от сервера.

2 - сервер игнорирует сообщения от пользователей и запоминает сообщения

только от серверов, вывод сообщений на экран не выполняется.

3 - файл сервер запоминает все пришедшие к нему сообщения, вывод на эк­ран не выполняется.

Установка режима приема сообщений.

Вход:

AH=DEH

DL = новое значение режима. Передача сообщений пользователем.

Вход:

АН = Е1Н

DS:SI - адрес входного буфера, ES:DI - адрес выходного буфера. Выход: AL - 0 или код ошибки.

Входной буфер:

DW?; длина буфера DB ? ; type = О

DB ?; количество станций (элементов массива) DB   массив номеров каналов DB?; длина сообщения DB ?; сообщение Выходной буфер: DW?; длина буфера DB ?; количество станций

DB ?; массив байт - результат для каждой станции

Прием сообщений.

Вход:

АН=Е1Н

Бв^І - адрес входного буфера,

ЕвЛИ - адрес выходного буфера. Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У?; длина буфера

БВ?^уре = 1 Выходной буфер:

Б\У?; длина буфера

БВ?; длина сообщения

БВ ?; сообщение

Посылка строки на сервер. Вход:

АН = Е1Н

Бв^І - адрес входного буфера, Выход:

АЬ-0 или код ошибки. Входной буфер:

Б\У?; длина буфера

БВ?^уре = 9

БВ ?; длина строки

БВ ?; строка

CODE SEGMENT

ASSUME CS:CODE, DS:CODE, ES:CODE ORG   10OH

BEGIN:

,-определяем количество соединений -/пользователей с именем RUFAT

MOV АН,ОЕЗН

LEA S1,BUF_IN

LEA DI,BUF_OUT INT 21H CMP AL,0

JZ OK

LEA

MOV AH, 9 INT 21H

JMP  SHORT _END

OK:

; формируем буфер  посылки сообщений XOR СН,СН .MOV CL,N_CON LEA SI,N_CON INC SI LEA DI,MAS CLD

LOO:

LODSB STOSB LOOP LOO ;осуществить пересылку

LEA SI,BUF_IN_SEND LEA DI,BUF_OUT_SEND MOV АН,0E1H INT 21H

_END:

RET

BUF_IN     DW 11 DB 15H

DW 0100H ;тип объекта  -  пользователь (1)

DB  5 ;длина имени пользователя

DB   'RUFAT"     ;имя пользователя BUF_OUT DW 103

N_CON      DB   ? ;количество регистрации   (рабочих станций)

DB  100  DUP(?)    ;номера соединений BUF_IN_SEND   DW 120 DB 0

N_SEND DB 100 ;в действительности посылается N_CON машинам MAS DB  100 DUP(?)

DB  15   ; длина строки

DB   'Проверка связи! '    ; строка для посылки BUF_OUT_SEND   DW 103 DB 100

DB  100 DUP(?) MES DB   'Ошибка! 1,13,10, '$ '

CODE ENDS

END BEGIN

Puc. 21.9. Пример посылки сообщений всем пользователям, зарегистрированным

под именем R UFA Т.передачи строки на консоль LEN_BUF

SS:ST1

DATA SEGMENT

;структура для

DB 09H LEN     DB ? MES      DB  60 DUP(?)

;структура для  ввода строки MAX DB   60 ■

LENS DB ?

STROKA     DB   61 DUP(?)

DATA ENDS ST1 SEGMENT STACK

DB 100 DUP(?)

ST1 ENDS CODE SEGMENT

ASSUME CS:CODE,

BEGIN:

MOV AX,DATA MOV DS,AX MOV ES,AX ;ввод строки    (-> STROKA) MOV АН,OAH LEA DX,MAX INT 21H

строки CLD

LEA  SI,STROKA LEA DI,MES MOV CL,LENS MOV LEN,CL

XOR CH,CH REP MOVSB

;передача на консоль    (MES  -> CONSOLE) LEA SI,LEN_BUF

MOV АН,0E1H /сетевая функция E1H INT 21H

_END:

MOV AH,4CH

INT 21H

CODE ENDS

END BEGIN

(STROKA   -> MES)

Puc. 21. передает на консоль вводимую строку.

5. Работа с объектами.

Добавление объекта к множественному свойству.

Вход:

АН = ЕЗН

ББ^І - адрес входного буфера

ЕБ:БІ - адрес выходного. Выход:

АЬ - 0 или код ошибки. Входнойбуфер:

Б\¥? ;длинабуфера

ВВ?;1уре-4Ш

В\У ? ;тип объекта (обратный порядок) БВ ? ;длинаимени (48) БВ ? ;имя объекта БВ ? ;длинаимени свойства (16) БВ?;имя свойства Б\У? ;типдобавляемого объекта БВ ? ;длина имени добавляемого объекта (48) БВ ? ;имя добавляемого объекта Выходной буфер: Б\¥? ;длинабуфера

Изменяет пароль объекта.

Вход:

АН=ЕЗН

ББ^І - адрес входного буфера ЕБ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У? ;длина буфера БВ ? ;1уре - 40п

Б\У? ;тип объекта (обратный порядок) БВ ? ;длина имени (48) БВ?;имя объекта БВ ? старого пароля

БВ ? ;старый пароль БВ ? нового пароля

? пароль

Выходной буфер:

Б\У? ;длина буфера

15-4072

ASSEMBLER. Учебпынкурс

Изменение защиты объекта.

Вход:

АН = ЕЗН

В^І - адрес входного буфера

Е5:В1 - адрес вьгходного. Выход:

АЬ - 0 или код ошибки. Входной буфер:

В\У?;длина буфера

БВ ? ;Гуре - 38гі

БВ ? щовый байт защиты

Б\У? ;тип объекта (обратный порядок)

БВ ? ;длинаимени объекта

БВ ? ;имя объекта Выходной буфер:

Б\У?;длина буфера

Изменяет защиту конкретного свойства объекта.

Вход:

АН = ЕЗН

В^І - адрес входного буфера

ЕБіБІ - адрес вьгходного. Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У?;длина буфера

БВ ? ;Гуре - ЗВп

Б\У? ;тип объекта (обратный порядок) БВ ? ;длинаимени объекта

БВ ? ;имя объекта

БВ ? ;байт защиты

БВ ? длинаимени свойства (6)

БВ ? ;имя свойства

Выкодной буфер:

В\У? ;длинабуфера Закрытие базы объектов.

Вход:

АН = ЕЗН

ББ:БІ - адрес входного буфера ЕБ:БІ - адрес выходного. Выход:

Б\У? ;длинабуфера

БВ ? ;1уре - 44п Выходной буфер:

В\У? ;длинабуфера Создание объекта с данными характеристиками.

Вход:

АН = ЕЗН

Б&БІ - адрес входного буфера ЕБ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. ■

Входной буфер:

Б\У? ;длина буфера БВ?;іуре- 32п

БВ ? ;флаг объекта

БВ ? ;байт защиты объекта

Б V/ ? ;тип объекта (обратный порядок)

БВ ? даинаимени объекта

БВ?;имя объекта

Выходной буфер:

Б\У? -длина буфера Добавление свойства к объекту.

Вход:

АН = ЕЗН

В&81 - адрес входного буфера - адрес выходного.

Выход:

АЬ - 0 или код ошибки.

Входной буфер:

Б\У? ;длинабуфера БВ ? ;1уре - 39п

Б\У? ;тип объекта (обратный порядок)

БВ ? дайна имени

БВ ? ;имя объекта

ВВ?;новыйфлаг

БВ?;новый байт защиты

БВ ? даинаимени свойства (16)

БВ ? ;имя свойства

Выходной буфер:

Б\У? дайна буфера

15*

Удаление объекта.

Вход:

АН = ЕЗН

Б&БІ - адрес входного буфера

ЕБ:БІ - адрес выходного. Выход:

АЬ - 0 или код ошибки. Входной буфер:

В\У? ;длина буфера

БВ ? ;1уре - ЗЗп

ВУУ? ;тип объекта (обратный порядок) БВ ? ;длинаимени объекта БВ ? ;имя объекта Выходной буфер: ВУУ?;длина буфера

Удаляет идентификатор объекта из набора свойств.

Вход:

АН = ЕЗН

Б8:81 - адрес входного буфера

- адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

В\У? ;длинабуфера БВ ? ;1уре - 42п

БУУ? ;тип объекта (обратный порядок) БВ ? даинаимени объекта БВ?;имя объекта БВ ? ;длинастроки свойств (16) БВ? ;строкасвойств

Б\У? идентификатор удаляемого объекта (обратный порядок) БВ ? ;длинаимени удаляемого объекта БВ ? ;имя удаляемого объекта Выходной буфер: Б\У? ;длина буфера

Удаляет одно или более свойств объекта.

Вход:

АН = ЕЗН

Б8:81 - адрес входного буфера

- адрес выходного.

Выход:

В\У? ;длина буфера

БВ ? ;1уре - ЗАп

Б\¥ ? ;тип объекта

БВ ? дайна имени

БВ?;имя объекта

БВ ? дайна строки свойств (16)

БВ ? ;строка свойств Выходной буфер:

В\У? дайна буфера

Возвращает уровень доступа рабочей станции к базе объектов.

Вход:

АН = ЕЗН

БЯ:ЯІ - адрес входного буфера

ЕЯ:БІ - адрес выходного. Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У? дайна буфера

БВ ? ;гуре - 46п

Выходной буфер:

Б\¥? дайна буфера ВВ?;байт доступа

БВ? ;идентификаторобъектадляданного пользователя Возвращает уникальный для объекта идентификационный номер.

Вход:

АН = ЕЗН

Б&ЯІ - адрес входного буфера ЕЯ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер: В\У? дайна буфера БВ ? ;1уре - 35п

ВУУ? ;тип объекта (обратный порядок) БВ ? даинаимени объекта БВ ? ;имя объекта Выходной буфер: В\У? дайна буфера

Возвращает имя и тип объекта.

Вход:

АН = ЕЗН

Б&ЯІ - адрес входного буфера ЕЯ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

В\У?;ддина буфера

БВ ? ;1уре - 36п

БВ ? ;идентификатор объекта (обратный порядок) Выходной буфер: В\У?-длинабуфера

ВВ ? идентификатор объекта (обратный порядок) Б\У? ;тип объекта (обратный порядок) БВ ? ;имя объекта

Показывает, входит ли единичный объект в некоторое множественное свойство другого объекта.

Вход:

АН = ЕЗН

Б&БІ - адрес входного буфера ЕЯ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер: В\У?-длина буфера БВ ? ;1уре - 43п ВУУ? ;тип объекта БВ? ;длинаимени ВВ?;имя объекта БВ ? ;длина имени свойства БВ? ;имясвойства

ВУУ? ;идентификатор объекта (обратный порядок) БВ ? -длинаимени объекта БВ ? ;имя объекта Выходной буфер: ВУУ?;длина буфера

Повторно открывает базу объектов.

Вход:

АН = ЕЗН

ББЗІ - адрес входного буфера

ЕЯ:БІ - адрес выходного. Выход:

АЬ - 0 или код ошибки. Входной буфер:

В\У?;длина буфера

БВ ? ;1уре - 45п Выходной буфер:

В\У?-длина буфера

Возвращает значение указанного свойства данного объекта в виде 128-байтового сегмента.

Вход: АН = ЕЗН

ББ^І - адрес входного буфера

ЕБ:БІ - адрес выходного. Выход:

АЬ-Оили код ошибки. Входнойбуфер:

Б\У? дайна буфера

БВ ? ;1уре - 3Бп

БВ ? ;тип объекта

БВ? дайна имени объекта

ВВ?;имя объекта

БВ ? ;номер сегмента (вначале 1)

БВ ? даинастроки свойств

БВ ? ;строкасвойств Выходной буфф:

Б\У? дайна буфера -

БВ ? ;строка(сегмент) свойства

БВ ? ;номер следующего сегмента

БВ ? ;байт флагов свойств

Переименовывает объект.

Вход:

АН = ЕЗН

- адрес входного буфера

ЕБ:БІ - адрес выходного. Выход:

АЬ-Оили код ошибки. Входной буфер:

В\У? дайна буфера

БВ ? ;1уре - 34п

БВ?;тип объекта

БВ ? старого имени

БВ?;староеимя

? нового имени

БВ ? ;новое имя Выходной буфер:

Б\У? даинабуфера Ищет объект в базе объектов и возвращает о нем информацию.

Вход:

АН = ЕЗН

ББ:81 - адрес входного буфера Е8:Б1 - адрес выходного.

ЛББЕМБЬЕК Учебпыйкурс

Выход:

АЬ - 0 или код ошибки. Входной буфер:

В\У?;длина буфера

БВ ? ;1уре - 37п

ВУУ?;тип объекта

ВВ ? ;идентификаторобъекта (вначале РРРРРРРНі) В\У? ;тип объекта ВВ?;длинаимени БВ ? ;имя объекта Выходной буфер: Б\У?;длина буфера ВВ ? идентификатор объекта Б\У? ;тип объекта ВВ?;имя объекта (48) БВ ? ;флаг БВ ? ;байт доступа БВ ? ;есть свойства

Вначале идентификатор содержит значение РРРРРРРРп, а затем берется из выход­ного буфера до тех пор, пока в АЬ не будет РСЬ. Возвращает любое свойство заданного объекта.

Вход:

АН=ЕЗН

ББ^І - адрес входного буфера ЕБ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У?;длина буфера

БВ ? ;1уре - 3Сп

В\У? ;тип объекта

БВ ? ;длинаимени объекта

БВ?;имя объекта

ББ? ;номер (вначале РРРРРРРРН)

БВ ? ;длина строки свойств

БВ ? ;строка свойств Выходной буфер:

В\У?;длина буфера

БВ ? ;строка свойств

БВ ? ;флаги свойств

БВ ? ; байт доступа

? номер

БВ ? ;байт свойств БВ ? ;еще свойства

После сравнения пароля, помещенного в поле входного буфера, с паролем, храни­мым в базе объектов для данного объекта, возвращает код завершения, показываю­щий, являются ли пароли эквивалентными.

Вход:

АН = ЕЗН

ББ:БІ - адрес входного буфера ЕБ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У? ;длина буфера

БВ ? ;1уре - 3БЬ

В\У? ;тип объекта

БВ ? ;длинаимени объекта

БВ ? ;имя объекта

БВ ? ;длинапароля (128) .

БВ ? ;пароль Выходной буфер:

В\У? ;длинабуфера

Описывает значение данного свойства данного объекта как 128-байтный объект.

Вход:

АН = ЕЗН

ББ:БІ - адрес входного буфера ЕБ:БІ - адрес выходного.

Выход:

АЬ - 0 или код ошибки. Входной буфер:

Б\У? ;длинабуфера

ВВ?И:уре-ЗРп

Б\У ? ;тип объекта

БВ ? ;длинаимени объекта

БВ ? ;имя объекта

БВ ? ;номер сегмента

БВ ? сегменты

БВ ? ;длина строки свойств объекта

БВ ? ;строка свойств объекта Выходной буфер:

Б\У?;длина буфера

CODE SEGMENT

ASSUME CS:CODE,   DS:CODE,   ES:CODE, SS:CODE

ORG   10OH

BEGIN:

MOV АН,0E3H LEA SI,BUF_IN

LEA DI,BUF_OUT

INT 21H

CMP AL,0

JNZ END

MOVAL,ACCES

MOV DL,AL

MOV CL, 4

SHR AL,CL

AND DL,00001111B

ADD DL, 48

MOV AH, 2

PUSH AX

INT 2Ш    ; доступ по чтению POP AX MOV DL, AL ADD DL,48

INT 21H    /доступ по записи

END:

RET

BUF_IN    DW 3 DB 46H

BUF_OUT DW 7 ACCES     DB ?

DD ? CODE ENDS

END BEGIN

Рис. 21.11. Программа определяет уровни доступа рабочей станции к базе

объектов.

CODE SEGMENT

ASSUME CS:CODE,   DS:CODE,  ES:CODE, SS:CODE ORG 100H

BEGIN:

MOV AH,0E3H LEA SI,BUF_IN

LEA DI,BUF_OUT INT 21H CMP AL, 0 JZ    OKI ■ CMP AL,OFCH

JZ      END     /конец поискаошибки

,• звуковой сигнал-признак MOV DL, 7 MOV АН,2

INT 21H JMP _END

OKI:

LEA BX,NAME2 MOV AH,2 ;выводим имя LOO:

MOV DL, [BX] CMP DL,0 JZ LOOl

INT 21H INC BX

JMP  SHORT LOO

LOOl:

DL, 13 21H DL, 10 21H.

/готовим ID1   для   следующего вызова MOV    АХ, WORD   PTR ID2

BX,WORD  PTR ID2+2 WORD  PTR ID1,AX WORD   PTR ID1+2,BX BEGIN

MOV INT MOV INT

MOV MOV MOV

JMP

_END:

RET

BUE_IN     DW 57 DB 37H

DD OEEEEEEEEH

DW 100H DB 47 DB    ' * * DB 46 DUP(O)

BUE_OUT  DW 59

ID1

LEN1

NAME1

ID2

?

DD DW ?

NAME2      DB 48  DUP(?)

FLAG DB ?

SEC DB ?

DB ? CODE ENDS

END BEGIN

Рис. 21.12. Вывод списка всех пользователей, зарегистрированных на данном сервере.

6. Сервис синхронизации.

Данный набор функций позволяет упорядочить коллективныйдоступ к файлам, расположенным на сервере. Суть работы этих функций заключается в том, что можно блокировать доступ (вообще или только на изменение) к отдельным областям файла или к целым файлам. Например, при просмотре базы данных только один пользова­тель может иметь право корректировать определенные записи и т.п.

Разблокирует указанный файл и удаляет его из таблицы регистрации.

Вход: АН=БОН

ББ:БХ - на входной буфер Выход:

АЬ - 0 или код ошибки

Входной буфер:

ВТТР_П\ <й> 255 аир(?) -полныйпуть к файлу Разблокирует все файлы в таблице регистрации рабочей станции и удаляет их из таблицы регистрации.

Вход: АН=СРН

Разблокирует указанную физическую запись и удаляет ее из таблицы регистрации.

Вход:

АН=ВЕН

ВХ - дескриптор файла СХ:БХ - указатель на запись БРБг - длина записи

Выход:

АЬ - 0 или код ошибки

Разблокирует все физические записи и удаляет их из таблицы регистрации.

Вход:

АН = С4Н

Возвращает флаг текущего режима блокировки.

Вход:

АН = С6Н АЬ = 2 Выход: АЬ-флаг

Флаг определяет, будет ли система распознавать значение тайм-аута для опреде­ленных вызовов.

Функция пытается блокировать все файлы из таблицы регистрации.

Вход:

АН=СВН

ВР-тайм-аут в 1/18 с.

Выход:

AL - О - успешно FEH - истек тайм-аут

FFH - ошибка.

Пытается блокировать все физические записи в таблице регистрации.

Вход:

АН = С2Н

AL - директива блокировки

О-блокировказаписейвисключительномрежиме, 1 - блокировка Read-Only. ВР-тайм-аут в 1/18 с.

Выход:

AL - О - успешно FEH-истектайм-аут FFH-ошибка.

Помещает файл в таблицу регистрации.

Вход:

АН=ЕВН

AL - директива блокировки

0 - зарегистрировать файл

1 - зарегистрировать и заблокировать файл. ВР-тайм-аутв 1/18 с.(приАЕ=1)

DS:DX - указатель на путь к файлу. Выход:

AL - О - успешно 96Н - сервер выгружен FEH-истектайм-аут FFH-ошибка.

Регистрирует физическую запись в таблице регистрации.

Вход:

АН=ВСН AL-директива

0 - зарегистрировать запись

1 - зарегистрировать и заблокировать запись в исключительном режиме 3 - зарегистрировать и заблокировать запись в режиме Read-Only

ВХ-дескриптор файла ВР-тайм-аут СХ:ОХ-позициязаписи SEDI - длина записи

Выход:

AL - О - успешно 96Н - сервер выгружен FEH - истек тайм-аут

FFH - ошибка.

Разблокировать файл без удаления его из таблицы. Вход:

ан-есн

Б8:БХ - указатель на путь к файлу Выход:

аь-0 или код ошибки.

Разблокирует все файлы без удаления их таблицы. Вход:

ан = сон

Разблокирует физическую запись, не удаляя из таблицы.

Вход:

ан=вш

вх- дескриптор сх:ох- позиция записи 8І:оі - длина записи Выход:

аь - 0 или код ошибки.

Разблокирует все физические записи, не удаляя из таблицы.

Вход:

АН = СЗН

Устанавливает флаг режима блокировки.

Вход:

АН=С6Н аь- режим

CODE SEGMENT

ASSUME CSrCODE,   DS-.CODE,   ES-.CODE, SS-.CODE

ORG   10OH

BEGIN:

/поместить файл   в   таблицу регистрации MOV АН,ОЕВН MOV AL,О LEA DX,PATH

int 21h cmp al,0

JNZ _END /если ошибка  - выйти

/заблокировать файлы  из   таблицы регистрации MOV АН,ОСВН MOV BP,10 int 21h ■ CMP AL,О

JNZ     END /если ошибка   - выйти

/открываем файл

MOV АН,3DH

MOV AL,2

LEA  DX, PATH

INT 21H

JC END

MOV BX,AX ;ждем нажатия клавиши /теперь с другой рабочей станции

/можете попытаться просмотреть  заблокированный файл

MOV АН, О

INT 16H /закрываем файл

MOV АН,ЗЕН

INT 21H /разблокировать файл

MOV АН, 0edh

LEA  DX, PATH

INT  21H '

_END: ■ '

RET

PATH    DB   'USER:SOFT\ME\STATUS.ME', 0

CODE ENDS

END BEGIN

Puc. 21.13. Пример блокирования файла на сетевом устройстве.

7. Обслуживание транзакций.

В сети Novel существует механизм автоматического восстановления файлов при сбоях - TTS - Transaction Tracking Service. Чтобы для файла работал такой механизм, он должен быть помечен как транзакционный.

TTS осуществляет "явное" и "неявное" отслеживание транзакций. Транзакцией называется совокупность следующих действий:

- чтение данных,

- обработка данных,

- запись данных.

"Неявное" означает, что серверная ОС запоминает последовательность изменен­ных транзакционных файлов без возможности программного вмешательства в этот процесс. "Явное" дает приложениям определенные возможности управления транзак-процессом.

Позволяет вручную прекратить транзакцию, заставляя файлы, вовлеченные в текущую транзакцию, восстанавливаться.

Вход:

АН = С7Н

ЛЬ = 3 Выход:

АЬ = 0 или код ошибки.

Служит для явного указания начала транзакции.

Вход:

АН = С7Н ЛЬ = 0

Выход:

ЛЬ = 0 или код ошибки. Дает команду завершения явной транзакции. Вход:

АН = С7Н

АЬ=1

Выход:

Флагпереноса=О ЛЬ = 0 успешно

ЬБН отслеживаниетранзакций запрещено

ЬЕН транзакция закончена СХ:БХ-справочный номертранзакции Флагпереноса= 1

ЛЬ = ЬЬН - нет активной явной транзакции

Дает информацию о пороге прикладного уровня логических или физических записей.

Вход:

АН = С7Н АЬ=5

Выход: ЛЬ = 0 или код ошибки

СЬ - порог блокирования логических записей (0-255) СН - порог блокирования физических записей.

Дает информацию о пороге прикладного уровня логических или физических записей на уровне рабочих станций.

Вход:

АН = С7Н ЛЬ = 7 Выход:

АЬ = 0 или код ошибки

СЬ - порог блокирования логических записей (0-255) СН - порог блокирования физических записей.

Показывает, является ли система управления транзакциями доступной и активной на файловом сервере по умолчанию.

Вход:

АН = С7Н

AL = 2 Выход:

AL = 0 - недоступна 1 - доступна

FDH - в текущий момент запрещена.

Устанавливает пороги прикладного уровня логических или физических записей.

Вход:

АН = С7Н AL = 6

CL - порог блокирования логических записей (0-255) СН - порог блокирования физическихзаписей. Выход:

AL = 0 или код ошибки

Устанавливает пороги прикладного уровня логических или физических записей на уровне рабочей станции.

Вход:

АН = С7Н

AL = 8

CL - порог блокирования логических записей (0-255) СН - порог блокирования физических записей. Выход:

AL = 0 или код ошибки Показывает, завершена ли полностью операция для указанной транзакции.

Вход:

АН = С7Н AL = 4

CX:DX- справочный номертранзакции. Выход:

AL = 0 или код ошибки

8. Сервис рабочей станции.

Вызывает выполнение завершающих операций как на рабочей станции, так и на файловом сервере, освобождая блокированные файлы и записи, закрывая сетевые и локальные файлы, сбрасывая режимы ошибки и

блокирования.

Вход:

AH = D6H

ВХ = 0 - только для текущего процесса FFFFH - для всех процессов на рабочей станции. Данная функция с ВХ=0 вызывается автоматически по выходу из программы в DOS.

Возвращает информацию об окружении рабочей станции.

Вход:

АН=ЕАН AL= 1

ВХ = 0

ES:DI - указатель на выходной буфер. Выход:

АН - операционная система рабочей станции (0 - PC DOS) AL-кодмодификации

ВН - старшая часть номера версии сетевой оболочки BL - младшая часть номера версии сетевой оболочки CL - номер редакции сетевой оболочки ES:SI - указатель на выходной буфер.

Выходной буфер:

Состоит из 40 байт. Строка представляет собой конкатенацию четырех строк с нулевым окончанием. Первая строка содержит имя операционной системы. Вторая строка содержит версию операционной системы. Третья строка содер­жит идентификацию типа компьютера. Четвертая строка содержит более об­щий идентификатор типа компьютера.

Включает или выключает автоматическое выполнение завершающих операций по окончанию прикладной программы.

Вход: АН=ВВН

AL = 0 - запрещено 1 - разрешено.

Выход:

AL = 0 или код ошибки

Сообщает, как Вы хотите получать сообщения о критических ошибках.

Вход:

AH=DDH

DL = 0 - спрашивать Abort, Retry, Fail?

1- не выполнять прерывание 24Н, возвращать ошибку NetWare в программу 2 - не выполнять прерывание 24Н, возвращать ошибку DOS в программу.

Выход:

AL - предыдущую установку режима ошибки.

9. Сервис печати.

Обслуживает сетевые принтеры и очереди к ним.

Структура     PRINT_CONTROL_DATA. status db ? print_flags db ? tab_size db ? server_printer db ?

db ?

form_type db ? reservl db ?

banner_text  db   13 dup(?) reserv2 db ? local_lpt_device db ? flush_timeout_count dw ? flush_on_close db ? maximum_lines dw ? maximum_chars dw ? form_name db  13 dup(?) lpt_flag db ? file_flag db ? timeout_Hag db ?

setup_string_ptr dd ? reset_string_ptr dd ?

connect_id_queue_print_job db ?

in_progres db ? print_queue_flag db ?

print_job_valid db ? print_queue_id dd ? print_job_number dw ?

Прекращает перехват потока данных на печать по умолчанию. на печать уничтожается.

Вход:

AH=DFH

DL = 2

Выход:

AL - О или код ошибки.

Прекращает перехват потока данных на определенную печать. Задание на печать уничтожается.

Вход:

АН=DFH

DL=6

DH - LPT (0 - LPT1,1 - LPT2,2 - LPT3)

Выход: AL - О или код ошибки.

Освобождает задание на печать принтера по умолчанию и перехват для печати по умолчанию.

Вход:

AH=DFH DL=1

Выход:

AL-Оили код ошибки.

Освобождает задание на печать для определенного принтера и заканчивает перехват.

Вход:

AH=DFH DL=5

DH - LPT (0 - LPT 1,1- LPT2,2 - LPT3)

Выход:

AL - 0 или код ошибки. .

Освобождает задание на печать принтера по умолчанию, но продолжает перехват данных.

Вход:

AH=DFH

DL = З Выход: AL - О или код ошибки.

Освобождает задание на печать для определенного принтера, но продолжает перехват данных.

Вход:

AH=DFH

DL=7

DH - LPT (0 - LPT1, 1 - LPT2,2 - LPT3)

Выход: AL - О или код ошибки.

Возвращает имя пользователя, которое печатается на первой странице.

Вход:

АН = В8Н AL = 8

ES:BX - длинный указатель на буфер ответа (12 байт)

Выход:

AL - 0 или код ошибки.

Возвращает заполненную структуру PRINT_CONTROL_DATA.

Вход:

АН = В8Н

AL = О

CX - длина буфера ответа

ES:BX - длинный указатель на буфер ответа

Выход: AL - О или код ошибки.

Возвращает номер, соответствующий устройству печати по умолчанию, в настоящий момент назначенному для перехвата.

Вход:

АН = В8Н AL = 4

Выход:

DH - устройство LPT.

Возвращает текущий статус заданного сетевого принтера.

Вход:

=

DS:SI - входной буфер ES:DI - выходной буфер

Выход: AL - О или код ошибки.

Входной буфер:

Б\У?;длина буфера DB ? ;type = б

DB ? ;номер принтера (0 - 4) Вьгходной буфер: DW? ;длинабуфера

DB ? ;0 - активный, FFH - остановленный

DB?;1-выключен

DB ? ;(0-255) - form_type

DB ? ;номер принтера

Возвращает заполненную структуру PRINT_CONTROL_DATA,

определенную ранее, для заданного устройства печати.

Вход: АН = В8Н AL = 2

ES:BX - длинный указатель на буфер ответа

DH-устройство LPT Выход: AL - О или код

Устанавливает имя пользователя, которое печатается на первой странице.

Вход: АН = В8Н

AL=9

ES:BX-длинный указатель на буфер с именем (12 байт) DH-устройство LPT

Выход:

AL - 0 или код ошибки. Осуществляет захват следующего принтера для указанной очереди.

Вход: АН = В8Н AL = б

ВX:CX - идентификатор очереди в базе объектов DH - устройство LPT Выход:

AL-0 или код ошибки.

Можно изменить некоторые поля структуры PRINT_CONTROL_DATA для

устройства печати по умолчанию. Изменениям подвергаются поля до

FORM_NAME, исключая поле STATUS.

Вход:

АН = В8Н AL=1

СХ - длина входного буфера (часть PRINTjCONTROLJDATAflo 42 байт) ES:BX - указатель на входной буфер. Выход:

AL - 0 или код ошибки.

Определяет локальный принтер по умолчанию. Определение действует до следующего вызова этой функции или до перезагрузки рабочей станции.

Вход: АН = В8Н AL = 5

DH - устройство LPT

Выход:

AL - 0 или код ошибки.

Можно изменить некоторые поля структуры для указанного устройства печати.

Вход: АН = В8Н

AL=3

СХ - длина входного буфера (часть PRI"NT„CONTROL_DATAflo 42 байт) ES:BX - указатель на входной буфер. DH-устройство LPT.

Выход:

AL - 0 или код ошибки.

Создает файл на диске и направляет последующие захваченные потоки

данных печати в этот файл.

Вход:

АН = БОН

AL = 9

DS:SI - входной буфер ES:DI - выходной буфер

Выход:

AL - 0 или код ошибки. Входной буфер:

DW? ;длина буфера

DB ? ;type = 9

DB ? ;0

DB ? ;длинапути к файлу DB ? ;полныйпутькфайлу Выходной буфер: 0\У?;длина буфера

Функция начинает захват данных печати на устройство печати по умолчанию.

Вход:

AH=DFH

AL = О Выход: AL - О или код ошибки.

Начинает захват данных печати на устройство печати.

Вход:

АН=DFH

AL=4

DH = устройство LPT.

Выход:

AL - 0 или код ошибки.

lO. Семафоры.

Семафорный сервис - еще один способ синхронизации работы программ на раз-ныхрабочих станциях. Этот сервис поддерживается сетевой операционной системой60 на сервере. Ceмафoр имеет следующие характеристики:

- имя семафора - задается при открытии, с данным семафором разные програм­мы могут связать некоторый критический ресурс, например, доступ к опреде­ленным записям файла т.п.

- индекс семафора - возвращается при открытии, в дальнейшем через него осу­ществляется доступ к данному семафору;

значение семафора - число в диапазоне -127 - +127, которое также связывается сданным семафором;

счетчик процессов - увеличивается на 1, когда очередная программа открывает данный семафор, и уменьшается, когда закрывает, когда счетчик принимает зна­чение 0, семафор ликвидируется. Кратко смысл работы с семафорами заключается в следующем: перед использова­нием критического ресурса, с которым связан семафор, программа должна уменьшить значение семафора на 1. Если значение семафора больше или равно 0, то программа может использовать ресурс, если же нет, то программа ожидает изменения значения,

указанное ей время (время ожидания).

Открыть семафор.

Вход:

АН = С5Н

AL = О

D&DX - адрес имени семафора (не более 127 символов с 0 на конце) CL - начальное значение семафора (обычно 1).

Выход:

AL - 0 или код ошибки.

60 Правильнее сказать, что семафор является неотъемлемой частью любой многозадачной опе­рационной системы.

Определить состояние семафора.

Вход:

АН = С5Н AL=1

CX,DX - индекс семафора

Выход:

AL - 0 или код ошибки

CX - значение семафора

DL - счетчик использования семафора.

Уменьшить значение семафора.

Вход:

АН = С5Н

AL= 2

CX,DX - индекс семафора ВР - время ожидания

Выход: AL - О или код ошибки.

Увеличить значение семафора.

Вход:

АН = C5Н AL = 3

CX,DX - индекс семафора

Выход: AL - О или код ошибки.

Закрыть семафор.

Вход:

АН = С5Н

AL = 4

CX,DX - индекс семафора Выход:

AL - О или код ошибки. 11. Коды ошибок.

01Н - неправильный код функции DOS, сервер используется

02Н - файл не найден

03 Н - путь не найден

О4Н - много открытых файлов

05Н - доступ запрещен

06Н - неправильный индекс файла

07Н - блок памяти уничтожен

О8Н - мало памяти

09Н - неправильный адрес блока памяти ОАН - неправильная среда MS DOS ОВН - неправильный формат

ОСН - неправильный код доступа ОБИ - неправильные данные ОБИ - дисковод указан неправильно ЮН - попытка удалить текущий каталог

11Н - задано другое устройство, что недопустимо в перемещении файлов 12Н-нет больше файлов

20Н - нарушение режима совместного использования файлов

21Н - нарушение режима блокировки файлов

80Н - файл уже используется

81Н - нет больше доступных индексов файлов

82Н - нет доступа для открытия файлов

83Н - ошибка ввода/вывода на сетевом устройстве

84Н - нет доступа для создания файлов или каталогов

85Н - нет доступа для создания и удаления файлов и каталогов

86Н - создаваемый файл существует, и для него установлен режим "только чтение"

87Н - недопустимое использование символов шаблона в имени создаваемого файла

88Н - неправильный индекс файла

89Н - нет доступа для поиска

8 АН - нет доступа для удаления

8ВН - нет доступа для переименования

8СН - нет доступа для изменения

8БИ - файлы уже используются

8ЕН - файлы не используются

8БИ - есть файлы, для которых установлен режим "только чтение" 90Н - нет файлов, для которых установлен режим "только чтение"

- при переименовании оказалось, что файлы с новым именем уже существуют 92Н - не найдены файлы, имена которых должны быть изменены 93Н - нет доступа для чтения

94Н - нет доступа на запись, или для файла установлен режим "только чтение"

95Н - файл отсоединен

96Н - недостаточно памяти на сервере 97Н - нет места на диске для файла спулинга 98Н - указанный том не существует 99Н - переполнение каталога

9АН - при переименовании задано новое имя для тома

9ВН - неправильный индекс каталога

9СН - неправильно указан путь к каталогу 9БН - нет свободных индексов каталогов 9ЕН - неправильное имя файла 9БИ - указанный каталог уже существует АОН - каталог не пуст

А1Н - ошибка ввода/вывода при обращении к каталогу А2Н - попытка прочитать файл с заблокированными записями СОН - нет доступа к средствам учета работы пользователей С1Н - подключение к серверу запрещено

С2Н - истек предоставленный кредит

С5Н - блокировка при попытке подобрать пароль

С6Н -     прав оператора консоли

ООН - ошибка при работе с очередями

Б1Н-нет очередей

Б2И - нет сервера очередей

Б3И - нет прав доступа к очереди

Б4И - переполнение очереди

Б5И - нет очереди заданий

Б6И - нетдоступа к заданию

Б7Н - пароль не является уникальным

Б8Н - слишком короткий пароль

Б9И - подключение запрещено

БАИ - в этот период времени подключение запрещено

БВН - с этой станции подключение запрещено

БСИ - пользователь заблокирован

БЕИ - пароль устарел

ББИ - пароль устарел

ЕБИ - задано неправильное имя объекта

БОИ - нельзя использовать символы шаблонов

Б1И - неправильный код доступа

Б2И - нет доступа на чтение данных об объекте

Б3И - нет доступа на изменение имени объекта

Б4И - нет доступа на удаление объекта

Б5И - нет доступа на создание объекта

Б6И - нет доступа на удаление записи

Е7Н - нетна создание записи, указанный дискнеявляется локальным

Б8И - объект уже подключен к серверу, нет доступа на изменение содержимого

записи, объект не подключен к серверу Б9И - нет доступных каналов для подключения, нет доступа на чтение содержи­мого записи

- нет свободных слотов для подключения сервера БВН - неправильно заданы параметры, неттакой записи, неправильный код запроса БСИ - неизвестный файл-сервер, переполнение очереди сообщений, нет такого

объекта

ББН - поле уже заблокировано

БЕН - база данных объектов заблокирована, каталог заблокирован, неправильная длина имени семафора, подключение к серверу запрещено супервизором

ББИ - неправильное смещение записи, ошибка в расширении имени файла, ошиб­ка в имени файла, сбой аппаратных средств, неправильный номер дисково­да, неправильное начальное значение семафора, неправильный индекс се­мафора, файлы не найдены, нет отклика от файл-сервера, нет такого объек­та, путь не найден, сбой при работе с базой объектов, больше нет файлов, соответствующих шаблону, записи не найдены.