// ===================================================
// Листинг 10. Отмена отображения локального диска на
//             сетевой каталог
//
// Файл dirunmap\dirunmap.cpp
//
// (C) A. Frolov, 1993
// ===================================================

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

#define BYTE unsigned char
#define WORD unsigned int

extern "C" int GetNetWareShellVersion(char *,char *, char *);
extern "C" BYTE GetDirectoryHandle(BYTE);
extern "C" int DeallocateDirectoryHandle(BYTE);

void main(int argc, char *argv[]) {

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

	BYTE DirectoryHandle;

	int ccode;

	printf("\n*DIRUNMAP* (C) Frolov A., 1993\n");

// Проверяем наличие сетевой оболочки

	asm push si
	GetNetWareShellVersion(&MajorVersion,
			&MinorVersion, &Revision);
	asm pop si

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

// Необходимо задать букву, обозначающую имя
// локального диска и путь к сетевому каталогу

	if(argc < 2) {
		printf("Укажите локальный диск, например: dirunmap f\n");
		return;
	}

// Параметр должен быть задан заглавной буквой

	strupr(argv[1]);

// Получаем индекс каталога, на который отображен
// указанный диск

	DirectoryHandle = GetDirectoryHandle(argv[1][0] - 'A');

// Если диск не отображен на сетевой каталог,
// выводим сообщение об ошибке

	if(DirectoryHandle)
		printf("Индекс каталога: %d\n", DirectoryHandle);
	else {
		printf("Диск не отображен на сетевой каталог\n");
		return;
	}

// Отменяем отображение диска

	ccode = DeallocateDirectoryHandle(DirectoryHandle);

// Если ошибок не было, выводим индекс каталога
// и маску прав для каталога

	if(ccode)
		printf("Ошибка %02.2X\n", ccode);
	else
		printf("Диск %c удален\n", argv[1][0]);
}

