home *** CD-ROM | disk | FTP | other *** search
- 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.