www.pudn.com > WDM_CharSample.rar > CharSampleDevice.cpp


// CharSampleDevice.cpp 
// Implementation of CharSampleDevice 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  
#include "..\CharSampleDeviceinterface.h" 
 
#include "CharSample.h" 
#include "CharSampleDevice.h" 
#include "..\CharSampleioctl.h" 
 
#pragma hdrstop("CharSample.pch") 
 
 
GUID CharSampleDevice_Guid = CharSampleDevice_CLASS_GUID; 
 
extern KTrace T;			// Global driver trace object	 
//////////////////////////////////////////////////////////////////////// 
//  CharSampleDevice::CharSampleDevice 
// 
//	Routine Description: 
//		This is the constructor for the Functional Device Object, or FDO. 
//		It is derived from KPnpDevice, 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 FDO to the 
//		PDO and creates an interface to the upper edge of the system class driver. 
// 
 
CharSampleDevice::CharSampleDevice(PDEVICE_OBJECT Pdo, ULONG Unit) : 
	KPnpDevice(Pdo, &CharSampleDevice_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. 
 
} 
 
CharSampleDevice::~CharSampleDevice() 
{ 
} 
 
NTSTATUS CharSampleDevice::DefaultPnp(KIrp I)  
{ 
	I.ForceReuseOfCurrentStackLocationInCalldown(); 
	return m_Lower.PnpCall(this, I); 
} 
 
NTSTATUS CharSampleDevice::DefaultPower(KIrp I)  
{ 
	I.IndicatePowerIrpProcessed(); 
	I.CopyParametersDown(); 
	return m_Lower.PnpPowerCall(this, I); 
} 
 
NTSTATUS CharSampleDevice::SystemControl(KIrp I)  
{ 
	I.ForceReuseOfCurrentStackLocationInCalldown(); 
	return m_Lower.PnpCall(this, I); 
} 
 
NTSTATUS CharSampleDevice::OnStartDevice(KIrp I) 
{ 
	return STATUS_SUCCESS; 
} 
 
NTSTATUS CharSampleDevice::OnStopDevice(KIrp I) 
{ 
	return STATUS_SUCCESS; 
} 
 
NTSTATUS CharSampleDevice::OnRemoveDevice(KIrp I) 
{ 
	return STATUS_SUCCESS; 
} 
 
NTSTATUS CharSampleDevice::Create(KIrp I) 
{ 
	return I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT); 
} 
 
NTSTATUS CharSampleDevice::Close(KIrp I) 
{ 
	return I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT); 
} 
 
NTSTATUS CharSampleDevice::DeviceControl(KIrp I)  
{ 
	NTSTATUS status; 
	CHAR n,c[]="零一二三四五六七八九"; 
 
	T << "CharSampleDevice::DeviceControl\n"; 
	 
	switch (I.IoctlCode()) 
	{ 
		case CHARSAMPLE_IOCTL_800: 
			n=*(CHAR *)I.IoctlBuffer(); 
			if ((n >= '0') && (n <= '9')) 
			{ 
				n -= '0'; 
				strncpy((PCHAR)I.IoctlBuffer(),&c[n*2],2); 
				I.Information() = 2; 
				status = STATUS_SUCCESS; 
			} 
			else 
				status = STATUS_INVALID_PARAMETER; 
			break; 
 
		default: 
			// Unrecognized IOCTL request 
			status = STATUS_INVALID_PARAMETER; 
			break; 
	} 
 
	return I.PnpComplete(this, status); 
}