Skip to content

Commit

Permalink
Support multiple NDIS versions at runtime.
Browse files Browse the repository at this point in the history
See #737 (NDIS 6.89 support), #581 (support for hardware timestamps)
  • Loading branch information
dmiller-nmap committed Oct 18, 2024
1 parent a60490b commit c5d29dd
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 71 deletions.
21 changes: 15 additions & 6 deletions packetWin7/npf/npf/Openclos.c
Original file line number Diff line number Diff line change
Expand Up @@ -1921,8 +1921,8 @@ NPF_CreateFilterModule(

NdisZeroMemory(&PoolParameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));
PoolParameters.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
PoolParameters.Header.Revision = NPCAP_REVISION_NET_BUFFER_LIST_POOL_PARAMETERS;
PoolParameters.Header.Size = NPCAP_SIZEOF_NET_BUFFER_LIST_POOL_PARAMETERS;
PoolParameters.Header.Revision = NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;
PoolParameters.Header.Size = NDIS_SIZEOF_NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;
PoolParameters.ProtocolId = NDIS_PROTOCOL_ID_DEFAULT;
PoolParameters.fAllocateNetBuffer = TRUE;
PoolParameters.ContextSize = sizeof(PACKET_RESERVED);
Expand Down Expand Up @@ -2194,8 +2194,8 @@ NPF_AttachAdapter(

NdisZeroMemory(&FilterAttributes, sizeof(NDIS_FILTER_ATTRIBUTES));
FilterAttributes.Header.Type = NDIS_OBJECT_TYPE_FILTER_ATTRIBUTES;
FilterAttributes.Header.Revision = NPCAP_REVISION_NDIS_FILTER_ATTRIBUTES;
FilterAttributes.Header.Size = NPCAP_SIZEOF_NDIS_FILTER_ATTRIBUTES;
FilterAttributes.Header.Revision = NDIS_FILTER_ATTRIBUTES_REVISION_1;
FilterAttributes.Header.Size = NDIS_SIZEOF_FILTER_ATTRIBUTES_REVISION_1;
FilterAttributes.Flags = 0;

NDIS_DECLARE_FILTER_MODULE_CONTEXT(NPCAP_FILTER_MODULE);
Expand Down Expand Up @@ -3356,8 +3356,17 @@ NDIS_STATUS NPF_DoInternalRequest(
NdisResetEvent(&pInternalRequest->InternalRequestCompletedEvent);

NdisRequest->Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST;
NdisRequest->Header.Revision = NPCAP_REVISION_NDIS_OID_REQUEST;
NdisRequest->Header.Size = NPCAP_SIZEOF_NDIS_OID_REQUEST;
#if NDIS_SUPPORT_NDIS650
if (g_pDriverExtension->NdisVersion >= NDIS_RUNTIME_VERSION_650) {
NdisRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_2;
NdisRequest->Header.Size = NDIS_SIZEOF_OID_REQUEST_REVISION_2;
} else
#else
{
NdisRequest->Header.Revision = NDIS_OID_REQUEST_REVISION_1;
NdisRequest->Header.Size = NDIS_SIZEOF_OID_REQUEST_REVISION_1;
}
#endif
NdisRequest->RequestType = RequestType;
NdisRequest->RequestHandle = pFiltMod->AdapterHandle;
*(PVOID *)NdisRequest->SourceReserved = NULL; //indicates this is a self-sent request
Expand Down
58 changes: 42 additions & 16 deletions packetWin7/npf/npf/Packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@
#include "..\..\..\version.h"
#include "..\..\..\Common\WpcapNames.h"

#include <windef.h>
#include <minwindef.h>

#ifdef ALLOC_PRAGMA
#pragma NDIS_INIT_FUNCTION(DriverEntry)
Expand Down Expand Up @@ -156,6 +156,7 @@ NTSTATUS NPF_Deny(
VOID
NPF_registerLWF(
_Out_ PNDIS_FILTER_DRIVER_CHARACTERISTICS pFChars,
_In_ UINT NdisVersion,
_In_ BOOLEAN bWiFiOrNot
);

Expand Down Expand Up @@ -256,6 +257,17 @@ DriverEntry(
return STATUS_INSUFFICIENT_RESOURCES;
}

g_pDriverExtension->NdisVersion = NdisGetVersion();
if (!NT_VERIFY(g_pDriverExtension->NdisVersion >= MAKELONG(
NDIS_FILTER_MINIMUM_MAJOR_VERSION, NDIS_FILTER_MINIMUM_MINOR_VERSION))) {
ERROR_DBG("Incompatible NDIS version (too low).\n");
TRACE_EXIT();
return STATUS_NDIS_BAD_VERSION;
}
if (g_pDriverExtension->NdisVersion > MAKELONG(NDIS_FILTER_MAJOR_VERSION, NDIS_FILTER_MINOR_VERSION)) {
g_pDriverExtension->NdisVersion = MAKELONG(NDIS_FILTER_MAJOR_VERSION, NDIS_FILTER_MINOR_VERSION);
}

RtlInitUnicodeString(&parametersPath, NULL);
parametersPath.MaximumLength=RegistryPath->Length+sizeof(L"\\Parameters");
parametersPath.Buffer=NPF_AllocateZeroPaged(parametersPath.MaximumLength, NPF_UNICODE_BUFFER_TAG);
Expand Down Expand Up @@ -325,9 +337,9 @@ DriverEntry(
//
// Register as a service with NDIS
//
NPF_registerLWF(&FChars, FALSE);
NPF_registerLWF(&FChars, g_pDriverExtension->NdisVersion, FALSE);
if (g_pDriverExtension->bDot11SupportMode)
NPF_registerLWF(&FChars_WiFi, TRUE);
NPF_registerLWF(&FChars_WiFi, g_pDriverExtension->NdisVersion, TRUE);

DriverObject->DriverUnload = NPF_Unload;

Expand Down Expand Up @@ -569,6 +581,7 @@ _Use_decl_annotations_
VOID
NPF_registerLWF(
PNDIS_FILTER_DRIVER_CHARACTERISTICS pFChars,
UINT NdisVersion,
BOOLEAN bWiFiOrNot
)
{
Expand All @@ -581,11 +594,33 @@ NPF_registerLWF(

NdisZeroMemory(pFChars, sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS));
pFChars->Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS;
pFChars->Header.Revision = NPCAP_REVISION_NDIS_FILTER_DRIVER_CHARACTERISTICS;
pFChars->Header.Size = NPCAP_SIZEOF_NDIS_FILTER_DRIVER_CHARACTERISTICS;

pFChars->MajorNdisVersion = NDIS_FILTER_MAJOR_VERSION;
pFChars->MinorNdisVersion = NDIS_FILTER_MINOR_VERSION;
#if NDIS_SUPPORT_NDIS61
pFChars->DirectOidRequestHandler = NULL;
pFChars->DirectOidRequestCompleteHandler = NULL;
pFChars->CancelDirectOidRequestHandler = NULL;
#if NDIS_SUPPORT_NDIS680
pFChars->SynchronousOidRequestHandler = NULL;
pFChars->SynchronousOidRequestCompleteHandler = NULL;
if (NdisVersion >= NDIS_RUNTIME_VERSION_680) {
pFChars->Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_3;
pFChars->Header.Size = NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_3;
} else
#endif
if (NT_VERIFY(NdisVersion >= NDIS_RUNTIME_VERSION_61)) {
pFChars->Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_2;
pFChars->Header.Size = NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_2;
} else
#else
# error NDIS 6.20 or later required
#endif
{
pFChars->Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_1;
pFChars->Header.Size = NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_1;
}

pFChars->MajorNdisVersion = (UCHAR)((NdisVersion >> 16) & 0xff);
pFChars->MinorNdisVersion = (UCHAR)(NdisVersion & 0xff);
// WINPCAP_MAJOR is 5 for Npcap
pFChars->MajorDriverVersion = WINPCAP_MINOR;
pFChars->MinorDriverVersion = WINPCAP_REV;
Expand Down Expand Up @@ -624,16 +659,7 @@ NPF_registerLWF(
pFChars->StatusHandler = NPF_Status;
pFChars->CancelSendNetBufferListsHandler = NPF_CancelSendNetBufferLists;

#if NDIS_SUPPORT_NDIS61
pFChars->DirectOidRequestHandler = NULL;
pFChars->DirectOidRequestCompleteHandler = NULL;
pFChars->CancelDirectOidRequestHandler = NULL;
#endif

#if NDIS_SUPPORT_NDIS680
pFChars->SynchronousOidRequestHandler = NULL;
pFChars->SynchronousOidRequestCompleteHandler = NULL;
#endif
}

//-------------------------------------------------------------------
Expand Down
35 changes: 1 addition & 34 deletions packetWin7/npf/npf/Packet.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,40 +138,6 @@ typedef struct _NDIS_OID_REQUEST *FILTER_REQUEST_CONTEXT,**PFILTER_REQUEST_CONTE
#ifndef NDIS_SUPPORT_NDIS620
#error NDIS 6.20 required
#endif
// ndis.h data structure revisions by version.
// NDIS_OBJECT_TYPE_OID_REQUEST
#if NDIS_SUPPORT_NDIS650
#define NPCAP_REVISION_NDIS_OID_REQUEST NDIS_OID_REQUEST_REVISION_2
#define NPCAP_SIZEOF_NDIS_OID_REQUEST NDIS_SIZEOF_OID_REQUEST_REVISION_2
#else
#define NPCAP_REVISION_NDIS_OID_REQUEST NDIS_OID_REQUEST_REVISION_1
#define NPCAP_SIZEOF_NDIS_OID_REQUEST NDIS_SIZEOF_OID_REQUEST_REVISION_1
#endif
#define ALIGNED_SIZE(x, t) (((x)+(_alignof(t)-1))&~(_alignof(t)-1))
C_ASSERT(sizeof(NDIS_OID_REQUEST) == ALIGNED_SIZE(NPCAP_SIZEOF_NDIS_OID_REQUEST, NDIS_OID_REQUEST));

// NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS
#if NDIS_SUPPORT_NDIS680
#define NPCAP_REVISION_NDIS_FILTER_DRIVER_CHARACTERISTICS NDIS_FILTER_CHARACTERISTICS_REVISION_3
#define NPCAP_SIZEOF_NDIS_FILTER_DRIVER_CHARACTERISTICS NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_3
#elif NDIS_SUPPORT_NDIS61
#define NPCAP_REVISION_NDIS_FILTER_DRIVER_CHARACTERISTICS NDIS_FILTER_CHARACTERISTICS_REVISION_2
#define NPCAP_SIZEOF_NDIS_FILTER_DRIVER_CHARACTERISTICS NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_2
#else
#define NPCAP_REVISION_NDIS_FILTER_DRIVER_CHARACTERISTICS NDIS_FILTER_CHARACTERISTICS_REVISION_1
#define NPCAP_SIZEOF_NDIS_FILTER_DRIVER_CHARACTERISTICS NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_1
#endif
C_ASSERT(sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS) == ALIGNED_SIZE(NPCAP_SIZEOF_NDIS_FILTER_DRIVER_CHARACTERISTICS, NDIS_FILTER_DRIVER_CHARACTERISTICS));

// NDIS_OBJECT_TYPE_DEFAULT: NET_BUFFER_LIST_POOL_PARAMETERS
#define NPCAP_REVISION_NET_BUFFER_LIST_POOL_PARAMETERS NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1
#define NPCAP_SIZEOF_NET_BUFFER_LIST_POOL_PARAMETERS NDIS_SIZEOF_NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1
C_ASSERT(sizeof(NET_BUFFER_LIST_POOL_PARAMETERS) == ALIGNED_SIZE(NPCAP_SIZEOF_NET_BUFFER_LIST_POOL_PARAMETERS, NET_BUFFER_LIST_POOL_PARAMETERS));

// NDIS_OBJECT_TYPE_FILTER_ATTRIBUTES
#define NPCAP_REVISION_NDIS_FILTER_ATTRIBUTES NDIS_FILTER_ATTRIBUTES_REVISION_1
#define NPCAP_SIZEOF_NDIS_FILTER_ATTRIBUTES NDIS_SIZEOF_FILTER_ATTRIBUTES_REVISION_1
C_ASSERT(sizeof(NDIS_FILTER_ATTRIBUTES) == ALIGNED_SIZE(NPCAP_SIZEOF_NDIS_FILTER_ATTRIBUTES, NDIS_FILTER_ATTRIBUTES));

#define Packet_ALIGNMENT sizeof(int) ///< Alignment macro. Defines the alignment size.
#define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) ///< Alignment macro. Rounds up to the next
Expand Down Expand Up @@ -288,6 +254,7 @@ typedef struct _NPCAP_DRIVER_EXTENSION
PDEVICE_OBJECT pNpcapDeviceObject;
NDIS_HANDLE FilterDriverHandle;
NDIS_HANDLE FilterDriverHandle_WiFi;
UINT NdisVersion;

SINGLE_LIST_ENTRY arrFiltMod; //Adapter filter module list head
NDIS_SPIN_LOCK FilterArrayLock; //The lock for adapter filter module list.
Expand Down
Loading

0 comments on commit c5d29dd

Please sign in to comment.