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

📄 timersampledevice.cpp

📁 windows 2000/XP WDM设备驱动程序开发 附书光盘 武安河著
💻 CPP
字号:
// TimerSampleDevice.cpp
// Implementation of TimerSampleDevice 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 "..\TimerSampleDeviceinterface.h"

#include "TimerSample.h"
#include "TimerSampleDevice.h"
#include "..\TimerSampleioctl.h"

#pragma hdrstop("TimerSample.pch")

extern KTrace t;			// Global driver trace object	

GUID TimerSampleDevice_Guid = TimerSampleDevice_CLASS_GUID;

TimerSampleDevice::TimerSampleDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
	KPnpDevice(Pdo, &TimerSampleDevice_Guid)
{
	t << "TimerSampleDevice (constructor)\n";


	// 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.
	InitializeTimer( LinkTo(Timer1Hz), this );//初始化1HZ定时器
	m_Item.Initialize(Pdo);	//初始化工作项
}

TimerSampleDevice::~TimerSampleDevice()
{
	t << "~TimerSampleDevice() (destructor)\n";
}

NTSTATUS TimerSampleDevice::DefaultPnp(KIrp I) 
{
	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Lower.PnpCall(this, I);
}

NTSTATUS TimerSampleDevice::DefaultPower(KIrp I) 
{
	I.IndicatePowerIrpProcessed();
	I.CopyParametersDown();
	return m_Lower.PnpPowerCall(this, I);
}

NTSTATUS TimerSampleDevice::SystemControl(KIrp I) 
{
	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Lower.PnpCall(this, I);
}

NTSTATUS TimerSampleDevice::OnStartDevice(KIrp I)
{
	t << "OnStartDevice\n";

	NTSTATUS status = STATUS_SUCCESS;

	I.Information() = 0;

	return status;
}

NTSTATUS TimerSampleDevice::OnStopDevice(KIrp I)
{
	NTSTATUS status = STATUS_SUCCESS;

	t << "OnStopDevice\n";
	return status;
}

NTSTATUS TimerSampleDevice::OnRemoveDevice(KIrp I)
{
	t << "OnRemoveDevice\n";
	return STATUS_SUCCESS;
}

NTSTATUS TimerSampleDevice::Create(KIrp I)
{
	NTSTATUS status;

	status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

	return status;
}

NTSTATUS TimerSampleDevice::Close(KIrp I)
{
	NTSTATUS status;

	status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);

    return status;
}

NTSTATUS TimerSampleDevice::DeviceControl(KIrp I) 
{
	NTSTATUS status = STATUS_SUCCESS;

	I.Information() = 0;
	switch (I.IoctlCode())
	{
		case Start_1HzTimer:
			t << "Start_1HzTimer\n";
			m_Delay=3;		//设置3次
			StartTimer();	//启动1HZ定时器
			break;

		case Start_KTimer:
			t << "Start_KTimer\n";
			m_Tcb.Set( (LONG) -30000000, LinkTo(TimerCallback), this ) ; // 3000 msec
			//设置定时器,定时参数3秒
			break;

		default:
			// Unrecognized IOCTL request
			status = STATUS_INVALID_PARAMETER;
			break;
	}

	return I.PnpComplete(this, status);
}

VOID TimerSampleDevice::Timer1Hz(PVOID Context)
{
	// This is called once per second after StartTimer is called
	m_Delay--;	//次数减1
	if (m_Delay==0)
	{	//3秒后,排队工作项,关闭1HZ定时器
		t << "Timer1Hz\n";
		IncrementOutstandingRequestCount();
		m_Item.Queue(LinkTo(Workitem), this);
	}
}

VOID TimerSampleDevice::TimerCallback(PVOID arg1, PVOID arg2)
{
	t << "TimerCallback\n";
}

VOID TimerSampleDevice::Workitem()
{
	StopTimer();	//只能在工作项回调例程中,关闭1HZ定时器
	DecrementOutstandingRequestCount();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -