1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef __TRAFFIC_H
7 #define __TRAFFIC_H
8 
9 #include <_mingw_unicode.h>
10 #include <ntddndis.h>
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 #define CURRENT_TCI_VERSION 0x0002
17 
18 #define TC_NOTIFY_IFC_UP 1
19 #define TC_NOTIFY_IFC_CLOSE 2
20 #define TC_NOTIFY_IFC_CHANGE 3
21 #define TC_NOTIFY_PARAM_CHANGED 4
22 #define TC_NOTIFY_FLOW_CLOSE 5
23 #define TC_INVALID_HANDLE ((HANDLE)0)
24 
25 #define MAX_STRING_LENGTH 256
26 
27 #ifndef CALLBACK
28 #if defined(_ARM_)
29 #define CALLBACK
30 #else
31 #define CALLBACK __stdcall
32 #endif
33 #endif
34 
35 #ifndef WINAPI
36 #if defined(_ARM_)
37 #define WINAPI
38 #else
39 #define WINAPI __stdcall
40 #endif
41 #endif
42 
43 #ifndef APIENTRY
44 #define APIENTRY WINAPI
45 #endif
46 
47   typedef VOID (CALLBACK *TCI_NOTIFY_HANDLER)(HANDLE ClRegCtx,HANDLE ClIfcCtx,ULONG Event,HANDLE SubCode,ULONG BufSize,PVOID Buffer);
48   typedef VOID (CALLBACK *TCI_ADD_FLOW_COMPLETE_HANDLER)(HANDLE ClFlowCtx,ULONG Status);
49   typedef VOID (CALLBACK *TCI_MOD_FLOW_COMPLETE_HANDLER)(HANDLE ClFlowCtx,ULONG Status);
50   typedef VOID (CALLBACK *TCI_DEL_FLOW_COMPLETE_HANDLER)(HANDLE ClFlowCtx,ULONG Status);
51 
52   typedef struct _TCI_CLIENT_FUNC_LIST {
53     TCI_NOTIFY_HANDLER ClNotifyHandler;
54     TCI_ADD_FLOW_COMPLETE_HANDLER ClAddFlowCompleteHandler;
55     TCI_MOD_FLOW_COMPLETE_HANDLER ClModifyFlowCompleteHandler;
56     TCI_DEL_FLOW_COMPLETE_HANDLER ClDeleteFlowCompleteHandler;
57   } TCI_CLIENT_FUNC_LIST,*PTCI_CLIENT_FUNC_LIST;
58 
59   typedef struct _ADDRESS_LIST_DESCRIPTOR {
60     ULONG MediaType;
61     NETWORK_ADDRESS_LIST AddressList;
62   } ADDRESS_LIST_DESCRIPTOR,*PADDRESS_LIST_DESCRIPTOR;
63 
64   typedef struct _TC_IFC_DESCRIPTOR {
65     ULONG Length;
66     LPWSTR pInterfaceName;
67     LPWSTR pInterfaceID;
68     ADDRESS_LIST_DESCRIPTOR AddressListDesc;
69   } TC_IFC_DESCRIPTOR,*PTC_IFC_DESCRIPTOR;
70 
71   typedef struct _TC_SUPPORTED_INFO_BUFFER {
72     USHORT InstanceIDLength;
73     WCHAR InstanceID[MAX_STRING_LENGTH];
74     ADDRESS_LIST_DESCRIPTOR AddrListDesc;
75   } TC_SUPPORTED_INFO_BUFFER,*PTC_SUPPORTED_INFO_BUFFER;
76 
77   typedef struct _TC_GEN_FILTER {
78     USHORT AddressType;
79     ULONG PatternSize;
80     PVOID Pattern;
81     PVOID Mask;
82   } TC_GEN_FILTER,*PTC_GEN_FILTER;
83 
84   typedef struct _TC_GEN_FLOW {
85     FLOWSPEC SendingFlowspec;
86     FLOWSPEC ReceivingFlowspec;
87     ULONG TcObjectsLength;
88     QOS_OBJECT_HDR TcObjects[1];
89   } TC_GEN_FLOW,*PTC_GEN_FLOW;
90 
91   typedef struct _IP_PATTERN {
92     ULONG Reserved1;
93     ULONG Reserved2;
94     ULONG SrcAddr;
95     ULONG DstAddr;
96     union {
97       struct { USHORT s_srcport,s_dstport; } S_un_ports;
98       struct { UCHAR s_type,s_code; USHORT filler; } S_un_icmp;
99       ULONG S_Spi;
100     } S_un;
101     UCHAR ProtocolId;
102     UCHAR Reserved3[3];
103   } IP_PATTERN,*PIP_PATTERN;
104 
105 #define tcSrcPort S_un.S_un_ports.s_srcport
106 #define tcDstPort S_un.S_un_ports.s_dstport
107 #define tcIcmpType S_un.S_un_icmp.s_type
108 #define tcIcmpCode S_un.S_un_icmp.s_code
109 #define tcSpi S_un.S_Spi
110 
111   typedef struct _IPX_PATTERN {
112     struct {
113       ULONG NetworkAddress;
114       UCHAR NodeAddress[6];
115       USHORT Socket;
116     } Src,Dest;
117   } IPX_PATTERN,*PIPX_PATTERN;
118 
119   typedef struct _ENUMERATION_BUFFER {
120     ULONG Length;
121     ULONG OwnerProcessId;
122     USHORT FlowNameLength;
123     WCHAR FlowName[MAX_STRING_LENGTH];
124     PTC_GEN_FLOW pFlow;
125     ULONG NumberOfFilters;
126     TC_GEN_FILTER GenericFilter[1];
127   } ENUMERATION_BUFFER,*PENUMERATION_BUFFER;
128 
129 #define QOS_TRAFFIC_GENERAL_ID_BASE 4000
130 #define QOS_OBJECT_DS_CLASS (0x00000001 + QOS_TRAFFIC_GENERAL_ID_BASE)
131 #define QOS_OBJECT_TRAFFIC_CLASS (0x00000002 + QOS_TRAFFIC_GENERAL_ID_BASE)
132 #define QOS_OBJECT_DIFFSERV (0x00000003 + QOS_TRAFFIC_GENERAL_ID_BASE)
133 #define QOS_OBJECT_TCP_TRAFFIC (0x00000004 + QOS_TRAFFIC_GENERAL_ID_BASE)
134 #define QOS_OBJECT_FRIENDLY_NAME (0x00000005 + QOS_TRAFFIC_GENERAL_ID_BASE)
135 
136   typedef struct _QOS_FRIENDLY_NAME {
137     QOS_OBJECT_HDR ObjectHdr;
138     WCHAR FriendlyName[MAX_STRING_LENGTH];
139   } QOS_FRIENDLY_NAME,*LPQOS_FRIENDLY_NAME;
140 
141   typedef struct _QOS_TRAFFIC_CLASS {
142     QOS_OBJECT_HDR ObjectHdr;
143     ULONG TrafficClass;
144   } QOS_TRAFFIC_CLASS,*LPQOS_TRAFFIC_CLASS;
145 
146   typedef struct _QOS_DS_CLASS {
147     QOS_OBJECT_HDR ObjectHdr;
148     ULONG DSField;
149   } QOS_DS_CLASS,*LPQOS_DS_CLASS;
150 
151   typedef struct _QOS_DIFFSERV {
152     QOS_OBJECT_HDR ObjectHdr;
153     ULONG DSFieldCount;
154     UCHAR DiffservRule[1];
155   } QOS_DIFFSERV,*LPQOS_DIFFSERV;
156 
157   typedef struct _QOS_DIFFSERV_RULE {
158     UCHAR InboundDSField;
159     UCHAR ConformingOutboundDSField;
160     UCHAR NonConformingOutboundDSField;
161     UCHAR ConformingUserPriority;
162     UCHAR NonConformingUserPriority;
163   } QOS_DIFFSERV_RULE,*LPQOS_DIFFSERV_RULE;
164 
165   typedef struct _QOS_TCP_TRAFFIC {
166     QOS_OBJECT_HDR ObjectHdr;
167   } QOS_TCP_TRAFFIC,*LPQOS_TCP_TRAFFIC;
168 
169 #define TcOpenInterface __MINGW_NAME_AW(TcOpenInterface)
170 #define TcQueryFlow __MINGW_NAME_AW(TcQueryFlow)
171 #define TcSetFlow __MINGW_NAME_AW(TcSetFlow)
172 #define TcGetFlowName __MINGW_NAME_AW(TcGetFlowName)
173 
174   ULONG WINAPI TcRegisterClient(ULONG TciVersion,HANDLE ClRegCtx,PTCI_CLIENT_FUNC_LIST ClientHandlerList,PHANDLE pClientHandle);
175   ULONG WINAPI TcEnumerateInterfaces(HANDLE ClientHandle,PULONG pBufferSize,PTC_IFC_DESCRIPTOR InterfaceBuffer);
176   ULONG WINAPI TcOpenInterfaceA(LPSTR pInterfaceName,HANDLE ClientHandle,HANDLE ClIfcCtx,PHANDLE pIfcHandle);
177   ULONG WINAPI TcOpenInterfaceW(LPWSTR pInterfaceName,HANDLE ClientHandle,HANDLE ClIfcCtx,PHANDLE pIfcHandle);
178   ULONG WINAPI TcCloseInterface(HANDLE IfcHandle);
179   ULONG WINAPI TcQueryInterface(HANDLE IfcHandle,LPGUID pGuidParam,BOOLEAN NotifyChange,PULONG pBufferSize,PVOID Buffer);
180   ULONG WINAPI TcSetInterface(HANDLE IfcHandle,LPGUID pGuidParam,ULONG BufferSize,PVOID Buffer);
181   ULONG WINAPI TcQueryFlowA(LPSTR pFlowName,LPGUID pGuidParam,PULONG pBufferSize,PVOID Buffer);
182   ULONG WINAPI TcQueryFlowW(LPWSTR pFlowName,LPGUID pGuidParam,PULONG pBufferSize,PVOID Buffer);
183   ULONG WINAPI TcSetFlowA(LPSTR pFlowName,LPGUID pGuidParam,ULONG BufferSize,PVOID Buffer);
184   ULONG WINAPI TcSetFlowW(LPWSTR pFlowName,LPGUID pGuidParam,ULONG BufferSize,PVOID Buffer);
185   ULONG WINAPI TcAddFlow(HANDLE IfcHandle,HANDLE ClFlowCtx,ULONG Flags,PTC_GEN_FLOW pGenericFlow,PHANDLE pFlowHandle);
186   ULONG WINAPI TcGetFlowNameA(HANDLE FlowHandle,ULONG StrSize,LPSTR pFlowName);
187   ULONG WINAPI TcGetFlowNameW(HANDLE FlowHandle,ULONG StrSize,LPWSTR pFlowName);
188   ULONG WINAPI TcModifyFlow(HANDLE FlowHandle,PTC_GEN_FLOW pGenericFlow);
189   ULONG WINAPI TcAddFilter(HANDLE FlowHandle,PTC_GEN_FILTER pGenericFilter,PHANDLE pFilterHandle);
190   ULONG WINAPI TcDeregisterClient(HANDLE ClientHandle);
191   ULONG WINAPI TcDeleteFlow(HANDLE FlowHandle);
192   ULONG WINAPI TcDeleteFilter(HANDLE FilterHandle);
193   ULONG WINAPI TcEnumerateFlows(HANDLE IfcHandle,PHANDLE pEnumHandle,PULONG pFlowCount,PULONG pBufSize,PENUMERATION_BUFFER Buffer);
194 
195 #ifdef __cplusplus
196 }
197 #endif
198 #endif
199