📄 regsampledevice.cpp
字号:
// RegSampleDevice.cpp
// Implementation of RegSampleDevice 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 "..\RegSampleDeviceinterface.h"
#include "RegSample.h"
#include "RegSampleDevice.h"
#include "..\RegSampleioctl.h"
#pragma hdrstop("RegSample.pch")
GUID RegSampleDevice_Guid = RegSampleDevice_CLASS_GUID;
RegSampleDevice::RegSampleDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
KPnpDevice(Pdo, &RegSampleDevice_Guid)
{
// 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);
// Inform the base class of the lower edge device object
SetLowerDevice(&m_Lower);
// Initialize the PnP Policy settings to the "standard" policy
SetPnpPolicy();
// TODO: Customize the PnP Policy for this device by setting
// flags in m_Policies.
}
RegSampleDevice::~RegSampleDevice()
{
}
NTSTATUS RegSampleDevice::DefaultPnp(KIrp I)
{
I.ForceReuseOfCurrentStackLocationInCalldown();
return m_Lower.PnpCall(this, I);
}
NTSTATUS RegSampleDevice::DefaultPower(KIrp I)
{
I.IndicatePowerIrpProcessed();
I.CopyParametersDown();
return m_Lower.PnpPowerCall(this, I);
}
NTSTATUS RegSampleDevice::SystemControl(KIrp I)
{
I.ForceReuseOfCurrentStackLocationInCalldown();
return m_Lower.PnpCall(this, I);
}
NTSTATUS RegSampleDevice::OnStartDevice(KIrp I)
{
return STATUS_SUCCESS;
}
NTSTATUS RegSampleDevice::OnStopDevice(KIrp I)
{
return STATUS_SUCCESS;
}
NTSTATUS RegSampleDevice::OnRemoveDevice(KIrp I)
{
return STATUS_SUCCESS;
}
NTSTATUS RegSampleDevice::Create(KIrp I)
{
return I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);
}
NTSTATUS RegSampleDevice::Close(KIrp I)
{
return I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);
}
NTSTATUS RegSampleDevice::DeviceControl(KIrp I)
{
NTSTATUS status;
switch (I.IoctlCode())
{
case READ_DWORD:
status = READ_DWORD_Handler(I);
break;
case READ_STRING:
status = READ_STRING_Handler(I);
break;
case READ_BOOLEAN:
status = READ_BOOLEAN_Handler(I);
break;
default:
// Unrecognized IOCTL request
status = STATUS_INVALID_PARAMETER;
break;
}
return I.PnpComplete(this, status);
}
NTSTATUS RegSampleDevice::READ_DWORD_Handler(KIrp I)
{
NTSTATUS status;
KRegistryKey Params(PDO(), L"Parameters");
if ( !NT_SUCCESS(Params.LastError()) )
{
I.Information() = 0;
return STATUS_UNSUCCESSFUL;
}
ULONG m_RegDword = 0;
status = Params.QueryValue(L"RegDword_Pdo", &m_RegDword);
if (!(NT_SUCCESS(status)))
{
I.Information() = 0;
return STATUS_UNSUCCESSFUL;
}
if (I.IoctlOutputBufferSize() >= sizeof(ULONG))
{
*(ULONG*)I.IoctlBuffer()=m_RegDword; // ①METHOD_ BUFFERED方式
I.Information() = sizeof(ULONG);
return STATUS_SUCCESS;
}
else
{
I.Information() = 0;
return STATUS_BUFFER_TOO_SMALL;
}
}
NTSTATUS RegSampleDevice::READ_STRING_Handler(KIrp I)
{
NTSTATUS status;
KRegistryKey Params(PDO(), L"Parameters");
if ( !NT_SUCCESS(Params.LastError()) )
{
I.Information() = 0;
return STATUS_UNSUCCESSFUL;
}
PWSTR m_RegString = L"WDM";
ULONG RegLength = 0;;
status = Params.QueryValue(L"RegString_Pdo", m_RegString, RegLength, NonPagedPool);
if (!(NT_SUCCESS(status)))
{
I.Information() = 0;
return STATUS_UNSUCCESSFUL;
}
if ((I.IoctlOutputBufferSize() >= RegLength+1) & (RegLength > 0))
{
KMemory Mem(I.Mdl()); // ②METHOD_OUT_DIRECT方式
wcscpy((PWCHAR)Mem.MapToSystemSpace(),m_RegString);
I.Information() = sizeof(ULONG);
if (RegLength != 0)
delete m_RegString;
return STATUS_SUCCESS;
}
else
{
I.Information() = 0;
return STATUS_BUFFER_TOO_SMALL;
}
}
NTSTATUS RegSampleDevice::READ_BOOLEAN_Handler(KIrp I)
{
NTSTATUS status;
KRegistryKey Params(PDO(), L"Parameters");
if ( !NT_SUCCESS(Params.LastError()) )
{
I.Information() = 0;
return STATUS_UNSUCCESSFUL;
}
ULONG m_RegBoolean = FALSE;
status = Params.QueryValue(L"RegBoolean_Pdo", &m_RegBoolean);
if (!(NT_SUCCESS(status)))
{
I.Information() = 0;
return STATUS_UNSUCCESSFUL;
}
if (I.IoctlOutputBufferSize() >= sizeof(ULONG))
{
*(ULONG*)I.UserBuffer()=m_RegBoolean; //③METHOD_NEITHER方式
I.Information() = sizeof(ULONG);
return STATUS_SUCCESS;
}
else
{
I.Information() = 0;
return STATUS_BUFFER_TOO_SMALL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -