Skip to content

Commit f7c77b5

Browse files
authored
Merge branch 'nmap:master' into fix_nonadmin_npcaphelper
2 parents 931f2ed + 95ddb32 commit f7c77b5

File tree

14 files changed

+536
-353
lines changed

14 files changed

+536
-353
lines changed

Common/Packet32.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,11 +372,14 @@ struct _PACKET_OID_DATA
372372
///< for a complete list of valid codes.
373373
ULONG Length; ///< Length of the data field
374374
_Field_size_full_(Length)
375-
UCHAR Data[1]; ///< variable-lenght field that contains the information passed to or received
375+
UCHAR Data[1]; ///< variable-length field that contains the information passed to or received
376376
///< from the adapter.
377377
};
378378
typedef struct _PACKET_OID_DATA PACKET_OID_DATA, * PPACKET_OID_DATA;
379379

380+
#define PACKET_OID_DATA_LENGTH(_DataLength) \
381+
(FIELD_OFFSET(PACKET_OID_DATA, Data) + _DataLength)
382+
380383
#ifdef __cplusplus
381384
extern "C"
382385
{
@@ -420,7 +423,8 @@ extern "C"
420423
_Success_(return) BOOLEAN PacketSetHwFilter(_In_ LPADAPTER AdapterObject, _In_ ULONG Filter);
421424
_Success_(return) BOOLEAN PacketGetAdapterNames(_Out_writes_opt_(_Old_(*BufferSize)) PCHAR pStr, _Inout_ PULONG BufferSize);
422425
_Success_(return) BOOLEAN PacketGetNetInfoEx(_In_ PCCH AdapterName, _Out_writes_to_(_Old_(*NEntries),*NEntries) npf_if_addr* buffer, _Inout_ PLONG NEntries);
423-
_Success_(return) BOOLEAN PacketRequest(_In_ LPADAPTER AdapterObject, _In_ BOOLEAN Set, _Inout_ PPACKET_OID_DATA OidData);
426+
_Success_(return) BOOLEAN PacketRequest(_In_ LPADAPTER AdapterObject, _In_ BOOLEAN Set, _Inout_updates_bytes_(PACKET_OID_DATA_LENGTH(OidData->Length)) PPACKET_OID_DATA OidData);
427+
_Success_(return) BOOLEAN PacketGetInfo(_In_opt_ LPADAPTER AdapterObject, _Inout_updates_bytes_(PACKET_OID_DATA_LENGTH(OidData->Length)) PPACKET_OID_DATA OidData);
424428
HANDLE PacketGetReadEvent(_In_ LPADAPTER AdapterObject);
425429
__declspec(deprecated("Kernel dump mode is not supported")) BOOLEAN PacketSetDumpName(LPADAPTER AdapterObject, void* name, int len);
426430
__declspec(deprecated("Kernel dump mode is not supported")) BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks);

packetWin7/Dll/Packet.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,5 @@ EXPORTS
3939
PacketSetLoopbackBehavior
4040
PacketSetTimestampMode
4141
PacketGetTimestampModes
42+
PacketGetInfo
4243
PacketGetAirPcapHandle

packetWin7/Dll/Packet32.cpp

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,7 @@ static PCHAR WChar2SChar(_In_ LPCWCH string)
927927
BOOLEAN PacketSetMaxLookaheadsize (LPADAPTER AdapterObject)
928928
{
929929
BOOLEAN Status;
930-
CHAR IoCtlBuffer[sizeof(PACKET_OID_DATA) + sizeof(ULONG) - 1] = { 0 };
930+
CHAR IoCtlBuffer[PACKET_OID_DATA_LENGTH(sizeof(ULONG))] = { 0 };
931931
PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)IoCtlBuffer;
932932
DWORD err = ERROR_SUCCESS;
933933

@@ -2918,13 +2918,13 @@ _Success_(return == ERROR_SUCCESS)
29182918
static DWORD PacketRequestHelper(
29192919
_In_ HANDLE hAdapter,
29202920
_In_ BOOLEAN Set,
2921-
_In_ PPACKET_OID_DATA OidData)
2921+
_Inout_updates_bytes_(PACKET_OID_DATA_LENGTH(OidData->Length)) PPACKET_OID_DATA OidData)
29222922
{
29232923
DWORD BytesReturned = 0;
29242924
DWORD err = ERROR_SUCCESS;
29252925
if(!DeviceIoControl(hAdapter, (DWORD) (Set ? BIOCSETOID : BIOCQUERYOID),
2926-
OidData, sizeof(PACKET_OID_DATA) - 1 + OidData->Length,
2927-
OidData, sizeof(PACKET_OID_DATA) - 1 + OidData->Length,
2926+
OidData, PACKET_OID_DATA_LENGTH(OidData->Length),
2927+
OidData, PACKET_OID_DATA_LENGTH(OidData->Length),
29282928
&BytesReturned, NULL))
29292929
{
29302930
err = GetLastError();
@@ -2991,7 +2991,7 @@ BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter)
29912991
{
29922992
BOOLEAN Status;
29932993
DWORD err = ERROR_SUCCESS;
2994-
CHAR IoCtlBuffer[sizeof(PACKET_OID_DATA) + sizeof(ULONG) - 1] = { 0 };
2994+
CHAR IoCtlBuffer[PACKET_OID_DATA_LENGTH(sizeof(ULONG))] = { 0 };
29952995
PPACKET_OID_DATA OidData = (PPACKET_OID_DATA) IoCtlBuffer;
29962996

29972997
TRACE_ENTER();
@@ -3454,7 +3454,7 @@ _Use_decl_annotations_
34543454
BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type)
34553455
{
34563456
DWORD err = ERROR_SUCCESS;
3457-
CHAR IoCtlBuffer[sizeof(PACKET_OID_DATA)+sizeof(NDIS_LINK_SPEED)] = {0};
3457+
CHAR IoCtlBuffer[PACKET_OID_DATA_LENGTH(sizeof(NDIS_LINK_SPEED))] = {0};
34583458

34593459
TRACE_ENTER();
34603460
if (type == NULL) {
@@ -3569,7 +3569,7 @@ int PacketIsMonitorModeSupported(PCCH AdapterName)
35693569
{
35703570
HANDLE hAdapter;
35713571
PCHAR AdapterID = NULL;
3572-
CHAR IoCtlBuffer[sizeof(PACKET_OID_DATA) + sizeof(DOT11_OPERATION_MODE_CAPABILITY) - 1] = { 0 };
3572+
CHAR IoCtlBuffer[PACKET_OID_DATA_LENGTH(sizeof(DOT11_OPERATION_MODE_CAPABILITY))] = { 0 };
35733573
PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)IoCtlBuffer;
35743574
PDOT11_OPERATION_MODE_CAPABILITY pOperationModeCapability;
35753575
int mode;
@@ -3641,7 +3641,7 @@ int PacketSetMonitorMode(PCCH AdapterName, int mode)
36413641
DWORD dwResult = ERROR_INVALID_DATA;
36423642
PCHAR AdapterID = NULL;
36433643
HANDLE hAdapter = INVALID_HANDLE_VALUE;
3644-
CHAR IoCtlBuffer[sizeof(PACKET_OID_DATA) + sizeof(DOT11_CURRENT_OPERATION_MODE) - 1] = { 0 };
3644+
CHAR IoCtlBuffer[PACKET_OID_DATA_LENGTH(sizeof(DOT11_CURRENT_OPERATION_MODE))] = { 0 };
36453645
PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)IoCtlBuffer;
36463646
PDOT11_CURRENT_OPERATION_MODE pOpMode = (PDOT11_CURRENT_OPERATION_MODE)OidData->Data;
36473647

@@ -3713,7 +3713,7 @@ int PacketGetMonitorMode(PCCH AdapterName)
37133713
int mode;
37143714
HANDLE hAdapter = INVALID_HANDLE_VALUE;
37153715
DWORD dwResult = ERROR_INVALID_DATA;
3716-
CHAR IoCtlBuffer[sizeof(PACKET_OID_DATA) + sizeof(DOT11_CURRENT_OPERATION_MODE) - 1] = { 0 };
3716+
CHAR IoCtlBuffer[PACKET_OID_DATA_LENGTH(sizeof(DOT11_CURRENT_OPERATION_MODE))] = { 0 };
37173717
PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)IoCtlBuffer;
37183718
PDOT11_CURRENT_OPERATION_MODE pOperationMode = (PDOT11_CURRENT_OPERATION_MODE)OidData->Data;
37193719
PCHAR AdapterID = NULL;
@@ -3792,4 +3792,50 @@ PAirpcapHandle PacketGetAirPcapHandle(LPADAPTER AdapterObject)
37923792
return handle;
37933793
}
37943794

3795+
_Use_decl_annotations_
3796+
BOOLEAN PacketGetInfo(
3797+
LPADAPTER AdapterObject,
3798+
PPACKET_OID_DATA OidData)
3799+
{
3800+
HANDLE hAdapter = INVALID_HANDLE_VALUE;
3801+
BOOLEAN bCloseAdapter = FALSE;
3802+
DWORD BytesReturned = 0;
3803+
DWORD err = ERROR_SUCCESS;
3804+
TRACE_ENTER();
3805+
3806+
if (AdapterObject == NULL) {
3807+
hAdapter = PacketGetAdapterHandle("", 0);
3808+
bCloseAdapter = TRUE;
3809+
}
3810+
else if(AdapterObject->Flags & INFO_FLAG_MASK_NOT_NPF)
3811+
{
3812+
TRACE_PRINT("PacketRequest not supported on non-NPF adapters.");
3813+
TRACE_EXIT();
3814+
SetLastError(ERROR_NOT_SUPPORTED);
3815+
return FALSE;
3816+
}
3817+
else {
3818+
hAdapter = AdapterObject->hFile;
3819+
}
3820+
3821+
if(!DeviceIoControl(hAdapter, BIOCGETINFO,
3822+
OidData, PACKET_OID_DATA_LENGTH(OidData->Length),
3823+
OidData, PACKET_OID_DATA_LENGTH(OidData->Length),
3824+
&BytesReturned, NULL))
3825+
{
3826+
err = GetLastError();
3827+
}
3828+
TRACE_PRINT3("PacketGetInfo: ID = 0x%.08x, Length = %d, ErrCode = 0x%.08x",
3829+
OidData->Oid,
3830+
OidData->Length,
3831+
err);
3832+
3833+
if (bCloseAdapter) {
3834+
CloseHandle(hAdapter);
3835+
}
3836+
TRACE_EXIT();
3837+
SetLastError(err);
3838+
return (err == ERROR_SUCCESS);
3839+
}
3840+
37953841
/* @} */

packetWin7/npf/npf/Openclos.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ NPF_GetFilterModuleByAdapterName(
163163
_Must_inspect_result_
164164
_Success_(return != NULL)
165165
__drv_allocatesMem(mem)
166-
POPEN_INSTANCE
166+
__declspec(restrict) POPEN_INSTANCE
167167
NPF_CreateOpenObject(
168168
_In_ NDIS_HANDLE NdisHandle
169169
);

packetWin7/npf/npf/Packet.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,6 +1950,87 @@ static NTSTATUS funcBIOCGETPIDS(_In_ POPEN_INSTANCE pOpen,
19501950
return STATUS_SUCCESS;
19511951
}
19521952

1953+
_Must_inspect_result_
1954+
static NTSTATUS funcBIOCGETINFO(_In_ POPEN_INSTANCE pOpen,
1955+
_Inout_updates_bytes_(ulBufLenIn) PPACKET_OID_DATA OidData,
1956+
_In_ ULONG ulBufLenIn,
1957+
_In_ ULONG ulBufLenOut,
1958+
_Out_ PULONG_PTR Info)
1959+
{
1960+
NTSTATUS Status = STATUS_UNSUCCESSFUL;
1961+
PSINGLE_LIST_ENTRY Curr = NULL;
1962+
PNPCAP_FILTER_MODULE pFiltMod = NULL;
1963+
ULONG ulTmp = 0;
1964+
1965+
*Info = 0;
1966+
// NDIS OID requests use the same buffer for in/out, so the caller must supply the same size buffers, too.
1967+
if (ulBufLenIn != ulBufLenOut ||
1968+
ulBufLenIn < sizeof(PACKET_OID_DATA) || // check before dereferencing OidData
1969+
ulBufLenIn < (FIELD_OFFSET(PACKET_OID_DATA, Data) + OidData->Length) ||
1970+
OidData->Length < sizeof(ULONG)
1971+
)
1972+
{
1973+
return STATUS_BUFFER_TOO_SMALL;
1974+
}
1975+
1976+
// Now Length is at least sizeof(ULONG)
1977+
INFO_DBG("BIOCGETINFO: ID=%08lx, Length=%08lx\n", OidData->Oid, OidData->Length);
1978+
1979+
switch (OidData->Oid) {
1980+
case NPF_GETINFO_VERSION:
1981+
*((PULONG)OidData->Data) =
1982+
((WINPCAP_MINOR & 0xff) << 24) |
1983+
((WINPCAP_REV & 0xff) << 16) |
1984+
((WINPCAP_BUILD & 0xffff));
1985+
OidData->Length = sizeof(ULONG);
1986+
*Info = FIELD_OFFSET(PACKET_OID_DATA, Data) + sizeof(ULONG);
1987+
Status = STATUS_SUCCESS;
1988+
break;
1989+
1990+
case NPF_GETINFO_CONFIG:
1991+
ulTmp = (0
1992+
#ifdef NPCAP_OEM
1993+
| NPF_CONFIG_OEM
1994+
#endif
1995+
#ifndef NPCAP_READ_ONLY
1996+
| NPF_CONFIG_INJECT
1997+
#endif
1998+
);
1999+
if (g_pDriverExtension->bAdminOnlyMode)
2000+
ulTmp |= NPF_CONFIG_ADMINONLY;
2001+
if (g_pDriverExtension->bDltNullMode)
2002+
ulTmp |= NPF_CONFIG_DLTNULL;
2003+
#ifdef HAVE_DOT11_SUPPORT
2004+
if (g_pDriverExtension->bDot11SupportMode)
2005+
ulTmp |= NPF_CONFIG_WIFI;
2006+
#endif
2007+
#ifdef HAVE_WFP_LOOPBACK_SUPPORT
2008+
if (g_pDriverExtension->bLoopbackSupportMode)
2009+
ulTmp |= NPF_CONFIG_LOOPBACK;
2010+
#endif
2011+
if (g_pDriverExtension->bTestMode)
2012+
ulTmp |= NPF_CONFIG_TESTMODE;
2013+
2014+
*((PULONG)OidData->Data) = ulTmp;
2015+
OidData->Length = sizeof(ULONG);
2016+
*Info = FIELD_OFFSET(PACKET_OID_DATA, Data) + sizeof(ULONG);
2017+
Status = STATUS_SUCCESS;
2018+
break;
2019+
2020+
case NPF_GETINFO_BPFEXT:
2021+
*((PULONG)OidData->Data) = SKF_AD_MAX;
2022+
OidData->Length = sizeof(ULONG);
2023+
*Info = FIELD_OFFSET(PACKET_OID_DATA, Data) + sizeof(ULONG);
2024+
Status = STATUS_SUCCESS;
2025+
break;
2026+
2027+
default:
2028+
Status = STATUS_INVALID_DEVICE_REQUEST;
2029+
break;
2030+
}
2031+
return Status;
2032+
}
2033+
19532034
_Use_decl_annotations_
19542035
NTSTATUS
19552036
NPF_IoControl(
@@ -2063,6 +2144,9 @@ NPF_IoControl(
20632144
case BIOCGTIMESTAMPMODES:
20642145
Status = funcBIOCGTIMESTAMPMODES(Open, pBuf, OutputBufferLength, &Information);
20652146
break;
2147+
case BIOCGETINFO:
2148+
Status = funcBIOCGETINFO(Open, pBuf, InputBufferLength, OutputBufferLength, &Information);
2149+
break;
20662150

20672151
#if DBG
20682152
/* Deprecated codes */

packetWin7/npf/npf/Packet.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,18 +461,25 @@ typedef struct _OPEN_INSTANCE
461461
}
462462
OPEN_INSTANCE, *POPEN_INSTANCE;
463463

464+
/* Packet metadata that is the same for every NET_BUFFER in the NET_BUFFER_LIST
465+
* and that we need until all related captures are retrieved. */
464466
typedef struct _NPF_NBL_COPY
465467
{
466468
SINGLE_LIST_ENTRY NBCopiesHead;
467469
SINGLE_LIST_ENTRY NBLCopyEntry;
468470
LARGE_INTEGER PerfCount;
469471
LARGE_INTEGER SystemTime;
472+
NDIS_NET_BUFFER_LIST_8021Q_INFO qInfo;
470473
#ifdef HAVE_DOT11_SUPPORT
471474
PUCHAR Dot11RadiotapHeader;
472475
#endif
473476
LONG refcount;
474477
} NPF_NBL_COPY, *PNPF_NBL_COPY;
475478

479+
480+
/* Packet data and metadata that is unique to each packet, but common to every
481+
* capture of that packet, and which we need to keep until all related captures
482+
* are retrieved. */
476483
typedef struct _NPF_NB_COPIES
477484
{
478485
PNPF_NBL_COPY pNBLCopy;
@@ -482,12 +489,16 @@ typedef struct _NPF_NB_COPIES
482489
PUCHAR Buffer; // packet data
483490
} NPF_NB_COPIES, *PNPF_NB_COPIES;
484491

492+
/* Packet metadata that we only need prior to putting the NPF_CAP_DATA in the
493+
* queue. Only lives as long as the call to NPF_DoTap. */
485494
typedef struct _NPF_SRC_NB
486495
{
487496
SINGLE_LIST_ENTRY CopiesEntry;
488497
PNPF_NB_COPIES pNBCopy;
489498
PNET_BUFFER pNetBuffer; // source NET_BUFFER
490499
ULONG ulDesired; // How much data we want from the packet
500+
BOOLEAN bVlanHeaderInPacket:1; // Is there a 802.1q VLAN header in the packet data?
501+
BOOLEAN bVlanHeaderAdded:1; // Was a VLAN header added to the pNBCopy, increasing size by 4 bytes?
491502
} NPF_SRC_NB, *PNPF_SRC_NB;
492503

493504
// so we can use the same lookaside list for all these things
@@ -519,11 +530,13 @@ NPF_CAP_DATA, *PNPF_CAP_DATA;
519530
#define NPF_CAP_SIZE(_CapLen) (sizeof(struct bpf_hdr) + _CapLen)
520531

521532
#ifdef HAVE_DOT11_SUPPORT
522-
#define NPF_CAP_OBJ_SIZE(_P, _R) NPF_CAP_SIZE( \
533+
#define NPF_CAP_RADIOTAP(_P) ((_P)->pNBCopy->pNBLCopy->Dot11RadiotapHeader)
534+
#define NPF_CAP_RADIOTAP_SIZE(_R) ((_R) != NULL ? ((PIEEE80211_RADIOTAP_HEADER)(_R))->it_len : 0)
535+
#define NPF_CAP_OBJ_SIZE(_P) NPF_CAP_SIZE( \
523536
(_P)->ulCaplen \
524-
+ (_R != NULL ? _R->it_len : 0))
537+
+ NPF_CAP_RADIOTAP_SIZE(NPF_CAP_RADIOTAP(_P)))
525538
#else
526-
#define NPF_CAP_OBJ_SIZE(_P, _N) NPF_CAP_SIZE((_P)->ulCaplen)
539+
#define NPF_CAP_OBJ_SIZE(_P) NPF_CAP_SIZE((_P)->ulCaplen)
527540
#endif
528541

529542
_When_(AcquireLock == FALSE, _Requires_lock_held_(Open->BufferLock))
@@ -1180,7 +1193,7 @@ NPF_GetLoopbackFilterModule();
11801193
This function is used to create a filter module context object
11811194
*/
11821195
_Ret_maybenull_
1183-
PNPCAP_FILTER_MODULE
1196+
__declspec(restrict) PNPCAP_FILTER_MODULE
11841197
NPF_CreateFilterModule(
11851198
_In_ NDIS_HANDLE NdisFilterHandle,
11861199
_In_ PNDIS_STRING AdapterName

0 commit comments

Comments
 (0)