📄 vpdo.cpp
字号:
// 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 + -