| [453] | 1 | { **************************************************************
 | 
|---|
 | 2 |         Package: XWB - Kernel RPCBroker
 | 
|---|
 | 3 |         Date Created: Sept 18, 1997 (Version 1.1)
 | 
|---|
 | 4 |         Site Name: Oakland, OI Field Office, Dept of Veteran Affairs
 | 
|---|
 | 5 |         Developers: Danila Manapsal, Don Craven, Joel Ivey
 | 
|---|
 | 6 |         Description: winsock utilities.
 | 
|---|
 | 7 |         Current Release: Version 1.1 Patch 40 (January 7, 2005))
 | 
|---|
 | 8 | *************************************************************** }
 | 
|---|
 | 9 | 
 | 
|---|
 | 10 | 
 | 
|---|
 | 11 | unit RpcNet ;
 | 
|---|
 | 12 | {
 | 
|---|
 | 13 |   Changes in v1.1.13 (JLI -- 8/23/00) -- XWB*1.1*13
 | 
|---|
 | 14 |     Made changes to cursor dependent on current cursor being crDefault so
 | 
|---|
 | 15 |        that the application can set it to a different cursor for long or
 | 
|---|
 | 16 |        repeated processes without the cursor 'flashing' repeatedly.
 | 
|---|
 | 17 | }
 | 
|---|
 | 18 | interface
 | 
|---|
 | 19 | 
 | 
|---|
 | 20 | uses
 | 
|---|
 | 21 |   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
 | 
|---|
 | 22 |   Forms, Dialogs, winsock;
 | 
|---|
 | 23 | 
 | 
|---|
 | 24 | Const XWB_GHIP = WM_USER + 10000;
 | 
|---|
 | 25 | //Const XWB_SELECT = WM_USER + 10001;
 | 
|---|
 | 26 | 
 | 
|---|
 | 27 | Const WINSOCK1_1 = $0101;
 | 
|---|
 | 28 | Const PF_INET = 2;
 | 
|---|
 | 29 | Const SOCK_STREAM = 1;
 | 
|---|
 | 30 | Const IPPROTO_TCP = 6;
 | 
|---|
 | 31 | Const INVALID_SOCKET = -1;
 | 
|---|
 | 32 | Const SOCKET_ERROR = -1;
 | 
|---|
 | 33 | Const FIONREAD = $4004667F;
 | 
|---|
 | 34 | Const ActiveConnection: boolean = False;
 | 
|---|
 | 35 | 
 | 
|---|
 | 36 | type EchatError = class(Exception);
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 | type
 | 
|---|
 | 39 |   TRPCFRM1 = class(TForm)
 | 
|---|
 | 40 |   private
 | 
|---|
 | 41 |     { Private declarations }
 | 
|---|
 | 42 |   public
 | 
|---|
 | 43 |     { Public declarations }
 | 
|---|
 | 44 |     procedure XWBGHIP(var msgSock: TMessage);
 | 
|---|
 | 45 |     //procedure xwbSelect(var msgSock: TMessage);           //P14
 | 
|---|
 | 46 |     procedure WndProc(var Message : TMessage); reintroduce; //P14
 | 
|---|
 | 47 | end;
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 | type
 | 
|---|
 | 50 |   WinTaskRec = record
 | 
|---|
 | 51 |      InUse: boolean;
 | 
|---|
 | 52 |      pTCPResult: Pointer;
 | 
|---|
 | 53 |      strTemp: string; {generic output string for async calls}
 | 
|---|
 | 54 |      chrTemp: PChar; {generic out PChar for async calls}
 | 
|---|
 | 55 |      hTCP: THandle; {pseudo handle for async calls}
 | 
|---|
 | 56 |      hWin: hWnd; {handle for owner window}
 | 
|---|
 | 57 |      CallWait: boolean;
 | 
|---|
 | 58 |      CallAbort: boolean;
 | 
|---|
 | 59 |      RPCFRM1: TRPCFRM1;
 | 
|---|
 | 60 |   end;
 | 
|---|
 | 61 | 
 | 
|---|
 | 62 | var
 | 
|---|
 | 63 |    WRec: array[1..128] of WinTaskRec;
 | 
|---|
 | 64 |    Hash: array[0..159] of char;
 | 
|---|
 | 65 | 
 | 
|---|
 | 66 | {Windows OS abstraction functions.  Should be taken over by VA Kernel}
 | 
|---|
 | 67 | 
 | 
|---|
 | 68 | function libGetCurrentProcess: word;
 | 
|---|
 | 69 | 
 | 
|---|
 | 70 | {Socket functions using library RPCLIB.DLL, in this case called locally}
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 | //function  libAbortCall(inst: integer): integer; export;   //P14
 | 
|---|
 | 73 | function  libGetHostIP1(inst: integer; HostName: PChar;
 | 
|---|
 | 74 |           var outcome: PChar): integer; export;
 | 
|---|
 | 75 | function  libGetLocalIP(inst: integer; var outcome: PChar): integer; export;
 | 
|---|
 | 76 | procedure libClose(inst: integer); export;
 | 
|---|
 | 77 | function  libOpen:integer; export;
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 | function GetTCPError:string;
 | 
|---|
 | 80 | 
 | 
|---|
 | 81 | {Secure Hash Algorithm functions, library SHA.DLL and local interfaces}
 | 
|---|
 | 82 | 
 | 
|---|
 | 83 | function libGetLocalModule: PChar; export;
 | 
|---|
 | 84 | function GetFileHash(fn: PChar): longint; export;
 | 
|---|
 | 85 | 
 | 
|---|
 | 86 | implementation
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 | uses rpcconf1;
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 | {function shsTest: integer; far; external 'SHA';
 | 
|---|
 | 91 | procedure shsHash(plain: PChar; size: integer;
 | 
|---|
 | 92 |           Hash: PChar); far; external 'SHA';}    //Removed in P14
 | 
|---|
 | 93 | 
 | 
|---|
 | 94 | {$R *.DFM}
 | 
|---|
 | 95 | 
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 | 
 | 
|---|
 | 98 | function libGetCurrentProcess: word;
 | 
|---|
 | 99 | begin
 | 
|---|
 | 100 |   Result := GetCurrentProcess;
 | 
|---|
 | 101 | end;
 | 
|---|
 | 102 | 
 | 
|---|
 | 103 | function libGetLocalIP(inst: integer; var outcome: PChar): integer;
 | 
|---|
 | 104 | var
 | 
|---|
 | 105 |    local: PChar;
 | 
|---|
 | 106 | begin
 | 
|---|
 | 107 |      local := StrAlloc(255);
 | 
|---|
 | 108 |      gethostname( local, 255);
 | 
|---|
 | 109 |      Result := libGetHostIP1(inst, local, outcome);
 | 
|---|
 | 110 |      StrDispose(local);
 | 
|---|
 | 111 | end;
 | 
|---|
 | 112 | 
 | 
|---|
 | 113 | function libGetLocalModule: PChar;
 | 
|---|
 | 114 | var
 | 
|---|
 | 115 |    tsk: THandle;
 | 
|---|
 | 116 |    name: PChar;
 | 
|---|
 | 117 | begin
 | 
|---|
 | 118 |      tsk := GetCurrentProcess;
 | 
|---|
 | 119 |      name := StrAlloc(1024);
 | 
|---|
 | 120 |      GetModuleFilename(tsk, name, 1024);
 | 
|---|
 | 121 |      Result := name;
 | 
|---|
 | 122 | 
 | 
|---|
 | 123 | end;
 | 
|---|
 | 124 | 
 | 
|---|
 | 125 | function GetFileHash(fn: PChar): longint;
 | 
|---|
 | 126 | var
 | 
|---|
 | 127 |    hFn: integer;
 | 
|---|
 | 128 |    finfo: TOFSTRUCT;
 | 
|---|
 | 129 |    bytesRead, status: longint;
 | 
|---|
 | 130 |    tBuf: PChar;
 | 
|---|
 | 131 | 
 | 
|---|
 | 132 | begin
 | 
|---|
 | 133 |      tBuf := StrAlloc(160);
 | 
|---|
 | 134 |      hFn := OpenFile(fn, finfo, OF_READ);
 | 
|---|
 | 135 |      bytesRead := 0;
 | 
|---|
 | 136 |      status := _lread(hFn, tBuf, sizeof(tBuf));
 | 
|---|
 | 137 |      while status <> 0 do
 | 
|---|
 | 138 |      begin
 | 
|---|
 | 139 |           status := _lread(hFn, tBuf, sizeof(tBuf));
 | 
|---|
 | 140 |           inc(bytesRead,status);
 | 
|---|
 | 141 |      end;
 | 
|---|
 | 142 |      _lclose(hFn);
 | 
|---|
 | 143 |      StrDispose(tBuf);
 | 
|---|
 | 144 |      Result := bytesRead;
 | 
|---|
 | 145 | end;
 | 
|---|
 | 146 | 
 | 
|---|
 | 147 | function libOpen:integer;
 | 
|---|
 | 148 | var
 | 
|---|
 | 149 |    inst: integer;
 | 
|---|
 | 150 |    WSData: TWSADATA;
 | 
|---|
 | 151 |    RPCFRM1: TRPCFRM1;
 | 
|---|
 | 152 | begin
 | 
|---|
 | 153 |      inst := 1; {in this case, no DLL so instance is always 1}
 | 
|---|
 | 154 |      RPCFRM1 := TRPCFRM1.Create(nil);    //P14
 | 
|---|
 | 155 |      with WRec[inst] do
 | 
|---|
 | 156 |      begin
 | 
|---|
 | 157 |      hWin := AllocateHWnd(RPCFRM1.wndproc);
 | 
|---|
 | 158 | 
 | 
|---|
 | 159 |      WSAStartUp(WINSOCK1_1, WSData);
 | 
|---|
 | 160 |      WSAUnhookBlockingHook;
 | 
|---|
 | 161 | 
 | 
|---|
 | 162 |      Result := inst;
 | 
|---|
 | 163 |      InUse := True;
 | 
|---|
 | 164 |      end;
 | 
|---|
 | 165 |      RPCFRM1.Release;                    //P14
 | 
|---|
 | 166 | end;
 | 
|---|
 | 167 | 
 | 
|---|
 | 168 | procedure libClose(inst: integer);
 | 
|---|
 | 169 | begin
 | 
|---|
 | 170 | 
 | 
|---|
 | 171 |      with WRec[inst] do
 | 
|---|
 | 172 |      begin
 | 
|---|
 | 173 |         InUse := False;
 | 
|---|
 | 174 |         WSACleanup;
 | 
|---|
 | 175 |         DeallocateHWnd(hWin);
 | 
|---|
 | 176 |      end;
 | 
|---|
 | 177 | end;
 | 
|---|
 | 178 | 
 | 
|---|
 | 179 | function libGetHostIP1(inst: integer; HostName: PChar;
 | 
|---|
 | 180 |          var outcome: PChar): integer;
 | 
|---|
 | 181 | var
 | 
|---|
 | 182 |    //RPCFRM1: TRPCFRM1; {P14}
 | 
|---|
 | 183 |    //wMsg: TMSG;        {P14}
 | 
|---|
 | 184 |    //hWnd: THandle;     {P14}
 | 
|---|
 | 185 |    ChangeCursor: Boolean;
 | 
|---|
 | 186 | 
 | 
|---|
 | 187 | begin
 | 
|---|
 | 188 | 
 | 
|---|
 | 189 |    outcome[0] := #0;
 | 
|---|
 | 190 | 
 | 
|---|
 | 191 |    if Screen.Cursor = crDefault then
 | 
|---|
 | 192 |      ChangeCursor := True
 | 
|---|
 | 193 |    else
 | 
|---|
 | 194 |      ChangeCursor := False;
 | 
|---|
 | 195 |    if ChangeCursor then
 | 
|---|
 | 196 |      Screen.Cursor := crHourGlass;
 | 
|---|
 | 197 | 
 | 
|---|
 | 198 |    with WRec[inst] do
 | 
|---|
 | 199 |    begin
 | 
|---|
 | 200 | 
 | 
|---|
 | 201 |    if HostName[0] = #0 then
 | 
|---|
 | 202 |    begin
 | 
|---|
 | 203 |         StrCat(outcome,'No Name to Resolve!');
 | 
|---|
 | 204 |         Result := -1;
 | 
|---|
 | 205 |         exit;
 | 
|---|
 | 206 |    end;
 | 
|---|
 | 207 | 
 | 
|---|
 | 208 |    if CallWait = True then
 | 
|---|
 | 209 |    begin
 | 
|---|
 | 210 |         outcome[0] := #0;
 | 
|---|
 | 211 |         StrCat(outcome, 'Call in Progress');
 | 
|---|
 | 212 |         Result := -1;
 | 
|---|
 | 213 |         exit;
 | 
|---|
 | 214 |    end;
 | 
|---|
 | 215 | 
 | 
|---|
 | 216 |    if inet_addr(HostName) > INADDR_ANY then
 | 
|---|
 | 217 |    begin
 | 
|---|
 | 218 |         outcome := Hostname;
 | 
|---|
 | 219 |         Result := 0;
 | 
|---|
 | 220 |         if ChangeCursor then
 | 
|---|
 | 221 |           Screen.Cursor := crDefault;
 | 
|---|
 | 222 |         WSACleanup;
 | 
|---|
 | 223 |         exit;
 | 
|---|
 | 224 |    end;
 | 
|---|
 | 225 | 
 | 
|---|
 | 226 |    GetMem(pTCPResult, MAXGETHOSTSTRUCT+1);
 | 
|---|
 | 227 |    try
 | 
|---|
 | 228 |       begin
 | 
|---|
 | 229 |            CallWait := True;
 | 
|---|
 | 230 |            CallAbort := False;
 | 
|---|
 | 231 |            PHostEnt(pTCPResult)^.h_name := nil;
 | 
|---|
 | 232 |            hTCP := WSAAsyncGetHostByName(hWin, XWB_GHIP, HostName,
 | 
|---|
 | 233 |                 pTCPResult, MAXGETHOSTSTRUCT );
 | 
|---|
 | 234 |            { loop while CallWait is True }
 | 
|---|
 | 235 |            CallAbort := False;
 | 
|---|
 | 236 |            while CallWait = True do
 | 
|---|
 | 237 |                  Application.ProcessMessages;
 | 
|---|
 | 238 |       end;
 | 
|---|
 | 239 |    except on EInValidPointer do
 | 
|---|
 | 240 |      begin
 | 
|---|
 | 241 |         StrCat(outcome,'Error in GetHostByName');
 | 
|---|
 | 242 |         if ChangeCursor then
 | 
|---|
 | 243 |           Screen.Cursor := crDefault;
 | 
|---|
 | 244 |      end;
 | 
|---|
 | 245 | 
 | 
|---|
 | 246 |    end;
 | 
|---|
 | 247 | 
 | 
|---|
 | 248 |    FreeMem(pTCPResult, MAXGETHOSTSTRUCT+1);
 | 
|---|
 | 249 |    StrCopy(outcome,chrTemp);
 | 
|---|
 | 250 |    Result := 0;
 | 
|---|
 | 251 |    if ChangeCursor then
 | 
|---|
 | 252 |      Screen.Cursor := crDefault;
 | 
|---|
 | 253 |    end;
 | 
|---|
 | 254 |    end;
 | 
|---|
 | 255 | 
 | 
|---|
 | 256 | (*procedure TRPCFRM1.XWBSELECT(var msgSock: TMessage);
 | 
|---|
 | 257 | var
 | 
|---|
 | 258 |    noop: integer;
 | 
|---|
 | 259 | begin
 | 
|---|
 | 260 |      case msgSock.lparam of
 | 
|---|
 | 261 |        FD_ACCEPT: {connection arrived}
 | 
|---|
 | 262 |           begin
 | 
|---|
 | 263 |                noop := 1;
 | 
|---|
 | 264 |           end;
 | 
|---|
 | 265 |        FD_CONNECT: {connection initiated}
 | 
|---|
 | 266 |           begin
 | 
|---|
 | 267 |                noop := 1;
 | 
|---|
 | 268 |           end;
 | 
|---|
 | 269 |        FD_READ:    {data received, put in display}
 | 
|---|
 | 270 |           begin
 | 
|---|
 | 271 |                noop := 1;
 | 
|---|
 | 272 |           end;
 | 
|---|
 | 273 |        FD_CLOSE:   {disconnection of accepted socket}
 | 
|---|
 | 274 |           begin
 | 
|---|
 | 275 |                noop := 1;
 | 
|---|
 | 276 |           end;
 | 
|---|
 | 277 |        else
 | 
|---|
 | 278 |               noop := 1;
 | 
|---|
 | 279 |        end;
 | 
|---|
 | 280 | end;*)     //Procedure removed in P14.
 | 
|---|
 | 281 | 
 | 
|---|
 | 282 | procedure TRPCFRM1.WndProc(var Message : TMessage);
 | 
|---|
 | 283 | begin
 | 
|---|
 | 284 |   with Message do
 | 
|---|
 | 285 |        case Msg of
 | 
|---|
 | 286 |             {XWB_SELECT : xwbSelect(Message);}    //P14
 | 
|---|
 | 287 |             XWB_GHIP: xwbghip(Message);
 | 
|---|
 | 288 |        else
 | 
|---|
 | 289 |            DefWindowProc(WRec[1].hWin, Msg, wParam, lParam);
 | 
|---|
 | 290 |            {Inherited WndProc(Message);}
 | 
|---|
 | 291 |        end;
 | 
|---|
 | 292 | end;
 | 
|---|
 | 293 | 
 | 
|---|
 | 294 | procedure TRPCFRM1.XWBGHIP(var msgSock: TMessage);
 | 
|---|
 | 295 | var
 | 
|---|
 | 296 |    TCPResult: PHostEnt;
 | 
|---|
 | 297 |    WSAError: integer;
 | 
|---|
 | 298 |    HostAddr: TSockaddr;
 | 
|---|
 | 299 |    inst: integer;
 | 
|---|
 | 300 | 
 | 
|---|
 | 301 | begin
 | 
|---|
 | 302 |    inst := 1; {local case is always 1}
 | 
|---|
 | 303 | 
 | 
|---|
 | 304 | 
 | 
|---|
 | 305 |    with WRec[inst] do
 | 
|---|
 | 306 |    begin
 | 
|---|
 | 307 | 
 | 
|---|
 | 308 |    hTCP := msgSock.WParam;
 | 
|---|
 | 309 |    
 | 
|---|
 | 310 |    chrTemp := StrAlloc(512);
 | 
|---|
 | 311 | 
 | 
|---|
 | 312 |    CallWait := False;
 | 
|---|
 | 313 |    If CallAbort = True then  { User aborted call }
 | 
|---|
 | 314 |    begin
 | 
|---|
 | 315 |         StrCopy(ChrTemp,'Abort!');
 | 
|---|
 | 316 |         exit;
 | 
|---|
 | 317 |    end;
 | 
|---|
 | 318 | 
 | 
|---|
 | 319 |    WSAError := WSAGetAsyncError(hTCP); { in case async call failed }
 | 
|---|
 | 320 |    If  WSAError < 0 then
 | 
|---|
 | 321 |    begin
 | 
|---|
 | 322 |         StrPCopy(chrTemp,IntToStr(WSAError));
 | 
|---|
 | 323 |         exit;
 | 
|---|
 | 324 |    end;
 | 
|---|
 | 325 | 
 | 
|---|
 | 326 |    try
 | 
|---|
 | 327 |    begin
 | 
|---|
 | 328 |       TCPResult := PHostEnt(pTCPResult);
 | 
|---|
 | 329 |       StrTemp := '';
 | 
|---|
 | 330 |        if TCPResult^.h_name = nil then
 | 
|---|
 | 331 |          begin
 | 
|---|
 | 332 |               StrCopy(chrTemp, 'Unknown!');
 | 
|---|
 | 333 |               if rpcconfig <> nil then
 | 
|---|
 | 334 |                 rpcconfig.panel4.Caption := StrPas(chrTemp);
 | 
|---|
 | 335 |               exit;
 | 
|---|
 | 336 |          end;
 | 
|---|
 | 337 |       {success, return resolved address}
 | 
|---|
 | 338 |       HostAddr.sin_addr.S_addr := longint(plongint(TCPResult^.h_addr_list^)^);
 | 
|---|
 | 339 |       chrTemp := inet_ntoa(HostAddr.sin_addr);
 | 
|---|
 | 340 |    end;
 | 
|---|
 | 341 |    except on EInValidPointer do StrCat(chrTemp, 'Error in GetHostByName');
 | 
|---|
 | 342 |    end;
 | 
|---|
 | 343 | end;
 | 
|---|
 | 344 | end;
 | 
|---|
 | 345 | 
 | 
|---|
 | 346 | (*function libAbortCall(inst: integer): integer;
 | 
|---|
 | 347 | var
 | 
|---|
 | 348 |    WSAError: integer;
 | 
|---|
 | 349 | begin
 | 
|---|
 | 350 | 
 | 
|---|
 | 351 |    with WRec[inst] do
 | 
|---|
 | 352 |    begin
 | 
|---|
 | 353 | 
 | 
|---|
 | 354 |    WSAError := WSACancelAsyncRequest(hTCP);
 | 
|---|
 | 355 |    if WSAError = Socket_Error then
 | 
|---|
 | 356 |    begin
 | 
|---|
 | 357 |         WSAError := WSAGetLastError;
 | 
|---|
 | 358 |         CallWait := False;
 | 
|---|
 | 359 |         CallAbort := True;
 | 
|---|
 | 360 |         Result := WSAError;
 | 
|---|
 | 361 |    end;
 | 
|---|
 | 362 | 
 | 
|---|
 | 363 |    CallAbort := True;
 | 
|---|
 | 364 |    CallWait := False;
 | 
|---|
 | 365 |    Result := WSAError;
 | 
|---|
 | 366 | 
 | 
|---|
 | 367 |    end;
 | 
|---|
 | 368 | 
 | 
|---|
 | 369 | end; *)    //Removed in P14
 | 
|---|
 | 370 | 
 | 
|---|
 | 371 | function GetTCPError:string;
 | 
|---|
 | 372 | var
 | 
|---|
 | 373 |    x: string;
 | 
|---|
 | 374 |    r: integer;
 | 
|---|
 | 375 | 
 | 
|---|
 | 376 | begin
 | 
|---|
 | 377 |       r := WSAGetLastError;
 | 
|---|
 | 378 |       Case r of
 | 
|---|
 | 379 |         WSAEINTR           : x := 'WSAEINTR';
 | 
|---|
 | 380 |         WSAEBADF           : x := 'WSAEINTR';
 | 
|---|
 | 381 |         WSAEFAULT          : x := 'WSAEFAULT';
 | 
|---|
 | 382 |         WSAEINVAL          : x := 'WSAEINVAL';
 | 
|---|
 | 383 |         WSAEMFILE          : x := 'WSAEMFILE';
 | 
|---|
 | 384 |         WSAEWOULDBLOCK     : x := 'WSAEWOULDBLOCK';
 | 
|---|
 | 385 |         WSAEINPROGRESS     : x := 'WSAEINPROGRESS';
 | 
|---|
 | 386 |         WSAEALREADY        : x := 'WSAEALREADY';
 | 
|---|
 | 387 |         WSAENOTSOCK        : x := 'WSAENOTSOCK';
 | 
|---|
 | 388 |         WSAEDESTADDRREQ    : x := 'WSAEDESTADDRREQ';
 | 
|---|
 | 389 |         WSAEMSGSIZE        : x := 'WSAEMSGSIZE';
 | 
|---|
 | 390 |         WSAEPROTOTYPE      : x := 'WSAEPROTOTYPE';
 | 
|---|
 | 391 |         WSAENOPROTOOPT     : x := 'WSAENOPROTOOPT';
 | 
|---|
 | 392 |         WSAEPROTONOSUPPORT : x := 'WSAEPROTONOSUPPORT';
 | 
|---|
 | 393 |         WSAESOCKTNOSUPPORT : x := 'WSAESOCKTNOSUPPORT';
 | 
|---|
 | 394 |         WSAEOPNOTSUPP      : x := 'WSAEOPNOTSUPP';
 | 
|---|
 | 395 |         WSAEPFNOSUPPORT    : x := 'WSAEPFNOSUPPORT';
 | 
|---|
 | 396 |         WSAEAFNOSUPPORT    : x := 'WSAEAFNOSUPPORT';
 | 
|---|
 | 397 |         WSAEADDRINUSE      : x := 'WSAEADDRINUSE';
 | 
|---|
 | 398 |         WSAEADDRNOTAVAIL   : x := 'WSAEADDRNOTAVAIL';
 | 
|---|
 | 399 |         WSAENETDOWN        : x := 'WSAENETDOWN';
 | 
|---|
 | 400 |         WSAENETUNREACH     : x := 'WSAENETUNREACH';
 | 
|---|
 | 401 |         WSAENETRESET       : x := 'WSAENETRESET';
 | 
|---|
 | 402 |         WSAECONNABORTED    : x := 'WSAECONNABORTED';
 | 
|---|
 | 403 |         WSAECONNRESET      : x := 'WSAECONNRESET';
 | 
|---|
 | 404 |         WSAENOBUFS         : x := 'WSAENOBUFS';
 | 
|---|
 | 405 |         WSAEISCONN         : x := 'WSAEISCONN';
 | 
|---|
 | 406 |         WSAENOTCONN        : x := 'WSAENOTCONN';
 | 
|---|
 | 407 |         WSAESHUTDOWN       : x := 'WSAESHUTDOWN';
 | 
|---|
 | 408 |         WSAETOOMANYREFS    : x := 'WSAETOOMANYREFS';
 | 
|---|
 | 409 |         WSAETIMEDOUT       : x := 'WSAETIMEDOUT';
 | 
|---|
 | 410 |         WSAECONNREFUSED    : x := 'WSAECONNREFUSED';
 | 
|---|
 | 411 |         WSAELOOP           : x := 'WSAELOOP';
 | 
|---|
 | 412 |         WSAENAMETOOLONG    : x := 'WSAENAMETOOLONG';
 | 
|---|
 | 413 |         WSAEHOSTDOWN       : x := 'WSAEHOSTDOWN';
 | 
|---|
 | 414 |         WSAEHOSTUNREACH    : x := 'WSAEHOSTUNREACH';
 | 
|---|
 | 415 |         WSAENOTEMPTY       : x := 'WSAENOTEMPTY';
 | 
|---|
 | 416 |         WSAEPROCLIM        : x := 'WSAEPROCLIM';
 | 
|---|
 | 417 |         WSAEUSERS          : x := 'WSAEUSERS';
 | 
|---|
 | 418 |         WSAEDQUOT          : x := 'WSAEDQUOT';
 | 
|---|
 | 419 |         WSAESTALE          : x := 'WSAESTALE';
 | 
|---|
 | 420 |         WSAEREMOTE         : x := 'WSAEREMOTE';
 | 
|---|
 | 421 |         WSASYSNOTREADY     : x := 'WSASYSNOTREADY';
 | 
|---|
 | 422 |         WSAVERNOTSUPPORTED : x := 'WSAVERNOTSUPPORTED';
 | 
|---|
 | 423 |         WSANOTINITIALISED  : x := 'WSANOTINITIALISED';
 | 
|---|
 | 424 |         WSAHOST_NOT_FOUND  : x := 'WSAHOST_NOT_FOUND';
 | 
|---|
 | 425 |         WSATRY_AGAIN       : x := 'WSATRY_AGAIN';
 | 
|---|
 | 426 |         WSANO_RECOVERY     : x := 'WSANO_RECOVERY';
 | 
|---|
 | 427 |         WSANO_DATA         : x := 'WSANO_DATA';
 | 
|---|
 | 428 | 
 | 
|---|
 | 429 |         else x := 'Unknown Error';
 | 
|---|
 | 430 |   end;
 | 
|---|
 | 431 |   Result := x + ' (' + IntToStr(r) + ')';
 | 
|---|
 | 432 | end;
 | 
|---|
 | 433 | 
 | 
|---|
 | 434 | 
 | 
|---|
 | 435 | end.
 | 
|---|