- 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:
basil00
2011-08-23 22:18:02 +08:00
parent 378df755bc
commit 0ff63cda99
13 changed files with 78 additions and 35 deletions
+5 -5
View File
@@ -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
View File
@@ -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>.
+1 -1
View File
@@ -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;
+7 -1
View File
@@ -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
+1 -1
View File
@@ -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;
+7 -1
View File
@@ -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
+7 -1
View File
@@ -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
+3 -3
View File
@@ -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
View File
@@ -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);
/*
+3 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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