📄 charfilterdevice.cpp
字号:
// CharFilterDevice.cpp
// Implementation of CharFilterDevice device class
//
// Generated by DriverWizard version DriverStudio 2.6.0 (Build 336)
// Requires Compuware's DriverWorks classes
//
#pragma warning(disable:4065) // Allow switch statement with no cases
#include <vdw.h>
#include <Kwdmfltr.cpp>
#include "CharFilter.h"
#include "CharFilterDevice.h"
#include "..\CharSampleioctl.h"
#pragma hdrstop("CharFilter.pch")
extern KTrace T; // Global driver trace object
CharFilterDevice::CharFilterDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
KWdmFilterDevice(Pdo, NULL)
{
// 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);
NTSTATUS status = AttachFilter(&m_Lower); //Attach the filter
if(!NT_SUCCESS(status))
{
m_ConstructorStatus = status;
return;
}
SetFilterPnpPolicy();
SetFilterPowerPolicy();
}
CharFilterDevice::~CharFilterDevice()
{
}
NTSTATUS CharFilterDevice::SystemControl(KIrp I)
{
return PassThrough(I);
}
NTSTATUS CharFilterDevice::Create(KIrp I)
{
return PassThrough(I);
}
NTSTATUS CharFilterDevice::Close(KIrp I)
{
return PassThrough(I);
}
NTSTATUS CharFilterDevice::DeviceControl(KIrp I)
{
switch (I.IoctlCode())
{
case CHARSAMPLE_IOCTL_800:
nin=I.IoctlInputBufferSize();
cin=new (NonPagedPool) CHAR[nin];
if ( cin == NULL )
{
return STATUS_INSUFFICIENT_RESOURCES;
}
nout=I.IoctlOutputBufferSize();
cout=new (NonPagedPool) CHAR[nout];
if ( cout == NULL )
{
delete cin;
return STATUS_INSUFFICIENT_RESOURCES;
}
strncpy(cin,(PCHAR)I.IoctlBuffer(),nin);
return PassThrough(I, LinkTo(OnDeviceControlComplete), this);
default:
// Unrecognized IOCTL request
return PassThrough(I);
}
}
NTSTATUS CharFilterDevice::OnDeviceControlComplete(KIrp I)
{
T << "CharFilterDevice::OnDeviceControlComplete\n";
strncpy(cout,(PCHAR)I.IoctlBuffer(),2);
cout += 2;
nin -= 1;
if (nin == 0)
{
cout -= nout;
strncpy((PCHAR)I.IoctlBuffer(),cout,nout);
I.Information() = nout;
if (cout) delete cout;
cin -= (nout - 2)/2;
if (cin) delete cin;
return I.Status();
}
else {
cin++;
strncpy((PCHAR)I.IoctlBuffer(),cin,1);
PassThrough(I, LinkTo(OnDeviceControlComplete), this);
return STATUS_MORE_PROCESSING_REQUIRED;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -