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

📄 vpdo.cpp

📁 WDM的驱动程序实例,可供自学开发WDM者参考,其是在VC和COMPUWARE下的.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// vpdo.cpp
//
// Generated by DriverWizard version DriverStudio 2.7.0 (Build 554)
// Requires Compuware's DriverWorks classes
//

#include <vdw.h>
#include "vbus.h"
#include "vbusdev.h"
#include "..\vinterface.h"

#pragma hdrstop("vbus.pch")

#include "vpdo.h"
#include "stdio.h"

UCHAR g_Buffer[PAGE_SIZE];

////////////////////////////////////////////////////////////////////////
//  VPdo::VPdo
//
//	Routine Description:
//		Constructor for VPdo class
//
//	Parameters:
//		[in] pParent
//			pointer to a parent FDO
//
//		[in] pBus
//			pointer to a pdo collection
//
//		[in] Unit
//			id
//
//	Return Value:
//		None   
//
//	Comments:
//		None
//
VPdo::VPdo(VBusDevice* pParent, VBus* pBus, ULONG Unit) :
	KPhysicalDevice(pBus),
	m_Parent(pParent),
	m_Unit(Unit),
	m_HardwareIDs(NULL)
{
	t << "VPdo::VPdo " << Unit << EOL;

	// Check constructor status
    if ( NT_SUCCESS(m_ConstructorStatus) )
	{
		SetPnpPolicy();
		SetPowerPolicy();
	}
}


////////////////////////////////////////////////////////////////////////
//  VPdo::~VPdo
//
//	Routine Description:
//		Destructor for VPdo class
//
//	Parameters:
//		None
//
//	Return Value:
//		None
//
//	Comments:
//		None
//
VPdo::~VPdo()
{
	t << "VPdo::~VPdo() " << m_Unit << EOL;

	if ( m_HardwareIDs )
		delete[] m_HardwareIDs;
}

////////////////////////////////////////////////////////////////////////
//  VPdo::OnQueryDeviceText
//
//	Routine Description:
//		IRP_MN_QUERY_DEVICE_TEXT handler
//
//	Parameters:
//		[in] I
//			IRP_MJ_PNP IRP
//
//	Return Value:
//		status
//
//	Comments:
//		None
//
NTSTATUS VPdo::QueryDeviceText(const WCHAR* Model, KIrp I)
{
	t << "VPdo::OnQueryDeviceText " << m_Unit << EOL;

	NTSTATUS status = STATUS_SUCCESS;

	switch ( I.CurrentStackLocation()->Parameters.QueryDeviceText.DeviceTextType )
	{
	case DeviceTextDescription:
		switch ( I.CurrentStackLocation()->Parameters.QueryDeviceText.LocaleId ) 
		{
        case 0x00000409: // English
        default:
            if( !I.Information() ) 
			{
                ULONG length = (ULONG)(wcslen(VENDORNAME) + wcslen(Model) + 8)*sizeof(WCHAR);

                PWCHAR buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, length, DefaultPoolTag);
                if ( buffer ) 
				{
					swprintf(buffer, L"%ws%ws%02d", VENDORNAME, Model, m_Unit);
					I.Information() = (ULONG_PTR)buffer;
				}
				else
				{
                    status = STATUS_INSUFFICIENT_RESOURCES;
                }

            }
            break;           
		}
		break;
	case DeviceTextLocationInformation:
		break;
	default:
		status = I.Status();
		break;
	}

	return I.PnpComplete(status);
}

////////////////////////////////////////////////////////////////////////
//  VPdo::OnQueryId
//
//	Routine Description:
//		IRP_MN_QUERY_DEVICE_TEXT handler
//
//	Parameters:
//		[in] I
//			IRP_MJ_PNP IRP
//
//	Return Value:
//		status
//
//	Comments:
//		None
//
NTSTATUS VPdo::OnQueryId(KIrp I)
{
	NTSTATUS	status = STATUS_SUCCESS;

    PWCHAR		buffer;
    ULONG		length;

	t << "VPdo::OnQueryId " << m_Unit << EOL;

	switch ( I.QueryIdType() )
	{
	case BusQueryDeviceID:
		buffer = m_HardwareIDs;

        while ( *(buffer++) ) 
		{
            while ( *(buffer++) );
        }

        length = (ULONG)(buffer - m_HardwareIDs)*sizeof(WCHAR);

        buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, length, DefaultPoolTag);

        if ( buffer ) 
		{
			RtlCopyMemory(buffer, m_HardwareIDs, length);
			I.Information() = (ULONG_PTR)buffer;
		}
		else
		{
           status = STATUS_INSUFFICIENT_RESOURCES;
        }
		break;

    case BusQueryInstanceID:
        buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, 6*sizeof(WCHAR), DefaultPoolTag);
        if ( buffer ) 
		{
			swprintf(buffer, L"%02d", m_Unit);
			I.Information() = (ULONG_PTR)buffer;
		}
		else
		{
           status = STATUS_INSUFFICIENT_RESOURCES;
        }
        break;

    case BusQueryHardwareIDs:
        buffer = m_HardwareIDs;

        while ( *(buffer++) ) 
		{
            while ( *(buffer++) );
        }

        length = (ULONG)(buffer - m_HardwareIDs)*sizeof(WCHAR);
        buffer = (PWCHAR)ExAllocatePoolWithTag(PagedPool, length, DefaultPoolTag);

        if ( buffer ) 
		{
			RtlCopyMemory(buffer, m_HardwareIDs, length);
			I.Information() = (ULONG_PTR)buffer;
		}
		else
		{
           status = STATUS_INSUFFICIENT_RESOURCES;
        }
        break;

    default:
        status = I.Status();
		break;
	}

	return I.PnpComplete(status);
}

////////////////////////////////////////////////////////////////////////
//  VPdo::OnQueryBusInformation
//
//	Routine Description:
//		IRP_MN_QUERY_BUS_INFORMATION handler
//
//	Parameters:
//		[in] I
//			IRP_MJ_PNP IRP
//
//	Return Value:
//		status
//
//	Comments:
//		None
//
NTSTATUS VPdo::OnQueryBusInformation(KIrp I)
{
	t << "VPdo::OnQueryBusInformation " << m_Unit << EOL;

	NTSTATUS status = STATUS_SUCCESS;

    PPNP_BUS_INFORMATION busInfo = (PPNP_BUS_INFORMATION)ExAllocatePoolWithTag(PagedPool, sizeof(PNP_BUS_INFORMATION), DefaultPoolTag);

    if ( busInfo ) 
	{
		busInfo->BusTypeGuid = GUID_VIRTUAL_BUS_TYPE;

		busInfo->LegacyBusType = PNPBus;
		busInfo->BusNumber = 0;

	    I.Information() = (ULONG_PTR)busInfo;
	}
	else
	{
      status = STATUS_INSUFFICIENT_RESOURCES;
    }

	return I.PnpComplete(status);
}

////////////////////////////////////////////////////////////////////////
//  VPdo::OnQueryBusInformation
//
//	Routine Description:
//		IRP_MN_DEVICE_USAGE_NOTIFICATION handler
//
//	Parameters:
//		[in] I
//			IRP_MJ_PNP IRP
//
//	Return Value:
//		status
//
//	Comments:
//		None
//
NTSTATUS VPdo::OnDeviceUsageNotification(KIrp I)
{
	NTSTATUS status = STATUS_UNSUCCESSFUL;

	t << "VPdo::OnDeviceUsageNotification " << m_Unit << EOL;

	return I.PnpComplete(status);
}

////////////////////////////////////////////////////////////////////////
//  VPdo::OnQueryResources
//
//	Routine Description:
//		IRP_MN_QUERY_RESOURCES handler
//
//	Parameters:
//		[in] I
//			IRP_MJ_PNP IRP
//
//	Return Value:
//		status
//
//	Comments:
//		None
//
NTSTATUS VPdo::OnQueryResources(KIrp I)
{
	t << "VPdo::OnQueryResources " << m_Unit << EOL;

#if 0
	PAGED_CODE();

	NTSTATUS status = STATUS_SUCCESS;


	ULONG size = sizeof(CM_RESOURCE_LIST);

	PCM_RESOURCE_LIST rl = (PCM_RESOURCE_LIST)ExAllocatePoolWithTag(PagedPool, size, DefaultPoolTag);
	if ( rl )
	{
		RtlZeroMemory(rl, size);
		rl->Count = 1;

		CM_FULL_RESOURCE_DESCRIPTOR& fd = rl->List[0];

		fd.PartialResourceList.Count = 1;

		CM_PARTIAL_RESOURCE_DESCRIPTOR& pd = fd.PartialResourceList.PartialDescriptors[0];

		pd.Type = CmResourceTypeMemory;
		pd.ShareDisposition = CmResourceShareShared;
		pd.u.Port.Start.QuadPart = (ULONG64)g_Buffer;
		pd.u.Port.Length = 1;
		I.Information() = (ULONG_PTR)rl;
	}
	else
	{
		status = STATUS_INSUFFICIENT_RESOURCES;
	}

	return I.PnpComplete(status);
#endif

	return DefaultPnp(I);
}

////////////////////////////////////////////////////////////////////////
//  VPdo::OnQueryResourceRequirements
//
//	Routine Description:
//		IRP_MN_QUERY_RESOURCES handler
//
//	Parameters:
//		[in] I
//			IRP_MJ_PNP IRP
//
//	Return Value:
//		status
//
//	Comments:
//		None
//
NTSTATUS VPdo::OnQueryResourceRequirements(KIrp I)
{
	t << "VPdo::OnQueryResourceRequirements " << m_Unit << EOL;

#if 0

	PAGED_CODE();

	NTSTATUS status = STATUS_SUCCESS;

	ULONG size = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);

	PIO_RESOURCE_REQUIREMENTS_LIST rl = 
		(PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag(PagedPool, size, DefaultPoolTag);

	if ( rl )
	{
		RtlZeroMemory(rl, size);

		rl->ListSize = size;

		rl->AlternativeLists = 1;
//		rl->InterfaceType = InterfaceTypeUndefined;
//		rl->BusNumber = 0;
		rl->List[0].Version = 1;
		rl->List[0].Revision = 1;
		rl->List[0].Count = 1;

		IO_RESOURCE_DESCRIPTOR& rd = rl->List[0].Descriptors[0];

		rd.Type = CmResourceTypeMemory;
		rd.ShareDisposition = CmResourceShareShared;
		rd.u.Memory.Length = 1;
		rd.u.Memory.Alignment = 1;
		rd.u.Memory.MinimumAddress.QuadPart = (ULONG64)g_Buffer;
		rd.u.Memory.MaximumAddress.QuadPart = (ULONG64)g_Buffer - sizeof(g_Buffer);

		I.Information() = (ULONG_PTR)rl;
	}
	else
	{

⌨️ 快捷键说明

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