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

📄 regsampledevice.cpp

📁 windows 2000/XP WDM设备驱动程序开发 附书光盘 武安河著
💻 CPP
字号:
// RegSampleDevice.cpp
// Implementation of RegSampleDevice device class
//
// Generated by DriverWizard version DriverStudio 3.1.0 (Build 1722)
// 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;

extern UNICODE_STRING SampleRegistryPath; 	//RegSample类中的变量

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;

	ULONG m_RegDword = 0;
	//本函数中的m_RegDword变量虽与RegSample中的m_RegDword名字相同,但不是一回事,
	//可定义为其它名,其它两变量也是
	KRegistryKey Params(&SampleRegistryPath, L"Parameters");
	if ( !NT_SUCCESS(Params.LastError()) )
	{
        I.Information() = 0;
        return STATUS_UNSUCCESSFUL;
	}
	status = Params.QueryValue(L"RegDword", &m_RegDword);
	if	(!(NT_SUCCESS(status)))
	{
        I.Information() = 0;
        return STATUS_UNSUCCESSFUL;
	}
	if	(I.IoctlOutputBufferSize() >= sizeof(ULONG))		
	{
		*(ULONG*)I.IoctlBuffer()=m_RegDword; // ①METHOD_BUFFERED方式
		//将m_RegDword值拷贝到应用程序的读内存,因在定义READ_DWORD命令时,其访问
		//方式为METHOD_BUFFERED,所以应用程序的读内存(即驱动程序的输出缓冲区)为
		//I.IoctlBuffer(),见第5章中的5.1.3解释;之所以前面又加*(ULONG*),是因为
		//I.IoctlBuffer()其定义类型为PVOID&,见第3章中的3.2 KIrp解释
		I.Information() = sizeof(ULONG);	
		//信息字符串长度,因是ULONG类型变量,其长度为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(&SampleRegistryPath, L"Parameters");
	if ( !NT_SUCCESS(Params.LastError()) )
	{
        I.Information() = 0;
        return STATUS_UNSUCCESSFUL;
	}
	PWSTR m_RegString = L"WAH";
	ULONG	RegLength = 0;;
	status = Params.QueryValue(L"RegString", 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);       
		//将m_RegString串内容拷贝到应用程序的读内存,因在定义READ_STRING命令时,其
		//访问方式为METHOD_IN_DIRECT方式,所以应用程序的读内存为I.Mdl(),见第5章中
		//的5.1.3解释;之所以用KMemory Mem(I.Mdl()),见第6章中的6.2.2 KMemory解释;
		//用wcscpy函数,是因为Unicode串中的字符串定义为宽字符,见第6章中的6.1.1解释

		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(&SampleRegistryPath, L"Parameters");
	if ( !NT_SUCCESS(Params.LastError()) )
	{
        I.Information() = 0;
        return STATUS_UNSUCCESSFUL;
	}
	ULONG m_RegBoolean = FALSE;
	status = Params.QueryValue(L"RegBoolean", &m_RegBoolean);
	if	(!(NT_SUCCESS(status)))
	{
        I.Information() = 0;
        return STATUS_UNSUCCESSFUL;
	}
	if	(I.IoctlOutputBufferSize() >= sizeof(ULONG))		
	{
		*(ULONG*)I.UserBuffer()=m_RegBoolean;	//③METHOD_NEITHER方式
		//将m_RegBoolean值拷贝到应用程序的读内存,因在定义READ_ BOOLEAN命令时,其访问
		//方式为METHOD_NEITHER方式,所以应用程序的读内存为I.UserBuffer(),见第5章中
		//的5.1.3解释;前面又加*(ULONG*),是因为I.UserBuffer() 其定义类型为PVOID&,见
		//第3章中的3.2 KIrp解释
		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 + -