'===========================================================================
' Subject: DETECT NOVELL INFORMATION          Date: 09-20-93 (00:00)       
'  Author: Harry F. Harrison                  Code: PDS                    
'  Origin: DETECT,NOVELL,INFORMATION        Packet: NETWORK.ABC
'===========================================================================
DECLARE FUNCTION GetNovellUserStats! (NovellInfo AS ANY)
DECLARE FUNCTION GetNovellVersion! (NovellInfo AS ANY)
'----------[ Network User Status ]----------
'$INCLUDE: '..\include\qbx.bi'

TYPE NovellConnectionInfo
    ServerName AS STRING * 48
    NetVer AS SINGLE
    MajVer AS INTEGER
    MinVer AS INTEGER
    MaxCon AS INTEGER
    MaxVol AS INTEGER
    ConInUse AS INTEGER
    UserName AS STRING * 48
    Connection AS INTEGER
    NodeAddress AS STRING * 12 'Hex
    LoginDate AS STRING * 10
    LoginTime AS STRING * 8
END TYPE


    TYPE NovellConnectionIn
        Length AS INTEGER
        Function AS STRING * 1
        station AS STRING * 1
    END TYPE
    TYPE NovellConnectionOut
        Length AS INTEGER
        ID AS LONG
        IDType AS INTEGER
        UserName AS STRING * 48
        LogTime AS STRING * 8
    END TYPE


'----------[ Network Name ]----------
'$INCLUDE: '..\include\qbx.bi'

    TYPE NovellInPacket
        Length AS INTEGER
        Function AS STRING * 1
    END TYPE
    TYPE NovellOutPacket
        Length AS INTEGER
        ServerName AS STRING * 48
        MajorVer AS STRING * 1
        MinorVer AS STRING * 1
        NumCon AS STRING * 2
        NumConUsed AS STRING * 2
        MaxVol AS STRING * 2
        undef AS STRING * 90
    END TYPE

FUNCTION GetNovellUserStats (NovellInfo AS NovellConnectionInfo)
'returns connection information on user.  Returns 0 if successful

DIM InRegs AS RegTypeX, OutRegs AS RegTypeX

IF NovellInfo.NetVer = 0 THEN
    x = GetNovellVersion!(NovellInfo)
END IF
IF x > 0 THEN
    InRegs.ax = &HDC00
    CALL InterruptX(&H21, InRegs, OutRegs)
    NovellInfo.Connection = (OutRegs.ax AND &HFF)
    InRegs.ax = &HEE00
    CALL InterruptX(&H21, InRegs, OutRegs)
    NovellInfo.NodeAddress = RIGHT$("0000" + HEX$(OutRegs.cx), 4) + RIGHT$("0000" + HEX$(OutRegs.bx), 4) + RIGHT$("0000" + HEX$(OutRegs.ax), 4)
    DIM InPacket AS NovellConnectionIn
    DIM OutPacket AS NovellConnectionOut
    InPacket.Length = 4
    InPacket.Function = CHR$(22)
    InPacket.station = CHR$(NovellInfo.Connection)
    InRegs.ax = &HE300
    InRegs.ds = VARSEG(InPacket)
    InRegs.si = VARPTR(InPacket)
    InRegs.es = VARSEG(OutPacket)
    InRegs.di = VARPTR(OutPacket)
    OutPacket.Length = LEN(OutPacket)
    CALL InterruptX(&H21, InRegs, OutRegs)
    a$ = TIME$
    Yr% = (1900 + (CVI(MID$(OutPacket.LogTime, 1, 2)) AND &HFF))
    Mnth% = (CVI(MID$(OutPacket.LogTime, 2, 2)) AND &HFF)
    Daay% = (CVI(MID$(OutPacket.LogTime, 3, 2)) AND &HFF)
    Hr% = (CVI(MID$(OutPacket.LogTime, 4, 2)) AND &HFF)
    Min% = (CVI(MID$(OutPacket.LogTime, 5, 2)) AND &HFF)
    Sec% = (CVI(MID$(OutPacket.LogTime, 6, 2)) AND &HFF)
    NovellInfo.UserName = OutPacket.UserName
    x = INSTR(NovellInfo.UserName, CHR$(0))
    WHILE x
        MID$(NovellInfo.UserName, x, 1) = " "
        x = INSTR(In$, CHR$(0))
    WEND
    NovellInfo.LoginDate = RIGHT$("0" + LTRIM$(STR$(Mnth%)), 2) + CHR$(45) + RIGHT$(CHR$(48) + LTRIM$(STR$(Daay%)), 2) + CHR$(45) + LTRIM$(STR$(Yr%))
    NovellInfo.LoginTime = RIGHT$("0" + LTRIM$(STR$(Hr%)), 2) + CHR$(58) + RIGHT$(CHR$(48) + LTRIM$(STR$(Min%)), 2) + CHR$(58) + RIGHT$(CHR$(48) + LTRIM$(STR$(Sec%)), 2)
ELSE
    NovellInfo.ServerName = "Novell NetWare Not Installed"
    NovellInfo.UserName = "Not Logged In"
END IF
GetNovellUserStats% = OutRegs.ax AND &HFF

END FUNCTION

FUNCTION GetNovellVersion! (NovellInfo AS NovellConnectionInfo)
    DIM InPack AS NovellInPacket
    DIM OutPack AS NovellOutPacket
    DIM inreg AS RegTypeX
    DIM outreg AS RegTypeX
    DIM ExitValue!

    InPack.Length = LEN(InPack)   ' Packet length of 3 bytes
    InPack.Function = CHR$(17)     ' Get File Server Information
    OutPack.Length = LEN(OutPack)
    inreg.ax = &HE300

    inreg.ds = VARSEG(InPack)
    inreg.si = VARPTR(InPack)

    inreg.es = VARSEG(OutPack)
    inreg.di = VARPTR(OutPack)

    CALL InterruptX(&H21, inreg, outreg)

    IF (outreg.ax AND &HFF) = 0 THEN
        NovellInfo.NetVer = ASC(OutPack.MajorVer) + (ASC(OutPack.MinorVer) / 100)
        NovellInfo.MajVer = ASC(OutPack.MajorVer) / 100
        NovellInfo.MinVer = ASC(OutPack.MinorVer)
        ExitValue! = ASC(OutPack.MajorVer) + (ASC(OutPack.MinorVer) / 100)
    ELSE
        NovellInfo.NetVer = -1
        ExitValue! = -1
    END IF
    NovellInfo.ServerName = OutPack.ServerName
    x = INSTR(NovellInfo.ServerName, CHR$(0))
    WHILE x
        MID$(NovellInfo.ServerName, x, 1) = " "
        x = INSTR(In$, CHR$(0))
    WEND
    NovellInfo.MaxCon = CVI(RIGHT$(OutPack.NumCon, 1) + LEFT$(OutPack.NumCon, 1))
    NovellInfo.ConInUse = CVI(RIGHT$(OutPack.NumConUsed, 1) + LEFT$(OutPack.NumConUsed, 1))
    NovellInfo.MaxVol = CVI(RIGHT$(OutPack.MaxVol, 1) + LEFT$(OutPack.MaxVol, 1))
    GetNovellVersion = ExitValue!
END FUNCTION

