Skip to content

Commit aff111e

Browse files
authored
Merge pull request #211 from zzzjim/fix-mcafee
Inject on different handles for inbound/outbound
2 parents 69b4620 + 160d983 commit aff111e

File tree

1 file changed

+97
-18
lines changed

1 file changed

+97
-18
lines changed

sys/windivert.c

Lines changed: 97 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,12 @@ typedef struct flow_s *flow_t;
294294
/*
295295
* Global state.
296296
*/
297-
static HANDLE inject_handle = NULL;
298-
static HANDLE injectv6_handle = NULL;
297+
static HANDLE inject_handle_forward = NULL;
298+
static HANDLE injectv6_handle_forward = NULL;
299+
static HANDLE inject_handle_in = NULL;
300+
static HANDLE inject_handle_out = NULL;
301+
static HANDLE injectv6_handle_in = NULL;
302+
static HANDLE injectv6_handle_out = NULL;
299303
static NDIS_HANDLE nbl_pool_handle = NULL;
300304
static NDIS_HANDLE nb_pool_handle = NULL;
301305
static HANDLE engine_handle = NULL;
@@ -1050,20 +1054,55 @@ extern NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver_obj,
10501054
WdfControlFinishInitializing(device);
10511055

10521056
// Create the packet injection handles.
1053-
status = FwpsInjectionHandleCreate0(AF_INET,
1057+
status = FwpsInjectionHandleCreate0(AF_INET,
10541058
FWPS_INJECTION_TYPE_NETWORK | FWPS_INJECTION_TYPE_FORWARD,
1055-
&inject_handle);
1059+
&inject_handle_forward);
10561060
if (!NT_SUCCESS(status))
10571061
{
1058-
DEBUG_ERROR("failed to create WFP packet injection handle", status);
1062+
DEBUG_ERROR("failed to create WFP forward packet injection handle", status);
10591063
goto driver_entry_exit;
10601064
}
1061-
status = FwpsInjectionHandleCreate0(AF_INET6,
1065+
status = FwpsInjectionHandleCreate0(AF_INET6,
10621066
FWPS_INJECTION_TYPE_NETWORK | FWPS_INJECTION_TYPE_FORWARD,
1063-
&injectv6_handle);
1067+
&injectv6_handle_forward);
10641068
if (!NT_SUCCESS(status))
10651069
{
1066-
DEBUG_ERROR("failed to create WFP ipv6 packet injection handle",
1070+
DEBUG_ERROR("failed to create WFP ipv6 forward packet injection handle", status);
1071+
goto driver_entry_exit;
1072+
}
1073+
1074+
status = FwpsInjectionHandleCreate0(AF_INET,
1075+
FWPS_INJECTION_TYPE_NETWORK | FWPS_INJECTION_TYPE_FORWARD,
1076+
&inject_handle_in);
1077+
if (!NT_SUCCESS(status))
1078+
{
1079+
DEBUG_ERROR("failed to create WFP inbound packet injection handle", status);
1080+
goto driver_entry_exit;
1081+
}
1082+
status = FwpsInjectionHandleCreate0(AF_INET,
1083+
FWPS_INJECTION_TYPE_NETWORK | FWPS_INJECTION_TYPE_FORWARD,
1084+
&inject_handle_out);
1085+
if (!NT_SUCCESS(status))
1086+
{
1087+
DEBUG_ERROR("failed to create WFP outbound packet injection handle", status);
1088+
goto driver_entry_exit;
1089+
}
1090+
1091+
status = FwpsInjectionHandleCreate0(AF_INET6,
1092+
FWPS_INJECTION_TYPE_NETWORK | FWPS_INJECTION_TYPE_FORWARD,
1093+
&injectv6_handle_in);
1094+
if (!NT_SUCCESS(status))
1095+
{
1096+
DEBUG_ERROR("failed to create WFP ipv6 inbound packet injection handle",
1097+
status);
1098+
goto driver_entry_exit;
1099+
}
1100+
status = FwpsInjectionHandleCreate0(AF_INET6,
1101+
FWPS_INJECTION_TYPE_NETWORK | FWPS_INJECTION_TYPE_FORWARD,
1102+
&injectv6_handle_out);
1103+
if (!NT_SUCCESS(status))
1104+
{
1105+
DEBUG_ERROR("failed to create WFP ipv6 outbound packet injection handle",
10671106
status);
10681107
goto driver_entry_exit;
10691108
}
@@ -1264,13 +1303,29 @@ static void windivert_driver_unload(void)
12641303

12651304
DEBUG("UNLOAD: unloading the WinDivert driver");
12661305

1267-
if (inject_handle != NULL)
1306+
if (inject_handle_forward != NULL)
1307+
{
1308+
FwpsInjectionHandleDestroy0(inject_handle_forward);
1309+
}
1310+
if (injectv6_handle_forward != NULL)
1311+
{
1312+
FwpsInjectionHandleDestroy0(injectv6_handle_forward);
1313+
}
1314+
if (inject_handle_in != NULL)
1315+
{
1316+
FwpsInjectionHandleDestroy0(inject_handle_in);
1317+
}
1318+
if (inject_handle_out != NULL)
1319+
{
1320+
FwpsInjectionHandleDestroy0(inject_handle_out);
1321+
}
1322+
if (injectv6_handle_in != NULL)
12681323
{
1269-
FwpsInjectionHandleDestroy0(inject_handle);
1324+
FwpsInjectionHandleDestroy0(injectv6_handle_in);
12701325
}
1271-
if (injectv6_handle != NULL)
1326+
if (injectv6_handle_out != NULL)
12721327
{
1273-
FwpsInjectionHandleDestroy0(injectv6_handle);
1328+
FwpsInjectionHandleDestroy0(injectv6_handle_out);
12741329
}
12751330
if (nbl_pool_handle != NULL)
12761331
{
@@ -2671,22 +2726,24 @@ static NTSTATUS windivert_write(context_t context, WDFREQUEST request,
26712726
}
26722727

26732728
// Inject packet:
2674-
handle = (ipv4? inject_handle: injectv6_handle);
26752729
if (layer == WINDIVERT_LAYER_NETWORK_FORWARD)
26762730
{
2731+
handle = (ipv4? inject_handle_forward: injectv6_handle_forward);
26772732
status = FwpsInjectForwardAsync0(handle, (HANDLE)priority, 0,
26782733
(ipv4? AF_INET: AF_INET6), UNSPECIFIED_COMPARTMENT_ID,
26792734
addr[i].Network.IfIdx, buffers, windivert_inject_complete,
26802735
data_copy);
26812736
}
26822737
else if (addr[i].Outbound != 0)
26832738
{
2739+
handle = (ipv4? inject_handle_out: injectv6_handle_out);
26842740
status = FwpsInjectNetworkSendAsync0(handle, (HANDLE)priority, 0,
26852741
UNSPECIFIED_COMPARTMENT_ID, buffers, windivert_inject_complete,
26862742
data_copy);
26872743
}
26882744
else
26892745
{
2746+
handle = (ipv4? inject_handle_in: injectv6_handle_in);
26902747
status = FwpsInjectNetworkReceiveAsync0(handle, (HANDLE)priority, 0,
26912748
UNSPECIFIED_COMPARTMENT_ID, addr[i].Network.IfIdx,
26922749
addr[i].Network.SubIfIdx, buffers, windivert_inject_complete,
@@ -3701,13 +3758,33 @@ static void windivert_network_classify(context_t context,
37013758
}
37023759
if (ipv4)
37033760
{
3704-
packet_state = FwpsQueryPacketInjectionState0(inject_handle, buffers,
3705-
&packet_context);
3761+
if ( context->layer == WINDIVERT_LAYER_NETWORK_FORWARD ) {
3762+
packet_state = FwpsQueryPacketInjectionState0(inject_handle_forward, buffers,
3763+
&packet_context);
3764+
}
3765+
else if ( outbound ) {
3766+
packet_state = FwpsQueryPacketInjectionState0(inject_handle_out, buffers,
3767+
&packet_context);
3768+
}
3769+
else {
3770+
packet_state = FwpsQueryPacketInjectionState0(inject_handle_in, buffers,
3771+
&packet_context);
3772+
}
37063773
}
37073774
else
37083775
{
3709-
packet_state = FwpsQueryPacketInjectionState0(injectv6_handle,
3710-
buffers, &packet_context);
3776+
if ( context->layer == WINDIVERT_LAYER_NETWORK_FORWARD ) {
3777+
packet_state = FwpsQueryPacketInjectionState0(injectv6_handle_forward, buffers,
3778+
&packet_context);
3779+
}
3780+
else if ( outbound ) {
3781+
packet_state = FwpsQueryPacketInjectionState0(injectv6_handle_out,
3782+
buffers, &packet_context);
3783+
}
3784+
else {
3785+
packet_state = FwpsQueryPacketInjectionState0(injectv6_handle_in,
3786+
buffers, &packet_context);
3787+
}
37113788
}
37123789

37133790
KeAcquireInStackQueuedSpinLock(&context->lock, &lock_handle);
@@ -5142,22 +5219,24 @@ static void windivert_reinject_packet(packet_t packet)
51425219
return;
51435220
}
51445221
priority = packet->priority;
5145-
handle = (packet->ipv6? injectv6_handle: inject_handle);
51465222
if (packet->layer == WINDIVERT_LAYER_NETWORK_FORWARD)
51475223
{
5224+
handle = (packet->ipv6? injectv6_handle_forward: inject_handle_forward);
51485225
status = FwpsInjectForwardAsync0(handle, (HANDLE)priority, 0,
51495226
(packet->ipv6? AF_INET6: AF_INET), UNSPECIFIED_COMPARTMENT_ID,
51505227
network_data->IfIdx, buffers, windivert_reinject_complete,
51515228
(HANDLE)packet);
51525229
}
51535230
else if (packet->outbound)
51545231
{
5232+
handle = (packet->ipv6? injectv6_handle_out: inject_handle_out);
51555233
status = FwpsInjectNetworkSendAsync0(handle, (HANDLE)priority, 0,
51565234
UNSPECIFIED_COMPARTMENT_ID, buffers, windivert_reinject_complete,
51575235
(HANDLE)packet);
51585236
}
51595237
else
51605238
{
5239+
handle = (packet->ipv6? injectv6_handle_in: inject_handle_in);
51615240
status = FwpsInjectNetworkReceiveAsync0(handle, (HANDLE)priority, 0,
51625241
UNSPECIFIED_COMPARTMENT_ID, network_data->IfIdx,
51635242
network_data->SubIfIdx, buffers, windivert_reinject_complete,

0 commit comments

Comments
 (0)