Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

       

Проверка присутствия сетевой оболочки


Прежде чем обращаться к функциям сетевой оболочки рабочей станции, ваша программа должна убедиться, что эта оболочка загружена. Следует также узнать ее версию, так как состав функций сетевой оболочки может меняться от версии к версии.

Для проверки присутствия сетевой оболочки и определения ее версии проще всего воспользоваться функцией GetShellVersionInformation(), входящей в состав библиотеки NetWare C Interface. Приведем прототип указанной функции:

int GetShellVersionInformation(BYTE *MajorVersion, BYTE *MinorVersion, BYTE *RevisionLevel);

Тип BYTE описан в include-файле prolog.h, входящем в состав NetWare C Interface:

#define BYTE unsigned char

Если функция возвратила значение 0xFF, поля MajorVersion, MinorVersion, RevisionLevel будут содержать соответственно верхний (major) номер версии, нижний (minor) номер версии и номер изменения (revision). Если функция GetShellVersionInformation() вернула нулевое значение, версия сетевой оболочки слишком стара (номер версии меньше 2.1) и не поддерживает данную функцию.

Для того чтобы определить наличие сетевой оболочки, перед вызовом функции GetShellVersionInformation() запишите нулевое значение в переменную MajorVersion. Если после возврата из функции переменная MajorVersion не изменила своего значения, сетевая оболочка не загружена.

К сожалению, функция GetShellVersionInformation() не сохраняет содержимое регистра SI, поэтому у нас возникли проблемы с использованием этой функции в среде сетевой оболочки версии 3.26. Мы вышли из положения простым способом - сохранили содержимое этого регистра в стеке сами перед вызовом функции, а после возврата из функции восстановили его.

Приведем программу, определяющую версию сетевой оболочки (листинг 1):

// =================================================== // Листинг 1. Программа для обнаружения сетевой // оболочки и определения ее версии // Файл version\version.cpp // // (C) A. Frolov, 1993 // ===================================================

#include <stdlib.h> #include <stdio.h>


extern "C" int GetNetWareShellVersion(char *,char *, char *);



void main(void) {

char MajorVersion=0; char MinorVersion=0; char Revision=0;

asm push si

GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision);

asm pop si

if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n"); return; }

printf("\nВерсия оболочки NetWare: %d.%d.%d\n",MajorVersion, MinorVersion, Revision); }

Приведенная программа составлена на языке программирования С++, поэтому внешняя функция GetNetWareShellVersion() должна быть описана как внешняя функция, использующая соглашения об именах и передаче параметров в стандарте С:

extern "C" int GetNetWareShellVersion(char *,char *, char *);

Если бы программа была составлена на языке С, можно было бы использовать описание этой функции, приведенное в одном из include-файлов библиотеки Netware C Interface. Для включения всех include-файлов библиотеки Netware C Interface вы должны добавить в вашу программу следующую строку:

#include <nit.h>

Для программ, составленных на языке С++, вам придется создавать собственные include-файлы на базе поставляемых вместе с библиотекой Netware C Interface.

Если у вас нет библиотеки Netware C Interface, вы можете узнать номер версии, вызвав непосредственно функцию 0xEA01 прерывания INT21h.

Перед вызовом функции вам нужно соответствующим образом загрузить регистры:

На входе: AX = EA01h.
ES:DI = Указатель на буфер размером 40 байт, в который будет записано текстовое описание среды рабочей станции. Это описание состоит из четырех строк:

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

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

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

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

Последняя текстовая строка в буфере закрыта двумя двоичными нулями.
На выходе: BH = Верхний (major) номер версии или 0, если сетевая оболочка не загружена или ее версия меньше 2.1.
BL = Нижний (minor) номер версии.
CL = Номер изменения (revision).
Приведем вариант предыдущей программы, не использующий библиотеку NetWare C Interface (листинг 2).


Кроме версии сетевой оболочки программа выводит содержимое буфера с текстовым описанием среды рабочей станции.

// ================================================================ // Листинг 2. Программа для обнаружения сетевой оболочки, определе- // ния ее версии и вывода строк описания среды рабочей станции // Файл version1\version1.cpp // // (C) A. Frolov, 1993 // ================================================================

#include <stdlib.h> #include <stdio.h> #include <dos.h> #include <string.h>

void PrintBuffer(char*);

void main(void) {

char MajorVersion=0; char MinorVersion=0; char Revision=0; char Buffer[40]; union REGS regs; struct SREGS sregs;

regs.x.ax = 0xea01; regs.x.di = FP_OFF(Buffer); sregs.es = FP_SEG(Buffer); intdosx(&regs, &regs, &sregs);

MajorVersion = regs.h.bh; MinorVersion = regs.h.bl; Revision = regs.h.cl;

printf("\nВерсия оболочки NetWare: %d.%d.%d\n",MajorVersion, MinorVersion, Revision); printf("\nСтроки описания среды: ");

PrintBuffer(Buffer); }

void PrintBuffer(char *Buffer) { char *ptr;

for(ptr = Buffer; *ptr != '\0';) { printf("'%s' ", ptr); ptr = ptr + strlen(ptr) + 1; } }


Содержание раздела