📄 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:
{
READ_COMPLETION_INFO* pCompInfo = new (NonPagedPool) READ_COMPLETION_INFO;
// make sure it succeeded
if ( pCompInfo == NULL )
{
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlZeroMemory(pCompInfo,sizeof(READ_COMPLETION_INFO));
// initialize the context structure
pCompInfo->m_pClass = this;
pCompInfo->nin=I.IoctlInputBufferSize();
pCompInfo->cin=new (NonPagedPool) CHAR[pCompInfo->nin];
if ( pCompInfo->cin == NULL )
{
delete pCompInfo;
return STATUS_INSUFFICIENT_RESOURCES;
}
pCompInfo->nout=I.IoctlOutputBufferSize();
pCompInfo->cout=new (NonPagedPool) CHAR[pCompInfo->nout];
if ( pCompInfo->cout == NULL )
{
delete pCompInfo->cin;
delete pCompInfo;
return STATUS_INSUFFICIENT_RESOURCES;
}
strncpy(pCompInfo->cin,(PCHAR)I.IoctlBuffer(),pCompInfo->nin);
I.FileObject()->FsContext = pCompInfo;
return PassThrough(I, LinkTo(OnDeviceControlComplete), this);
}
default:
// Unrecognized IOCTL request
return PassThrough(I);
}
}
NTSTATUS CharFilterDevice::OnDeviceControlComplete(KIrp I)
{
T << "CharFilterDevice_Class::OnDeviceControlComplete\n";
READ_COMPLETION_INFO* pCompInfo = (READ_COMPLETION_INFO*)I.FileObject()->FsContext;
if ( pCompInfo == NULL ) return I.Status();
strncpy(pCompInfo->cout,(PCHAR)I.IoctlBuffer(),2);
pCompInfo->cout += 2;
pCompInfo->nin -= 1;
if (pCompInfo->nin == 0)
{
pCompInfo->cout -= pCompInfo->nout;
strncpy((PCHAR)I.IoctlBuffer(),pCompInfo->cout,pCompInfo->nout);
I.Information() = pCompInfo->nout;
if (pCompInfo->cout) delete pCompInfo->cout;
pCompInfo->cin -= (pCompInfo->nout - 2)/2;
if (pCompInfo->cin) delete pCompInfo->cin;
if (pCompInfo) delete pCompInfo;
I.FileObject()->FsContext = NULL;
return I.Status();
}
else {
pCompInfo->cin++;
strncpy((PCHAR)I.IoctlBuffer(),pCompInfo->cin,1);
PassThrough(I, LinkTo(OnDeviceControlComplete), this);
return STATUS_MORE_PROCESSING_REQUIRED;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -