Bitdefender Hypervisor Memory Introspection
intronet.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Bitdefender
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #include "intronet.h"
6 #include "guests.h"
7 
8 
9 _Success_(return > 0)
10 DWORD
12  _In_ const INTRO_NET_AF Family,
13  _In_ const INTRONET_ADDRESS *Address,
15  )
27 {
28  DWORD written = 0;
29 
30  if (NULL == Address || NULL == String)
31  {
32  return 0;
33  }
34 
35  if (introNetAfIpv4 == Family)
36  {
37  written = snprintf(String, INTRONET_MIN_BUFFER_SIZE, "%d.%d.%d.%d",
38  Address->Ipv4[0], Address->Ipv4[1], Address->Ipv4[2], Address->Ipv4[3]);
39  }
40  else if (introNetAfIpv6 == Family)
41  {
42  CHAR *format = NULL;
43  BOOLEAN first = TRUE;
44  WORD toPrint = 0;
45 
46  written = snprintf(String, INTRONET_MIN_BUFFER_SIZE, "[");
47 
48  // Iterate up to 14 since we don't want to print the last two BYTEs inside this loop.
49  for (DWORD i = 0; i < 14; i += 2)
50  {
51  toPrint = Address->Ipv6[i] << 8 | Address->Ipv6[i + 1];
52 
53  if (0 != toPrint)
54  {
55  format = first ? "%04x:" : ":%04x";
56 
57  written += snprintf(String + written, INTRONET_MIN_BUFFER_SIZE - written, format, toPrint);
58  }
59  else if (first)
60  {
61  written += snprintf(String + written, INTRONET_MIN_BUFFER_SIZE - written, ":");
62  }
63 
64  first = FALSE;
65  }
66 
67  format = ":%x]";
68  toPrint = Address->Ipv6[14] << 8 | Address->Ipv6[15];
69 
70  written += snprintf(String + written, INTRONET_MIN_BUFFER_SIZE - written, format, toPrint);
71  }
72 
73  return written;
74 }
75 
76 
79  _In_ const LIX_SOCK_STATE State
80  )
89 {
90  switch (State)
91  {
94  case LIX_TCP_SYN_SENT:
95  return introNetStateSynSent;
96  case LIX_TCP_SYN_RECV:
97  return introNetStateSynRecv;
98  case LIX_TCP_FIN_WAIT1:
99  return introNetStateFinWait;
100  case LIX_TCP_FIN_WAIT2:
101  return introNetStateFinWait2;
102  case LIX_TCP_TIME_WAIT:
103  return introNetStateTimeWait;
104  case LIX_TCP_CLOSE:
105  return introNetStateClosed;
106  case LIX_TCP_CLOSE_WAIT:
107  return introNetStateCloseWait;
108  case LIX_TCP_LAST_ACK:
109  return introNetStateLastAck;
110  case LIX_TCP_LISTEN:
111  return introNetStateListening;
112  case LIX_TCP_CLOSING:
113  return introNetStateClosing;
116  default:
117  return introNetStateUnknown;
118  }
119 }
120 
121 
124  _In_ const WIN_SOCK_STATE State
125  )
134 {
135  switch (State)
136  {
137  case WIN_TCP_CLOSED:
138  return introNetStateClosed;
139  case WIN_TCP_LISTENING:
140  return introNetStateListening;
141  case WIN_TCP_SYN_SENT:
142  return introNetStateSynSent;
143  case WIN_TCP_SYN_RECV:
144  return introNetStateSynRecv;
145  case WIN_TCP_ESTABLISHED:
147  case WIN_TCP_FIN_WAIT:
148  return introNetStateFinWait;
149  case WIN_TCP_FIN_WAIT2:
150  return introNetStateFinWait2;
151  case WIN_TCP_CLOSE_WAIT:
152  return introNetStateCloseWait;
153  case WIN_TCP_CLOSING:
154  return introNetStateClosing;
155  case WIN_TCP_LAST_ACK:
156  return introNetStateLastAck;
157  case WIN_TCP_TIME_WAIT:
158  return introNetStateTimeWait;
159  case WIN_TCP_DELETE_TCB:
160  return introNetStateDeleteTcb;
161  default:
162  return introNetStateUnknown;
163  }
164 }
165 
166 
169  _In_ const DWORD State
170  )
179 {
180  switch (gGuest.OSType)
181  {
182  case introGuestLinux:
183  return IntNetConvertStateLix(State);
184 
185  case introGuestWindows:
186  return IntNetConvertStateWin(State);
187 
188  default:
189  return introNetStateUnknown;
190  }
191 }
_Bool BOOLEAN
Definition: intro_types.h:58
#define _In_
Definition: intro_sal.h:21
uint16_t WORD
Definition: intro_types.h:48
#define _Success_(expr)
Definition: intro_sal.h:47
static INTRO_NET_STATE IntNetConvertStateLix(const LIX_SOCK_STATE State)
Converts a Linux specific connection state to an Introcore connection state.
Definition: intronet.c:78
enum _INTRO_NET_STATE INTRO_NET_STATE
Connection states.
enum _WIN_SOCK_STATE WIN_SOCK_STATE
The states in which a Windows socket can be in.
INTRO_GUEST_TYPE OSType
The type of the guest.
Definition: guests.h:274
#define _Out_writes_(expr)
Definition: intro_sal.h:28
#define INTRONET_MIN_BUFFER_SIZE
The minimum buffer size needed for the textual representation of an IP address.
Definition: intronet.h:12
Available only on Windows.
Definition: intro_types.h:313
static INTRO_NET_STATE IntNetConvertStateWin(const WIN_SOCK_STATE State)
Converts a Windows specific connection state to an Introcore connection state.
Definition: intronet.c:123
#define TRUE
Definition: intro_types.h:30
INTRO_NET_STATE IntNetConvertState(const DWORD State)
Converts a guest connection state to an Introcore connection state.
Definition: intronet.c:168
#define __forceinline
Definition: introtypes.h:61
uint32_t DWORD
Definition: intro_types.h:49
DWORD IntNetAddrToStr(const INTRO_NET_AF Family, const INTRONET_ADDRESS *Address, CHAR *String)
Converts an IP address to a string.
Definition: intronet.c:11
GUEST_STATE gGuest
The current guest state.
Definition: guests.c:48
enum _LIX_SOCK_STATE LIX_SOCK_STATE
Available only on Linux.
Definition: intro_types.h:312
An IP address.
Definition: intronet.h:16
enum _INTRO_NET_AF INTRO_NET_AF
Address family.
char CHAR
Definition: intro_types.h:56
#define FALSE
Definition: intro_types.h:34