IPXCancelEvent - отменить событие
На входе: | BX | = | 06h. |
ES:SI | = | Указатель на блок ECB. | |
На выходе: | AL | = | Код завершения: 00h - функция выполнена без ошибок; F9h - обработка ECB не может быть отменена; FFh - указанный ECB не используется. |
IPXCloseSocket - закрыть сокет
На входе: | BX | = | 01h. |
DX | = | Номер закрываемого сокета. | |
На выходе: | Регистры не используются. |
IPXDisconnectFromTaget - отключиться от партнера
На входе: | BX | = | 0Bh. | |
ES:SI | = | Указатель на структуру, содержащую сетевой адрес станции:
struct NetworkAddress { unsigned char Network[4]; unsigned char Node[6]; unsigned char Socket[2]; } | ||
На выходе: | Регистры не используются. |
IPXGetInternetworkAddress - получить собственный адрес
На входе: | BX | = | 09h. |
ES:DI | = | Указатель на буфер длиной 10 байт, в который будет записан адрес станции, на которой работает данная программа. Адрес состоит из номера сети Network и адреса станции в сети Node. | |
На выходе: | Регистры не используются. |
IPXGetIntervalMarker - получить интервальный маркер
На входе: | BX | = | 08h. |
На выходе: | AX | = | Интервальный маркер. |
IPXGetLocalTaget - получить непосредственный адрес
На входе: | BX | = | 02h. |
ES:SI | = | Указатель на буфер длиной 12 байт, содержащий полный сетевой адрес станции, на которую будет послан пакет. | |
ES:DI | = | Указатель на буфер длиной 6 байт, в который будет запи-сан непосредственный адрес, т. е. адрес той станции, которой будет передан пакет. Это может быть адрес моста. | |
На выходе: | AL | = | Код завершения: 00h - непосредственный адрес был успешно вычислен; FAh - непосредственный адрес вычислить невозможно, так как к указанной станции нет ни одного пути доступа по сети. |
CX | = | Время пересылки пакета до станции назначения (только если AL равен 0) в тиках системного таймера. Тики таймера следуют с периодом примерно 1/18 секунды. |
IPXListenForPacket - принять IPX-пакет
На входе: | BX | = | 04h. |
ES:DI | = | Указатель на заполненный блок ECB. Необходимо заполнить поля: ESRAddress; Socket; FragmentCnt; указатели на буферы фрагментов Address; размеры фрагментов Size. |
|
На выходе: | Регистры не используются. |
IPXOpenSocket - открыть сокет
На входе: | BX | = | 00h. |
AL | = | Тип сокета: 00h - короткоживущий; FFh - долгоживущий. |
|
DX | = | Запрашиваемый номер сокета или 0000h, если требуется получить динамический номер сокета. Примечание. Байты номера сокета находятся в перевернутом виде. |
|
На выходе: | AL | = | Код завершения: 00h - сокет открыт; FFh - этот сокет уже был открыт раньше; FEh - переполнилась таблица сокетов. |
DX | = | Присвоенный номер сокета. |
IPXRelinquishControl - выделить время драйверу IPX
На входе: | BX | = | 0Ah. |
На выходе: | Регистры не используются. |
IPXSceduleIPXEvent - отложить событие
На входе: | BX | = | 05h. |
AX | = | Время задержки в тиках таймера | |
ES:SI | = | Указатель на блок ECB. | |
На выходе: | Регистры не используются. |
IPXSendPacket - передать IPX-пакет
На входе: | BX | = | 03h. |
ES:DI | = | Указатель на заполненный блок ECB. Необходимо заполнить поля: ESRAddress; Socket; ImmAddress; FragmentCnt; указатели на буферы фрагментов Address; размеры фрагментов Size.В заголовке пакета IPX необходимо заполнить поля: PacketType; |
|
DestNetwork; DestNode; DestSocket. |
|||
На выходе: | Регистры не используются. |
SPXAbortConnection - закрыть канал аварийно
На входе: | BX | = | 14h. |
DX | = | Номер канала связи. | |
На выходе: | Регистры не используются. |
SPXCheckInstallation - инициализировать SPX
На входе: | BX | = | 10h. |
AL | = | 00h. | |
На выходе: | AL | = | Код завершения: 00h - SPX не установлен; FFh - SPX установлен. |
BH | = | Верхний (major) номер версии SPX. | |
BL | = | Нижний (minor) номер версии SPX. | |
CX | = | Максимальное количество каналов SPX, поддерживаемых драйвером SPX. | |
DX | = | Количество доступных каналов SPX. |
SPXEstablishConnection - создать канал с передающей стороны
На входе: | BX | = | 11h |
AL | = | Счетчик повторов попыток создать канал связи. | |
AH | = | Флаг включения системы периодической проверки связи (Watchdog Supervision Required Flag). | |
ES:SI | = | Указатель на блок ECB | |
На выходе: | AL | = | Промежуточный код завершения: 00h - выполняется попытка создать канал; FFh - указанный в блоке ECB сокет закрыт; FDh - сбойный пакет: либо счетчик фрагментов не равен 1, либо размер фрагмента не равен 42; |
EFh - переполнение локальной таблицы номеров каналов связи. | |||
DX | Присвоенный номер канала. |
SPXGetConnectionStatus - получить состояние канала
На входе: | BX | = | 15h. |
DX | = | Номер канала связи. | |
ES:SI | = | Указатель на буфер размером 44 байта. | |
На выходе: | AL | = | Код завершения: 00h - канал активен; EEh - указанный канал не существует. |
SPXListenForConnection - создать канал с принимающей стороны
На входе: | BX | = | 12h. |
AL | = | Счетчик повторов попыток создать канал связи. | |
AH | = | Флаг включения системы периодической проверки связи (Watchdog Supervision Required Flag). | |
ES:SI | = | Указатель на блок ECB. | |
На выходе: | Регистры не используются. |
SPXListenForSequencedPacket - принять SPX-пакет
На входе: | BX | = | 17h. |
ES:SI | = | Указатель на блок ECB. | |
На выходе: | Регистры не используются. |
SPXSendSequencedPackett - передать SPX-пакет
На входе: | BX | = | 16h. |
ES:SI | = | Указатель на блок ECB | |
DX | = | Номер канала связи. | |
На выходе: | Регистры не используются. |
SPXTerminateConnection - закрыть канал
На входе: | BX | = | 13h |
ES:SI | = | Указатель на блок ECB | |
DX | = | Номер канала связи | |
На выходе: | Регистры не используются. |
NB_AddGroupName (0xB6)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB6.
NB_AddName (0xB0)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB0.
NB_Call (0x90)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x90.
NB_ChainSend (0x97)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x97.
NB_ChainSendNoAck (0xF2)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xF2.
NB_DeleteName (0xB1)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB1.
NB_HangUp (0x92)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x92.
NB_Listen (0x91)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x91.
NB_Receive (0x95)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x95.
NB_ReceiveAny (0x96)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x96.
NB_ReceiveBroadcastDatagram (0xA3)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA3.
NB_ReceiveDatagram (0xA1)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA1.
NB_Send (0x94)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0x94.
NB_SendBroadcastDatagram (0xA2)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA2.
NB_SendDatagram (0xA0)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xA0.
NB_SendNoAck (0xF1)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xF1.
NB_SessionStatus (0xB4)
Команда аналогична предыдущей, за исключением того, что она выполняется без ожидания и в поле Cmd необходимо записать значение 0xB4.
NB_WAddGroupName (0x36) - добавить групповое имя
Поля NCB на входе | Содержимое |
Cmd | 0x36 |
OurName | Добавляемое групповое имя |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
NetworkNameNumber | Присвоенный номер имени |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WAddName (0x30) - добавить имя
Поля NCB на входе | Содержимое |
Cmd | 0x30 |
OurName | Добавляемое имя |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
NetworkNameNumber | Присвоенный номер имени |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WCall (0x10) - создать канал с передающей стороны
Поля NCB на входе | Содержимое |
Cmd | 0x10 |
CallName | Имя, с которым устанавливается канал |
OurName | Имя станции, создающей канал |
ReceiveTimeout | Время ожидания приема, в 1/2 с |
SendTimeout | Время ожидания передачи, в 1/2 с |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
LocalSessionNumber | Присвоенный номер канала |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WCancel (0x35) - отменить команду
Поля NCB на входе | Содержимое |
Cmd | 0x35 |
Buffer | Указатель на блок NCB, для которого отменяется команда |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
FinalCCode | Окончательный код завершения команды |
NB_WChainSend (0x17) - передать данные через канал, используя сцепленные буферы
Поля NCB на входе | Содержимое |
Cmd | 0x17 |
LocalSessionNumber | Номер используемого канала |
Buffer | Указатель на первый буфер, содержащий передаваемые данные |
Size | Размер первого буфера |
CallName | Первые два байта содержат размер второго буфера, следующие четыре байта - дальний адрес второго буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WChainSendNoAck (0x72) - передать
Поля NCB на входе | Содержимое |
Cmd | 0x72 |
LocalSessionNumber | Номер используемого канала |
Buffer | Указатель на первый буфер, содержащий передаваемые данные |
Size | Размер первого буфера |
CallName | Первые два байта содержат размер второго буфера, следующие четыре байта - дальний адрес второго буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WDeleteName (0x31) - удалить имя
Поля NCB на входе | Содержимое |
Cmd | 0x31 |
OurName | Удаляемое имя |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WHangUp (0x12) - закрыть канал
Поля NCB на входе | Содержимое |
Cmd | 0x12 |
LocalSessionNumber | Номер закрываемого канала |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WListen (0x11) - создать канал с принимающей стороны
Поля NCB на входе | Содержимое |
Cmd | 0x11 |
CallName | Имя, с которым устанавливается канал. Если в первый байт имени записать символ "*", канал будет установлен с любой вызывающей станцией |
OurName | Имя станции, создающей канал с принимающей стороны |
ReceiveTimeout | Время ожидания приема, в 1/2 с |
SendTimeout | Время ожидания передачи, в 1/2 с |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
LocalSessionNumber | Присвоенный номер канала |
CallName | В это поле записывается имя вызвавшей станции, если при установлении канала было указано имя "*" |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WReceive (0x15) - принять данные через канал
Поля NCB на входе | Содержимое |
Cmd | 0x15 |
LocalSessionNumber | Номер используемого канала |
Buffer | Указатель на буфер, используемый для записи принятых данных |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
Size | Количество принятых и записанных в буфер байт данных |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WReceiveAny (0x16) - принять данные через канал от любого имени
Поля NCB на входе | Содержимое |
Cmd | 0x16 |
NetworkNameNumber | Номер имени или 0xFF |
Buffer | Указатель на буфер, используемый для записи принятых данных |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
Size | Количество принятых и записанных в буфер байт данных |
NetworkNameNumber | Номер имени станции, от которой пришли данные |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WReceiveBroadcastDatagram (0x23)
Поля NCB на входе | Содержимое |
Cmd | 0x23 |
NetworkNameNumber | Номер, присвоенный при добавлении имени или 0xFF |
Buffer | Адрес буфера, содержащего передаваемые данные |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CallName | Имя станции, от которой получена датаграмма |
Size | Размер принятого блока данных |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WReceiveDatagram (0x21) - принять датаграмму
Поля NCB на входе | Содержимое |
Cmd | 0x21 |
NetworkNameNumber | Номер, присвоенный при добавлении имени или 0xFF |
Buffer | Адрес буфера, содержащего передаваемые данные |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CallName | Имя станции, от которой получена датаграмма |
Size | Размер принятого блока данных |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WResetAdapter (0x32) - сбросить сетевой адаптер
Поля NCB на входе | Содержимое |
Cmd | 0x32 |
LocalSessionNumber | Максимальное количество каналов или 0 для использования значения по умолчанию |
NetworkNameNumber | Максимальное количество блоков NCB или 0 для использования значения по умолчанию |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
FinalCCode | Окончательный код завершения команды |
NB_WSend (0x14) - передать данные через канал
Поля NCB на входе | Содержимое |
Cmd | 0x14 |
LocalSessionNumber | Номер используемого канала |
Buffer | Указатель на буфер, содержащий передаваемые данные |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WSendBroadcastDatagram (0x22) - послать датаграмму одновременно всем станциям
Поля NCB на входе | Содержимое |
Cmd | 0x22 |
NetworkNameNumber | Номер, присвоенный при добавлении имени |
Buffer | Адрес буфера, содержащего передаваемые данные |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WSendDatagram (0x20) - послать датаграмму
Поля NCB на входе | Содержимое |
Cmd | 0x20 |
NetworkNameNumber | Номер, присвоенный при добавлении имени |
CallName | Имя станции, которой передаются данные |
Buffer | Адрес буфера, содержащего передаваемые данные |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WSendNoAck (0x71) - передать данные через канал без подтверждения
Поля NCB на входе | Содержимое |
Cmd | 0x71 |
LocalSessionNumber | Номер используемого канала |
Buffer | Указатель на буфер, содержащий передаваемые данные |
Size | Размер буфера |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
NB_WSessionStatus (0x34) - получить состояние канала
Название поля | Назначение поля |
NameNumber | Номер имени канала |
SessionCount | Количество каналов |
DatagramsOutstanding | Количество выданных команд на прием датаграмм |
ReceiveAnyoutstanding | Количество выданных команд на прием командой NB_ReceiveAny |
Session | Массив структур, описывающих каждый канал в отдельности |
LocalSessionNumber | Номер канала |
State | Состояние канала: 1 - ожидание завершения команды NB_Listen; 2 - ожидание завершения команды NB_Call; 3 - канал установлен; 4 - ожидание завершения команды NB_HangUp; 5 - команда NB_HangUp завершила свое вы- полнение; 6 - канал закрыт с ошибкой. |
LocalName | Имя локальной станции |
RemoteName | Имя удаленной станции |
ReceiveCount | Количество ожидающих завершения команд NB_Receive |
SendCount | Количество ожидающих завершения команд NB_Send |
Поля NCB на входе | Содержимое |
Cmd | 0x34 |
Buffer | Дальний адрес буфера для приема информации о состоянии каналов |
Size | Размер буфера |
OurNames | Имя канала, для которого необходимо получить информацию о состоянии. В качестве имени можно указывать "*" |
PostRoutine | Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется |
AdapterNumber | Номер адаптера; 0 - первый адаптер, 1 - второй |
Поля NCB на выходе | Содержимое |
Size | Размер заполненной части буфера |
CCode | Промежуточный код завершения команды |
FinalCCode | Окончательный код завершения команды |
РАБОТА С IPX, SPX И NETBIOS В СРЕДЕ MS WINDOWS
8.1.
8.2.
Создание программ, специально предназначенных для работы в среде Microsoft Windows, не является предметом обсуждения в данной книге. Однако мы сделаем несколько замечаний относительно использования протоколов IPX, SPX и NETBIOS в программах, работающих в среде Microsoft Windows версии 3.1 и Microsoft Windows for Workgroups версии3.1.
к Microsoft Windows for Workgroups
Замечания, сделанные выше, относятся и к Microsoft Windows for Workgroups версии 3.1. Однако эта операционная система может и не поддерживать протоколы IPX/SPX. С помощью приложения Control Panel вы можете подключить или отключить поддержку сети Novell NetWare и протоколов IPX/SPX.
Если поддержка Novell NetWare не используется, вам доступен протокол NETBIOS, который является "родным" протоколом для Windows for Workgroups.
Мы проверили работу NETBIOS через интерфейс прерывания INT 2Ah при работе в виртуальной машине MS-DOS. Сразу после загрузки сетевых драйверов Windows for Workgroups интерфейс NETBIOS недоступен. Однако в среде виртуальной машины MS-DOS этот интерфейс появляется.
Приведем два фрагмента системы "клиент-сервер", проверенной нами при работе в Windows for Workgroups. Вы сможете найти полные исходные тексты на дискете, которая продается вместе с книгой (эти исходные тексты почти полностью повторяют тексты системы "клиент-сервер", работающей с датаграммами).
Первый фрагмент проверяет присутствие интерфейса NETBIOS:
// Проверяем наличие интерфейса NETBIOS
regs.h.ah = 0; int86(0x2a, ®s, ®s); errno = 0;
if(regs.h.ah == 0) { errno=0xff; }
Второй фрагмент предназначен для вызова NETBIOS через прерывание INT 2Ah:
// Функция для вызова NETBIOS
void NetBios(void) { sregs.es = FP_SEG(&ncb); regs.x.bx = FP_OFF(&ncb); regs.h.ah = 0x4; regs.h.al = 0x1; int86x(0x2a, ®s, ®s, &sregs); }
Все резидентные программы, имеющие отношение
Все резидентные программы, имеющие отношение к сетевой оболочке Novell NetWare, необходимо загружать до запуска Windows. Это относится и к эмулятору протокола NETBIOS. Если вы запустите эти программы из виртуальной машины MS-DOS, работающей в среде WIndows, рано или поздно произойдет аварийное завершение Windows.
Если ваша программа работает в среде MS-DOS с протоколами IPX, SPX или NETBIOS, она без всяких изменений будет работать и на виртуальной машине Windows. Вам только надо проследить, чтобы все резидентные программы и эмулятор NETBIOS загружались до запуска Windows.
Если же вы желаете создать полноценное приложение для Windows, работающее с сетевыми протоколами, вам следует иметь в виду, что для всех этих протоколов необходимо указывать адреса управляющих блоков и буферов, расположенные в первом мегабайте основной оперативной памяти. Кроме того, из приложений Windows, работающих в защищенном режиме, вы не можете непосредственно вызывать драйвер IPX/SPX или прерывание NETBIOS, так как эти интерфейсы рассчитаны на вызов из реального режима.
Вы можете выйти из такого затруднительного положения, если воспользуетесь интерфейсом с защищенным режимом DPMI (DOS Protected Mode Interface), описанным нами в томе "Библиотеки системного программиста", по-священном использованию защищенного режима.
В рамках интерфейса DPMI есть функции, позволяющие из программы, работающей в защищенном режиме, вызывать прерывания или функции, предназначенные для работы в реальном режиме. Кроме того, в API Windows есть функции, с помощью которых вы можете заказать для программы защищенного режима буферы, расположенные в первом мегабайте основной оперативной памяти.