⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charfilterdevice.cpp

📁 武安河 电子书所副代码,包括windows驱动编程的基本方面
💻 CPP
字号:
// CharFilterDevice.cpp
// Implementation of CharFilterDevice device class
//
// Generated by DriverWizard version DriverStudio 3.1.0 (Build 1722)
// Requires Compuware's DriverWorks classes
//

#include <vdw.h>
#include <Kwdmfltr.cpp>
#include "CharFilterDevice.h"

#include "CharSampleioctl.h"

////////////////////////////////////////////////////////////////////////
//  CharFilterDevice::CharFilterDevice
//
//	Routine Description:
//		This is the constructor for the Filter Device Object.
//		It is derived from KWdmFilterDevice, which builds in automatic
//	    dispatching of subfunctions of IRP_MJ_POWER and IRP_MJ_PNP to
//		virtual member functions.
//
//	Parameters:
//		Pdo - Physical Device Object - this is a pointer to a system
//			device object that represents the physical device.
//
//		Unit - Unit number. This is a number to append to the device's
//			base device name to form the Logical Device Object's name
//
//	Return Value:
//		None   
//
//	Comments:
//		The object being constructed contains a data member (m_Lower) of type
//		KPnpLowerDevice. By initializing it, the driver binds the Filter 
//		Device Object to the device stack.
//
CharFilterDevice::CharFilterDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
	KWdmFilterDevice(Pdo, NULL)	//其继承基类是 KWdmFilterDevice
{

	// Check constructor status
    if ( !NT_SUCCESS(m_ConstructorStatus) )
	{
	    return;
	}

	// Remember our unit number
	m_Unit = Unit;

	// Initialize the lower device
	m_Lower.Initialize(this, Pdo);

	// Attach the filter
	NTSTATUS status = AttachFilter(&m_Lower);  //将过滤器设备对象附着到设备堆栈上

	// Check the status
	if ( !NT_SUCCESS(status) )
	{
		m_ConstructorStatus = status;
		return;
	}

	// Initialize the Filter Power Policy settings 
	SetFilterPowerPolicy();		//过滤器驱动程序的PnP政策设置函数

	// Initialize the Filter PnP Policy settings 
	SetFilterPnpPolicy();		//过滤器驱动程序的电源管理政策设置函数
}


////////////////////////////////////////////////////////////////////////
//  CharFilterDevice::DeviceControl
//
//	Routine Description:
//		Handler for IRP_MJ_DEVICE_CONTROL
//
//	Parameters:
//		I - Current IRP
// 
//	Return Value:
//		None
//
//	Comments:
//		This implementation simply forwards the IRP to the lower device.
//
NTSTATUS CharFilterDevice::DeviceControl(KIrp I)	
{	//DeviceControl IRP过滤例程
	switch (I.IoctlCode())
	{
		case CHARSAMPLE_IOCTL_800:
			nin=I.IoctlInputBufferSize();	//要转换的数字数目,如3个数字
			cin=new (NonPagedPool) CHAR[nin];//申请一个内存,用于存放数字
			if ( cin == NULL )
			{
				return STATUS_INSUFFICIENT_RESOURCES;
			}
			nout=I.IoctlOutputBufferSize();	//输出缓冲区大小,如6个字节
			cout=new (NonPagedPool) CHAR[nout]; //申请一个内存,用于存放中文
			if ( cout == NULL )
			{
				delete cin;
				return STATUS_INSUFFICIENT_RESOURCES;
			}
			strncpy(cin,(PCHAR)I.IoctlBuffer(),nin);//将数字字符拷贝到cin中
			return PassThrough(I, LinkTo(IrpCompletionRoutine), this);
			//将IRP传递下去,同时链接一个IRP完成例程。
		default:
			// Unrecognized IOCTL request
			return PassThrough(I);
	}
}


////////////////////////////////////////////////////////////////////////
//  CharFilterDevice::IrpCompletionRoutine
//
//	Routine Description:
//		Completion Handler for IRPs
//
//	Parameters:
//		I - IRP just completed by lower driver
//
//	Parameters:
//		NTSTATUS - STATUS_SUCCESS
//
//	Comments:
//		This routine is called when the lower driver completes the request
//
NTSTATUS CharFilterDevice::IrpCompletionRoutine(KIrp I)
{	//DeviceControl IRP完成例程
	strncpy(cout,(PCHAR)I.IoctlBuffer(),2);	//将转换后的中文字符拷贝到cout中
	cout += 2;	//调整cout指针,+2是因为一个中文占2个字节空间
	nin  -= 1;	//完成一个转换后,nin便减1
 	if (nin == 0)
	{	// nin减至0,表示转换工作全部完成
		cout -= nout;	//调整cout指针,指向缓冲区的头
		strncpy((PCHAR)I.IoctlBuffer(),cout,nout); 
		//将转换后的全部中文字符拷贝到应用程序的缓冲区中
		I.Information() = nout;
		if (cout) delete cout;	//删除cout
		cin -= (nout - 2)/2; 	//调整cin指针,指向缓冲区的头
		if (cin) delete cin; 	//删除cin
		return I.Status();		//完成IRP
	}
	else
	{
		cin++;	//调整cin指针,指向下一个数字
		strncpy((PCHAR)I.IoctlBuffer(),cin,1);
		//将下一个数字拷贝到应用程序的缓冲区中
		PassThrough(I, LinkTo(IrpCompletionRoutine), this);
		//将IRP再次传递下去,同时链接IRP完成例程。
		return STATUS_MORE_PROCESSING_REQUIRED;	//表示IRP尚未完成
	}
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -