Локальные сети персональных компьютеров. Работа с сервером Novell NetWare© Александр Фролов, Григорий ФроловТом 4, М.: Диалог-МИФИ, 1993, 168 стр. 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. Перед вызовом функции вам нужно соответствующим образом загрузить регистры:
Приведем вариант предыдущей программы, не использующий библиотеку 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(®s, ®s, &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;
}
}
|

