📄 filethreaddevice.cpp
字号:
// FileThreadDevice.cpp
// Implementation of FileThreadDevice 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 "DebugPrint.h"
#include "..\FileThreadDeviceinterface.h"
#include "FileThread.h"
#include "FileThreadDevice.h"
#include "..\FileThreadioctl.h"
#pragma hdrstop("FileThread.pch")
DebugPrint DP("FileThread");
GUID FileThreadDevice_Guid = FileThreadDevice_CLASS_GUID;
FileThreadDevice::FileThreadDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :
KPnpDevice(Pdo, &FileThreadDevice_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.
m_Stage.Start(LinkTo(Stage), this);
}
FileThreadDevice::~FileThreadDevice()
{
KIrp I = KIrp::Allocate(1);
I.SetNextStackLocation();
I.MajorFunction() = IRP_MJ_CLEANUP;
m_Stage.Post(I);
m_Stage.Wait();
KIrp::Deallocate(I);
}
NTSTATUS FileThreadDevice::DefaultPnp(KIrp I)
{
I.ForceReuseOfCurrentStackLocationInCalldown();
return m_Lower.PnpCall(this, I);
}
NTSTATUS FileThreadDevice::DefaultPower(KIrp I)
{
I.IndicatePowerIrpProcessed();
I.CopyParametersDown();
return m_Lower.PnpPowerCall(this, I);
}
NTSTATUS FileThreadDevice::SystemControl(KIrp I)
{
I.ForceReuseOfCurrentStackLocationInCalldown();
return m_Lower.PnpCall(this, I);
}
NTSTATUS FileThreadDevice::OnStartDevice(KIrp I)
{
DP.DPrint("OnStartDevice\n");
return STATUS_SUCCESS;
}
NTSTATUS FileThreadDevice::OnStopDevice(KIrp I)
{
DP.DPrint("OnStopDevice\n");
return STATUS_SUCCESS;
}
NTSTATUS FileThreadDevice::OnRemoveDevice(KIrp I)
{
DP.DPrint("OnRemoveDevice\n");
return STATUS_SUCCESS;
}
NTSTATUS FileThreadDevice::Create(KIrp I)
{
NTSTATUS status;
DP.DPrint("Create\n");
status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);
return status;
}
NTSTATUS FileThreadDevice::Close(KIrp I)
{
NTSTATUS status;
DP.DPrint("Close \n");
status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT);
return status;
}
NTSTATUS FileThreadDevice::DeviceControl(KIrp I)
{
NTSTATUS status;
switch (I.IoctlCode())
{
case FILETHREAD_IOCTL_800:
I.MarkPending();
m_Stage.Post(I);
status = STATUS_PENDING;
break;
default:
// Unrecognized IOCTL request
status = STATUS_INVALID_PARAMETER;
break;
}
if (status == STATUS_PENDING)
{
return status;
}
else
{
return I.PnpComplete(this, status);
}
}
VOID FileThreadDevice::Stage(void)
{
NTSTATUS status;
KFile m_File;
FILE_STANDARD_INFORMATION StandardInfo;
KUstring name(L"\\DosDevices\\e:\\wahbook\\chinesedot\\hzk16");
status=m_File.OpenCreate(
name,
NULL,
FILE_GENERIC_READ | SYNCHRONIZE,
OBJ_CASE_INSENSITIVE,
0,
FILE_SHARE_READ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT);
if (NT_SUCCESS(status))
{
m_File.Query(&StandardInfo);
DbgPrint("File allocation size is %x\n", StandardInfo.AllocationSize.QuadPart);
DbgPrint("File size is %x\n", StandardInfo.EndOfFile.QuadPart);
}
while (TRUE)
{
m_Stage.m_Mailbox.Wait();
KIrp I = m_Stage.m_Queue.RemoveHead();
if ( I.MajorFunction() == IRP_MJ_CLEANUP )
{
// if the MajorFunction is cleanup, the driver is unloading
m_File.Close();
m_Stage.Terminate(STATUS_SUCCESS);
}
else
{
// Read from the file.
DP.DPrint("Read from the file\n");
LARGE_INTEGER p;
p.QuadPart=*(ULONG*)I.IoctlBuffer();
status=m_File.Read((PUCHAR)I.IoctlBuffer(), I.IoctlOutputBufferSize(), &I.Information(),&p);
// p.QuadPart=*(ULONG*)I.IoctlType3InputBuffer(); //这样是错误的,因不在应用程序的进程环境中
// status=m_File.Read((PUCHAR)I.UserBuffer(), I.IoctlOutputBufferSize(), &I.Information(),&p);
I.PnpComplete(this, status);
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Constructor for TestThread
//
TestThread::TestThread(void) : m_Mailbox((LONG)0, MAX_IRP) {}
///////////////////////////////////////////////////////////////////////////////
// Post
//
// Posts an IRP to a TestThread. This simply adds the IRP to the queue
// and signals the semaphore that the thread waits on.
//
VOID TestThread::Post(KIrp I)
{
m_Queue.InsertTail(I);
m_Mailbox.Signal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -