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

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

Для проверки присутствия сетевой оболочки и определения ее версии
проще всего воспользоваться функцией 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 прерывания
INT 21h.

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

На входе: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;
                }
  }



При использовании материалов сайта ссылка обязательна! (Copyright by www.avs-info.ru 2006)