[Back to NETWORK SWAG index] [Back to Main SWAG index] [Original]
{
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º ÚËÍÍÍË¿ÚËÍÍÍË¿ÚËÍÍÍË¿ÚËÍ» Ë¿ÚËÍÍÍË¿ÚÉÍËÍ»¿ º
º ³ÌÍÍÍÊÙÃÎÍÍÍδÀÊÍÍÍË¿³º º º³ÃÎÍÍ º º
º ÀÊ ÀÊ ÊÙÀÊÍÍÍÊÙÀÊ ÈÍÊÙÀÊÍÍÍÊÙ Ê º
º º
º NetWare 3.11 API Library for Turbo Pascal º
º by º
º S.Perevoznik º
º 1996 º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
}
Unit NetStat;
Interface
Uses NetConv;
Type PhysDiskStats = record
SystemElapsedTime : LongInt;
DiskChanell,
Diskremovable,
DriveType,
ControllerDriveNumber,
ControllerNumber,
ControllerType : byte;
DriveSize : longInt; { in 4096 byte blocks}
DriveCylinders : word;
DriveHeads,
SectorsPerTrack : byte;
DriveDefinition : array [1..63] of char;
IOErrorCount : word;
HotFixStart : LongInt;
HotFixSize ,
HotFixBlockAvailable : word;
HotFixDisabled : byte;
end;
FileStats = record
SystemElapsedTime : LongInt;
MaxOpenFiles : Word;
MaxFilesOpened : Word;
CurrOpenFiles : Word;
TotalFilesOpened : LongInt;
TotalReadRequests : LongInt;
TotalWriteRequests : LongInt;
CurrChangedFATSectors : Word;
TotalChangedFATSectors : LongInt;
FATWriteErrors : Word;
FatalFATWriteErrors : Word;
FATScanErrors : Word;
MaxIndexFilesOpened : Word;
CurrOpenIndexedFiles : Word;
AttachedIndexFiles : Word;
AvailableIndexFiles : Word;
end;
CacheStats = record
systemElapsedTime : LongInt ;
cacheBufferCount : Word ;
cacheBufferSize : Word ;
dirtyCacheBuffers : Word ;
cacheReadRequests : LongInt ;
cacheWriteRequests : LongInt ;
cacheHits : LongInt ;
cacheMisses : LongInt ;
physicalReadRequests : LongInt ;
physicalWriteRequests : LongInt ;
physicalReadErrors : WORD ;
physicalWriteErrors : WORD ;
cacheGetRequests : LongInt ;
cacheFullWriteRequests : LongInt ;
cachePartialWriteRequests: LongInt ;
backgroundDirtyWrites : LongInt ;
backgroundAgedWrites : LongInt ;
totalCacheWrites : LongInt ;
cacheAllocations : LongInt ;
thrashingCount : WORD ;
LRUBlockWasDirtyCount : WORD ;
readBeyondWriteCount : WORD ;
fragmentedWriteCount : WORD ;
cacheHitOnUnavailCount : WORD ;
cacheBlockScrappedCount : WORD ;
end;
ServerLANIO = record
systemElapsedTime : LongInt ;
maxRoutingBuffersAvail : Word ;
maxRoutingBuffersUsed : Word ;
routingBuffersInUse : Word ;
totalFileServicePackets : LongInt ;
fileServicePacketsBuffered : Word ;
invalidConnPacketCount : Word ;
badLogicalConnCount : Word ;
packetsRcvdDuringProcCount : Word ;
reprocessedRequestCount : Word ;
badSequenceNumberPacketCount : Word ;
duplicateReplyCount : Word ;
acknowledgementsSent : Word ;
badRequestTypeCount : Word ;
attachDuringProcCount : Word ;
attachWhileAttachingCount : Word ;
forgedDetachRequestCount : Word ;
badConnNumberOnDetachCount : Word ;
detachDuringProcCount : Word ;
repliesCanceledCount : Word ;
hopCountDiscardCount : Word ;
unknownNetDiscardCount : Word ;
noDGroupBufferDiscardCount : Word ;
outPacketNoBufferDiscardCount : Word ;
IPXNotMyNetworkCount : Word ;
NetBIOSPropagationCount : LongInt ;
totalOtherPackets : LongInt ;
totalRoutedPackets : LongInt ;
end;
ServerMiscInfo = record
systemElapsedTime : LongInt;
processorType : BYTE;
reserved : BYTE;
serviceProcessCount : BYTE;
serverUtilizationPercent : BYTE;
maxBinderyObjectsAvail : WORD;
maxBinderyObjectsUsed : WORD;
binderyObjectsInUse : WORD;
serverMemoryInK : Word ;
serverWastedMemoryInK : Word ;
dynamicAreaCount : Word ;
dynamicSpace1 : LongInt;
maxUsedDynamicSpace1 : LongInt;
dynamicSpaceInUse1 : LongInt;
dynamicSpace2 : LongInt;
maxUsedDynamicSpace2 : LongInt;
dynamicSpaceInUse2 : LongInt;
dynamicSpace3 : LongInt;
maxUsedDynamicSpace3 : LongInt;
dynamicSpaceInUse3 : LongInt;
end;
Function GetPhysicalDiskStats(PhysicalDiskNumber : byte;
Var PhysicalDiskStats : PhysDiskStats) : byte;
Function GetFileSystemStats(Var FileSystemStats : FileStats ) : byte;
Function GetDiskCacheStats(Var DiskCacheStats : CacheStats ) : byte;
Function GetServerLANIOStats( Var ServerLANIOStats : ServerLANIO ) : byte;
Function GetServerMiscInformation( Var ServerMiscInformation : ServerMiscInfo) : byte;
{________________________ GetDiskUtilization _____________________________
|
| Output: 0 -- SUCCESSFUL
| network error code -- UNSUCCESSFUL
|
| Comments:
| This function returns the disk usage of a bindery object on a volume.
| To determine the total disk space used, this call should be made
| repetitively for all mounted volumes. To determine the number of bytes
| of disk space used, the usedBlocks should be multiplied by the number of
| sectors and the bytes per sector. Currently network implementations
| allocate the disk in 8 512-byte sectors per block, which is 4K per block.
|__________________________________________________________________________}
Function GetDiskUtilization( VolumeNumber : byte;
ObjectID : LongInt;
Var UsedDirectories : Word;
Var UsedFiles : Word;
Var UsedBlocks : Word) : byte;
Implementation
Uses Dos;
Function GetPhysicalDiskStats(PhysicalDiskNumber : byte;
Var PhysicalDiskStats : PhysDiskStats) : byte;
Var
r : registers;
SendPacket : array [0..004] of byte;
ReplyPacket : array [0..096] of byte;
WordPtr : ^Word;
Begin
SendPacket[2] := $D8;
SendPacket[3] := PhysicalDiskNumber;
WordPtr := addr(SendPacket);
WordPtr^ := 2;
WordPtr := addr(ReplyPacket);
WordPtr^ := 94;
r.BX := r.DS;
r.AH := $0E3;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetPhysicaldiskStats := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[2],PhysicalDiskStats,94);
with PhysicalDiskStats do
begin
SystemElapsedTime := GetLong(Addr(SystemElapsedTime));
DriveSize := GetLong(Addr(DriveSize));
DriveCylinders := GetWord(Addr(DriveCylinders));
IOErrorCount := GetWord(Addr(IOErrorCount));
HotFixStart := GetLong(Addr(HotFixStart));
HotFixSize := GetWord(Addr(HotFixSize));
HotFixBlockAvailable := GetWord(Addr(HotFixBlockAvailable));
end;
end;
end;
Function GetFileSystemStats(Var FileSystemStats : FileStats ) : byte;
Var
r : registers;
SendPacket : array [0..003] of byte;
ReplyPacket : array [0..030] of byte;
WordPtr : ^Word;
Begin
SendPacket[2] := $D4;
WordPtr := addr(SendPacket);
WordPtr^ := 1;
WordPtr := addr(ReplyPacket);
WordPtr^ := 28;
r.BX := r.DS;
r.AH := $0E3;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetFileSystemStats := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[2],FileSystemStats,28);
with FileSystemStats do
begin
SystemElapsedTime := GetLong(Addr(SystemElapsedTime));
MaxOpenFiles := GetWord(Addr(MaxOpenFiles));
MaxFilesOpened := GetWord(Addr(MaxFilesOpened));
CurrOpenFiles := GetWord(Addr(CurrOpenFiles));
TotalFilesOpened := GetLong(Addr(TotalFilesOpened));
TotalReadRequests := GetLong(Addr(TotalReadRequests));
TotalWriteRequests:= GetLong(Addr(TotalWriteRequests));
CurrChangedFATSectors := GetWord(Addr(CurrChangedFATSectors));
TotalChangedFATSectors := GetLong(Addr(TotalChangedFATSectors));
FATWriteErrors := GetWord(Addr(FATWriteErrors));
FatalFATWriteErrors := GetWord(Addr(FatalFATWriteErrors));
FATScanErrors := GetWord(Addr(FATScanErrors));
MaxIndexFilesOpened := GetWord(Addr(MaxIndexFilesOpened));
CurrOpenIndexedFiles := GetWord(Addr(CurrOpenIndexedFiles));
AttachedIndexFiles := GetWord(Addr(AttachedIndexFiles));
AvailableIndexFiles := GetWord(Addr(AvailableIndexFiles));
end;
end;
end;
Function GetDiskCacheStats(Var DiskCacheStats : CacheStats ) : byte;
Var
r : registers;
SendPacket : array [0..003] of byte;
ReplyPacket : array [0..080] of byte;
WordPtr : ^Word;
Begin
SendPacket[2] := $D6;
WordPtr := addr(SendPacket);
WordPtr^ := 1;
WordPtr := addr(ReplyPacket);
WordPtr^ := 78;
r.BX := r.DS;
r.AH := $0E3;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetDiskCacheStats := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[2],DiskCacheStats,78);
with DiskCacheStats do
begin
systemElapsedTime := GetLong(Addr(systemElapsedTime ));
cacheBufferCount := GetWord(Addr(cacheBufferCount ));
cacheBufferSize := GetWord(Addr(cacheBufferSize ));
dirtyCacheBuffers := GetWord(Addr(dirtyCacheBuffers ));
cacheReadRequests := GetLong(Addr(cacheReadRequests ));
cacheWriteRequests := GetLong(Addr(cacheWriteRequests ));
cacheHits := GetLong(Addr(cacheHits ));
cacheMisses := GetLong(Addr(cacheMisses ));
physicalReadRequests := GetLong(Addr(physicalReadRequests ));
physicalWriteRequests := GetLong(Addr(physicalWriteRequests ));
physicalReadErrors := GetWORD(Addr(physicalReadErrors ));
physicalWriteErrors := GetWORD(Addr(physicalWriteErrors ));
cacheGetRequests := GetLong(Addr(cacheGetRequests ));
cacheFullWriteRequests := GetLong(Addr(cacheFullWriteRequests ));
cachePartialWriteRequests:= GetLong(Addr(cachePartialWriteRequests));
backgroundDirtyWrites := GetLong(Addr(backgroundDirtyWrites ));
backgroundAgedWrites := GetLong(Addr(backgroundAgedWrites ));
totalCacheWrites := GetLong(Addr(totalCacheWrites ));
cacheAllocations := GetLong(Addr(cacheAllocations ));
thrashingCount := GetWORD(Addr(thrashingCount ));
LRUBlockWasDirtyCount := GetWORD(Addr(LRUBlockWasDirtyCount ));
readBeyondWriteCount := GetWORD(Addr(readBeyondWriteCount ));
fragmentedWriteCount := GetWORD(Addr(fragmentedWriteCount ));
cacheHitOnUnavailCount := GetWORD(Addr(cacheHitOnUnavailCount ));
cacheBlockScrappedCount := GetWORD(Addr(cacheBlockScrappedCount ));
end;
end;
end;
Function GetServerLANIOStats( Var ServerLANIOStats : ServerLANIO ) : byte;
Var
r : registers;
SendPacket : array [0..003] of byte;
ReplyPacket : array [0..068] of byte;
WordPtr : ^Word;
Begin
SendPacket[2] := $E7;
WordPtr := addr(SendPacket);
WordPtr^ := 1;
WordPtr := addr(ReplyPacket);
WordPtr^ := 66;
r.BX := r.DS;
r.AH := $0E3;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
r.DS := r.BX;
GetServerLANIOStats := r.AL;
if r.AL = 0 then
begin
move(ReplyPacket[2],ServerLANIOStats,66);
with ServerLANIOStats do
begin
systemElapsedTime := GetLong(Addr(systemElapsedTime ));
maxRoutingBuffersAvail := GetWord(Addr(maxRoutingBuffersAvail ));
maxRoutingBuffersUsed := GetWord(Addr(maxRoutingBuffersUsed ));
routingBuffersInUse := GetWord(Addr(routingBuffersInUse ));
totalFileServicePackets := GetLong(Addr(totalFileServicePackets ));
fileServicePacketsBuffered := GetWord(Addr(fileServicePacketsBuffered ));
invalidConnPacketCount := GetWord(Addr(invalidConnPacketCount ));
badLogicalConnCount := GetWord(Addr(badLogicalConnCount ));
packetsRcvdDuringProcCount := GetWord(Addr(packetsRcvdDuringProcCount ));
reprocessedRequestCount := GetWord(Addr(reprocessedRequestCount ));
badSequenceNumberPacketCount := GetWord(Addr(badSequenceNumberPacketCount ));
duplicateReplyCount := GetWord(Addr(duplicateReplyCount ));
acknowledgementsSent := GetWord(Addr(acknowledgementsSent ));
badRequestTypeCount := GetWord(Addr(badRequestTypeCount ));
attachDuringProcCount := GetWord(Addr(attachDuringProcCount ));
attachWhileAttachingCount := GetWord(Addr(attachWhileAttachingCount ));
forgedDetachRequestCount := GetWord(Addr(forgedDetachRequestCount ));
badConnNumberOnDetachCount := GetWord(Addr(badConnNumberOnDetachCount ));
detachDuringProcCount := GetWord(Addr(detachDuringProcCount ));
repliesCanceledCount := GetWord(Addr(repliesCanceledCount ));
hopCountDiscardCount := GetWord(Addr(hopCountDiscardCount ));
unknownNetDiscardCount := GetWord(Addr(unknownNetDiscardCount ));
noDGroupBufferDiscardCount := GetWord(Addr(noDGroupBufferDiscardCount ));
outPacketNoBufferDiscardCount := GetWord(Addr(outPacketNoBufferDiscardCount ));
IPXNotMyNetworkCount := GetWord(Addr(IPXNotMyNetworkCount ));
NetBIOSPropagationCount := GetLong(Addr(NetBIOSPropagationCount ));
totalOtherPackets := GetLong(Addr(totalOtherPackets ));
totalRoutedPackets := GetLong(Addr(totalRoutedPackets ));
end;
end;
end;
Function GetServerMiscInformation( Var ServerMiscInformation : ServerMiscInfo) : byte;
Var
r : registers;
SendPacket : array [0..003] of byte;
ReplyPacket : array [0..058] of byte;
WordPtr : ^Word;
Begin
SendPacket[2] := $E8;
WordPtr := addr(SendPacket);
WordPtr^ := 1;
WordPtr := addr(ReplyPacket);
WordPtr^ := 56;
r.BX := r.DS;
r.AH := $0E3;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
GetServerMiscInformation := r.AL;
r.DS := r.BX;
if r.AL = 0 then
begin
move(ReplyPacket[2],ServerMiscInformation,56);
with ServerMiscInformation do
begin
systemElapsedTime := GetLong(Addr(systemElapsedTime ));
maxBinderyObjectsAvail := GetWORD(Addr(maxBinderyObjectsAvail ));
maxBinderyObjectsUsed := GetWORD(Addr(maxBinderyObjectsUsed ));
binderyObjectsInUse := GetWORD(Addr(binderyObjectsInUse ));
serverMemoryInK := GetWord(Addr(serverMemoryInK ));
serverWastedMemoryInK := GetWord(Addr(serverWastedMemoryInK ));
dynamicAreaCount := GetWord(Addr(dynamicAreaCount ));
dynamicSpace1 := GetLong(Addr(dynamicSpace1 ));
maxUsedDynamicSpace1 := GetLong(Addr(maxUsedDynamicSpace1 ));
dynamicSpaceInUse1 := GetLong(Addr(dynamicSpaceInUse1 ));
dynamicSpace2 := GetLong(Addr(dynamicSpace2 ));
maxUsedDynamicSpace2 := GetLong(Addr(maxUsedDynamicSpace2 ));
dynamicSpaceInUse2 := GetLong(Addr(dynamicSpaceInUse2 ));
dynamicSpace3 := GetLong(Addr(dynamicSpace3 ));
maxUsedDynamicSpace3 := GetLong(Addr(maxUsedDynamicSpace3 ));
dynamicSpaceInUse3 := GetLong(Addr(dynamicSpaceInUse3 ));
end;
end;
end;
Function GetDiskUtilization( VolumeNumber : byte;
ObjectID : LongInt;
Var UsedDirectories : Word;
Var UsedFiles : Word;
Var UsedBlocks : Word) : byte;
{ ��âì ¨�ä®à�æ¨î ®¡ ¨á¯®«ì§®¢��¨¨ ¤¨áª�}
Var
r : registers;
SendPacket : array [0..08] of byte;
ReplyPacket : array [0..13] of byte;
WordPtr : ^Word;
Begin
SendPacket[2] := 14;
SendPacket[3] := VolumeNumber;
ObjectID := GetLong(Addr(ObjectID));
move(ObjectID,SendPacket[4],4);
WordPtr := addr(SendPacket);
WordPtr^ := 6;
WordPtr := addr(ReplyPacket);
WordPtr^ := 11;
r.BX := r.DS;
r.AH := $0E3;
r.DS := SEG(SendPacket);
r.SI := OFS(SendPacket);
r.ES := SEG(ReplyPacket);
r.DI := OFS(ReplyPacket);
intr($21,r);
GetDiskUtilization := r.AL;
r.DS := r.BX;
if r.AL = 0 then
begin
UsedDirectories := GetWord(Addr(ReplyPacket[7]));
UsedFiles := GetWord(Addr(ReplyPacket[9]));
UsedBlocks := GetWord(Addr(ReplyPacket[11]));
end;
end;
end.
[Back to NETWORK SWAG index] [Back to Main SWAG index] [Original]