From 3375363d934dcd7e43bc4e3b3cefe92318123dc9 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 20 Jan 2014 14:33:05 -0800 Subject: [PATCH] More tap driver cleanup, and add IOCTL to get L2 multicast ethernet address subscriptions. --- ext/bin/tap-windows/x64/ztTap100.inf | 2 +- ext/bin/tap-windows/x64/ztTap100.sys | Bin 29928 -> 30392 bytes ext/bin/tap-windows/x64/zttap100.cat | Bin 0 -> 8974 bytes ext/bin/tap-windows/x86/ztTap100.inf | 2 +- ext/bin/tap-windows/x86/ztTap100.sys | Bin 32464 -> 27800 bytes ext/bin/tap-windows/x86/zttap100.cat | Bin 0 -> 1048 bytes .../TapDriver Package.vcxproj | 54 +++++- .../TapDriver Package.vcxproj.filters | 8 + windows/TapDriver/TapDriver.vcxproj | 12 ++ windows/TapDriver/config.h | 2 +- windows/TapDriver/constants.h | 2 +- windows/TapDriver/proto.h | 164 ------------------ windows/TapDriver/prototypes.h | 59 ------- windows/TapDriver/tap-windows.h | 7 + windows/TapDriver/tapdrvr.c | 34 ++++ windows/TapDriver/types.h | 22 --- 16 files changed, 118 insertions(+), 250 deletions(-) create mode 100644 ext/bin/tap-windows/x64/zttap100.cat create mode 100644 ext/bin/tap-windows/x86/zttap100.cat diff --git a/ext/bin/tap-windows/x64/ztTap100.inf b/ext/bin/tap-windows/x64/ztTap100.inf index 452d36249..ff7eb6a26 100644 --- a/ext/bin/tap-windows/x64/ztTap100.inf +++ b/ext/bin/tap-windows/x64/ztTap100.inf @@ -4,7 +4,7 @@ Class=Net ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318} Provider=%Provider% CatalogFile=ztTap100.cat -DriverVer=08/24/2013,16.12.30.608 +DriverVer=01/20/2014,14.30.21.864 [Strings] diff --git a/ext/bin/tap-windows/x64/ztTap100.sys b/ext/bin/tap-windows/x64/ztTap100.sys index 904c0e64d9c2c0b872915e5c769e15ca98963449..6641337f136642bed7aafa794dcb8e6fe052ccf8 100644 GIT binary patch delta 16135 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 ZKMdnaqfS?S7yVuN{PIsfCr%l^{{{G4uH^s# diff --git a/ext/bin/tap-windows/x64/zttap100.cat b/ext/bin/tap-windows/x64/zttap100.cat new file mode 100644 index 0000000000000000000000000000000000000000..e1fdb5fd1b0179fd875a8a8c7b2733ca162f7c73 GIT binary patch literal 8974 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 {% zGg3V3sd3V|-T5WSy3EZh;kNJ`i;7=gMa_#edUM)~T9}*D;P{MnLHTBtNm|4SquAq7 z-qOGfuQ#tY$C+k|$`?R;r=lbXl?cJ9zbyQ~8u5&oW(;>1%u0+D~ zXd20SH&sb?$0?4S(7*p;{%JFzui*7p!< zFy6&qM)`~!gqytgT)+odUGLg5(3>T^>lA&b!>IdXWqe0zIkagocbQ20o;wT9Ne$u~ zYBvcM3~KSaZdE$pFC%9^ws8IlThbQmoS5(jr{q_zR1nRLk*Lpe(DlgS*AP`Bv2b9A z2d9gHVFb)v{u>J&a85RJ=kmAn^a2JVI(Z(4frUuu@rcaiF`59D1P0CIaXZ)(>pI>Ux?xr%=*pCMdOH|yx_WFW) zG@Kl_cW=(A8kq}W58@jFOj3&z_dHyeX*AsC5#zahEph+SI)+@Y`|X>Z{m~0uRaUC! zI%=@M;l|=_b^%PyY5G# zck0!Zzqodc%xCKv;lJO;w4f$hLwBJ>--|xakd+#IiE1hbBI?dsGfifVfS^moA-rBT4#qJ*&8M5M^$xym-T!|;A31ZS;x}o%G;xX ztV1je9${fXMNji*FpJPU$4xv$_QLj~X!O5|d%`knq#~ zXrb>ht4loQuW40?c<-^ZUHkpR*Ah9Zg!{@R?K*s@{^dUJEL4BMO8M?MD?Q=35$#q*=Oq-F>pRKJkwDA&Oqs9GT-- zk?IhI{W6Ei@r2-iM??4f$53rvdtc4J9S}_ z5qohTR`|#9M`%2z&MzFog;i=heeNxsybtS!=7qC3N7 zhC@Vs#+U2sCTuUhv-@qYWLfuMz#;zC_f^MxOWKVk6oU*xjLgtji(OjMs|q4vgwt#m8N=!q^hXA2WCCT|?0S52MGN-~a#s literal 0 HcmV?d00001 diff --git a/ext/bin/tap-windows/x86/ztTap100.inf b/ext/bin/tap-windows/x86/ztTap100.inf index b67eb1561..1849019bf 100644 --- a/ext/bin/tap-windows/x86/ztTap100.inf +++ b/ext/bin/tap-windows/x86/ztTap100.inf @@ -4,7 +4,7 @@ Class=Net ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318} Provider=%Provider% CatalogFile=ztTap100.cat -DriverVer=08/24/2013,16.12.37.14 +DriverVer=01/20/2014,14.30.31.745 [Strings] diff --git a/ext/bin/tap-windows/x86/ztTap100.sys b/ext/bin/tap-windows/x86/ztTap100.sys index 297f468088a8c648295e00d84651024fb8cc5635..6dce8e8e38478cd7f77e791de3132fe38f88bb7d 100644 GIT binary patch delta 15743 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 WvN_n+_Y`+eQ; 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 diff --git a/ext/bin/tap-windows/x86/zttap100.cat b/ext/bin/tap-windows/x86/zttap100.cat new file mode 100644 index 0000000000000000000000000000000000000000..9eff33eba39fa07b270c34b14dc169fac16c0659 GIT binary patch literal 1048 zcmcgqOKTHR6h8OnPBiJH7A;DH47ErR+lF&zl1WE`kW3Ql1B!`QUz-FfM2m`bqaw;I zx^vNmh`4AFvjxp&U%e&>9LBQ=~%9bTGQ z`kE0tWH(Y4M@mQ`G;x&JOr|E1LW!uD7TqYZ0n<9$$#lX-+3=6{_z+WL3 z_bTjVsE;Twjx!Nu_>G51N21K`ulJHKy+w<=6mtk+i`k}uHz+!_#2Y<6!$cb~z+E`sV7oyA)Drg?u`#vvYe(lkSJbPTNMpLxG; HHmIWS{kWez literal 0 HcmV?d00001 diff --git a/windows/TapDriver Package/TapDriver Package.vcxproj b/windows/TapDriver Package/TapDriver Package.vcxproj index 6ac36e9e9..4c1495fcf 100644 --- a/windows/TapDriver Package/TapDriver Package.vcxproj +++ b/windows/TapDriver Package/TapDriver Package.vcxproj @@ -124,7 +124,9 @@ - + + http://timestamp.digicert.com/ + DbgengKernelDebugger False @@ -139,6 +141,21 @@ 133563 $(OutDir)TapDriver Package + + http://timestamp.digicert.com/ + + + http://timestamp.digicert.com/ + + + http://timestamp.digicert.com/ + + + http://timestamp.digicert.com/ + + + http://timestamp.digicert.com/ + @@ -147,8 +164,43 @@ {689210b1-467c-4850-bb7d-2e10d5b4a3da} + true + true + false + true + false + + + false + false + false + false + false + false + true + true + true + true + true + true + + + true + true + true + true + true + true + false + false + false + false + false + false + + diff --git a/windows/TapDriver Package/TapDriver Package.vcxproj.filters b/windows/TapDriver Package/TapDriver Package.vcxproj.filters index e1b34f2aa..44a2620e8 100644 --- a/windows/TapDriver Package/TapDriver Package.vcxproj.filters +++ b/windows/TapDriver Package/TapDriver Package.vcxproj.filters @@ -6,4 +6,12 @@ inf;inv;inx;mof;mc; + + + Driver Files + + + Driver Files + + \ No newline at end of file diff --git a/windows/TapDriver/TapDriver.vcxproj b/windows/TapDriver/TapDriver.vcxproj index 3ebc8f900..33421c842 100644 --- a/windows/TapDriver/TapDriver.vcxproj +++ b/windows/TapDriver/TapDriver.vcxproj @@ -127,6 +127,7 @@ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ $(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ DbgengKernelDebugger @@ -135,50 +136,61 @@ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ $(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ $(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ $(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ $(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ $(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ ztTap100 $(SolutionDir)\Build\$(Platform)\$(ConfigurationName)\ + http://timestamp.digicert.com/ diff --git a/windows/TapDriver/config.h b/windows/TapDriver/config.h index 5a6ff2471..1dc6ac878 100644 --- a/windows/TapDriver/config.h +++ b/windows/TapDriver/config.h @@ -6,7 +6,7 @@ #define PRODUCT_TAP_WIN_MINOR 0 #define PRODUCT_TAP_WIN_PROVIDER "ZeroTier Networks" #define PRODUCT_TAP_WIN_DEVICE_DESCRIPTION PRODUCT_NAME -#define PRODUCT_TAP_WIN_RELDATE "08/01/2013" +#define PRODUCT_TAP_WIN_RELDATE "01/20/2014" #define TAP_DRIVER_MAJOR_VERSION PRODUCT_TAP_WIN_MAJOR #define TAP_DRIVER_MINOR_VERSION PRODUCT_TAP_WIN_MINOR diff --git a/windows/TapDriver/constants.h b/windows/TapDriver/constants.h index 698dc6297..0e8d86f3a 100644 --- a/windows/TapDriver/constants.h +++ b/windows/TapDriver/constants.h @@ -40,7 +40,7 @@ #define ETHERNET_PACKET_SIZE (ETHERNET_MTU + ETHERNET_HEADER_SIZE) #define DEFAULT_PACKET_LOOKAHEAD (ETHERNET_PACKET_SIZE) -#define NIC_MAX_MCAST_LIST 32 // Max length of multicast address list +#define NIC_MAX_MCAST_LIST 128 // Max length of multicast address list #define MINIMUM_MTU 576 // USE TCP Minimum MTU #define MAXIMUM_MTU 65536 // IP maximum MTU diff --git a/windows/TapDriver/proto.h b/windows/TapDriver/proto.h index 05d2db0d1..06c712bc8 100644 --- a/windows/TapDriver/proto.h +++ b/windows/TapDriver/proto.h @@ -28,12 +28,7 @@ #pragma pack(1) -#define IP_HEADER_SIZE 20 -#define IPV6_HEADER_SIZE 40 - typedef unsigned char MACADDR [6]; -typedef unsigned long IPADDR; -typedef unsigned char IPV6ADDR [16]; //----------------- // Ethernet address @@ -62,163 +57,4 @@ typedef struct USHORT proto; /* packet type ID field */ } ETH_HEADER, *PETH_HEADER; -//---------------- -// ARP packet -//---------------- - -typedef struct -{ - MACADDR m_MAC_Destination; // Reverse these two - MACADDR m_MAC_Source; // to answer ARP requests - USHORT m_Proto; // 0x0806 - -# define MAC_ADDR_TYPE 0x0001 - USHORT m_MAC_AddressType; // 0x0001 - - USHORT m_PROTO_AddressType; // 0x0800 - UCHAR m_MAC_AddressSize; // 0x06 - UCHAR m_PROTO_AddressSize; // 0x04 - -# define ARP_REQUEST 0x0001 -# define ARP_REPLY 0x0002 - USHORT m_ARP_Operation; // 0x0001 for ARP request, 0x0002 for ARP reply - - MACADDR m_ARP_MAC_Source; - IPADDR m_ARP_IP_Source; - MACADDR m_ARP_MAC_Destination; - IPADDR m_ARP_IP_Destination; -} -ARP_PACKET, *PARP_PACKET; - -//---------- -// IP Header -//---------- - -typedef struct { -# define IPH_GET_VER(v) (((v) >> 4) & 0x0F) -# define IPH_GET_LEN(v) (((v) & 0x0F) << 2) - UCHAR version_len; - - UCHAR tos; - USHORT tot_len; - USHORT id; - -# define IP_OFFMASK 0x1fff - USHORT frag_off; - - UCHAR ttl; - -# define IPPROTO_UDP 17 /* UDP protocol */ -# define IPPROTO_TCP 6 /* TCP protocol */ -# define IPPROTO_ICMP 1 /* ICMP protocol */ -# define IPPROTO_IGMP 2 /* IGMP protocol */ - UCHAR protocol; - - USHORT check; - ULONG saddr; - ULONG daddr; - /* The options start here. */ -} IPHDR; - -//----------- -// UDP header -//----------- - -typedef struct { - USHORT source; - USHORT dest; - USHORT len; - USHORT check; -} UDPHDR; - -//-------------------------- -// TCP header, per RFC 793. -//-------------------------- - -typedef struct { - USHORT source; /* source port */ - USHORT dest; /* destination port */ - ULONG seq; /* sequence number */ - ULONG ack_seq; /* acknowledgement number */ - -# define TCPH_GET_DOFF(d) (((d) & 0xF0) >> 2) - UCHAR doff_res; - -# define TCPH_FIN_MASK (1<<0) -# define TCPH_SYN_MASK (1<<1) -# define TCPH_RST_MASK (1<<2) -# define TCPH_PSH_MASK (1<<3) -# define TCPH_ACK_MASK (1<<4) -# define TCPH_URG_MASK (1<<5) -# define TCPH_ECE_MASK (1<<6) -# define TCPH_CWR_MASK (1<<7) - UCHAR flags; - - USHORT window; - USHORT check; - USHORT urg_ptr; -} TCPHDR; - -#define TCPOPT_EOL 0 -#define TCPOPT_NOP 1 -#define TCPOPT_MAXSEG 2 -#define TCPOLEN_MAXSEG 4 - -//------------ -// IPv6 Header -//------------ - -typedef struct { - UCHAR version_prio; - UCHAR flow_lbl[3]; - USHORT payload_len; -# define IPPROTO_ICMPV6 0x3a /* ICMP protocol v6 */ - UCHAR nexthdr; - UCHAR hop_limit; - IPV6ADDR saddr; - IPV6ADDR daddr; -} IPV6HDR; - -//-------------------------------------------- -// IPCMPv6 NS/NA Packets (RFC4443 and RFC4861) -//-------------------------------------------- - -// Neighbor Solictiation - RFC 4861, 4.3 -// (this is just the ICMPv6 part of the packet) -typedef struct { - UCHAR type; -# define ICMPV6_TYPE_NS 135 // neighbour solicitation - UCHAR code; -# define ICMPV6_CODE_0 0 // no specific sub-code for NS/NA - USHORT checksum; - ULONG reserved; - IPV6ADDR target_addr; -} ICMPV6_NS; - -// Neighbor Advertisement - RFC 4861, 4.4 + 4.6/4.6.1 -// (this is just the ICMPv6 payload) -typedef struct { - UCHAR type; -# define ICMPV6_TYPE_NA 136 // neighbour advertisement - UCHAR code; -# define ICMPV6_CODE_0 0 // no specific sub-code for NS/NA - USHORT checksum; - UCHAR rso_bits; // Router(0), Solicited(2), Ovrrd(4) - UCHAR reserved[3]; - IPV6ADDR target_addr; - // always include "Target Link-layer Address" option (RFC 4861 4.6.1) - UCHAR opt_type; -#define ICMPV6_OPTION_TLLA 2 - UCHAR opt_length; -#define ICMPV6_LENGTH_TLLA 1 // multiplied by 8 -> 1 = 8 bytes - MACADDR target_macaddr; -} ICMPV6_NA; - -// this is the complete packet with Ethernet and IPv6 headers -typedef struct { - ETH_HEADER eth; - IPV6HDR ipv6; - ICMPV6_NA icmpv6; -} ICMPV6_NA_PKT; - #pragma pack() diff --git a/windows/TapDriver/prototypes.h b/windows/TapDriver/prototypes.h index 2c4ea91da..4062fc18c 100644 --- a/windows/TapDriver/prototypes.h +++ b/windows/TapDriver/prototypes.h @@ -146,58 +146,12 @@ VOID FlushQueues TapExtensionPointer p_Extension ); -VOID ResetTapAdapterState - ( - TapAdapterPointer p_Adapter - ); - -BOOLEAN ProcessARP - ( - TapAdapterPointer p_Adapter, - const PARP_PACKET src, - const IPADDR adapter_ip, - const IPADDR ip_network, - const IPADDR ip_netmask, - const MACADDR mac - ); - VOID SetMediaStatus ( TapAdapterPointer p_Adapter, BOOLEAN state ); -VOID InjectPacketDeferred - ( - TapAdapterPointer p_Adapter, - UCHAR *packet, - const unsigned int len - ); - -VOID InjectPacketNow - ( - TapAdapterPointer p_Adapter, - UCHAR *packet, - const unsigned int len - ); - -// for KDEFERRED_ROUTINE and Static Driver Verifier -//#include -//KDEFERRED_ROUTINE InjectPacketDpc; - -VOID InjectPacketDpc - ( - KDPC *Dpc, - PVOID DeferredContext, - PVOID SystemArgument1, - PVOID SystemArgument2 - ); - -VOID CheckIfDhcpAndTunMode - ( - TapAdapterPointer p_Adapter - ); - VOID HookDispatchFunctions(); struct WIN2K_NDIS_MINIPORT_BLOCK @@ -206,17 +160,4 @@ struct WIN2K_NDIS_MINIPORT_BLOCK UNICODE_STRING MiniportName; // how mini-port refers to us }; -#if PACKET_TRUNCATION_CHECK - -VOID IPv4PacketSizeVerify - ( - const UCHAR *data, - ULONG length, - BOOLEAN tun, - const char *prefix, - LONG *counter - ); - -#endif - #endif diff --git a/windows/TapDriver/tap-windows.h b/windows/TapDriver/tap-windows.h index a396470e7..3b695e5dd 100644 --- a/windows/TapDriver/tap-windows.h +++ b/windows/TapDriver/tap-windows.h @@ -38,6 +38,13 @@ #define TAP_WIN_IOCTL_GET_MTU TAP_WIN_CONTROL_CODE (3, METHOD_BUFFERED) #define TAP_WIN_IOCTL_SET_MEDIA_STATUS TAP_WIN_CONTROL_CODE (6, METHOD_BUFFERED) #define TAP_WIN_IOCTL_GET_LOG_LINE TAP_WIN_CONTROL_CODE (8, METHOD_BUFFERED) +#define TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS TAP_WIN_CONTROL_CODE (11, METHOD_BUFFERED) + +// Must be the same as NIC_MAX_MCAST_LIST in constants.h +#define TAP_MAX_MCAST_LIST 128 + +// Amount of memory that must be provided to ioctl TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS +#define TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE (TAP_MAX_MCAST_LIST * 6) /* * ================= diff --git a/windows/TapDriver/tapdrvr.c b/windows/TapDriver/tapdrvr.c index 031b0b4e3..f541ebd77 100644 --- a/windows/TapDriver/tapdrvr.c +++ b/windows/TapDriver/tapdrvr.c @@ -1523,6 +1523,7 @@ NTSTATUS PIO_STACK_LOCATION l_IrpSp; NTSTATUS l_Status = STATUS_SUCCESS; BOOLEAN accessible; + ULONG i,j; l_IrpSp = IoGetCurrentIrpStackLocation (p_IRP); @@ -1633,6 +1634,39 @@ NTSTATUS } #endif + // Allow ZeroTier One to get multicast memberships at the L2 level in a + // protocol-neutral manner. + case TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS: + { + if (&l_Adapter->m_MCLockAllocated) + NdisAcquireSpinLock (&l_Adapter->m_MCLock); + if (l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength < TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE) { + /* output buffer too small */ + NOTE_ERROR (); + p_IRP->IoStatus.Status = l_Status = STATUS_INVALID_PARAMETER; + } else { + char *out = (char *)p_IRP->AssociatedIrp.SystemBuffer; + char *end = out + TAP_WIN_IOCTL_GET_MULTICAST_MEMBERSHIPS_OUTPUT_BUF_SIZE; + for(i=0;im_MCListSize;++i) { + if (i >= TAP_MAX_MCAST_LIST) + break; + for(j=0;j<6;++j) + *(out++) = l_Adapter->m_MCList.list[i].addr[j]; + if (out >= end) + break; + } + while (out < end) + *(out++) = (char)0; + p_IRP->IoStatus.Information + = l_IrpSp->Parameters.DeviceIoControl.OutputBufferLength; + p_IRP->IoStatus.Status = l_Status = STATUS_SUCCESS; + } + if (&l_Adapter->m_MCLockAllocated) + NdisReleaseSpinLock (&l_Adapter->m_MCLock); + + break; + } + case TAP_WIN_IOCTL_SET_MEDIA_STATUS: { if (l_IrpSp->Parameters.DeviceIoControl.InputBufferLength >= diff --git a/windows/TapDriver/types.h b/windows/TapDriver/types.h index 9a853e96b..94587a645 100644 --- a/windows/TapDriver/types.h +++ b/windows/TapDriver/types.h @@ -82,14 +82,6 @@ typedef struct _TapExtension // Flags BOOLEAN m_TapIsRunning; BOOLEAN m_CalledTapDeviceFreeResources; - -#if 0 - // DPC queue for deferred packet injection - BOOLEAN m_InjectDpcInitialized; - KDPC m_InjectDpc; - NDIS_SPIN_LOCK m_InjectLock; - Queue *m_InjectQueue; -#endif } TapExtension, *TapExtensionPointer; @@ -103,17 +95,6 @@ typedef struct _TapPacket } TapPacket, *TapPacketPointer; -#if 0 -typedef struct _InjectPacket - { -# define INJECT_PACKET_SIZE(data_size) (sizeof (InjectPacket) + (data_size)) -# define INJECT_PACKET_FREE(ib) NdisFreeMemory ((ib), INJECT_PACKET_SIZE ((ib)->m_Size), 0) - ULONG m_Size; - UCHAR m_Data []; // m_Data must be the last struct member - } -InjectPacket, *InjectPacketPointer; -#endif - typedef struct _TapAdapter { # define NAME(a) ((a)->m_NameAnsi.Buffer) @@ -122,9 +103,6 @@ typedef struct _TapAdapter BOOLEAN m_InterfaceIsRunning; NDIS_HANDLE m_MiniportAdapterHandle; LONG m_Rx, m_Tx, m_RxErr, m_TxErr; -#if PACKET_TRUNCATION_CHECK - LONG m_RxTrunc, m_TxTrunc; -#endif NDIS_MEDIUM m_Medium; ULONG m_Lookahead; ULONG m_MTU;