- Make the package compile for i386
- Make the pAddr arg for DivertRecv() optional - Make the i386 user binaries compatible with an amd64 driver. (useful for projects not yet ported to amd64)
This commit is contained in:
+5
-5
@@ -172,7 +172,7 @@ static BOOLEAN DivertDriverFiles(LPWSTR *divert_dir_ptr,
|
||||
static BOOLEAN DivertDriverInstall(VOID);
|
||||
static BOOL DivertCompileFilter(const char *filter_str,
|
||||
divert_ioctl_filter_t filter, UINT8 *fp);
|
||||
static int DivertFilterTokenNameCompare(const void *a, const void *b);
|
||||
static int __cdecl DivertFilterTokenNameCompare(const void *a, const void *b);
|
||||
static BOOL DivertTokenizeFilter(const char *filter, FILTER_TOKEN *tokens,
|
||||
UINT8 tokensmax);
|
||||
static BOOL DivertParseIPv4Address(char *str, UINT32 *addr_ptr);
|
||||
@@ -485,7 +485,7 @@ extern HANDLE DivertOpen(const char *filter)
|
||||
ioctl.version = DIVERT_VERSION;
|
||||
ioctl.magic = DIVERT_MAGIC;
|
||||
ioctl.reserved = 0x0;
|
||||
ioctl.arg = NULL;
|
||||
ioctl.arg = (UINT64)NULL;
|
||||
if (!DeviceIoControl(handle, IOCTL_DIVERT_SET_FILTER, &ioctl,
|
||||
sizeof(ioctl), ioctl_filter,
|
||||
filter_len*sizeof(struct divert_ioctl_filter_s), &iolen, NULL))
|
||||
@@ -510,7 +510,7 @@ extern BOOL DivertRecv(HANDLE handle, PVOID pPacket, UINT packetLen,
|
||||
ioctl.version = DIVERT_VERSION;
|
||||
ioctl.magic = DIVERT_MAGIC;
|
||||
ioctl.reserved = 0x0;
|
||||
ioctl.arg = (PVOID)addr;
|
||||
ioctl.arg = (UINT64)addr;
|
||||
if (!DeviceIoControl(handle, IOCTL_DIVERT_RECV, &ioctl, sizeof(ioctl),
|
||||
pPacket, packetLen, &readlen0, NULL))
|
||||
{
|
||||
@@ -535,7 +535,7 @@ extern BOOL DivertSend(HANDLE handle, PVOID pPacket, UINT packetLen,
|
||||
ioctl.version = DIVERT_VERSION;
|
||||
ioctl.magic = DIVERT_MAGIC;
|
||||
ioctl.reserved = 0x0;
|
||||
ioctl.arg = (PVOID)addr;
|
||||
ioctl.arg = (UINT64)addr;
|
||||
if (!DeviceIoControl(handle, IOCTL_DIVERT_SEND, &ioctl, sizeof(ioctl),
|
||||
pPacket, packetLen, &writelen0, NULL))
|
||||
{
|
||||
@@ -586,7 +586,7 @@ static BOOL DivertCompileFilter(const char *filter_str,
|
||||
/*
|
||||
* Compare two FILTER_TOKEN_NAMEs.
|
||||
*/
|
||||
static int DivertFilterTokenNameCompare(const void *a, const void *b)
|
||||
static int __cdecl DivertFilterTokenNameCompare(const void *a, const void *b)
|
||||
{
|
||||
PFILTER_TOKEN_NAME na = (PFILTER_TOKEN_NAME)a;
|
||||
PFILTER_TOKEN_NAME nb = (PFILTER_TOKEN_NAME)b;
|
||||
|
||||
+3
-2
@@ -263,7 +263,7 @@ BOOL <b>DivertRecv</b>(
|
||||
__in HANDLE handle,
|
||||
__out PVOID pPacket,
|
||||
__in UINT packetLen,
|
||||
__out PDIVERT_ADDRESS pAddr,
|
||||
__out_opt PDIVERT_ADDRESS pAddr,
|
||||
__out_opt UINT *recvLen
|
||||
);
|
||||
</pre>
|
||||
@@ -296,7 +296,8 @@ If the captured packet is larger than the <tt>pPacket</tt> buffer length,
|
||||
then the packet will be truncated.
|
||||
If <tt>recvLen</tt> is non-<tt>NULL</tt>, then the total number of bytes
|
||||
written to <tt>pPacket</tt> is placed there.
|
||||
The address of the captured packet is written to <tt>pAddr</tt>.
|
||||
If non-<tt>NULL</tt>, the address of the captured packet is written to
|
||||
<tt>pAddr</tt>.
|
||||
</p><p>
|
||||
An application should call <tt>DivertRecv()</tt> <i>as soon as possible</i>
|
||||
after a successful call to <tt>DivertOpen()</tt>.
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
/*
|
||||
* Entry.
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
int __cdecl main(int argc, char **argv)
|
||||
{
|
||||
HANDLE handle, console;
|
||||
size_t slen, flen;
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
!IF "$(_BUILDARCH)" == "x86"
|
||||
CPU=i386
|
||||
!ELSE
|
||||
CPU=$(_BUILDARCH)
|
||||
!ENDIF
|
||||
|
||||
TARGETNAME=netdump
|
||||
TARGETTYPE=PROGRAM
|
||||
TARGETPATH=..\..\install
|
||||
@@ -21,7 +27,7 @@ TARGETLIBS=\
|
||||
$(SDK_LIB_PATH)\setupapi.lib \
|
||||
$(SDK_LIB_PATH)\user32.lib \
|
||||
$(SDK_LIB_PATH)\ws2_32.lib \
|
||||
$(TARGETPATH)\$(_BUILDARCH)\divert.lib
|
||||
$(TARGETPATH)\$(CPU)\divert.lib
|
||||
UMTYPE=console
|
||||
UMENTRY=main
|
||||
USE_MSVCRT=1
|
||||
|
||||
@@ -83,7 +83,7 @@ static void PacketIpv6Icmpv6Init(PICMPV6PACKET packet);
|
||||
/*
|
||||
* Entry.
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
int __cdecl main(int argc, char **argv)
|
||||
{
|
||||
HANDLE handle, console;
|
||||
size_t slen, flen;
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
!IF "$(_BUILDARCH)" == "x86"
|
||||
CPU=i386
|
||||
!ELSE
|
||||
CPU=$(_BUILDARCH)
|
||||
!ENDIF
|
||||
|
||||
TARGETNAME=netfilter
|
||||
TARGETTYPE=PROGRAM
|
||||
TARGETPATH=..\..\install
|
||||
@@ -21,7 +27,7 @@ TARGETLIBS=\
|
||||
$(SDK_LIB_PATH)\setupapi.lib \
|
||||
$(SDK_LIB_PATH)\user32.lib \
|
||||
$(SDK_LIB_PATH)\ws2_32.lib \
|
||||
$(TARGETPATH)\$(_BUILDARCH)\divert.lib
|
||||
$(TARGETPATH)\$(CPU)\divert.lib
|
||||
UMTYPE=console
|
||||
UMENTRY=main
|
||||
USE_MSVCRT=1
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
!IF "$(_BUILDARCH)" == "x86"
|
||||
CPU=i386
|
||||
!ELSE
|
||||
CPU=$(_BUILDARCH)
|
||||
!ENDIF
|
||||
|
||||
TARGETNAME=webfilter
|
||||
TARGETTYPE=PROGRAM
|
||||
TARGETPATH=..\..\install
|
||||
@@ -21,7 +27,7 @@ TARGETLIBS=\
|
||||
$(SDK_LIB_PATH)\setupapi.lib \
|
||||
$(SDK_LIB_PATH)\user32.lib \
|
||||
$(SDK_LIB_PATH)\ws2_32.lib \
|
||||
$(TARGETPATH)\$(_BUILDARCH)\divert.lib
|
||||
$(TARGETPATH)\$(CPU)\divert.lib
|
||||
UMTYPE=console
|
||||
UMENTRY=main
|
||||
USE_MSVCRT=1
|
||||
|
||||
@@ -88,7 +88,7 @@ const char block_data[] =
|
||||
* Prototypes
|
||||
*/
|
||||
static void PacketInit(PPACKET packet);
|
||||
static int UrlCompare(const void *a, const void *b);
|
||||
static int __cdecl UrlCompare(const void *a, const void *b);
|
||||
static int UrlMatch(PURL urla, PURL urlb);
|
||||
static PBLACKLIST BlackListInit(void);
|
||||
static void BlackListInsert(PBLACKLIST blacklist, PURL url);
|
||||
@@ -101,7 +101,7 @@ static BOOL BlackListPayloadMatch(PBLACKLIST blacklist, char *data,
|
||||
/*
|
||||
* Entry.
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
int __cdecl main(int argc, char **argv)
|
||||
{
|
||||
HANDLE handle;
|
||||
DIVERT_ADDRESS addr;
|
||||
@@ -536,7 +536,7 @@ static BOOL BlackListPayloadMatch(PBLACKLIST blacklist, char *data, UINT16 len)
|
||||
/*
|
||||
* URL comparison.
|
||||
*/
|
||||
static int UrlCompare(const void *a, const void *b)
|
||||
static int __cdecl UrlCompare(const void *a, const void *b)
|
||||
{
|
||||
PURL urla = *(PURL *)a;
|
||||
PURL urlb = *(PURL *)b;
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* divert.c
|
||||
* divert.h
|
||||
* (C) 2011, all rights reserved,
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
@@ -61,7 +61,7 @@ extern DIVERTEXPORT BOOL DivertRecv(
|
||||
__in HANDLE handle,
|
||||
__out PVOID pPacket,
|
||||
__in UINT packetLen,
|
||||
__out PDIVERT_ADDRESS pAddr,
|
||||
__out_opt PDIVERT_ADDRESS pAddr,
|
||||
__out_opt UINT *readLen);
|
||||
|
||||
/*
|
||||
|
||||
@@ -110,12 +110,13 @@
|
||||
/*
|
||||
* Message definitions.
|
||||
*/
|
||||
#pragma pack(push, 1)
|
||||
struct divert_ioctl_s
|
||||
{
|
||||
UINT16 magic; // DIVERT_MAGIC
|
||||
UINT8 version; // DIVERT_VERSION
|
||||
UINT8 reserved; // Reserved (set to 0x0)
|
||||
PVOID arg; // Pointer to buffer
|
||||
UINT64 arg; // Pointer to buffer
|
||||
};
|
||||
typedef struct divert_ioctl_s *divert_ioctl_t;
|
||||
|
||||
@@ -131,6 +132,7 @@ struct divert_ioctl_filter_s
|
||||
UINT32 arg[4]; // Argument.
|
||||
};
|
||||
typedef struct divert_ioctl_filter_s *divert_ioctl_filter_t;
|
||||
#pragma pack(pop)
|
||||
|
||||
/*
|
||||
* IOCTL codes.
|
||||
|
||||
+10
-4
@@ -1,4 +1,10 @@
|
||||
$(TARGETPATH)\$(_BUILDARCH)\divert.inf: divert.inf
|
||||
copy /y divert.inf $@
|
||||
$(TARGETPATH)\$(_BUILDARCH)\WdfCoInstaller01009.dll:
|
||||
copy /y $(BASEDIR)\redist\wdf\$(_BUILDARCH)\WdfCoInstaller01009.dll $@
|
||||
!IF "$(_BUILDARCH)" == "x86"
|
||||
CPU=i386
|
||||
!ELSE
|
||||
CPU=$(_BUILDARCH)
|
||||
!ENDIF
|
||||
|
||||
$(TARGETPATH)\$(CPU)\divert.inf: divert.inf
|
||||
copy /y divert.inf $@
|
||||
$(TARGETPATH)\$(CPU)\WdfCoInstaller01009.dll:
|
||||
copy /y $(BASEDIR)\redist\wdf\$(_BUILDARCH)\WdfCoInstaller01009.dll $@
|
||||
|
||||
+21
-11
@@ -964,9 +964,12 @@ static void divert_read_service(context_t context)
|
||||
// Write the address information.
|
||||
req_context = divert_req_context_get(request);
|
||||
addr = req_context->addr;
|
||||
addr->IfIdx = packet->if_idx;
|
||||
addr->SubIfIdx = packet->sub_if_idx;
|
||||
addr->Direction = packet->direction;
|
||||
if (addr != NULL)
|
||||
{
|
||||
addr->IfIdx = packet->if_idx;
|
||||
addr->SubIfIdx = packet->sub_if_idx;
|
||||
addr->Direction = packet->direction;
|
||||
}
|
||||
|
||||
// Compute the IP/TCP/UDP checksums here if required.
|
||||
divert_update_checksums(dst, dst_len, packet->ip_checksum,
|
||||
@@ -1208,14 +1211,21 @@ extern VOID divert_ioctl(IN WDFQUEUE queue, IN WDFREQUEST request,
|
||||
switch (code)
|
||||
{
|
||||
case IOCTL_DIVERT_RECV:
|
||||
status = WdfRequestProbeAndLockUserBufferForWrite(request,
|
||||
ioctl->arg, sizeof(struct divert_addr_s), &memobj);
|
||||
if (!NT_SUCCESS(status))
|
||||
if ((PVOID)ioctl->arg != NULL)
|
||||
{
|
||||
DEBUG_ERROR("invalid arg pointer for RECV ioctl", status);
|
||||
goto divert_ioctl_exit;
|
||||
status = WdfRequestProbeAndLockUserBufferForWrite(request,
|
||||
(PVOID)ioctl->arg, sizeof(struct divert_addr_s), &memobj);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("invalid arg pointer for RECV ioctl", status);
|
||||
goto divert_ioctl_exit;
|
||||
}
|
||||
addr = (divert_addr_t)WdfMemoryGetBuffer(memobj, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
addr = NULL;
|
||||
}
|
||||
addr = (divert_addr_t)WdfMemoryGetBuffer(memobj, NULL);
|
||||
|
||||
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes,
|
||||
req_context_s);
|
||||
@@ -1238,7 +1248,7 @@ extern VOID divert_ioctl(IN WDFQUEUE queue, IN WDFREQUEST request,
|
||||
|
||||
case IOCTL_DIVERT_SEND:
|
||||
status = WdfRequestProbeAndLockUserBufferForRead(request,
|
||||
ioctl->arg, sizeof(struct divert_addr_s), &memobj);
|
||||
(PVOID)ioctl->arg, sizeof(struct divert_addr_s), &memobj);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
DEBUG_ERROR("invalid arg pointer for SEND ioctl", status);
|
||||
@@ -1253,7 +1263,7 @@ extern VOID divert_ioctl(IN WDFQUEUE queue, IN WDFREQUEST request,
|
||||
break;
|
||||
|
||||
case IOCTL_DIVERT_SET_FILTER:
|
||||
if (ioctl->arg != NULL)
|
||||
if ((PVOID)ioctl->arg != NULL)
|
||||
{
|
||||
status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
DEBUG_ERROR("arg pointer is non-NULL for SET_FILTER ioctl",
|
||||
|
||||
+8
-2
@@ -14,6 +14,12 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
!IF "$(_BUILDARCH)" == "x86"
|
||||
CPU=i386
|
||||
!ELSE
|
||||
CPU=$(_BUILDARCH)
|
||||
!ENDIF
|
||||
|
||||
TARGETNAME=divert
|
||||
TARGETTYPE=DRIVER
|
||||
TARGETPATH=..\install
|
||||
@@ -23,8 +29,8 @@ TARGETLIBS=\
|
||||
$(DDK_LIB_PATH)\fwpkclnt.lib \
|
||||
$(SDK_LIB_PATH)\uuid.lib
|
||||
NTTARGETFILES=\
|
||||
$(TARGETPATH)\$(_BUILDARCH)\divert.inf \
|
||||
$(TARGETPATH)\$(_BUILDARCH)\WdfCoInstaller01009.dll
|
||||
$(TARGETPATH)\$(CPU)\divert.inf \
|
||||
$(TARGETPATH)\$(CPU)\WdfCoInstaller01009.dll
|
||||
KMDF_VERSION_MAJOR=1
|
||||
C_DEFINES=$(C_DEFINES) -DBINARY_COMPATIBLE=0 -DNT -DUNICODE -D_UNICODE \
|
||||
-DNDIS60 -DNDIS_SUPPORT_NDIS60
|
||||
|
||||
Reference in New Issue
Block a user