📄 timersampledevice.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 + -