📄 ipfilt.c
字号:
/////////////////////////////////////////////////////////////////////////////
//// INCLUDE FILES
#include "ndis.h"
#include "TDI.H"
#include "TDIKRNL.H"
#include "PCATDIH.h"
// Copyright And Configuration Management ----------------------------------
//
// TDI Filter Driver IP Device Filter - IPFILT.c
//
// Transport Data Interface (TDI) Filter Samples
// For
// Windows NT
//
// Copyright (c) 2000, Printing Communications Associates, Inc.
//
// Thomas F. Divine
// 4201 Brunswick Court
// Smyrna, Georgia 30080 USA
// (770) 432-4580
// tdivine@pcausa.com
//
// End ---------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// I P D E V I C E F I L T E R //
/////////////////////////////////////////////////////////////////////////////
//
// Notes
// -----
// The IP device is a Microsoft device that provides support for IP
// operations other than TCP and UDP. Since the details of it's operation
// are undocumented, this is an empty skeleton provided strictly for
// experimental purposes.
//
// If you exercise the IP filter you will see calls related to IP functions
// such as ICMP and IGMP. For example, if you exercise the PING.EXE utility,
// you will see that the IP device is called to create a handle and then
// DeviceIoControl calls are made to actually perform the PING.
//
// Since this IP filter is not of much practical use, it is NOT called
// unless the USE_IP_FILTER preprocessor variable is set in PCATDIH.H
//
#ifdef USE_IP_FILTER
/////////////////////////////////////////////////////////////////////////////
//// IPFilter_InitDeviceExtension
//
// Purpose
//
// Parameters
//
// Return Value
//
// Remarks
//
NTSTATUS
IPFilter_InitDeviceExtension(
PTDIH_DeviceExtension pTDIH_DeviceExtension,
PDEVICE_OBJECT pFilterDeviceObject
)
{
NdisZeroMemory( pTDIH_DeviceExtension, sizeof( TDIH_DeviceExtension ) );
pTDIH_DeviceExtension->NodeIdentifier.NodeType = TDIH_NODE_TYPE_IP_FILTER_DEVICE;
pTDIH_DeviceExtension->NodeIdentifier.NodeSize = sizeof( TDIH_DeviceExtension );
pTDIH_DeviceExtension->pFilterDeviceObject = pFilterDeviceObject;
return( STATUS_SUCCESS );
}
/////////////////////////////////////////////////////////////////////////////
//// IPFilter_Attach
//
// Purpose
//
// Parameters
//
// Return Value
//
// Remarks
//
NTSTATUS
IPFilter_Attach(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
UNICODE_STRING uniNtNameString;
PTDIH_DeviceExtension pTDIH_DeviceExtension;
PDEVICE_OBJECT pFilterDeviceObject = NULL;
PDEVICE_OBJECT pTargetDeviceObject = NULL;
PFILE_OBJECT pTargetFileObject = NULL;
PDEVICE_OBJECT pLowerDeviceObject = NULL;
KdPrint(("PCATDIH: IPFilter_Attach Entry...\n"));
//
// Create counted string version of target IP device name.
//
ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );
RtlInitUnicodeString( &uniNtNameString, DD_IP_DEVICE_NAME );
ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );
status = IoGetDeviceObjectPointer(
&uniNtNameString,
FILE_READ_ATTRIBUTES,
&pTargetFileObject, // Call ObDereferenceObject Eventually...
&pTargetDeviceObject
);
if( !NT_SUCCESS(status) )
{
KdPrint(("PCATDIH: Couldn't get the IP Device Object\n"));
pTargetFileObject = NULL;
pTargetDeviceObject = NULL;
return( status );
}
//
// Create counted string version of our IP filter device name.
//
ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );
RtlInitUnicodeString( &uniNtNameString, TDIH_IP_DEVICE_NAME );
//
// Create The IP Filter Device Object
// -----------------------------------
// IoCreateDevice zeroes the memory occupied by the object.
//
// Adopt the DeviceType and Characteristics of the target device.
//
ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );
status = IoCreateDevice(
DriverObject,
sizeof( TDIH_DeviceExtension ),
&uniNtNameString,
pTargetDeviceObject->DeviceType,
pTargetDeviceObject->Characteristics,
FALSE, // This isn't an exclusive device
&pFilterDeviceObject
);
if( !NT_SUCCESS(status) )
{
KdPrint(("PCATDIH: Couldn't create the IP Filter Device Object\n"));
ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );
ObDereferenceObject( pTargetFileObject );
pTargetFileObject = NULL;
pTargetDeviceObject = NULL;
return( status );
}
//
// Initialize The Extension For The IP Filter Device Object
//
pTDIH_DeviceExtension = (PTDIH_DeviceExtension )( pFilterDeviceObject->DeviceExtension );
IPFilter_InitDeviceExtension(
pTDIH_DeviceExtension,
pFilterDeviceObject
);
// Initialize the Executive spin lock for this device extension.
KeInitializeSpinLock(&(pTDIH_DeviceExtension->IoRequestsSpinLock));
// Initialize the event object used to denote I/O in progress.
// When set, the event signals that no I/O is currently in progress.
KeInitializeEvent(&(pTDIH_DeviceExtension->IoInProgressEvent), NotificationEvent, FALSE);
//
// Attach Our Filter To The IP Device Object
//
pLowerDeviceObject = IoAttachDeviceToDeviceStack(
pFilterDeviceObject, // Source Device (Our Device)
pTargetDeviceObject // Target Device
);
if( !pLowerDeviceObject )
{
KdPrint(("PCATDIH: Couldn't attach to IP Device Object\n"));
//
// Delete Our IP Filter Device Object
//
IoDeleteDevice( pFilterDeviceObject );
pFilterDeviceObject = NULL;
ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );
ObDereferenceObject( pTargetFileObject );
pTargetFileObject = NULL;
pTargetDeviceObject = NULL;
return( status );
}
// Initialize the TargetDeviceObject field in the extension.
pTDIH_DeviceExtension->TargetDeviceObject = pTargetDeviceObject;
pTDIH_DeviceExtension->TargetFileObject = pTargetFileObject;
pTDIH_DeviceExtension->LowerDeviceObject = pLowerDeviceObject;
pTDIH_DeviceExtension->DeviceExtensionFlags |= TDIH_DEV_EXT_ATTACHED;
#ifdef DBG
if( pLowerDeviceObject != pTargetDeviceObject )
{
KdPrint(("PCATDIH: IP Already Filtered!\n"));
}
#endif DBG
//
// Adopt Target Device I/O Flags
//
pFilterDeviceObject->Flags |= pTargetDeviceObject->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO);
return status;
}
#ifdef DBG
/////////////////////////////////////////////////////////////////////////////
//// IPFilter_Detach
//
// Purpose
//
// Parameters
//
// Return Value
//
// Remarks
//
VOID
IPFilter_Detach(
PDEVICE_OBJECT pDeviceObject
)
{
PTDIH_DeviceExtension pTDIH_DeviceExtension;
BOOLEAN NoRequestsOutstanding = FALSE;
pTDIH_DeviceExtension = (PTDIH_DeviceExtension )pDeviceObject->DeviceExtension;
ASSERT( pTDIH_DeviceExtension );
try
{
try
{
// We will wait until all IRP-based I/O requests have been completed.
while (TRUE)
{
// Check if there are requests outstanding
UTIL_IsLargeIntegerZero(
NoRequestsOutstanding,
pTDIH_DeviceExtension->OutstandingIoRequests,
&(pTDIH_DeviceExtension->IoRequestsSpinLock)
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -