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

📄 filethreaddevice.cpp

📁 驱动程序中的文件读写。
💻 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 + -