📄 charfilterdevice.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 + -