⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idrawfunctions.pas

📁 Indy控件的使用源代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:

  // copy header
  Move(HdrIcmp, ABuffer, Id_ICMP_MASK_HSIZE);

  Result := TRUE;
end;

function IdRawBuildIcmpUnreach(AType, ACode: byte; AnOrigLen: word;
  AnOrigTos: byte; AnOrigId, AnOrigFrag: word; AnOrigTtl, AnOrigProtocol: byte;
  AnOrigSource, AnOrigDest: TIdInAddr; const AnOrigPayload, APayloadSize: integer; var ABuffer): boolean;
var
  HdrIcmp: TIdIcmpHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrIcmp.icmp_type := AType;
  HdrIcmp.icmp_code := ACode;
  HdrIcmp.icmp_hun.echo.id := 0;
  HdrIcmp.icmp_hun.echo.seq := 0;

  // attach original header
  IdRawBuildIp(0, AnOrigTos, AnOrigId, AnOrigFrag, AnOrigTtl, AnOrigProtocol,
    AnOrigSource, AnOrigDest, AnOrigPayload, APayloadSize,
    pointer(integer(@ABuffer) + Id_ICMP_UNREACH_HSIZE)^);

  // copy header
  Move(HdrIcmp, ABuffer, Id_ICMP_UNREACH_HSIZE);

  Result := TRUE;
end;

function IdRawBuildIcmpTimeExceed(AType, ACode: byte; AnOrigLen: word; AnOrigTos: byte;
  AnOrigId, AnOrigFrag: word; AnOrigTtl: byte; AnOrigProtocol: byte;
  AnOrigSource, AnOrigDest: TIdInAddr; const AnOrigPayload; APayloadSize: integer; var ABuffer): boolean;
var
  HdrIcmp: TIdIcmpHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrIcmp.icmp_type := AType;
  HdrIcmp.icmp_code := ACode;
  HdrIcmp.icmp_hun.echo.id := 0;
  HdrIcmp.icmp_hun.echo.seq := 0;

  // attach original header
  IdRawBuildIp(0, AnOrigTos, AnOrigId, AnOrigFrag, AnOrigTtl, AnOrigProtocol,
    AnOrigSource, AnOrigDest, AnOrigPayload, APayloadSize,
    pointer(integer(@ABuffer) + Id_ICMP_TIMEXCEED_HSIZE)^);

  // copy header
  Move(HdrIcmp, ABuffer, Id_ICMP_TIMEXCEED_HSIZE);

  Result := TRUE;
end;

function IdRawBuildIcmpTimestamp(AType, ACode: byte; AnId, ASeq: word;
  AnOtime, AnRtime, ATtime: TIdNetTime; const APayload; APayloadSize: integer; var ABuffer): boolean;
var
  HdrIcmp: TIdIcmpHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrIcmp.icmp_type             := AType;
  HdrIcmp.icmp_code             := ACode;
  HdrIcmp.icmp_hun.echo.id      := GStack.WSHToNs(AnId);
  HdrIcmp.icmp_hun.echo.seq     := GStack.WSHToNs(ASeq);
  HdrIcmp.icmp_dun.ts.otime     := GStack.WSHToNL(AnOtime);      // original timestamp
  HdrIcmp.icmp_dun.ts.rtime     := GStack.WSHToNL(AnRtime);      // receive timestamp
  HdrIcmp.icmp_dun.ts.ttime     := GStack.WSHToNL(ATtime);       // transmit timestamp

  // copy payload
  if ((@APayload <> nil) and (APayloadSize > 0)) then
    Move(APayload, pointer(integer(@ABuffer) + Id_ICMP_TS_HSIZE)^, APayloadSize);

  // copy header
  Move(HdrIcmp, ABuffer, Id_ICMP_TS_HSIZE);

  Result := TRUE;
end;

function IdRawBuildIcmpRedirect(AType, ACode: byte; AGateway: TIdInAddr;
  AnOrigLen: word; AnOrigTos: byte; AnOrigId, AnOrigFrag: word; AnOrigTtl, AnOrigProtocol: byte;
  AnOrigSource, AnOrigDest: TIdInAddr; const AnOrigPayload; APayloadSize: integer; var ABuffer): boolean;
var
  HdrIcmp: TIdIcmpHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrIcmp.icmp_type           := AType;
  HdrIcmp.icmp_code           := ACode;
  HdrIcmp.icmp_hun.gateway    := AGateway;      // gateway address

  // attach original header
  IdRawBuildIp(0, AnOrigTos, AnOrigId, AnOrigFrag, AnOrigTtl, AnOrigProtocol,
    AnOrigSource, AnOrigDest, AnOrigPayload, APayloadSize,
    pointer(integer(@ABuffer) + Id_ICMP_REDIRECT_HSIZE)^);

  // copy header
  Move(HdrIcmp, ABuffer, Id_ICMP_REDIRECT_HSIZE);

  Result := TRUE;
end;

function IdRawBuildIgmp(AType, ACode: byte; AnIp: TIdInAddr;
  const APayload, APayloadSize: integer; var ABuffer): boolean;
var
  HdrIgmp: TIdIgmpHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrIgmp.igmp_type         := AType;
  HdrIgmp.igmp_code         := ACode;
  HdrIgmp.igmp_sum          := 0;
  HdrIgmp.igmp_group        := AnIp;      // group address or 0

  // copy payload
  if ((@APayload <> nil) and (APayloadSize > 0)) then
    Move(APayload, pointer(integer(@ABuffer) + Id_IGMP_HSIZE)^, APayloadSize);

  // copy header
  Move(HdrIgmp, ABuffer, sizeof(HdrIgmp));

  Result := TRUE;
end;

function IdRawBuildRip(ACommand, AVersion: byte; ARoutingDomain, AnAddressFamily,
  ARoutingTag: word; AnAddr, AMask, ANextHop, AMetric: longword;
  const APayload; APayloadSize: integer; var ABuffer): boolean;
var
  HdrRip: TIdRipHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrRip.rip_cmd      := ACommand;
  HdrRip.rip_ver      := AVersion;
  HdrRip.rip_rd       := GStack.WSHToNS(ARoutingDomain);
  HdrRip.rip_af       := GStack.WSHToNS(AnAddressFamily);
  HdrRip.rip_rt       := GStack.WSHToNS(ARoutingTag);
  HdrRip.rip_addr     := GStack.WSHToNL(AnAddr);
  HdrRip.rip_mask     := GStack.WSHToNL(AMask);
  HdrRip.rip_next_hop := GStack.WSHToNL(ANextHop);
  HdrRip.rip_metric   := GStack.WSHToNL(AMetric);

  // copy payload
  if ((@APayload <> nil) and (APayloadSize > 0)) then
    Move(APayload, pointer(integer(@ABuffer) + Id_RIP_HSIZE)^, APayloadSize);

  // copy header
  Move(HdrRip, ABuffer, sizeof(HdrRip));

  Result := TRUE;
end;

// TODO: check nibbles in TCP header
function IdRawBuildTcp(ASourcePort, ADestPort: word; ASeq, AnAck: longword;
  AControl: byte; AWindowSize, AnUrgent: word;
  const APayload, APayloadSize: integer; var ABuffer): boolean;
var
  HdrTcp: TIdTcpHdr;
begin
  // init result
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrTcp.tcp_sport    := GStack.WSHToNS(ASourcePort);
  HdrTcp.tcp_dport    := GStack.WSHToNS(ADestPort);
  HdrTcp.tcp_seq      := GStack.WSHToNL(ASeq);
  HdrTcp.tcp_ack      := GStack.WSHToNL(AnAck);                // acknowledgement number
  HdrTcp.tcp_flags    := AControl;                              // control flags
  HdrTcp.tcp_x2off    := ((Id_TCP_HSIZE div 4) shl 4) + 0;      // 20 bytes div 4, x2 unused
  HdrTcp.tcp_win      := GStack.WSHToNS(AWindowSize);          // window size
  HdrTcp.tcp_sum      := 0;
  HdrTcp.tcp_urp      := AnUrgent;                              // urgent pointer

  // copy payload
  if ((@APayload <> nil) and (APayloadSize > 0)) then
    Move(APayload, pointer(integer(@ABuffer) + Id_TCP_HSIZE)^, APayloadSize);

  // copy header
  Move(HdrTcp, ABuffer, sizeof(HdrTcp));

  Result := TRUE;
end;

function IdRawBuildUdp(ASourcePort, ADestPort: word; const APayload;
  APayloadSize: integer; var ABuffer): boolean;
var
  HdrUdp: TIdUdpHdr;
begin
  Result := FALSE;

  // check input
	if (@ABuffer = nil) then
    Exit;

  // construct header
  HdrUdp.udp_dport    := GStack.WSHToNS(ASourcePort);
  HdrUdp.udp_dport    := GStack.WSHToNS(ADestPort);
  HdrUdp.udp_ulen     := GStack.WSHToNS(Id_UDP_HSIZE + APayloadSize);
  HdrUdp.udp_sum      := 0;

  // copy payload
  if ((@APayload <> nil) and (APayloadSize > 0)) then
    Move(APayload, pointer(integer(@ABuffer) + Id_UDP_HSIZE)^, APayloadSize);

  // copy header
  Move(HdrUdp, ABuffer, sizeof(HdrUdp));

  Result := TRUE;
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -