Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 65bb889c79 | |||
| c983d554c9 | |||
| 0b164b6ba3 | |||
| 7f35b0c8f8 | |||
| ea25bab7c5 |
+1
-1
@@ -2317,7 +2317,7 @@ to convert the result into network-byte-order.
|
||||
</p>
|
||||
</dd></dl>
|
||||
|
||||
<a name="divert_helper_format_ipv4_address"><h3>6.11 WinDivertHelperParseIPv4Address</h3></a>
|
||||
<a name="divert_helper_format_ipv4_address"><h3>6.11 WinDivertHelperFormatIPv4Address</h3></a>
|
||||
<table border="1" cellpadding="5"><tr><td>
|
||||
<pre>
|
||||
BOOL <b>WinDivertHelperFormatIPv4Address</b>(
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ Class = WFPCALLOUTS
|
||||
ClassGuid = {57465043-616C-6C6F-7574-5F636C617373}
|
||||
Provider = %Basil%
|
||||
CatalogFile = WinDivert32.Cat
|
||||
DriverVer = 08/08/2019,2.2.0
|
||||
DriverVer = 01/08/2022,2.2.1
|
||||
|
||||
[SourceDisksNames]
|
||||
1 = %DiskName%
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ Class = WFPCALLOUTS
|
||||
ClassGuid = {57465043-616C-6C6F-7574-5F636C617373}
|
||||
Provider = %Basil%
|
||||
CatalogFile = WinDivert64.Cat
|
||||
DriverVer = 08/08/2019,2.2.0
|
||||
DriverVer = 01/08/2022,2.2.1
|
||||
|
||||
[SourceDisksNames]
|
||||
1 = %DiskName%
|
||||
|
||||
+30
-27
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* windivert.c
|
||||
* (C) 2019, all rights reserved,
|
||||
* (C) 2022, all rights reserved,
|
||||
*
|
||||
* This file is part of WinDivert.
|
||||
*
|
||||
@@ -123,7 +123,6 @@ typedef enum
|
||||
WINDIVERT_CONTEXT_STATE_OPEN = 0xB1, // Context is open.
|
||||
WINDIVERT_CONTEXT_STATE_CLOSING = 0xC2, // Context is closing.
|
||||
WINDIVERT_CONTEXT_STATE_CLOSED = 0xD3, // Context is closed.
|
||||
WINDIVERT_CONTEXT_STATE_INVALID = 0xE4 // Context is invalid.
|
||||
} context_state_t;
|
||||
struct context_s
|
||||
{
|
||||
@@ -333,7 +332,7 @@ extern VOID windivert_worker(IN WDFWORKITEM item);
|
||||
static void windivert_read_service(context_t context);
|
||||
extern VOID windivert_create(IN WDFDEVICE device, IN WDFREQUEST request,
|
||||
IN WDFFILEOBJECT object);
|
||||
static NTSTATUS windivert_install_provider();
|
||||
static NTSTATUS windivert_install_provider(void);
|
||||
static NTSTATUS windivert_install_sublayer(layer_t layer);
|
||||
static NTSTATUS windivert_install_callouts(context_t context, UINT8 layer,
|
||||
UINT64 flags);
|
||||
@@ -1166,12 +1165,14 @@ extern NTSTATUS DriverEntry(IN PDRIVER_OBJECT driver_obj,
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to begin WFP transaction", status);
|
||||
FwpmTransactionAbort0(engine_handle);
|
||||
goto driver_entry_exit;
|
||||
}
|
||||
status = windivert_install_provider();
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to install provider", status);
|
||||
FwpmTransactionAbort0(engine_handle);
|
||||
goto driver_entry_exit;
|
||||
}
|
||||
status = windivert_install_sublayer(WINDIVERT_LAYER_INBOUND_NETWORK_IPV4);
|
||||
@@ -1283,6 +1284,7 @@ driver_entry_sublayer_error:
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to commit WFP transaction", status);
|
||||
FwpmTransactionAbort0(engine_handle);
|
||||
goto driver_entry_exit;
|
||||
}
|
||||
|
||||
@@ -1359,6 +1361,7 @@ static void windivert_driver_unload(void)
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to begin WFP transaction", status);
|
||||
FwpmTransactionAbort0(engine_handle);
|
||||
FwpmEngineClose0(engine_handle);
|
||||
return;
|
||||
}
|
||||
@@ -1409,6 +1412,7 @@ static void windivert_driver_unload(void)
|
||||
status = FwpmTransactionCommit0(engine_handle);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
FwpmTransactionAbort0(engine_handle);
|
||||
DEBUG_ERROR("failed to commit WFP transaction", status);
|
||||
}
|
||||
FwpmEngineClose0(engine_handle);
|
||||
@@ -1568,7 +1572,7 @@ windivert_create_exit:
|
||||
// Clean-up on error:
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
context->state = WINDIVERT_CONTEXT_STATE_INVALID;
|
||||
context->state = WINDIVERT_CONTEXT_STATE_CLOSED;
|
||||
if (context->read_queue != NULL)
|
||||
{
|
||||
WdfObjectDelete(context->read_queue);
|
||||
@@ -1577,14 +1581,7 @@ windivert_create_exit:
|
||||
{
|
||||
WdfObjectDelete(context->worker);
|
||||
}
|
||||
if (context->process != NULL)
|
||||
{
|
||||
ObDereferenceObject(context->process);
|
||||
}
|
||||
if (context->engine_handle != NULL)
|
||||
{
|
||||
FwpmEngineClose0(context->engine_handle);
|
||||
}
|
||||
// process/engine_handle handled by windivert_destroy()
|
||||
}
|
||||
|
||||
WdfRequestComplete(request, status);
|
||||
@@ -1603,15 +1600,15 @@ static NTSTATUS windivert_install_callouts(context_t context, UINT8 layer,
|
||||
accept, close;
|
||||
NTSTATUS status = STATUS_SUCCESS;
|
||||
|
||||
inbound = ((flags & WINDIVERT_FILTER_FLAG_INBOUND) != 0);
|
||||
outbound = ((flags & WINDIVERT_FILTER_FLAG_OUTBOUND) != 0);
|
||||
ipv4 = ((flags & WINDIVERT_FILTER_FLAG_IP) != 0);
|
||||
ipv6 = ((flags & WINDIVERT_FILTER_FLAG_IPV6) != 0);
|
||||
bind = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_BIND) != 0);
|
||||
connect = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_CONNECT) != 0);
|
||||
listen = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_LISTEN) != 0);
|
||||
accept = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_ACCEPT) != 0);
|
||||
close = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_CLOSE) != 0);
|
||||
inbound = ((flags & WINDIVERT_FILTER_FLAG_INBOUND) != 0);
|
||||
outbound = ((flags & WINDIVERT_FILTER_FLAG_OUTBOUND) != 0);
|
||||
ipv4 = ((flags & WINDIVERT_FILTER_FLAG_IP) != 0);
|
||||
ipv6 = ((flags & WINDIVERT_FILTER_FLAG_IPV6) != 0);
|
||||
bind = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_BIND) != 0);
|
||||
connect = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_CONNECT) != 0);
|
||||
listen = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_LISTEN) != 0);
|
||||
accept = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_ACCEPT) != 0);
|
||||
close = ((flags & WINDIVERT_FILTER_FLAG_EVENT_SOCKET_CLOSE) != 0);
|
||||
|
||||
i = 0;
|
||||
switch (layer)
|
||||
@@ -1803,8 +1800,7 @@ static NTSTATUS windivert_install_callout(context_t context, UINT idx,
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to begin WFP transaction", status);
|
||||
FwpsCalloutUnregisterByKey0(&callout_guid);
|
||||
return status;
|
||||
goto windivert_install_callout_error;
|
||||
}
|
||||
status = FwpmCalloutAdd0(engine, &mcallout, NULL, NULL);
|
||||
if (!NT_SUCCESS(status))
|
||||
@@ -1822,8 +1818,7 @@ static NTSTATUS windivert_install_callout(context_t context, UINT idx,
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to commit WFP transaction", status);
|
||||
FwpsCalloutUnregisterByKey0(&callout_guid);
|
||||
return status;
|
||||
goto windivert_install_callout_error;
|
||||
}
|
||||
|
||||
KeAcquireInStackQueuedSpinLock(&context->lock, &lock_handle);
|
||||
@@ -1878,6 +1873,7 @@ windivert_uninstall_callouts_error:
|
||||
// RPC handle was closed first. So, this path is "normal" if
|
||||
// the user's app crashed or never closed the WinDivert handle.
|
||||
DEBUG_ERROR("failed to begin WFP transaction", status);
|
||||
FwpmTransactionAbort0(engine);
|
||||
goto windivert_uninstall_callouts_unregister;
|
||||
}
|
||||
for (i = 0; i < WINDIVERT_CONTEXT_MAXLAYERS; i++)
|
||||
@@ -1922,6 +1918,7 @@ windivert_uninstall_callouts_error:
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("failed to commit WFP transaction", status);
|
||||
FwpmTransactionAbort0(engine);
|
||||
// continue
|
||||
}
|
||||
|
||||
@@ -2104,9 +2101,15 @@ extern VOID windivert_destroy(IN WDFOBJECT object)
|
||||
filter = context->filter;
|
||||
KeReleaseInStackQueuedSpinLock(&lock_handle);
|
||||
windivert_uninstall_callouts(context, WINDIVERT_CONTEXT_STATE_CLOSED);
|
||||
FwpmEngineClose0(context->engine_handle);
|
||||
if (context->engine_handle != NULL)
|
||||
{
|
||||
FwpmEngineClose0(context->engine_handle);
|
||||
}
|
||||
windivert_free((PVOID)filter);
|
||||
ObDereferenceObject(context->process);
|
||||
if (context->process != NULL)
|
||||
{
|
||||
ObDereferenceObject(context->process);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* windivert.rc
|
||||
* (C) 2019, all rights reserved,
|
||||
* (C) 2022, all rights reserved,
|
||||
*
|
||||
* This file is part of WinDivert.
|
||||
*
|
||||
@@ -48,7 +48,7 @@
|
||||
#define VER_PRODUCTVERSION 2.2
|
||||
#define VER_PRODUCTVERSION_STR "2.2"
|
||||
#define VER_COMPANYNAME_STR "Basil"
|
||||
#define VER_LEGALCOPYRIGHT_YEARS "2011-2019"
|
||||
#define VER_LEGALCOPYRIGHT_YEARS "2011-2022"
|
||||
#define VER_LEGALCOPYRIGHT_STR \
|
||||
"Copyright \251 " VER_COMPANYNAME_STR " " VER_LEGALCOPYRIGHT_YEARS
|
||||
#define VER_FILEVERSION VER_PRODUCTVERSION
|
||||
|
||||
Reference in New Issue
Block a user