| 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.
 | 
|---|