home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 21
/
CD_ASCQ_21_040595.iso
/
dos
/
prg
/
pas
/
nwtp06
/
nwserv.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-03-01
|
23KB
|
748 lines
{$X+,B-,V-} {essential compiler directives}
UNIT nwServ;
{ nwServ unit as of 950301 / NwTP 0.6 API. (c) 1993,1995, R. Spronk }
INTERFACE
uses nwIntr,NwMisc,nwConn;
Var result:word;
{ Primary Functions: Interrupt: Comments:
* CheckConsolePrivileges (F217/C8)
* ClearConnectionNumber (F217/D2)
* DisableFileServerLogin (F217/CB)
. DisableTransactionTracking (F217/CF)
* DownFileServer (F217/D3)
* EnableFileServerLogin (F217/CC)
. EnableTransactionTracking (F217/D0)
* GetConnectionsOpenFiles (F217/EB)
GetConnectionsUsingAFile (F217/EC)
* GetDiskUtilization (F217/0E)
* GetFileServerDateAndTime (F214)
* GetFileServerDescriptionStrings (F217/C9)
* GetFileServerLoginStatus (F217/CD)
* GetNetworkSerialNumber (F217/12)
* GetFileServerInformation (F217/11)
* SetFileServerDateAndTime (F217/CA)
* VerifyNetworkSerialNumber (F217/0C)
Secondary functions:
* CheckNetwareVersion
Not supported by netware 3.x: (2.x only)
- GetBinderyObjectDiskSpaceLeft (F217/E6) (failed during testing)
- GetConnectionsTaskInformation (E3../DA)
- GetConnectionsUsageStats (E3../E5)
- GetConnectionsUsingAFile (E3../DC)
- GetDiskCacheStats (E3../D6)
- GetDiskChannelStats (E3../D9)
- GetDriveMappingTable (E3../D7)
- GetFileServerLANIOStats (E3../E7)
- GetFileServerMiscInformation (E3../E8)
- GetFileSystemStats (E3../D4)
- GetLANDriverConfigInfo (E3../E3)
- GetLogicalRecordInformation (E3../E0)
- GetLogicalRecordsByConnection (E3../DF)
- GetPhysicalDiskStats (E3../D8)
- GetPhysicalRecordLocksByFile (E3../DE)
- GetPhysRecLocksByConnectAndFile (E3../DD)
}
Type TFileServerInformation
=Record
ServerName : string[48];
NetwareVersion : Byte;
NetwareSubVersion : Byte; { 0..99 }
ConnectionsMax : word;
ConnectionsInUse : word;
MaxConnVol : word; { max connected volumes }
{---Advanced Netware 2.1x/3.x------------}
OS_revision : byte;
SFT_level : byte;
TTS_level : byte;
peak_conn_used : word; { max simult.used connections}
accounting_version : byte;
vap_version : byte;
queuing_version : byte;
print_server_version : byte;
virtual_console_version : byte;
security_restrictions_level : byte;
Internetwork_bridge_version : byte;
Undefined : Array [1..60] of Byte;
End;
Type TfileInfoRecord=record
TaskNbr :Word;
LockType :Byte; { 00 no lock; FE file lock; FF locked by Begin Share File Set }
AccessFlag :Byte;
LockFlag :Byte;
VolNbr :Byte; { 0..31 }
ParentEntryId:Longint;
DirEntryId :Longint;
ForkCount :Byte;
NStype :Byte;
FileName :String;
end;
TfileInfoRecList=array[1..28] of TfileInfoRecord;
Type TfileUsageList=record
UseCount :word;
OpenCount :word;
OpenForReadCount :word;
OpenForWriteCount:word;
DenyReadCount :word;
DenyWriteCount :word;
LockFlag :Byte; { boolean }
NStype :Byte; { Fork Count = File siz? of NStype? }
NbrOfRec :word; { max 70 }
FileUsage:array[1..70] of record
ConnNbr :word;
TaskNbr :word;
LockType :byte;
AccessFlag:Byte;
LockFlag :Byte;
end;
end;
{F217/C8 [2.15c+]}
FUNCTION CheckConsolePrivileges : Boolean;
{F217/D2 [2.15c+]}
Function ClearConnectionNumber(connectionNbr:byte):boolean;
{ Console Rights needed;
-Terminates a connection. }
{F217/CB [2.15c+]}
FUNCTION DisableFileServerLogin : Boolean;
{F217/CF [2.15c+]}
FUNCTION DisableTransactionTracking : Boolean;
{F217/D3 [2.15c+]}
FUNCTION DownFileServer (ForceFlag : Boolean) : Boolean;
{F217/CC [2.15c+]}
FUNCTION EnableFileServerLogin : Boolean;
{F217/D0 [2.15c+]}
FUNCTION EnableTransactionTracking : Boolean;
{F217/EB [3.0+]}
FUNCTION GetConnectionsOpenFiles
( ConnNumber : Byte;
{i/o:} var LastRecordSeen : word;
{out:} var NbrOfRecords : word;
var FileInfo : TfileInfoRecList ) : Boolean;
{F217/0E [2.15c+]}
FUNCTION GetDiskUtilization(volNbr:byte; objID:Longint;
Var usedDirs,usedFiles,usedBlocks:Word ):Boolean;
{F214 [2.15c+]}
FUNCTION GetFileServerDateAndTime ( Var time:TnovTime): Boolean;
{F217/C9 [2.15c+]}
FUNCTION GetFileServerDescriptionStrings(Var companyName,
VersionAndRevision,revisionDate,
copyrightNotice:String
):Boolean;
{F217/CD [2.15c+]}
FUNCTION GetFileServerLoginStatus (Var LoginEnabled:Boolean): Boolean;
{ if Login is enabled then returns TRUE in LoginEnabled }
{F217/12 [2.15c+]}
Function GetNetworkSerialNumber(Var serialNbr:LongInt; Var ApplicNbr:Word ):Boolean;
{return the serial number and application number for the software
installed on the file server}
{F217/11 [2.15c+]}
Function GetFileServerInformation (Var serverInfo:TFileServerInformation):boolean;
{determine the version of software installed on the file server and how it is configured}
{F217/CA [2.15c+]}
FUNCTION SetFileServerDateAndTime(time:TnovTime):Boolean;
{need console operator privileges to do this}
{F217/OC [2.15c+]}
Function VerifyNetworkSerialNumber(serialNbr: LongInt ;
Var ApplicNbr: Word ):Boolean;
{if the network serial number to be verified is correct, the reply
buffer will contain the corresponding application number }
{*********************** Secondary Functions ******************************}
{ [1.x/2.x/3.x] }
FUNCTION CheckNetwareVersion(MinimumVersion,MinimumSubVersion,
MinimumRevision,MinimumSFT,MinimumTTS:word):Boolean;
IMPLEMENTATION{=============================================================}
{F217/D2 [2.15c+]}
Function ClearConnectionNumber(connectionNbr:byte):boolean;
{ Console Rights needed;
-Terminates a connection. }
Type Treq=record
len : word;
subf: byte;
_connNbr:byte;
end;
TPreq=^Treq;
begin
With TPreq(GlobalReqBuf)^
do begin
len:=2;
subf:=$D2;
_connNbr:=connectionNbr
end;
F2SystemCall($17,SizeOf(Treq),0,result);
ClearConnectionNumber:=(result=0);
{result codes: 00 successful; C6 No Console Rights}
end;
{F214 [2.15c+]}
FUNCTION GetFileServerDateAndTime ( Var time:TnovTime): Boolean;
Type Trep=TnovTime;
TPrep=^Trep;
BEGIN
F2SystemCall($14,0,SizeOf(Trep),result);
Time:=TPrep(GlobalreplyBuf)^;
if time.year>100
then time.year:=time.year-100;
{ year<80 : 21st century }
result:=0;
getFileServerDateAndTime:=TRUE;
end;
{F217/CA [2.15c+]}
FUNCTION SetFileServerDateAndTime (time:TnovTime): Boolean;
Type Treq=record
Len:word;
subF:byte;
_time:TnovTime
end;
TPreq=^Treq;
BEGIN
{ year<80 : 21st century }
WITH TPreq(GlobalReqBuf)^
do begin
Len:=SizeOf(Treq)-3; { dow is not a parameter }
subF:=$CA;
_time:=time;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
SetFileServerDateAndTime:=(Result=$00);
{ Resulcodes: $00 Success; $C6 No Console Operator Rights }
end;
{F217/11 [2.15c+]}
Function GetFileServerInformation (Var serverInfo:TFileServerInformation):boolean;
{determine the version of software installed on the file server and how it is configured}
{SeeAlso: GetDiskUtilization, GetNetworkSerialNumber, GetFileServerLoginStatus,
GetFileServerDateAndTime}
Type TReq=Record
Len : word;
SubF : Byte;
End;
TRep=TFileServerInformation;
TPreq=^Treq;
TPrep=^Trep;
Var t:word;
Begin
With TPreq(GlobalReqBuf)^
Do Begin
Len := 1;
SubF:= $11;
End;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep)-1,result);
Move(GlobalReplyBuf^[1],GlobalReplyBuf^[2],SizeOf(Trep)-1);
serverInfo:=TPrep(GlobalReplyBuf)^;
With serverinfo
do begin
connectionsMax :=Swap(connectionsMax); { force lo-hi again }
ConnectionsInUse:=Swap(connectionsInUse);
MaxConnVol :=Swap(maxConnVol);
peak_conn_used :=Swap(peak_conn_used);
for t:=48 downto 1
do if serverInfo.serverName[t]=#0
then serverInfo.serverName[0]:=chr(t-1);
end;
GetFileServerInformation:=(result=0);
End;
{F217/C9 [2.15c+]}
FUNCTION GetFileServerDescriptionStrings(Var companyName,
VersionAndRevision,revisionDate,
copyrightNotice:String
):Boolean;
{SeeAlso: GetFileServerLoginStatus, GetFileServerInformation. }
Type Treq=record
len : word;
subf: byte;
end;
Trep=record
stuff : array [1..512] of byte;
end;
TPreq=^Treq;
TPrep=^Trep;
Var x,xofs:word;
begin
With TPreq(GlobalReqBuf)^
do begin
len := 1;
subf := $c9;
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
companyName:=''; VersionAndRevision:='';
revisionDate:=''; copyrightNotice:='';
if result=$00
then with TPrep(GlobalReplyBuf)^
do begin
x:=1;xofs:=x;
while (stuff[x]<>$00) and (x<512) do inc(x);
ZStrCopy(companyName,stuff[xofs],x-xofs);
inc(x);xofs:=x; { skip 1 zero. ? skip more zero's? }
While (stuff[x]<>$00) and (x<512) do inc(x);
ZStrCopy(VersionAndRevision,stuff[xofs],x-xofs);
inc(x);xofs:=x;
While (stuff[x]<>$00) and (x<512) do inc(x);
ZStrCopy(revisionDate,stuff[xofs],x-xofs); { mm/dd/yy }
inc(x);xofs:=x;
While (stuff[x]<>$00) and (x<512) do inc(x);
ZStrCopy(copyrightNotice,stuff[xofs],x-xofs);
end;
GetFileServerDescriptionStrings:=(Result=$00);
end;
{F217/D3 [2.15c+]}
FUNCTION DownFileServer (ForceFlag : Boolean) : Boolean;
Type Treq=record
len : word;
subf : byte;
flag : byte;
end;
TPreq=^Treq;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
len := 2;
subf := $D3;
if ForceFlag then flag := $FF { non-zero }
else flag := $00;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
DownFileServer:=(result=0);
{ resultcodes: 00=successful; C6 No Console Rights ; FF Open Files}
end;
{F217/CF [3.x]}
FUNCTION DisableTransactionTracking : Boolean;
{ Caller must have console-operator rights. }
Type Treq=record
len : word;
subf: byte
end;
TPreq=^Treq;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
len := 1;
subf:= $CF;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
DisableTransactionTracking:=(result=0);
{ resultcodes: 00=successful; C6 No Console Rights }
end;
{F217/D0 [3.x]}
FUNCTION EnableTransactionTracking : Boolean;
{ Caller must have console-operator rights. }
Type Treq=record
len : word;
subf: byte
end;
TPreq=^Treq;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
len := 1;
subf:= $D0;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
EnableTransactionTracking:=(result=0);
{ resultcodes: 00=successful; C6 No Console Rights }
end;
{F217/CB [2.15c+]}
FUNCTION DisableFileServerLogin : Boolean;
{ Caller must have console-operator rights. }
Type Treq=record
len : word;
subf: byte
end;
TPreq=^Treq;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
len := 1;
subf:= $CB;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
DisableFileServerLogin:=(result=0);
{ resultcodes: 00=successful; C6 No Console Rights }
end;
{F217/CC [2.15c+]}
FUNCTION EnableFileServerLogin : Boolean;
{ Caller needs console-operator rights. }
Type Treq=record
len : word;
subf: byte
end;
TPreq=^Treq;
BEGIN
With TPreq(GlobalReqBuf)^
do begin
len := 1;
subf:= $CC;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
EnableFileServerLogin:=(result=0);
{ resultcodes: 00=successful; C6 No Console Rights }
end;
{F217/CD [2.15c+]}
FUNCTION GetFileServerLoginStatus( Var LoginEnabled:Boolean ): Boolean;
{ if Login is enabled then returns TRUE in LoginEnabled }
{ result byte: 00h - Success, C6h No Console Rights }
{ Caller must have operator status.}
Type TReq=record
Len : Word;
SubF : Byte;
end;
TRep=record
Flag : Byte;
end;
TPreq=^Treq;
TPrep=^Trep;
begin
with TPreq(GlobalReqBuf)^
do begin
Len := 1;
SubF := $CD;
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
LoginEnabled:=Boolean(TPrep(GlobalReplyBuf)^.Flag);
GetFileServerLoginStatus := (result=0);
end;
{F217/C8 [2.15c+]}
FUNCTION CheckConsolePrivileges : Boolean;
Type TReq=record
Len : Word;
SubF : Byte;
end;
TPreq=^Treq;
begin
with TPReq(GlobalReqBuf)^
do begin
Len := 1;
SubF := $C8;
end;
F2SystemCall($17,SizeOf(Treq),0,result);
CheckConsolePrivileges := (Result=$00);
{ result byte: 00h - Success, C6h No Console Rights }
end;
{F217/EB [3.0+]}
FUNCTION GetConnectionsOpenFiles
( ConnNumber : Byte;
{i/o:} var LastRecordSeen : word;
{out:} var NbrOfRecords : word;
var FileInfo : TfileInfoRecList ) : Boolean;
{ the calling workstation must have console operator privileges }
{ LastRecordSeen is an i/o parameter;
-An initial value of 0 has to be supplied;
-The function can be called until LastRecordSeen becomes 0,
indicating the end of the FIR-list.
to be called iteratively. }
Type TReq=record
len :word;
subf :byte;
logicalConnNbr:word;
lastRecSeen :word; {lo-hi, $0000 on first call }
end;
TRep=record
nextReqRec : word; { lo-hi, use as lastRecSeen in next iterative call }
{ $0000 if no more records }
RecCount : word;
FIRbuf:array[1..508] of byte;
end;
TPreq=^Treq;
TPrep=^Trep;
Var t,Foff:Word;
begin
With TPreq(GlobalReqBuf)^
do begin
len:=sizeof(Treq)-2;
subf:=$EB;
logicalConnNbr:=connNumber;
lastRecSeen:=LastRecordSeen; { force hi-lo }
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
if result=$00
then with TPrep(GlobalReplyBuf)^
do begin
{ Copy recCount FIRs from FIRbuf to the FileInfo[] array }
LastRecordSeen:=NextReqRec;
NbrOfrecords:=RecCount;
Foff:=0;
For t:=1 to RecCount
do begin
Move(FIRbuf[1+Foff],FileInfo[t],17+FIRbuf[Foff+17]);
inc(Foff,17+FIRbuf[Foff+17]);
{ Direntry and ParentEntry may have to be swapped lo-hi }
end;
end
else begin
NbrOfRecords:=0;
LastRecordSeen:=0;
end;
GetConnectionsOpenFiles:=(result=$00);
{ errorcodes: $00 Success; $C6 no console privileges }
end;
{F217/EC }
Function GetConnectionsUsingAFile(VolNbr:Byte; EntryId:Longint; NStype:byte;
{i/o} Var LastRecordSeen:word;
Var NbrOfRecords:Word;
Var FileInfo:TfileUsageList):boolean;
{ This call returns all connection numbers using the file specified
by the Volume Number and Directory Entry Id. }
{ !! UNDER CONSTRUCTION !! }
Type TReq=record
len :word;
subf :byte;
NStype :Byte; {= data stream type / Fork type }
VolNbr :Byte;
DirEntryId :Longint;
LastRecSeen:Word; {initially set to 0}
end;
TRep=record
NextRec :word; { iteration }
UseCount :word;
OpenCount :word;
OpenForReadCount :word;
OpenForWriteCount:word;
DenyReadCount :word;
DenyWriteCount :word;
LockFlag :Byte; { boolean }
NStype :Byte; { Fork Count -> ?? NStype }
NbrOfRec :word; { max 70 }
FileUsage:array[1..70] of record
ConnNbr :word;
TaskNbr :word;
LockType :byte;
AccessFlag:Byte;
LockFlag :Byte;
end;
end;
TPreq=^Treq;
TPrep=^Trep;
begin
With TPreq(GlobalReqBuf)^
do begin
len:=sizeof(Treq)-2;
subf:=$EC;
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
if result=$00
then with TPrep(GlobalReplyBuf)^
do begin
end
else begin
NbrOfRecords:=0;
LastRecordSeen:=0;
end;
GetConnectionsUsingAFile:=(result=$00);
{ errorcodes: $00 Success; $C6 no console privileges }
end;
{F217/0E [2.15c+]}
FUNCTION GetDiskUtilization(volNbr:byte; objID:Longint;
Var usedDirs,usedFiles,usedBlocks:Word ):Boolean;
{ SeeAlso: GetFileServerInformation,getBinderyObjectDiskSpaceLeft }
Type TReq=record
Len : Word;
SubF : Byte;
_volNbr:Byte;
_objID:longInt; { hi-lo }
end;
TRep=record
_volNbr:Byte;
_objID:Longint; {hi-lo}
_usedDirs,
_usedFiles,
_usedBlocks:Word; { all hi-lo }
end;
TPreq=^Treq;
TPrep=^Trep;
begin
with TPReq(GlobalReqBuf)^
do begin
Len := SizeOf(TReq)-2;
SubF := $0E;
_volNbr:=volNbr;
_objID:=Lswap(objID);
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
if result=$00
then begin
with TPrep(GlobalReplyBuf)^
do begin
usedDirs:=swap(_usedDirs); { force lo-hi }
usedFiles:=swap(_usedFiles); { force lo-hi }
usedBlocks:=swap(_usedBlocks);{ force lo-hi }
end;
end;
GetDiskUtilization:=(result=$00);
{Resultcodes: 00h successful; 98h volume doesn't exist
89h No Search Privileges
F2h no Object read privileges }
end;
{F217/12 [2.15c+]}
Function GetNetworkSerialNumber(Var serialNbr:LongInt; Var ApplicNbr:Word ):Boolean;
{return the serial number and application number for the software
installed on the file server}
{SeeAlso: VerifyNetworkSerialNumber,GetFileServerInformation}
Type TReq=record
Len : Word;
SubF : Byte;
end;
TRep=record
_serNbr : LongInt; {hi-lo}
_applicNbr: Word; {hi-lo}
end;
TPreq=^Treq;
TPrep=^Trep;
begin
with TPreq(GlobalReqBuf)^
do begin
Len := 1;
SubF := $12;
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
with TPrep(GlobalReplyBuf)^
do begin
ApplicNbr:=swap(_applicNbr); { force lo-hi }
serialNbr:=Lswap(_serNbr); { force lo-hi }
end;
GetNetworkSerialNumber := (result=0);
end;
{F217/OC [2.15c+]}
Function VerifyNetworkSerialNumber(serialNbr: LongInt ;
Var ApplicNbr: Word ):Boolean;
{if the network serial number to be verified is correct, the reply
buffer will contain the corresponding application number }
{SeeAlso: GetNetworkSerialNumber}
Type Treq=record
Len : Word;
SubF : Byte;
_netwSerNbr: LongInt; {hi-lo}
end;
TRep=record
_applicNbr: word; {hi-lo}
end;
TPreq=^Treq;
TPrep=^Trep;
begin
with TPReq(GlobalReqBuf)^
do begin
Len := 1;
SubF := $0C;
_netwSerNbr:=Lswap(serialNbr);
end;
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
with TPrep(GlobalReplyBuf)^
do begin
ApplicNbr:=swap(_applicNbr); { force lo-hi }
end;
VerifyNetworkSerialNumber := (result=0);
end;
{****************** secondary functions ************************************}
FUNCTION CheckNetwareVersion(MinimumVersion,MinimumSubVersion,
MinimumRevision,MinimumSFT,MinimumTTS:word):Boolean;
{ checks if the current OS/TTS/SFT version is greater or equal to the minimal version }
Var info:TFileServerInformation;
res:boolean;
begin
IF GetFileServerInformation(info)
then begin
IF (info.NetwareVersion>MinimumVersion)
then res:=true
else if (info.NetwareVersion=MinimumVersion)
AND (info.NetwareSubVersion>MinimumSubVersion)
then res:=true
else if (info.NetwareVersion=MinimumVersion)
AND (info.NetwareSubVersion=MinimumSubVersion)
AND (info.OS_Revision>=MinimumRevision)
then res:=true
else res:=false
end
else res:=false;
CheckNetwareVersion:=res AND (info.SFT_Level>=MinimumSFT)
AND (info.TTS_Level>=MinimumTTS)
end;
end. {unit nwServ}