[476] | 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.
|
---|