Unit IpxUnit;



Interface



uses dos;

const

     IPX_PACKET_TYPE    =   4;

type

    NetWrkAdr = record

                  NetworkNumber      : array [1..4] of byte;

                  NodeAddress        : array [1..6]    of byte;

                end;



    IpxHeader = record

                  CheckSum           : word;

                  Len                : word;

                  TransportControl   : byte;

                  PacketType         : byte;

                  Destination        : NetWrkAdr;

                  DestinationSocket  : word;

                  Source             : NetWrkAdr;

                  SourceSocket       : word;

                end;

    ConNbrArr = record

                  Len                : word;

                  Count              : byte;

                  Connections        : array [1..250] of byte;

                end;

    ftype     = record

                  Adr                : pointer;

                  Len                : word;

                end;

    Ecb       = record

                  LinkAddress        : pointer;

                  EventServiceRoutine: pointer;

                  StatusFlag         : byte;

                  CompletionCode     : byte;

                  SocketNumber       : word;

                  WorkSpace          : array [1..4]  of byte;

                  DriverWorkSpace    : array [1..12] of byte;

                  ImmediateAddress   : array [1..6]   of byte;

                  FragmentCount      : word;

                  FragmentDescriptor : array [1..2] of ftype;

                end;

    ConnInfo  = record

                  Len                : word;

                  ObjectID           : array [1..4]  of byte;

                  ObjectType         : word;

                  ObjectName         : array [1..48] of byte;

                  LoginTime          : array [1..7]  of byte;

                  Reserved           : word;

                end;

    NetType   = array [1..4] of byte;

    NodType   = array [1..6]    of byte;

var

   regs           : registers;

   ipxrutofs,

   ipxrutseg      : word;

{-----------------------------------------------------------------------------}

function LeadingZero(w:word) : String;

function Time : String;

procedure WriteHexByte(b : byte);



function  IpxPresent : boolean;

procedure IpxServicesCall;

function  IpxCreateSocket (Socket : word) : boolean;

function  LocalConnectionNumber : byte;

procedure IpxDeleteSocket (Socket : word);

procedure GetInternetAddress (ConnectionNbr : byte; var NetNod : NetWrkAdr);

procedure UserInfo (ConnectionNumber: byte; var ConnInfoRec : ConnInfo);

procedure GetConnections (UserName: string; var ConNbrRec : ConNbrArr);

procedure GetLocalTarget(DestNet : NetWrkAdr;

                         DestSock : word; var LocalTarget : NodType );

procedure SendMessage(ConnectionNumber : byte; Message : String);

Procedure IpxSendPacket(var SendEcb : Ecb);

Procedure IpxReadPacket(var ReadEcb : Ecb);



Implementation



{----------------------------------------------------------------------------}

function LeadingZero;

var

   s : String;

begin

     Str(w:0,s);

     if Length(s) = 1 then

        s := '0' + s;

        LeadingZero := s;

end;

{----------------------------------------------------------------------------}

function Time;

var

    h, m, s, hund : Word;

begin

     GetTime(h,m,s,hund);

     Time:=LeadingZero(h)+':'+LeadingZero(m)+':'+LeadingZero(s);

end;

{----------------------------------------------------------------------------}

procedure WriteHexByte;

const

     hexChars : array [0..$F] of Char =

                '0123456789ABCDEF';

begin

     Write(hexChars[b shr 4],

           hexChars[b and $F]);

end;



{----------------------------------------------------------------------------}

function IpxPresent;

const

     MULTIPLEXER  = $2F;

     IPXINSTALLED = $FF;

begin

     regs.ax:=$7A00;

     intr(MULTIPLEXER,regs);

     if (regs.al = IPXINSTALLED) then IpxPresent:=TRUE

                                 else IpxPresent:=FALSE;

end;

{----------------------------------------------------------------------------}

procedure IpxServicesCall;

begin

     intr($7a,regs);

end;

{----------------------------------------------------------------------------}

function IpxCreateSocket;

const

     IPX_CreateSocket = $00;

     PermanentSocket  = $FF;

     TemporarySocket  = $00;

var

   SwapSocket    : word;

begin

     SwapSocket:=swap(Socket);

     regs.al:=TemporarySocket;

     regs.bx:=IPX_CreateSocket;

     regs.dx:=SwapSocket;

     IpxServicesCall;

     if (regs.al = $00) then IpxCreateSocket:=TRUE

                        else IpxCreateSocket:=FALSE;

                        {0FEh Full Socket Table

                         0FFh Socket Already Opened}

end;

{----------------------------------------------------------------------------}

procedure IpxDeleteSocket;

const

     IPX_DeleteSocket             = $01;

var

     SwapSocket    : word;

begin

     SwapSocket:=swap(Socket);

     regs.bx:=IPX_DeleteSocket;

     regs.dx:=SwapSocket;

     IpxServicesCall;

end;

{----------------------------------------------------------------------------}

function LocalConnectionNumber;

const

     GET_CONNECTION_NUMBER = $DC;

begin

     regs.ah:=GET_CONNECTION_NUMBER;

     regs.al:=$00;

     msdos(regs);

     LocalConnectionNumber:=regs.al;

end;

{----------------------------------------------------------------------------}

procedure  GetInternetAddress;

const

     GET_INTERNET_ADDRESS = $13;

     NETWARE_SERVICE_E3   = $E3;



var

   ReqBlk   : record

                Len       :  word;

                ReqType   :  byte;

                ConnNbr   :  byte;

              end;

   ResBlk   : record

                Len       :  word;

                NetNod    :  NetWrkAdr;

                SrvSocket :  word;

              end;

begin

     with ReqBlk do

       begin

            Len:=sizeof(ReqBlk) - sizeof(Len);

            ReqType:=GET_INTERNET_ADDRESS;

            ConnNbr:=ConnectionNbr;

       end;



     with ResBlk do Len:=sizeof(ResBlk) - sizeof(Len);



     regs.ah:=NETWARE_SERVICE_E3;

     regs.ds:=seg(ReqBlk); regs.si:=ofs(ReqBlk);

     regs.es:=seg(ResBlk); regs.di:=ofs(ResBlk);

     msdos(regs);

     if regs.al <> $00 then writeln('Error GETINTERNETADDRESS...')

     else

       begin

            NetNod.NetworkNumber:=ResBlk.NetNod.NetworkNumber;

            NetNod.NodeAddress:=  ResBlk.NetNod.NodeAddress;

       end;

end;

{----------------------------------------------------------------------------}

procedure UserInfo;

const

     GET_CONNECTION_INFORMATION   = $16;

     NETWARE_SERVICE_E3           = $E3;

var

   ReqBlk   :  record

                Len    :  word;

                ReqType   :  byte;

                ConnNbr   :  byte;

               end;

begin

     with ReqBlk do

       begin

            Len :=sizeof(ReqBlk) - sizeof(Len);

            ReqType:=GET_CONNECTION_INFORMATION;

            ConnNbr:=ConnectionNumber;

       end;

     with ConnInfoRec do Len:=sizeof(ConnInfoRec) - sizeof(Len);

     regs.ah:=NETWARE_SERVICE_E3;

     regs.ds:=seg(ReqBlk);       regs.si:=ofs(ReqBlk);

     regs.es:=seg(ConnInfoRec);  regs.di:=ofs(ConnInfoRec);

     msdos(regs);

end;

{----------------------------------------------------------------------------}

procedure GetConnections;

const

     GET_OBJECT_CONNECTION_NUMBERS= $15;

     USER_BINDERY_OBJECT_TYPE     = $0001;

     NETWARE_SERVICE_E3           = $E3;

var

   ReqBlk    :  record

                  Len          : word;

                  RequestType     : byte;

                  ObjectType      : word;

                  NameLength      : byte;

                  Name            : array [1..48] of byte;

                end;

   swapbind  :  word;

   i         :  integer;

begin

     swapbind:=swap(USER_BINDERY_OBJECT_TYPE);

     with ReqBlk do

       begin

            Len:=sizeof(ReqBlk) - sizeof(Len);

            RequestType:=GET_OBJECT_CONNECTION_NUMBERS;

            ObjectType:=SwapBind;

       end;

     ReqBlk.NameLength:=Length(UserName);

     for i:=1 to ReqBlk.NameLength do ReqBlk.Name[i]:=ord(UserName[i]);



     with ConNbrRec do Len:=sizeof(ConNbrRec) - sizeof(Len);

     regs.ah:=NETWARE_SERVICE_E3;

     regs.ds:=seg(ReqBlk);    regs.si:=ofs(ReqBlk);

     regs.es:=seg(ConNbrRec); regs.di:=ofs(ConNbrRec);

     msdos(regs);

     if regs.al <> 0 then ConNbrRec.Count:=0;

end;

{----------------------------------------------------------------------------}

procedure GetLocalTarget;

const

     IPX_GetLocalTarget           = $02;

var

   ReqBlk     :  record

                  Dnetwork  : NetWrkAdr;

                  DSocket   : word;

                 end;

   ResBlk     :  record

                   Ltarget  : NodType;

                 end;

   swapsocket :  word;

begin

     swapsocket:=swap(DestSock);

     ReqBlk.Dnetwork:=DestNet;

     ReqBlk.DSocket :=swapsocket;



     regs.bx:=IPX_GetLocalTarget;

     regs.es:=seg(ReqBlk);

     regs.si:=ofs(ReqBlk);

     regs.di:=ofs(ResBlk);



     IpxServicesCall;



     if regs.al = $00 then LocalTarget:=ResBlk.Ltarget;

                  {0FAh No path to Destination}

end;

{----------------------------------------------------------------------------}

procedure SendMessage;

const

     USER_BINDERY_OBJECT_TYPE     = $0001;

     NETWARE_SERVICE_E1           = $E1;

var

   ReqBlk     :  record

                  Len       : word;

                  Bindery   : word;

                  ConnNbr   : byte;

                  Mlen      : byte;

                  Mens      : array [1..45] of byte;

                 end;

   ResBlk     :  record

                   Len      : word;

                   Filler   : array [1..100] of byte;

                 end;

   i          :  integer;

begin

     with ReqBlk do

        begin

          Bindery:=swap(USER_BINDERY_OBJECT_TYPE);

          ConnNbr:=ConnectionNumber;

          Mlen:=Length(Message);

          Len:=Mlen + 4;

          for i:=1 to Mlen do mens[i]:=ord(message[i]);

        end;



     ResBlk.Len:=$6400;



     regs.ah:=NETWARE_SERVICE_E1;

     regs.ds:=seg(ReqBlk);  regs.si:=ofs(ReqBlk);

     regs.es:=seg(ResBlk);  regs.di:=ofs(ResBlk);

     msdos(regs);

end;



{----------------------------------------------------------------------------}

Procedure IpxSendPacket;

const

     IPX_SendPacket               = $03;

begin

     regs.bx:=IPX_SendPacket;

     regs.es:=Seg(SendEcb);

     regs.si:=Ofs(SendEcb);

     IpxServicesCall;



     while (SendEcb.StatusFlag <> 0) do ;

end;

{----------------------------------------------------------------------------}

Procedure IpxReadPacket;

const

     IPX_ReceivePacket               = $04;

begin

     regs.bx:=IPX_ReceivePacket;

     regs.es:=Seg(ReadEcb);

     regs.si:=Ofs(ReadEcb);

     IpxServicesCall;

     if regs.al <> $00 then

       begin

          writeln('Error Read Packet ');

          WriteHexByte(Regs.al);

       end;

                  {0ffh NonExistant socket}

end;

{----------------------------------------------------------------------------}

{----------------------------------------------------------------------------}

begin

end.



    Source: geocities.com/SiliconValley/2926/tpsrc

               ( geocities.com/SiliconValley/2926)                   ( geocities.com/SiliconValley)