ReactOS 0.4.16-dev-297-gc569aee
ninfo.c File Reference
#include "precomp.h"
Include dependency graph for ninfo.c:

Go to the source code of this file.

Macros

#define IP_ROUTE_TYPE_ADD   3
 
#define IP_ROUTE_TYPE_DEL   2
 
#define ntohs(n)   ((((n) & 0xff) << 8) | (((n) & 0xff00) >> 8))
 

Functions

TDI_STATUS InfoTdiQueryGetRouteTable (PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize)
 
TDI_STATUS InfoTdiQueryGetAddrTable (TDIEntityID ID, PNDIS_BUFFER Buffer, PUINT BufferSize)
 
TDI_STATUS InfoTdiQueryGetIPSnmpInfo (TDIEntityID ID, PIP_INTERFACE IF, PNDIS_BUFFER Buffer, PUINT BufferSize)
 
TDI_STATUS InfoTdiQueryGetConnectionTcpTable (PADDRESS_FILE AddrFile, PNDIS_BUFFER Buffer, PUINT BufferSize, TDI_TCPUDP_CLASS_INFO Class)
 
TDI_STATUS InfoTdiQueryGetConnectionUdpTable (PADDRESS_FILE AddrFile, PNDIS_BUFFER Buffer, PUINT BufferSize, TDI_TCPUDP_CLASS_INFO Class)
 
TDI_STATUS InfoTdiSetRoute (PIP_INTERFACE IF, PVOID Buffer, UINT BufferSize)
 

Macro Definition Documentation

◆ IP_ROUTE_TYPE_ADD

#define IP_ROUTE_TYPE_ADD   3

Definition at line 13 of file ninfo.c.

◆ IP_ROUTE_TYPE_DEL

#define IP_ROUTE_TYPE_DEL   2

Definition at line 14 of file ninfo.c.

◆ ntohs

#define ntohs (   n)    ((((n) & 0xff) << 8) | (((n) & 0xff00) >> 8))

Definition at line 180 of file ninfo.c.

Function Documentation

◆ InfoTdiQueryGetAddrTable()

TDI_STATUS InfoTdiQueryGetAddrTable ( TDIEntityID  ID,
PNDIS_BUFFER  Buffer,
PUINT  BufferSize 
)

Definition at line 98 of file ninfo.c.

101{
103 PIPADDR_ENTRY IPEntry;
104 PIP_INTERFACE CurrentIF;
105 UINT i;
106
107 TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
108
109
111
112 for (i = 0; i < EntityCount; i++)
113 {
114 if (EntityList[i].tei_entity == ID.tei_entity &&
115 EntityList[i].tei_instance == ID.tei_instance)
116 break;
117 }
118
119 if (i == EntityCount)
120 {
123 }
124
126 if (!IPEntry)
127 {
129 return TDI_NO_RESOURCES;
130 }
131
132 CurrentIF = EntityList[i].context;
133
134 IPEntry->Index = CurrentIF->Index;
135 GetInterfaceIPv4Address(CurrentIF,
137 &IPEntry->Addr);
138 GetInterfaceIPv4Address(CurrentIF,
140 &IPEntry->Mask);
141 GetInterfaceIPv4Address(CurrentIF,
143 &IPEntry->BcastAddr);
144
146
147 InfoCopyOut((PCHAR)IPEntry, sizeof(IPADDR_ENTRY),
149
151
152 return TDI_SUCCESS;
153}
Definition: bufpool.h:45
#define DEBUG_INFO
Definition: debug.h:33
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
#define ADE_BROADCAST
Definition: ip.h:111
#define ADE_UNICAST
Definition: ip.h:110
#define ADE_ADDRMASK
Definition: ip.h:112
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
#define IP_ADDRESS_TAG
Definition: tags.h:18
ULONG EntityCount
Definition: main.c:28
TDIEntityInfo * EntityList
Definition: main.c:27
KSPIN_LOCK EntityListLock
Definition: main.c:26
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define NonPagedPool
Definition: env_spec_w32.h:307
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
TDI_STATUS InfoCopyOut(PCHAR DataOut, UINT SizeOut, PNDIS_BUFFER ClientBuf, PUINT ClientBufSize)
Definition: info.c:97
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
unsigned int UINT
Definition: ndis.h:50
NTSTATUS GetInterfaceIPv4Address(PIP_INTERFACE Interface, ULONG Type, PULONG Address)
Definition: interface.c:19
#define ID
Definition: ruserpass.c:36
Definition: afd.h:56
ULONG BcastAddr
Definition: afd.h:60
ULONG Mask
Definition: afd.h:59
ULONG Addr
Definition: afd.h:57
ULONG Index
Definition: afd.h:58
UINT tei_instance
Definition: tcpip.h:147
PVOID context
Definition: tcpip.h:148
UINT Index
Definition: ip.h:167
#define TDI_SUCCESS
Definition: tdistat.h:30
#define TDI_NO_RESOURCES
Definition: tdistat.h:31
#define TDI_INVALID_PARAMETER
Definition: tdistat.h:52
char * PCHAR
Definition: typedefs.h:51
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by InfoTdiQueryInformationEx().

◆ InfoTdiQueryGetConnectionTcpTable()

TDI_STATUS InfoTdiQueryGetConnectionTcpTable ( PADDRESS_FILE  AddrFile,
PNDIS_BUFFER  Buffer,
PUINT  BufferSize,
TDI_TCPUDP_CLASS_INFO  Class 
)

Definition at line 182 of file ninfo.c.

186{
187 SIZE_T Size;
190
191 TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
192
194 {
195 Size = sizeof(MIB_TCPROW_OWNER_PID);
196 }
197 else if (Class == TcpUdpClassOwner)
198 {
200 }
201 else
202 {
203 Size = sizeof(MIB_TCPROW);
204 }
205
206 TcpRow.dwOwningPid = HandleToUlong(AddrFile->ProcessId);
207 TcpRow.liCreateTimestamp = AddrFile->CreationTime;
208
209 if (AddrFile->Listener != NULL)
210 {
211 PADDRESS_FILE EndPoint;
212
213 EndPoint = AddrFile->Listener->AddressFile;
214
216 TcpRow.dwLocalAddr = AddrFile->Address.Address.IPv4Address;
217 TcpRow.dwLocalPort = AddrFile->Port;
218 TcpRow.dwRemoteAddr = EndPoint->Address.Address.IPv4Address;
219 TcpRow.dwRemotePort = EndPoint->Port;
220
222 }
223 else if (AddrFile->Connection != NULL &&
224 AddrFile->Connection->SocketContext != NULL)
225 {
226 TA_IP_ADDRESS EndPoint;
227
229 if (NT_SUCCESS(Status))
230 {
231 ASSERT(EndPoint.TAAddressCount >= 1);
232 ASSERT(EndPoint.Address[0].AddressLength == TDI_ADDRESS_LENGTH_IP);
233 TcpRow.dwLocalAddr = EndPoint.Address[0].Address[0].in_addr;
234 TcpRow.dwLocalPort = ntohs(EndPoint.Address[0].Address[0].sin_port);
235
237 if (NT_SUCCESS(Status))
238 {
239 ASSERT(EndPoint.TAAddressCount >= 1);
240 ASSERT(EndPoint.Address[0].AddressLength == TDI_ADDRESS_LENGTH_IP);
241 TcpRow.dwRemoteAddr = EndPoint.Address[0].Address[0].in_addr;
242 TcpRow.dwRemotePort = ntohs(EndPoint.Address[0].Address[0].sin_port);
243
244 Status = TCPGetSocketStatus(AddrFile->Connection, &TcpRow.dwState);
246 }
247 }
248 }
249
250 if (NT_SUCCESS(Status))
251 {
252 if (Class == TcpUdpClassOwner)
253 {
254 RtlZeroMemory(&TcpRow.OwningModuleInfo[0], sizeof(TcpRow.OwningModuleInfo));
255 TcpRow.OwningModuleInfo[0] = (ULONG_PTR)AddrFile->SubProcessTag;
256 }
257
258 Status = InfoCopyOut( (PCHAR)&TcpRow, Size,
260 }
261
262 TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
263
264 return Status;
265}
#define HandleToUlong(h)
Definition: basetsd.h:79
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ULONG_PTR
Definition: config.h:101
Status
Definition: gdiplustypes.h:25
NTSTATUS TCPGetSocketStatus(PCONNECTION_ENDPOINT Connection, PULONG State)
Definition: tcp.c:749
NTSTATUS TCPGetSockAddress(PCONNECTION_ENDPOINT Connection, PTRANSPORT_ADDRESS TransportAddress, BOOLEAN RemoteAddress)
Definition: tcp.c:658
@ TcpUdpClassOwnerPid
Definition: info.h:85
@ TcpUdpClassOwner
Definition: info.h:86
#define ASSERT(a)
Definition: mode.c:44
#define ntohs(n)
Definition: ninfo.c:180
union IP_ADDRESS::@1014 Address
IPv4_RAW_ADDRESS IPv4Address
Definition: ip.h:26
struct _CONNECTION_ENDPOINT * Connection
Definition: titypes.h:131
HANDLE ProcessId
Definition: titypes.h:137
USHORT Port
Definition: titypes.h:120
IP_ADDRESS Address
Definition: titypes.h:117
LARGE_INTEGER CreationTime
Definition: titypes.h:139
struct _CONNECTION_ENDPOINT * Listener
Definition: titypes.h:133
PVOID SubProcessTag
Definition: titypes.h:138
LARGE_INTEGER liCreateTimestamp
Definition: tcpmib.h:126
ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE]
Definition: tcpmib.h:127
struct _TA_ADDRESS_IP::_AddrIp Address[1]
LONG TAAddressCount
Definition: tdi.h:523
struct _MIB_TCPROW MIB_TCPROW
struct _MIB_TCPROW_OWNER_PID MIB_TCPROW_OWNER_PID
@ MIB_TCP_STATE_LISTEN
Definition: tcpmib.h:29
struct _MIB_TCPROW_OWNER_MODULE MIB_TCPROW_OWNER_MODULE
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
LONG TDI_STATUS
Definition: tdi.h:36
#define TDI_INVALID_REQUEST
Definition: tdistat.h:63
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

Referenced by InfoTdiQueryInformationEx().

◆ InfoTdiQueryGetConnectionUdpTable()

TDI_STATUS InfoTdiQueryGetConnectionUdpTable ( PADDRESS_FILE  AddrFile,
PNDIS_BUFFER  Buffer,
PUINT  BufferSize,
TDI_TCPUDP_CLASS_INFO  Class 
)

Definition at line 267 of file ninfo.c.

271{
272 SIZE_T Size;
275
276 TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
277
279 {
280 Size = sizeof(MIB_UDPROW_OWNER_PID);
281 }
282 else if (Class == TcpUdpClassOwner)
283 {
285 }
286 else
287 {
288 Size = sizeof(MIB_UDPROW);
289 }
290
291 UdpRow.dwLocalAddr = AddrFile->Address.Address.IPv4Address;
292 UdpRow.dwLocalPort = AddrFile->Port;
293 UdpRow.dwOwningPid = HandleToUlong(AddrFile->ProcessId);
294 UdpRow.liCreateTimestamp = AddrFile->CreationTime;
295 UdpRow.dwFlags = 0; /* FIXME */
296 if (Class == TcpUdpClassOwner)
297 {
298 RtlZeroMemory(&UdpRow.OwningModuleInfo[0], sizeof(UdpRow.OwningModuleInfo));
299 UdpRow.OwningModuleInfo[0] = (ULONG_PTR)AddrFile->SubProcessTag;
300 }
301
302 Status = InfoCopyOut( (PCHAR)&UdpRow,
304
305 TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
306
307 return Status;
308}
LARGE_INTEGER liCreateTimestamp
Definition: udpmib.h:56
ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE]
Definition: udpmib.h:65
struct _MIB_UDPROW_OWNER_MODULE MIB_UDPROW_OWNER_MODULE
struct _MIB_UDPROW_OWNER_PID MIB_UDPROW_OWNER_PID
struct _MIB_UDPROW MIB_UDPROW

Referenced by InfoTdiQueryInformationEx().

◆ InfoTdiQueryGetIPSnmpInfo()

TDI_STATUS InfoTdiQueryGetIPSnmpInfo ( TDIEntityID  ID,
PIP_INTERFACE  IF,
PNDIS_BUFFER  Buffer,
PUINT  BufferSize 
)

Definition at line 155 of file ninfo.c.

158 {
159 IPSNMPInfo SnmpInfo;
160 UINT IfCount = CountInterfaces();
161 UINT RouteCount = CountFIBs(IF);
163
164 TI_DbgPrint(DEBUG_INFO, ("Called.\n"));
165
166 RtlZeroMemory(&SnmpInfo, sizeof(SnmpInfo));
167
168 SnmpInfo.ipsi_numif = IfCount;
169 SnmpInfo.ipsi_numaddr = 1;
170 SnmpInfo.ipsi_numroutes = RouteCount;
171
172 Status = InfoCopyOut( (PCHAR)&SnmpInfo, sizeof(SnmpInfo),
174
175 TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
176
177 return Status;
178}
UINT CountInterfaces()
Definition: interface.c:46
UINT CountFIBs(PIP_INTERFACE IF)
Definition: router.c:101
ULONG ipsi_numif
Definition: tcpioctl.h:155
ULONG ipsi_numroutes
Definition: tcpioctl.h:157
ULONG ipsi_numaddr
Definition: tcpioctl.h:156

Referenced by InfoTdiQueryInformationEx().

◆ InfoTdiQueryGetRouteTable()

TDI_STATUS InfoTdiQueryGetRouteTable ( PIP_INTERFACE  IF,
PNDIS_BUFFER  Buffer,
PUINT  BufferSize 
)

Definition at line 17 of file ninfo.c.

17 {
20 UINT RtCount = CountFIBs(IF);
21 UINT Size = sizeof( IPROUTE_ENTRY ) * RtCount;
22 PFIB_ENTRY RCache, RCacheCur;
23 PIPROUTE_ENTRY RouteEntries, RtCurrent;
24 UINT i;
25
26 TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d\n",
27 RtCount));
28
29 if (RtCount == 0)
30 return InfoCopyOut(NULL, 0, NULL, BufferSize);
31
33 RtCurrent = RouteEntries;
34
35 RCache = ExAllocatePoolWithTag( NonPagedPool, sizeof( FIB_ENTRY ) * RtCount, FIB_TAG );
36 RCacheCur = RCache;
37
38 if( !RCache || !RouteEntries ) {
39 if( RCache ) ExFreePoolWithTag( RCache, FIB_TAG );
40 if( RouteEntries ) ExFreePoolWithTag( RouteEntries, ROUTE_ENTRY_TAG );
41 return TDI_NO_RESOURCES;
42 }
43
44 RtlZeroMemory( RouteEntries, Size );
45
46 RtCount = CopyFIBs( IF, RCache );
47
48 while( RtCurrent < RouteEntries + RtCount ) {
49 ASSERT(RCacheCur->Router);
50
51 RtlCopyMemory( &RtCurrent->Dest,
52 &RCacheCur->NetworkAddress.Address,
53 sizeof(RtCurrent->Dest) );
54 RtlCopyMemory( &RtCurrent->Mask,
55 &RCacheCur->Netmask.Address,
56 sizeof(RtCurrent->Mask) );
57 RtlCopyMemory( &RtCurrent->Gw,
58 &RCacheCur->Router->Address.Address,
59 sizeof(RtCurrent->Gw) );
60
61 RtCurrent->Metric1 = RCacheCur->Metric;
62 RtCurrent->Type = TDI_ADDRESS_TYPE_IP;
63
66 ("%d: NA %08x NM %08x GW %08x MT %x\n",
67 RtCurrent - RouteEntries,
68 RtCurrent->Dest,
69 RtCurrent->Mask,
70 RtCurrent->Gw,
71 RtCurrent->Metric1 ));
72
74 for (i = 0; i < EntityCount; i++)
75 if (EntityList[i].context == IF)
76 break;
77
78 if (i < EntityCount)
79 RtCurrent->Index = EntityList[i].tei_instance;
80 else
81 RtCurrent->Index = 0;
82
84
85 RtCurrent++; RCacheCur++;
86 }
87
88 Status = InfoCopyOut( (PCHAR)RouteEntries, Size, Buffer, BufferSize );
89
90 ExFreePoolWithTag( RouteEntries, ROUTE_ENTRY_TAG );
91 ExFreePoolWithTag( RCache, FIB_TAG );
92
93 TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status));
94
95 return Status;
96}
#define FIB_TAG
Definition: tags.h:29
#define ROUTE_ENTRY_TAG
Definition: tags.h:38
UINT CopyFIBs(PIP_INTERFACE IF, PFIB_ENTRY Target)
Definition: router.c:120
Definition: info.h:43
ULONG Dest
Definition: info.h:44
ULONG Index
Definition: info.h:45
ULONG Metric1
Definition: info.h:46
ULONG Gw
Definition: info.h:50
ULONG Type
Definition: info.h:51
ULONG Mask
Definition: info.h:54
IP_ADDRESS Address
Definition: neighbor.h:36
Definition: router.h:14
PNEIGHBOR_CACHE_ENTRY Router
Definition: router.h:19
UINT Metric
Definition: router.h:20
IP_ADDRESS Netmask
Definition: router.h:18
IP_ADDRESS NetworkAddress
Definition: router.h:17
Definition: http.c:7252
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by InfoTdiQueryInformationEx().

◆ InfoTdiSetRoute()

TDI_STATUS InfoTdiSetRoute ( PIP_INTERFACE  IF,
PVOID  Buffer,
UINT  BufferSize 
)

Definition at line 310 of file ninfo.c.

311{
312 IP_ADDRESS Address, Netmask, Router;
313 PIPROUTE_ENTRY Route = Buffer;
314
315 if (!Buffer || BufferSize < sizeof(IPROUTE_ENTRY))
317
318 AddrInitIPv4( &Address, Route->Dest );
319 AddrInitIPv4( &Netmask, Route->Mask );
320 AddrInitIPv4( &Router, Route->Gw );
321
322 if (IF == Loopback)
323 {
324 DbgPrint("Failing attempt to add route to loopback adapter\n");
326 }
327
328 if( Route->Type == IP_ROUTE_TYPE_ADD ) { /* Add the route */
329 TI_DbgPrint(DEBUG_INFO,("Adding route (%s)\n", A2S(&Address)));
330 if (!RouterCreateRoute( &Address, &Netmask, &Router,
331 IF, Route->Metric1))
332 return TDI_NO_RESOURCES;
333
334 return TDI_SUCCESS;
335 } else if( Route->Type == IP_ROUTE_TYPE_DEL ) {
336 TI_DbgPrint(DEBUG_INFO,("Removing route (%s)\n", A2S(&Address)));
337 if (NT_SUCCESS(RouterRemoveRoute( &Address, &Router )))
338 return TDI_SUCCESS;
339 else
341 }
342
343 return TDI_INVALID_REQUEST;
344}
#define AddrInitIPv4(IPAddress, RawAddress)
Definition: address.h:16
PCHAR A2S(PIP_ADDRESS Address)
Definition: address.c:17
#define DbgPrint
Definition: hal.h:12
PIP_INTERFACE Loopback
Definition: loopback.c:13
#define IP_ROUTE_TYPE_DEL
Definition: ninfo.c:14
#define IP_ROUTE_TYPE_ADD
Definition: ninfo.c:13
static WCHAR Address[46]
Definition: ping.c:68
PFIB_ENTRY RouterCreateRoute(PIP_ADDRESS NetworkAddress, PIP_ADDRESS Netmask, PIP_ADDRESS RouterAddress, PIP_INTERFACE Interface, UINT Metric)
Definition: router.c:421
NTSTATUS RouterRemoveRoute(PIP_ADDRESS Target, PIP_ADDRESS Router)
Definition: router.c:364
Definition: ip.h:23

Referenced by InfoTdiSetInformationEx().