Make(delphi) ver(4.04 build 185) Add(MainForm,6449431,182,280) { Width=815 Height=330 Caption="TCP_UDP_Tables" Position=1 } Add(Button,13770907,182,357) { Left=330 Top=265 Width=120 TabOrder=-1 Caption="GetTCP_UDP_Tables" link(onClick,2868222:doGetTCPTable,[]) } Add(InlineCode,2868222,294,357) { WorkPoints=#13:doGetTCPTable|13:doGetUDPTable| EventPoints=#13:onGetTCPTable|13:onGetUDPTable| VarPoints=#8:TCPTable|8:UDPTable| Code=#15:unit HiAsmUnit;|0:|9:interface|0:|39:uses kol,Share,Debug, Windows, Winsock;|0:|5:const|30: // Константы состояний порта|31: MIB_TCP_STATE_CLOSED = 1;|31: MIB_TCP_STATE_LISTEN = 2;|31: MIB_TCP_STATE_SYN_SENT = 3;|31: MIB_TCP_STATE_SYN_RCVD = 4;|31: MIB_TCP_STATE_ESTAB = 5;|31: MIB_TCP_STATE_FIN_WAIT1 = 6;|31: MIB_TCP_STATE_FIN_WAIT2 = 7;|31: MIB_TCP_STATE_CLOSE_WAIT = 8;|31: MIB_TCP_STATE_CLOSING = 9;|32: MIB_TCP_STATE_LAST_ACK = 10;|32: MIB_TCP_STATE_TIME_WAIT = 11;|32: MIB_TCP_STATE_DELETE_TCB = 12;|0:|4:type|55: // Стандартная структура для получения ТСР статистики|28: PTMibTCPRow = ^TMibTCPRow;|28: TMibTCPRow = packed record|19: dwState: DWORD;|23: dwLocalAddr: DWORD;|23: dwLocalPort: DWORD;|24: dwRemoteAddr: DWORD;|24: dwRemotePort: DWORD;|6: end;|0:|64: // В данную структуру будет передаваться результат GetTcpTable|32: PTMibTCPTable = ^TMibTCPTable;|30: TMibTCPTable = packed record|24: dwNumEntries: DWORD;|37: Table: array[0..0] of TMibTCPRow;|6: end;|0:|55: // Стандартная структура для получения UDP статистики|28: PTMibUdpRow = ^TMibUdpRow;|28: TMibUdpRow = packed record|23: dwLocalAddr: DWORD;|23: dwLocalPort: DWORD;|6: end;|0:|64: // В данную структуру будет передаваться результат GetUDPTable|32: PTMibUdpTable = ^TMibUdpTable;|30: TMibUdpTable = packed record|24: dwNumEntries: DWORD;|38: table: array [0..0] of TMibUdpRow;|6: end;|0:|41: // Расширенные варианты данных структур|32: PTMibTCPExRow = ^TMibTCPExRow;|30: TMibTCPExRow = packed record|19: dwState: DWORD;|23: dwLocalAddr: DWORD;|23: dwLocalPort: DWORD;|24: dwRemoteAddr: DWORD;|24: dwRemotePort: DWORD;|23: dwProcessID: DWORD;|6: end;|0:|36: PTMibTCPExTable = ^TMibTCPExTable;|32: TMibTCPExTable = packed record|24: dwNumEntries: DWORD;|39: Table: array[0..0] of TMibTCPExRow;|6: end;|0:|32: PTMibUdpExRow = ^TMibUdpExRow;|30: TMibUdpExRow = packed record|23: dwLocalAddr: DWORD;|23: dwLocalPort: DWORD;|23: dwProcessID: DWORD;|6: end;|0:|36: PTMibUdpExTable = ^TMibUdpExTable;|32: TMibUdpExTable = packed record|24: dwNumEntries: DWORD;|40: table: array [0..0] of TMibUdpExRow;|6: end;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|28: TCPArr, UDPArr: PArray;|30: fTCPTable: PTMibTCPTable;|30: fUDPTable: PTMibUdpTable;|42: stGetTCPTable, stGetUDPTable: DWORD; |35: FCountTCP, FCountUDP: Integer;|57: function PortStateToStr(const State: DWORD): String;|61: function _GetTCP(Var Item:TData; var Val:TData):boolean;|32: function _CountTCP:integer;|61: function _GetUDP(Var Item:TData; var Val:TData):boolean;|32: function _CountUDP:integer;|9: public|45: onGetTCPTable, onGetUDPTable: THI_Event;|5: |24: constructor Create;|34: destructor Destroy; override;|58: procedure doGetTCPTable(var _Data:TData; Index:word);|63: procedure doGetUDPTable(var _Data:TData; Index:word); |53: procedure TCPTable(var _Data:TData; Index:word);|53: procedure UDPTable(var _Data:TData; Index:word);|5: end;|0:|68: function GetTcpTable(pTCPTable: PTMibTCPTable; var pDWSize: DWORD;|78: bOrder: BOOL): DWORD; stdcall; external 'IPHLPAPI.DLL';|68: function GetUdpTable(pUDPTable: PTMibUDPTable; var pDWSize: DWORD;|78: bOrder: BOOL): DWORD; stdcall; external 'IPHLPAPI.DLL';|0:|74: function AllocateAndGetTcpExTableFromStack(pTCPExTable: PTMibTCPExTable;|83: bOrder: BOOL; heap: THandle; zero: DWORD; flags: DWORD): DWORD; stdcall;|35: external 'IPHLPAPI.DLL';|0:|74: function AllocateAndGetUdpExTableFromStack(pUDPExTable: PTMibUDPExTable;|83: bOrder: BOOL; heap: THandle; zero: DWORD; flags: DWORD): DWORD; stdcall;|35: external 'IPHLPAPI.DLL';|0:|14:implementation|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|17: FCountTCP := 0;|17: FCountUDP := 0;|42: GetMem(fTCPTable, SizeOf(TMibTCPTable));|44: GetMem(fUDPTable, SizeOf(TMibUDPTable)); |4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|21: FreeMem(fTCPTable);|21: FreeMem(fUDPTable);|40: if TCPArr <> nil then dispose(TCPArr);|40: if UDPArr <> nil then dispose(UDPArr);|12: inherited;|4:end;|0:|61:// Функция преобразует состояние порта в строковый эквивалент|64:function THiAsmClass.PortStateToStr(const State: DWORD): String;|5:begin|15: case State of|45: MIB_TCP_STATE_CLOSED: Result := 'CLOSED';|45: MIB_TCP_STATE_LISTEN: Result := 'LISTEN';|49: MIB_TCP_STATE_SYN_SENT: Result := 'SYN SENT';|53: MIB_TCP_STATE_SYN_RCVD: Result := 'SYN RECEIVED';|49: MIB_TCP_STATE_ESTAB: Result := 'ESTABLISHED';|52: MIB_TCP_STATE_FIN_WAIT1: Result := 'FIN WAIT 1';|52: MIB_TCP_STATE_FIN_WAIT2: Result := 'FIN WAIT 2';|53: MIB_TCP_STATE_CLOSE_WAIT: Result := 'CLOSE WAIT';|47: MIB_TCP_STATE_CLOSING: Result := 'CLOSING';|49: MIB_TCP_STATE_LAST_ACK: Result := 'LAST ACK';|51: MIB_TCP_STATE_TIME_WAIT: Result := 'TIME WAIT';|53: MIB_TCP_STATE_DELETE_TCB: Result := 'DELETE TCB';|6: else|24: Result := 'UNKNOWN';|6: end;|4:end;|0:|36:procedure THiAsmClass.doGetTCPTable;|3:var|17: Size, i: DWORD;|5:begin|17: FCountTCP := 0;|12: Size := 0;|54: stGetTCPTable := GetTcpTable(fTCPTable, Size, true);|58: if stGetTCPTable <> ERROR_INSUFFICIENT_BUFFER then exit;|26: GetMem(fTCPTable, Size);|54: stGetTCPTable := GetTcpTable(fTCPTable, Size, true);|41: if stGetTCPTable <> NO_ERROR then exit;|42: FCountTCP := fTCPTable^.dwNumEntries; |29: _hi_onEvent(onGetTCPTable);|4:end;|0:|36:procedure THiAsmClass.doGetUDPTable;|3:var|17: Size, i: DWORD;|5:begin|17: FCountUDP := 0;|12: Size := 0;|54: stGetUDPTable := GetUDPTable(fUDPTable, Size, true);|58: if stGetUDPTable <> ERROR_INSUFFICIENT_BUFFER then exit;|26: GetMem(fUDPTable, Size);|54: stGetUDPTable := GetUDPTable(fUDPTable, Size, true);|41: if stGetUDPTable <> NO_ERROR then exit;|40: FCountUDP := fUDPTable^.dwNumEntries; |29: _hi_onEvent(onGetUDPTable);|4:end;|0:|31:procedure THiAsmClass.TCPTable;|5:begin|22: if TCPArr = nil then|56: TCPArr := CreateArray(nil, _GetTCP, _CountTCP, nil);|25: dtArray(_Data, TCPArr);|4:end;|0:|31:procedure THiAsmClass.UDPTable;|5:begin|22: if UDPArr = nil then|56: UDPArr := CreateArray(nil, _GetUDP, _CountUDP, nil);|25: dtArray(_Data, UDPArr);|4:end;|0:|29:function THiAsmClass._GetTCP;|3:var|15: ind: integer;|5:begin|18: Result := false;|42: if stGetTCPTable <> NO_ERROR then exit; |26: ind := ToIntIndex(Item);|42: if (ind >= 0) and (ind < _CountTCP) then|7: begin|19: Result := true;|79: dtString(Val, inet_ntoa(in_addr(fTCPTable^.Table[ind].dwLocalAddr)) + ';' +|75: int2str(htons(fTCPTable^.Table[ind].dwLocalPort)) + ';' +|80: inet_ntoa(in_addr(fTCPTable^.Table[ind].dwRemoteAddr)) + ';' +|76: int2str(htons(fTCPTable^.Table[ind].dwRemotePort)) + ';' +|65: PortStateToStr(fTCPTable^.Table[ind].dwState));|6: end;|4:end;|0:|31:function THiAsmClass._CountTCP;|5:begin|23: Result := FCountTCP;|4:end;|0:|29:function THiAsmClass._GetUDP;|3:var|15: ind: integer;|5:begin|18: Result := false;|42: if stGetUDPTable <> NO_ERROR then exit; |26: ind := ToIntIndex(Item);|42: if (ind >= 0) and (ind < _CountUDP) then|7: begin|19: Result := true;|79: dtString(Val, inet_ntoa(in_addr(fTCPTable^.Table[ind].dwLocalAddr)) + ';' +|69: int2str(htons(fTCPTable^.Table[ind].dwLocalPort)));|6: end;|4:end;|0:|31:function THiAsmClass._CountUDP;|5:begin|22: Result := FCountUDP;|4:end;|0:|4:end.| link(onGetTCPTable,15662563:doEnum,[(338,363)(338,337)(272,337)(272,426)]) link(onGetUDPTable,7278504:doEnum,[(344,370)(344,332)(264,332)(264,482)]) } Add(MTStrTbl,13900364,294,280) { Left=10 Top=10 Width=545 Height=250 Name="TCPtable" Columns=#13:LocalAddr=104|13:LocalPort=104|14:RemoteAddr=104|14:RemotePort=104|9:State=104| } Add(ArrayEnum,15662563,294,420) { link(onItem,12585531:doMTString,[]) link(onEndEnum,2868222:doGetUDPTable,[(338,433)(338,401)(282,401)(282,370)]) link(Array,2868222:TCPTable,[]) } Add(MT_String,12585531,364,406) { link(onResult,3724182:doRowAction,[]) } Add(MST_RowAction,3724182,420,406) { MSTControl="TCPtable" } Add(MTStrTbl,15510300,364,280) { Left=560 Top=10 Width=232 Height=250 Name="UDPtable" Columns=#13:LocalAddr=104|13:LocalPort=104| } Add(ArrayEnum,7278504,315,476) { link(onItem,2125659:doMTString,[]) link(Array,2868222:UDPTable,[(321,432)(307,432)]) } Add(MT_String,2125659,364,462) { link(onResult,1059487:doRowAction,[]) } Add(MST_RowAction,1059487,420,462) { MSTControl="UDPtable" }