JwaTraffic.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:30k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Traffic Control API interface Unit for Object Pascal                         }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: traffic.h, released June 2000. The original Pascal     }
  9. { code is: Traffic.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaTraffic;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "traffic.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType, JwaQos;
  52. //---------------------------------------------------------------------------
  53. //
  54. // Define's
  55. //
  56. const
  57.   CURRENT_TCI_VERSION = $0002;
  58.   {$EXTERNALSYM CURRENT_TCI_VERSION}
  59. //
  60. // Definitions of notification events. These may be passed
  61. // to the client's notification handler, to identify the
  62. // notification type
  63. //
  64. //
  65. // A TC interface has come up
  66. //
  67.   TC_NOTIFY_IFC_UP = 1;
  68.   {$EXTERNALSYM TC_NOTIFY_IFC_UP}
  69. //
  70. // A TC interface has come down
  71. //
  72.   TC_NOTIFY_IFC_CLOSE = 2;
  73.   {$EXTERNALSYM TC_NOTIFY_IFC_CLOSE}
  74. //
  75. // A change on a TC interface, typically a change in the
  76. // list of supported network addresses
  77. //
  78.   TC_NOTIFY_IFC_CHANGE = 3;
  79.   {$EXTERNALSYM TC_NOTIFY_IFC_CHANGE}
  80. //
  81. // A TC parameter has changed
  82. //
  83.   TC_NOTIFY_PARAM_CHANGED = 4;
  84.   {$EXTERNALSYM TC_NOTIFY_PARAM_CHANGED}
  85. //
  86. // A flow has been closed by the TC interface
  87. // for example: after a remote call close, or the whole interface
  88. // is going down
  89. //
  90.   TC_NOTIFY_FLOW_CLOSE = 5;
  91.   {$EXTERNALSYM TC_NOTIFY_FLOW_CLOSE}
  92.   TC_INVALID_HANDLE = HANDLE(0);
  93.   {$EXTERNALSYM TC_INVALID_HANDLE}
  94.   MAX_STRING_LENGTH = 256;
  95.   {$EXTERNALSYM MAX_STRING_LENGTH}
  96. //---------------------------------------------------------------------------
  97. //
  98. // Typedef's and structures
  99. //
  100. //
  101. // Handlers registered by the TCI client
  102. //
  103. type
  104.   TCI_NOTIFY_HANDLER = procedure (ClRegCtx, ClIfcCtx: HANDLE; Event: ULONG;
  105.     SubCode: HANDLE; BufSize: ULONG; Buffer: PVOID); stdcall;
  106.   {$EXTERNALSYM TCI_NOTIFY_HANDLER}
  107.   TTciNotifyHandler = TCI_NOTIFY_HANDLER;
  108.   TCI_ADD_FLOW_COMPLETE_HANDLER = procedure (ClFlowCtx: HANDLE; Status: ULONG); stdcall;
  109.   {$EXTERNALSYM TCI_ADD_FLOW_COMPLETE_HANDLER}
  110.   TTciAddFlowCompleteHandler = TCI_ADD_FLOW_COMPLETE_HANDLER;
  111.   TCI_MOD_FLOW_COMPLETE_HANDLER = procedure (ClFlowCtx: HANDLE; Status: ULONG); stdcall;
  112.   {$EXTERNALSYM TCI_MOD_FLOW_COMPLETE_HANDLER}
  113.   TTciModFlowCompleteHandler = TCI_MOD_FLOW_COMPLETE_HANDLER;
  114.   TCI_DEL_FLOW_COMPLETE_HANDLER = procedure (ClFlowCtx: HANDLE; Status: ULONG); stdcall;
  115.   {$EXTERNALSYM TCI_DEL_FLOW_COMPLETE_HANDLER}
  116.   TTciDelFlowComlpeteHandler = TCI_DEL_FLOW_COMPLETE_HANDLER;
  117. type
  118.   PTCI_CLIENT_FUNC_LIST = ^TCI_CLIENT_FUNC_LIST;
  119.   {$EXTERNALSYM PTCI_CLIENT_FUNC_LIST}
  120.   _TCI_CLIENT_FUNC_LIST = record
  121.     ClNotifyHandler: TCI_NOTIFY_HANDLER;
  122.     ClAddFlowCompleteHandler: TCI_ADD_FLOW_COMPLETE_HANDLER;
  123.     ClModifyFlowCompleteHandler: TCI_MOD_FLOW_COMPLETE_HANDLER;
  124.     ClDeleteFlowCompleteHandler: TCI_DEL_FLOW_COMPLETE_HANDLER;
  125.   end;
  126.   {$EXTERNALSYM _TCI_CLIENT_FUNC_LIST}
  127.   TCI_CLIENT_FUNC_LIST = _TCI_CLIENT_FUNC_LIST;
  128.   {$EXTERNALSYM TCI_CLIENT_FUNC_LIST}
  129.   TTciClientFuncList = TCI_CLIENT_FUNC_LIST;
  130.   PTciClientFuncList = PTCI_CLIENT_FUNC_LIST;
  131.   // TODO NETWORD_ADDRESS and NETWORK_ADDRESS_LIST are from NtDDNdis.h
  132.   _NETWORK_ADDRESS = record
  133.     AddressLength: USHORT; // length in bytes of Address[] in this
  134.     AddressType: USHORT; // type of this address (NDIS_PROTOCOL_ID_XXX above)
  135.     Address: array [0..0] of UCHAR; // actually AddressLength bytes long
  136.   end;
  137.   NETWORK_ADDRESS = _NETWORK_ADDRESS;
  138.   PNETWORK_ADDRESS = ^NETWORK_ADDRESS;
  139.   _NETWORK_ADDRESS_LIST = record
  140.     AddressCount: LONG;   // number of addresses following
  141.     AddressType: USHORT; // type of this address (NDIS_PROTOCOL_ID_XXX above)
  142.     Address: array [0..0] of NETWORK_ADDRESS; // actually AddressCount elements long
  143.   end;
  144.   NETWORK_ADDRESS_LIST = _NETWORK_ADDRESS_LIST;
  145.   PNETWORK_ADDRESS_LIST = ^NETWORK_ADDRESS_LIST;
  146. //
  147. // Network address descriptor
  148. //
  149.   PADDRESS_LIST_DESCRIPTOR = ^ADDRESS_LIST_DESCRIPTOR;
  150.   {$EXTERNALSYM PADDRESS_LIST_DESCRIPTOR}
  151.   _ADDRESS_LIST_DESCRIPTOR = record
  152.     MediaType: ULONG;
  153.     AddressList: NETWORK_ADDRESS_LIST;
  154.   end;
  155.   {$EXTERNALSYM _ADDRESS_LIST_DESCRIPTOR}
  156.   ADDRESS_LIST_DESCRIPTOR = _ADDRESS_LIST_DESCRIPTOR;
  157.   {$EXTERNALSYM ADDRESS_LIST_DESCRIPTOR}
  158.   TAddressListDescriptor = ADDRESS_LIST_DESCRIPTOR;
  159.   PAddressListDescriptor = PADDRESS_LIST_DESCRIPTOR;
  160. //
  161. // An interface ID that is returned by the enumerator
  162. //
  163.   PTC_IFC_DESCRIPTOR = ^TC_IFC_DESCRIPTOR;
  164.   {$EXTERNALSYM PTC_IFC_DESCRIPTOR}
  165.   _TC_IFC_DESCRIPTOR = record
  166.     Length: ULONG;
  167.     pInterfaceName: LPWSTR;
  168.     pInterfaceID: LPWSTR;
  169.     AddressListDesc: ADDRESS_LIST_DESCRIPTOR;
  170.   end;
  171.   {$EXTERNALSYM _TC_IFC_DESCRIPTOR}
  172.   TC_IFC_DESCRIPTOR = _TC_IFC_DESCRIPTOR;
  173.   {$EXTERNALSYM TC_IFC_DESCRIPTOR}
  174.   TTcIfcDescriptor = TC_IFC_DESCRIPTOR;
  175.   PTcIfcDescriptor = PTC_IFC_DESCRIPTOR;
  176. //
  177. // This structure is returned by a QoS data provider in reply to
  178. // GUID_QOS_SUPPORTED query or with an interface UP notification
  179. //
  180.   PTC_SUPPORTED_INFO_BUFFER = ^TC_SUPPORTED_INFO_BUFFER;
  181.   {$EXTERNALSYM PTC_SUPPORTED_INFO_BUFFER}
  182.   _TC_SUPPORTED_INFO_BUFFER = record
  183.     InstanceIDLength: USHORT;
  184.     // device or interface ID
  185.     InstanceID: array [0..MAX_STRING_LENGTH - 1] of WCHAR;
  186.     // address list
  187.     AddrListDesc: ADDRESS_LIST_DESCRIPTOR;
  188.   end;
  189.   {$EXTERNALSYM _TC_SUPPORTED_INFO_BUFFER}
  190.   TC_SUPPORTED_INFO_BUFFER = _TC_SUPPORTED_INFO_BUFFER;
  191.   {$EXTERNALSYM TC_SUPPORTED_INFO_BUFFER}
  192.   TTcSupportedInfoBuffer = TC_SUPPORTED_INFO_BUFFER;
  193.   PTcSupportedInfoBuffer = PTC_SUPPORTED_INFO_BUFFER;
  194. //
  195. // Filters are used to match packets. The Pattern field
  196. // indicates the values to which bits in corresponding
  197. // positions in candidate packets should be compared. The
  198. // Mask field indicates which bits are to be compared and
  199. // which bits are don't cares.
  200. //
  201. // Different filters can be submitted on the TCI interface.
  202. // The generic filter structure is defined to include an
  203. // AddressType, which indicates the specific type of filter to
  204. // follow.
  205. //
  206.   PTC_GEN_FILTER = ^TC_GEN_FILTER;
  207.   {$EXTERNALSYM PTC_GEN_FILTER}
  208.   _TC_GEN_FILTER = record
  209.     AddressType: USHORT; // IP, IPX, etc.
  210.     PatternSize: ULONG; // byte count of the pattern
  211.     Pattern: PVOID; // specific format, e.g. IP_PATTERN
  212.     Mask: PVOID; // same type as Pattern
  213.   end;
  214.   {$EXTERNALSYM _TC_GEN_FILTER}
  215.   TC_GEN_FILTER = _TC_GEN_FILTER;
  216.   {$EXTERNALSYM TC_GEN_FILTER}
  217.   TTcGenFilter = TC_GEN_FILTER;
  218.   PTcGenFilter = PTC_GEN_FILTER;
  219. //
  220. // A generic flow includes two flowspecs and a freeform
  221. // buffer which contains flow specific TC objects.
  222. //
  223.   PTC_GEN_FLOW = ^TC_GEN_FLOW;
  224.   {$EXTERNALSYM PTC_GEN_FLOW}
  225.   _TC_GEN_FLOW = record
  226.     SendingFlowspec: FLOWSPEC;
  227.     ReceivingFlowspec: FLOWSPEC;
  228.     TcObjectsLength: ULONG; // number of optional bytes
  229.     TcObjects: array [0..0] of QOS_OBJECT_HDR;
  230.   end;
  231.   {$EXTERNALSYM _TC_GEN_FLOW}
  232.   TC_GEN_FLOW = _TC_GEN_FLOW;
  233.   {$EXTERNALSYM TC_GEN_FLOW}
  234.   TTcGenFlow = TC_GEN_FLOW;
  235.   PTcGenFlow = PTC_GEN_FLOW;
  236. //
  237. // Format of specific pattern or mask used by GPC for the IP protocol
  238. //
  239.   PIP_PATTERN = ^IP_PATTERN;
  240.   {$EXTERNALSYM PIP_PATTERN}
  241.   _IP_PATTERN = record
  242.     Reserved1: ULONG;
  243.     Reserved2: ULONG;
  244.     SrcAddr: ULONG;
  245.     DstAddr: ULONG;
  246.     S_un: record
  247.     case Integer of
  248.       0: (
  249.         s_srcport: USHORT;
  250.         s_dstport: USHORT);
  251.       1: (
  252.         s_type: UCHAR;
  253.         s_code: UCHAR;
  254.         filler: USHORT);
  255.       2: (
  256.         S_Spi: ULONG);
  257.     end;
  258.     ProtocolId: UCHAR;
  259.     Reserved3: array [0..3 - 1] of UCHAR;
  260.   end;
  261.   {$EXTERNALSYM _IP_PATTERN}
  262.   IP_PATTERN = _IP_PATTERN;
  263.   {$EXTERNALSYM IP_PATTERN}
  264.   TIpPattern = IP_PATTERN;
  265.   PIpPattern = PIP_PATTERN;
  266. //
  267. // Format of specific pattern or mask used by GPC for the IPX protocol
  268. //
  269.   TIpxPatternAddress = record
  270.     NetworkAddress: ULONG;
  271.     NodeAddress: array [0..5] of UCHAR;
  272.     Socket: USHORT;
  273.   end;
  274.   PIPX_PATTERN = ^IPX_PATTERN;
  275.   {$EXTERNALSYM PIPX_PATTERN}
  276.   _IPX_PATTERN = record
  277.     Src: TIpxPatternAddress;
  278.     Dest: TIpxPatternAddress;
  279.   end;
  280.   {$EXTERNALSYM _IPX_PATTERN}
  281.   IPX_PATTERN = _IPX_PATTERN;
  282.   {$EXTERNALSYM IPX_PATTERN}
  283.   TIpxPattern = IPX_PATTERN;
  284.   PIpxPattern = PIPX_PATTERN;
  285. //
  286. // The enumeration buffer is the flow parameters + a list of filters
  287. //
  288.   PENUMERATION_BUFFER = ^ENUMERATION_BUFFER;
  289.   {$EXTERNALSYM PENUMERATION_BUFFER}
  290.   _ENUMERATION_BUFFER = record
  291.     Length: ULONG;
  292.     OwnerProcessId: ULONG;
  293.     FlowNameLength: USHORT;
  294.     FlowName: array [0..MAX_STRING_LENGTH - 1] of WCHAR;
  295.     pFlow: PTC_GEN_FLOW;
  296.     NumberOfFilters: ULONG;
  297.     GenericFilter: array [0..0] of TC_GEN_FILTER; // one for each filter
  298.   end;
  299.   {$EXTERNALSYM _ENUMERATION_BUFFER}
  300.   ENUMERATION_BUFFER = _ENUMERATION_BUFFER;
  301.   {$EXTERNALSYM ENUMERATION_BUFFER}
  302.   TEnumerationBuffer = ENUMERATION_BUFFER;
  303.   PEnumerationBuffer = PENUMERATION_BUFFER;
  304. //
  305. // QoS objects supported by traffic
  306. //
  307. const
  308.   QOS_TRAFFIC_GENERAL_ID_BASE = 4000;
  309.   {$EXTERNALSYM QOS_TRAFFIC_GENERAL_ID_BASE}
  310.   QOS_OBJECT_DS_CLASS      = ($00000001 + QOS_TRAFFIC_GENERAL_ID_BASE);
  311.   {$EXTERNALSYM QOS_OBJECT_DS_CLASS}
  312.   QOS_OBJECT_TRAFFIC_CLASS = ($00000002 + QOS_TRAFFIC_GENERAL_ID_BASE);
  313.   {$EXTERNALSYM QOS_OBJECT_TRAFFIC_CLASS}
  314.   QOS_OBJECT_DIFFSERV      = ($00000003 + QOS_TRAFFIC_GENERAL_ID_BASE);
  315.   {$EXTERNALSYM QOS_OBJECT_DIFFSERV}
  316.   QOS_OBJECT_TCP_TRAFFIC   = ($00000004 + QOS_TRAFFIC_GENERAL_ID_BASE);
  317.   {$EXTERNALSYM QOS_OBJECT_TCP_TRAFFIC}
  318.   QOS_OBJECT_FRIENDLY_NAME = ($00000005 + QOS_TRAFFIC_GENERAL_ID_BASE);
  319.   {$EXTERNALSYM QOS_OBJECT_FRIENDLY_NAME}
  320. //
  321. // This structure is used to associate a friendly name with the flow
  322. // 
  323. type
  324.   LPQOS_FRIENDLY_NAME = ^QOS_FRIENDLY_NAME;
  325.   {$EXTERNALSYM LPQOS_FRIENDLY_NAME}
  326.   _QOS_FRIENDLY_NAME = record
  327.     ObjectHdr: QOS_OBJECT_HDR;
  328.     FriendlyName: array [0..MAX_STRING_LENGTH - 1] of WCHAR;
  329.   end;
  330.   {$EXTERNALSYM _QOS_FRIENDLY_NAME}
  331.   QOS_FRIENDLY_NAME = _QOS_FRIENDLY_NAME;
  332.   {$EXTERNALSYM QOS_FRIENDLY_NAME}
  333.   TQosFriendlyName = QOS_FRIENDLY_NAME;
  334.   PQosFriendlyName = LPQOS_FRIENDLY_NAME;
  335. //
  336. // This structure may carry an 802.1 TrafficClass parameter which 
  337. // has been provided to the host by a layer 2 network, for example, 
  338. // in an 802.1 extended RSVP RESV message. If this object is obtained
  339. // from the network, hosts will stamp the MAC headers of corresponding
  340. // transmitted packets, with the value in the object. Otherwise, hosts
  341. // may select a value based on the standard Intserv mapping of 
  342. // ServiceType to 802.1 TrafficClass.
  343. //
  344. //
  345.   LPQOS_TRAFFIC_CLASS = ^QOS_TRAFFIC_CLASS;
  346.   {$EXTERNALSYM LPQOS_TRAFFIC_CLASS}
  347.   _QOS_TRAFFIC_CLASS = record
  348.     ObjectHdr: QOS_OBJECT_HDR;
  349.     TrafficClass: ULONG;
  350.   end;
  351.   {$EXTERNALSYM _QOS_TRAFFIC_CLASS}
  352.   QOS_TRAFFIC_CLASS = _QOS_TRAFFIC_CLASS;
  353.   {$EXTERNALSYM QOS_TRAFFIC_CLASS}
  354.   TQosTrafficClass = QOS_TRAFFIC_CLASS;
  355.   PQosTrafficClass = LPQOS_TRAFFIC_CLASS;
  356. //
  357. // This structure may carry an DSField parameter which  has been provided to 
  358. // the host by a layer 3 network, for example, in an extended RSVP RESV message. 
  359. // If this object is obtained from the network, hosts will stamp the DS Field on the
  360. // IP header of transmitted packets, with the value in the object. Otherwise, hosts
  361. // may select a value based on the standard Intserv mapping of ServiceType to DS Field 
  362. //
  363.   LPQOS_DS_CLASS = ^QOS_DS_CLASS;
  364.   {$EXTERNALSYM LPQOS_DS_CLASS}
  365.   _QOS_DS_CLASS = record
  366.     ObjectHdr: QOS_OBJECT_HDR;
  367.     DSField: ULONG;
  368.   end;
  369.   {$EXTERNALSYM _QOS_DS_CLASS}
  370.   QOS_DS_CLASS = _QOS_DS_CLASS;
  371.   {$EXTERNALSYM QOS_DS_CLASS}
  372.   TQosDsClass = QOS_DS_CLASS;
  373.   PQosDsClass = LPQOS_DS_CLASS;
  374. //
  375. // This structure is used to create DiffServ Flows. This creates flows in the packet scheduler
  376. // and allows it to classify to packets based on a particular DS field. This structure takes
  377. // a variable length array of QOS_DIFFSERV_RULE, where each DS field is specified by a 
  378. // QOS_DIFFSERV_RULE
  379. //
  380.   LPQOS_DIFFSERV = ^QOS_DIFFSERV;
  381.   {$EXTERNALSYM LPQOS_DIFFSERV}
  382.   _QOS_DIFFSERV = record
  383.     ObjectHdr: QOS_OBJECT_HDR;
  384.     DSFieldCount: ULONG;
  385.     DiffservRule: array [0..0] of UCHAR;
  386.   end;
  387.   {$EXTERNALSYM _QOS_DIFFSERV}
  388.   QOS_DIFFSERV = _QOS_DIFFSERV;
  389.   {$EXTERNALSYM QOS_DIFFSERV}
  390.   TQosDiffserv = QOS_DIFFSERV;
  391.   PQosDiffserv = LPQOS_DIFFSERV;
  392. //
  393. // The rule for a Diffserv DS codepoint. 
  394. //
  395.   LPQOS_DIFFSERV_RULE = ^QOS_DIFFSERV_RULE;
  396.   {$EXTERNALSYM LPQOS_DIFFSERV_RULE}
  397.   _QOS_DIFFSERV_RULE = record
  398.     InboundDSField: UCHAR;
  399.     ConformingOutboundDSField: UCHAR;
  400.     NonConformingOutboundDSField: UCHAR;
  401.     ConformingUserPriority: UCHAR;
  402.     NonConformingUserPriority: UCHAR;
  403.   end;
  404.   {$EXTERNALSYM _QOS_DIFFSERV_RULE}
  405.   QOS_DIFFSERV_RULE = _QOS_DIFFSERV_RULE;
  406.   {$EXTERNALSYM QOS_DIFFSERV_RULE}
  407.   TQosDiffservRule = QOS_DIFFSERV_RULE;
  408.   PQosDiffservRule = LPQOS_DIFFSERV_RULE;
  409. // 
  410. // This structure is passed to indicate that the IP Precedence and UserPriority mappings for the flow
  411. // have to be set to the system defaults for TCP traffic. If this object is passed, 
  412. // the ServiceType ==> DSField mapping, ServiceType ==> UserPriorityMapping, QOS_OBJECT_DS_CLASS
  413. // and QOS_OBJECT_TRAFFIC_CLASS will be ignored.
  414. //
  415.   LPQOS_TCP_TRAFFIC = ^QOS_TCP_TRAFFIC;
  416.   {$EXTERNALSYM LPQOS_TCP_TRAFFIC}
  417.   _QOS_TCP_TRAFFIC = record
  418.     ObjectHdr: QOS_OBJECT_HDR;
  419.   end;
  420.   {$EXTERNALSYM _QOS_TCP_TRAFFIC}
  421.   QOS_TCP_TRAFFIC = _QOS_TCP_TRAFFIC;
  422.   {$EXTERNALSYM QOS_TCP_TRAFFIC}
  423.   TQosTcpTraffic = QOS_TCP_TRAFFIC;
  424.   PQosTcpTraffic = LPQOS_TCP_TRAFFIC;
  425. //---------------------------------------------------------------------------
  426. //
  427. // Interface Function Definitions
  428. //
  429. function TcRegisterClient(TciVersion: ULONG; ClRegCtx: HANDLE; const ClientHandlerList: TCI_CLIENT_FUNC_LIST; var pClientHandle: HANDLE): ULONG; stdcall;
  430. {$EXTERNALSYM TcRegisterClient}
  431. function TcEnumerateInterfaces(ClientHandle: HANDLE; var pBufferSize: ULONG; var InterfaceBuffer: TC_IFC_DESCRIPTOR): ULONG; stdcall;
  432. {$EXTERNALSYM TcEnumerateInterfaces}
  433. function TcOpenInterfaceA(pInterfaceName: LPSTR; ClientHandle, ClIfcCtx: HANDLE; var pIfcHandle: HANDLE): ULONG; stdcall;
  434. {$EXTERNALSYM TcOpenInterfaceA}
  435. function TcOpenInterfaceW(pInterfaceName: LPWSTR; ClientHandle, ClIfcCtx: HANDLE; var pIfcHandle: HANDLE): ULONG; stdcall;
  436. {$EXTERNALSYM TcOpenInterfaceW}
  437. function TcCloseInterface(IfcHandle: HANDLE): ULONG; stdcall;
  438. {$EXTERNALSYM TcCloseInterface}
  439. function TcQueryInterface(IfcHandle: HANDLE; const pGuidParam: GUID; NotifyChange: Longbool; var pBufferSize: ULONG; Buffer: PVOID): ULONG; stdcall;
  440. {$EXTERNALSYM TcQueryInterface}
  441. function TcSetInterface(IfcHandle: HANDLE; const pGuidParam: GUID; BufferSize: ULONG; Buffer: PVOID): ULONG; stdcall;
  442. {$EXTERNALSYM TcSetInterface}
  443. function TcQueryFlowA(pFlowName: LPSTR; const pGuidParam: GUID; var pBufferSize: ULONG; Buffer: PVOID): ULONG; stdcall;
  444. {$EXTERNALSYM TcQueryFlowA}
  445. function TcQueryFlowW(pFlowName: LPWSTR; const pGuidParam: GUID; var pBufferSize: ULONG; Buffer: PVOID): ULONG; stdcall;
  446. {$EXTERNALSYM TcQueryFlowW}
  447. function TcSetFlowA(pFlowName: LPSTR; const pGuidParam: GUID; BufferSize: GUID; Buffer: PVOID): ULONG; stdcall;
  448. {$EXTERNALSYM TcSetFlowA}
  449. function TcSetFlowW(pFlowName: LPWSTR; const pGuidParam: GUID; BufferSize: GUID; Buffer: PVOID): ULONG; stdcall;
  450. {$EXTERNALSYM TcSetFlowW}
  451. function TcAddFlow(IfcHandle, ClFlowCtx: HANDLE; Flags: ULONG; const pGenericFlow: TC_GEN_FLOW; var pFlowHandle: HANDLE): ULONG; stdcall;
  452. {$EXTERNALSYM TcAddFlow}
  453. function TcGetFlowNameA(FlowHandle: HANDLE; StrSize: ULONG; pFlowName: LPSTR): ULONG; stdcall;
  454. {$EXTERNALSYM TcGetFlowNameA}
  455. function TcGetFlowNameW(FlowHandle: HANDLE; StrSize: ULONG; pFlowName: LPWSTR): ULONG; stdcall;
  456. {$EXTERNALSYM TcGetFlowNameW}
  457. function TcModifyFlow(FlowHandle: HANDLE; const pGenericFlow: TC_GEN_FLOW): ULONG; stdcall;
  458. {$EXTERNALSYM TcModifyFlow}
  459. function TcAddFilter(FlowHandle: HANDLE; const pGenericFilter: TC_GEN_FILTER; var pFilterHandle: HANDLE): ULONG; stdcall;
  460. {$EXTERNALSYM TcAddFilter}
  461. function TcDeregisterClient(ClientHandle: HANDLE): ULONG; stdcall;
  462. {$EXTERNALSYM TcDeregisterClient}
  463. function TcDeleteFlow(FlowHandle: HANDLE): ULONG; stdcall;
  464. {$EXTERNALSYM TcDeleteFlow}
  465. function TcDeleteFilter(FilterHandle: HANDLE): ULONG; stdcall;
  466. {$EXTERNALSYM TcDeleteFilter}
  467. function TcEnumerateFlows(IfcHandle: HANDLE; var pEnumHandle: HANDLE; var pFlowCount, pBufSize: ULONG; var Buffer: ENUMERATION_BUFFER): ULONG; stdcall;
  468. {$EXTERNALSYM TcEnumerateFlows}
  469. {$IFDEF UNICODE}
  470. function TcOpenInterface(pInterfaceName: LPWSTR; ClientHandle, ClIfcCtx: HANDLE; var pIfcHandle: HANDLE): ULONG; stdcall;
  471. {$EXTERNALSYM TcOpenInterface}
  472. function TcQueryFlow(pFlowName: LPWSTR; const pGuidParam: GUID; var pBufferSize: ULONG; Buffer: PVOID): ULONG; stdcall;
  473. {$EXTERNALSYM TcQueryFlow}
  474. function TcSetFlow(pFlowName: LPWSTR; const pGuidParam: GUID; BufferSize: GUID; Buffer: PVOID): ULONG; stdcall;
  475. {$EXTERNALSYM TcSetFlow}
  476. function TcGetFlowName(FlowHandle: HANDLE; StrSize: ULONG; pFlowName: LPWSTR): ULONG; stdcall;
  477. {$EXTERNALSYM TcGetFlowName}
  478. {$ELSE}
  479. function TcOpenInterface(pInterfaceName: LPSTR; ClientHandle, ClIfcCtx: HANDLE; var pIfcHandle: HANDLE): ULONG; stdcall;
  480. {$EXTERNALSYM TcOpenInterface}
  481. function TcQueryFlow(pFlowName: LPSTR; const pGuidParam: GUID; var pBufferSize: ULONG; Buffer: PVOID): ULONG; stdcall;
  482. {$EXTERNALSYM TcQueryFlow}
  483. function TcSetFlow(pFlowName: LPSTR; const pGuidParam: GUID; BufferSize: GUID; Buffer: PVOID): ULONG; stdcall;
  484. {$EXTERNALSYM TcSetFlow}
  485. function TcGetFlowName(FlowHandle: HANDLE; StrSize: ULONG; pFlowName: LPSTR): ULONG; stdcall;
  486. {$EXTERNALSYM TcGetFlowName}
  487. {$ENDIF}
  488. implementation
  489. const
  490.   traffic_lib = 'traffic.dll';
  491. {$IFDEF DYNAMIC_LINK}
  492. var
  493.   _TcRegisterClient: Pointer;
  494. function TcRegisterClient;
  495. begin
  496.   GetProcedureAddress(_TcRegisterClient, traffic_lib, 'TcRegisterClient');
  497.   asm
  498.     mov esp, ebp
  499.     pop ebp
  500.     jmp [_TcRegisterClient]
  501.   end;
  502. end;
  503. {$ELSE}
  504. function TcRegisterClient; external traffic_lib name 'TcRegisterClient';
  505. {$ENDIF DYNAMIC_LINK}
  506. {$IFDEF DYNAMIC_LINK}
  507. var
  508.   _TcEnumerateInterfaces: Pointer;
  509. function TcEnumerateInterfaces;
  510. begin
  511.   GetProcedureAddress(_TcEnumerateInterfaces, traffic_lib, 'TcEnumerateInterfaces');
  512.   asm
  513.     mov esp, ebp
  514.     pop ebp
  515.     jmp [_TcEnumerateInterfaces]
  516.   end;
  517. end;
  518. {$ELSE}
  519. function TcEnumerateInterfaces; external traffic_lib name 'TcEnumerateInterfaces';
  520. {$ENDIF DYNAMIC_LINK}
  521. {$IFDEF DYNAMIC_LINK}
  522. var
  523.   _TcOpenInterfaceA: Pointer;
  524. function TcOpenInterfaceA;
  525. begin
  526.   GetProcedureAddress(_TcOpenInterfaceA, traffic_lib, 'TcOpenInterfaceA');
  527.   asm
  528.     mov esp, ebp
  529.     pop ebp
  530.     jmp [_TcOpenInterfaceA]
  531.   end;
  532. end;
  533. {$ELSE}
  534. function TcOpenInterfaceA; external traffic_lib name 'TcOpenInterfaceA';
  535. {$ENDIF DYNAMIC_LINK}
  536. {$IFDEF DYNAMIC_LINK}
  537. var
  538.   _TcOpenInterfaceW: Pointer;
  539. function TcOpenInterfaceW;
  540. begin
  541.   GetProcedureAddress(_TcOpenInterfaceW, traffic_lib, 'TcOpenInterfaceW');
  542.   asm
  543.     mov esp, ebp
  544.     pop ebp
  545.     jmp [_TcOpenInterfaceW]
  546.   end;
  547. end;
  548. {$ELSE}
  549. function TcOpenInterfaceW; external traffic_lib name 'TcOpenInterfaceW';
  550. {$ENDIF DYNAMIC_LINK}
  551. {$IFDEF DYNAMIC_LINK}
  552. var
  553.   _TcCloseInterface: Pointer;
  554. function TcCloseInterface;
  555. begin
  556.   GetProcedureAddress(_TcCloseInterface, traffic_lib, 'TcCloseInterface');
  557.   asm
  558.     mov esp, ebp
  559.     pop ebp
  560.     jmp [_TcCloseInterface]
  561.   end;
  562. end;
  563. {$ELSE}
  564. function TcCloseInterface; external traffic_lib name 'TcCloseInterface';
  565. {$ENDIF DYNAMIC_LINK}
  566. {$IFDEF DYNAMIC_LINK}
  567. var
  568.   _TcQueryInterface: Pointer;
  569. function TcQueryInterface;
  570. begin
  571.   GetProcedureAddress(_TcQueryInterface, traffic_lib, 'TcQueryInterface');
  572.   asm
  573.     mov esp, ebp
  574.     pop ebp
  575.     jmp [_TcQueryInterface]
  576.   end;
  577. end;
  578. {$ELSE}
  579. function TcQueryInterface; external traffic_lib name 'TcQueryInterface';
  580. {$ENDIF DYNAMIC_LINK}
  581. {$IFDEF DYNAMIC_LINK}
  582. var
  583.   _TcSetInterface: Pointer;
  584. function TcSetInterface;
  585. begin
  586.   GetProcedureAddress(_TcSetInterface, traffic_lib, 'TcSetInterface');
  587.   asm
  588.     mov esp, ebp
  589.     pop ebp
  590.     jmp [_TcSetInterface]
  591.   end;
  592. end;
  593. {$ELSE}
  594. function TcSetInterface; external traffic_lib name 'TcSetInterface';
  595. {$ENDIF DYNAMIC_LINK}
  596. {$IFDEF DYNAMIC_LINK}
  597. var
  598.   _TcQueryFlowA: Pointer;
  599. function TcQueryFlowA;
  600. begin
  601.   GetProcedureAddress(_TcQueryFlowA, traffic_lib, 'TcQueryFlowA');
  602.   asm
  603.     mov esp, ebp
  604.     pop ebp
  605.     jmp [_TcQueryFlowA]
  606.   end;
  607. end;
  608. {$ELSE}
  609. function TcQueryFlowA; external traffic_lib name 'TcQueryFlowA';
  610. {$ENDIF DYNAMIC_LINK}
  611. {$IFDEF DYNAMIC_LINK}
  612. var
  613.   _TcQueryFlowW: Pointer;
  614. function TcQueryFlowW;
  615. begin
  616.   GetProcedureAddress(_TcQueryFlowW, traffic_lib, 'TcQueryFlowW');
  617.   asm
  618.     mov esp, ebp
  619.     pop ebp
  620.     jmp [_TcQueryFlowW]
  621.   end;
  622. end;
  623. {$ELSE}
  624. function TcQueryFlowW; external traffic_lib name 'TcQueryFlowW';
  625. {$ENDIF DYNAMIC_LINK}
  626. {$IFDEF DYNAMIC_LINK}
  627. var
  628.   _TcSetFlowA: Pointer;
  629. function TcSetFlowA;
  630. begin
  631.   GetProcedureAddress(_TcSetFlowA, traffic_lib, 'TcSetFlowA');
  632.   asm
  633.     mov esp, ebp
  634.     pop ebp
  635.     jmp [_TcSetFlowA]
  636.   end;
  637. end;
  638. {$ELSE}
  639. function TcSetFlowA; external traffic_lib name 'TcSetFlowA';
  640. {$ENDIF DYNAMIC_LINK}
  641. {$IFDEF DYNAMIC_LINK}
  642. var
  643.   _TcSetFlowW: Pointer;
  644. function TcSetFlowW;
  645. begin
  646.   GetProcedureAddress(_TcSetFlowW, traffic_lib, 'TcSetFlowW');
  647.   asm
  648.     mov esp, ebp
  649.     pop ebp
  650.     jmp [_TcSetFlowW]
  651.   end;
  652. end;
  653. {$ELSE}
  654. function TcSetFlowW; external traffic_lib name 'TcSetFlowW';
  655. {$ENDIF DYNAMIC_LINK}
  656. {$IFDEF DYNAMIC_LINK}
  657. var
  658.   _TcAddFlow: Pointer;
  659. function TcAddFlow;
  660. begin
  661.   GetProcedureAddress(_TcAddFlow, traffic_lib, 'TcAddFlow');
  662.   asm
  663.     mov esp, ebp
  664.     pop ebp
  665.     jmp [_TcAddFlow]
  666.   end;
  667. end;
  668. {$ELSE}
  669. function TcAddFlow; external traffic_lib name 'TcAddFlow';
  670. {$ENDIF DYNAMIC_LINK}
  671. {$IFDEF DYNAMIC_LINK}
  672. var
  673.   _TcGetFlowNameA: Pointer;
  674. function TcGetFlowNameA;
  675. begin
  676.   GetProcedureAddress(_TcGetFlowNameA, traffic_lib, 'TcGetFlowNameA');
  677.   asm
  678.     mov esp, ebp
  679.     pop ebp
  680.     jmp [_TcGetFlowNameA]
  681.   end;
  682. end;
  683. {$ELSE}
  684. function TcGetFlowNameA; external traffic_lib name 'TcGetFlowNameA';
  685. {$ENDIF DYNAMIC_LINK}
  686. {$IFDEF DYNAMIC_LINK}
  687. var
  688.   _TcGetFlowNameW: Pointer;
  689. function TcGetFlowNameW;
  690. begin
  691.   GetProcedureAddress(_TcGetFlowNameW, traffic_lib, 'TcGetFlowNameW');
  692.   asm
  693.     mov esp, ebp
  694.     pop ebp
  695.     jmp [_TcGetFlowNameW]
  696.   end;
  697. end;
  698. {$ELSE}
  699. function TcGetFlowNameW; external traffic_lib name 'TcGetFlowNameW';
  700. {$ENDIF DYNAMIC_LINK}
  701. {$IFDEF DYNAMIC_LINK}
  702. var
  703.   _TcModifyFlow: Pointer;
  704. function TcModifyFlow;
  705. begin
  706.   GetProcedureAddress(_TcModifyFlow, traffic_lib, 'TcModifyFlow');
  707.   asm
  708.     mov esp, ebp
  709.     pop ebp
  710.     jmp [_TcModifyFlow]
  711.   end;
  712. end;
  713. {$ELSE}
  714. function TcModifyFlow; external traffic_lib name 'TcModifyFlow';
  715. {$ENDIF DYNAMIC_LINK}
  716. {$IFDEF DYNAMIC_LINK}
  717. var
  718.   _TcAddFilter: Pointer;
  719. function TcAddFilter;
  720. begin
  721.   GetProcedureAddress(_TcAddFilter, traffic_lib, 'TcAddFilter');
  722.   asm
  723.     mov esp, ebp
  724.     pop ebp
  725.     jmp [_TcAddFilter]
  726.   end;
  727. end;
  728. {$ELSE}
  729. function TcAddFilter; external traffic_lib name 'TcAddFilter';
  730. {$ENDIF DYNAMIC_LINK}
  731. {$IFDEF DYNAMIC_LINK}
  732. var
  733.   _TcDeregisterClient: Pointer;
  734. function TcDeregisterClient;
  735. begin
  736.   GetProcedureAddress(_TcDeregisterClient, traffic_lib, 'TcDeregisterClient');
  737.   asm
  738.     mov esp, ebp
  739.     pop ebp
  740.     jmp [_TcDeregisterClient]
  741.   end;
  742. end;
  743. {$ELSE}
  744. function TcDeregisterClient; external traffic_lib name 'TcDeregisterClient';
  745. {$ENDIF DYNAMIC_LINK}
  746. {$IFDEF DYNAMIC_LINK}
  747. var
  748.   _TcDeleteFlow: Pointer;
  749. function TcDeleteFlow;
  750. begin
  751.   GetProcedureAddress(_TcDeleteFlow, traffic_lib, 'TcDeleteFlow');
  752.   asm
  753.     mov esp, ebp
  754.     pop ebp
  755.     jmp [_TcDeleteFlow]
  756.   end;
  757. end;
  758. {$ELSE}
  759. function TcDeleteFlow; external traffic_lib name 'TcDeleteFlow';
  760. {$ENDIF DYNAMIC_LINK}
  761. {$IFDEF DYNAMIC_LINK}
  762. var
  763.   _TcDeleteFilter: Pointer;
  764. function TcDeleteFilter;
  765. begin
  766.   GetProcedureAddress(_TcDeleteFilter, traffic_lib, 'TcDeleteFilter');
  767.   asm
  768.     mov esp, ebp
  769.     pop ebp
  770.     jmp [_TcDeleteFilter]
  771.   end;
  772. end;
  773. {$ELSE}
  774. function TcDeleteFilter; external traffic_lib name 'TcDeleteFilter';
  775. {$ENDIF DYNAMIC_LINK}
  776. {$IFDEF DYNAMIC_LINK}
  777. var
  778.   _TcEnumerateFlows: Pointer;
  779. function TcEnumerateFlows;
  780. begin
  781.   GetProcedureAddress(_TcEnumerateFlows, traffic_lib, 'TcEnumerateFlows');
  782.   asm
  783.     mov esp, ebp
  784.     pop ebp
  785.     jmp [_TcEnumerateFlows]
  786.   end;
  787. end;
  788. {$ELSE}
  789. function TcEnumerateFlows; external traffic_lib name 'TcEnumerateFlows';
  790. {$ENDIF DYNAMIC_LINK}
  791. {$IFDEF UNICODE}
  792. {$IFDEF DYNAMIC_LINK}
  793. var
  794.   _TcOpenInterface: Pointer;
  795. function TcOpenInterface;
  796. begin
  797.   GetProcedureAddress(_TcOpenInterface, traffic_lib, 'TcOpenInterfaceW');
  798.   asm
  799.     mov esp, ebp
  800.     pop ebp
  801.     jmp [_TcOpenInterface]
  802.   end;
  803. end;
  804. {$ELSE}
  805. function TcOpenInterface; external traffic_lib name 'TcOpenInterfaceW';
  806. {$ENDIF DYNAMIC_LINK}
  807. {$IFDEF DYNAMIC_LINK}
  808. var
  809.   _TcQueryFlow: Pointer;
  810. function TcQueryFlow;
  811. begin
  812.   GetProcedureAddress(_TcQueryFlow, traffic_lib, 'TcQueryFlowW');
  813.   asm
  814.     mov esp, ebp
  815.     pop ebp
  816.     jmp [_TcQueryFlow]
  817.   end;
  818. end;
  819. {$ELSE}
  820. function TcQueryFlow; external traffic_lib name 'TcQueryFlowW';
  821. {$ENDIF DYNAMIC_LINK}
  822. {$IFDEF DYNAMIC_LINK}
  823. var
  824.   _TcSetFlow: Pointer;
  825. function TcSetFlow;
  826. begin
  827.   GetProcedureAddress(_TcSetFlow, traffic_lib, 'TcSetFlowW');
  828.   asm
  829.     mov esp, ebp
  830.     pop ebp
  831.     jmp [_TcSetFlow]
  832.   end;
  833. end;
  834. {$ELSE}
  835. function TcSetFlow; external traffic_lib name 'TcSetFlowW';
  836. {$ENDIF DYNAMIC_LINK}
  837. {$IFDEF DYNAMIC_LINK}
  838. var
  839.   _TcGetFlowName: Pointer;
  840. function TcGetFlowName;
  841. begin
  842.   GetProcedureAddress(_TcGetFlowName, traffic_lib, 'TcGetFlowNameW');
  843.   asm
  844.     mov esp, ebp
  845.     pop ebp
  846.     jmp [_TcGetFlowName]
  847.   end;
  848. end;
  849. {$ELSE}
  850. function TcGetFlowName; external traffic_lib name 'TcGetFlowNameW';
  851. {$ENDIF DYNAMIC_LINK}
  852. {$ELSE}
  853. {$IFDEF DYNAMIC_LINK}
  854. var
  855.   _TcOpenInterface: Pointer;
  856. function TcOpenInterface;
  857. begin
  858.   GetProcedureAddress(_TcOpenInterface, traffic_lib, 'TcOpenInterfaceA');
  859.   asm
  860.     mov esp, ebp
  861.     pop ebp
  862.     jmp [_TcOpenInterface]
  863.   end;
  864. end;
  865. {$ELSE}
  866. function TcOpenInterface; external traffic_lib name 'TcOpenInterfaceA';
  867. {$ENDIF DYNAMIC_LINK}
  868. {$IFDEF DYNAMIC_LINK}
  869. var
  870.   _TcQueryFlow: Pointer;
  871. function TcQueryFlow;
  872. begin
  873.   GetProcedureAddress(_TcQueryFlow, traffic_lib, 'TcQueryFlowA');
  874.   asm
  875.     mov esp, ebp
  876.     pop ebp
  877.     jmp [_TcQueryFlow]
  878.   end;
  879. end;
  880. {$ELSE}
  881. function TcQueryFlow; external traffic_lib name 'TcQueryFlowA';
  882. {$ENDIF DYNAMIC_LINK}
  883. {$IFDEF DYNAMIC_LINK}
  884. var
  885.   _TcSetFlow: Pointer;
  886. function TcSetFlow;
  887. begin
  888.   GetProcedureAddress(_TcSetFlow, traffic_lib, 'TcSetFlowA');
  889.   asm
  890.     mov esp, ebp
  891.     pop ebp
  892.     jmp [_TcSetFlow]
  893.   end;
  894. end;
  895. {$ELSE}
  896. function TcSetFlow; external traffic_lib name 'TcSetFlowA';
  897. {$ENDIF DYNAMIC_LINK}
  898. {$IFDEF DYNAMIC_LINK}
  899. var
  900.   _TcGetFlowName: Pointer;
  901. function TcGetFlowName;
  902. begin
  903.   GetProcedureAddress(_TcGetFlowName, traffic_lib, 'TcGetFlowNameA');
  904.   asm
  905.     mov esp, ebp
  906.     pop ebp
  907.     jmp [_TcGetFlowName]
  908.   end;
  909. end;
  910. {$ELSE}
  911. function TcGetFlowName; external traffic_lib name 'TcGetFlowNameA';
  912. {$ENDIF DYNAMIC_LINK}
  913. {$ENDIF}
  914. end.