/*********************************************************************************
*Copyright(C),2016-$year$,Your Company
*FileName : Pnp.cpp
*Author : $username$
*Version : 0.01
*Date : $time$
*Description:
1.用于实现IRP_MJ_PNP请求相关功能的实现
*Others : //其他内容说明
*Function List: //主要函数列表,每条记录应包含函数名及功能简要说明
1.MJ_Pnp(), IRP_MJ_PNP请求的处理
2.DefaultPnpHandler(), 对PNP IRP进行缺省处理
*History : //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简介
1.Date:
Author:
Modification:
2.…………
**********************************************************************************/
#include "Pnp.h"
/************************************************************************
* 函数名称: DefaultPnpHandler
* 功能描述: 对PNP IRP进行缺省处理
* 参数列表:
|-pExtension: 设备对象的扩展
|-pIrp: IO请求包
* 返 回 值: 返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pExtension, PIRP pIrp)
{
PAGED_CODE();
IoSkipCurrentIrpStackLocation(pIrp);
return IoCallDriver(pExtension->NextStackDevice, pIrp);
}
/************************************************************************
* 函数名称: MJ_Pnp
* 功能描述: 对即插即用IRP进行处理
* 参数列表:
|-PhysicalDeviceObject: 功能设备对象
|-pIrp: 从IO请求包
* 返 回 值: 返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS MJ_Pnp(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PIRP pIrp)
{
PAGED_CODE();
NTSTATUS ntStatus = STATUS_SUCCESS;
PDEVICE_EXTENSION pExtension = (PDEVICE_EXTENSION)PhysicalDeviceObject->DeviceExtension;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
static NTSTATUS(*fcntab[])(PDEVICE_EXTENSION pExtension, PIRP pIrp) =
{
DefaultPnpHandler, // IRP_MN_START_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_CANCEL_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_CANCEL_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_DEVICE_RELATIONS
DefaultPnpHandler, // IRP_MN_QUERY_INTERFACE
DefaultPnpHandler, // IRP_MN_QUERY_CAPABILITIES
DefaultPnpHandler, // IRP_MN_QUERY_RESOURCES
DefaultPnpHandler, // IRP_MN_QUERY_RESOURCE_REQUIREMENTS
DefaultPnpHandler, // IRP_MN_QUERY_DEVICE_TEXT
DefaultPnpHandler, // IRP_MN_FILTER_RESOURCE_REQUIREMENTS
DefaultPnpHandler, //
DefaultPnpHandler, // IRP_MN_READ_CONFIG
DefaultPnpHandler, // IRP_MN_WRITE_CONFIG
DefaultPnpHandler, // IRP_MN_EJECT
DefaultPnpHandler, // IRP_MN_SET_LOCK
DefaultPnpHandler, // IRP_MN_QUERY_ID
DefaultPnpHandler, // IRP_MN_QUERY_PNP_DEVICE_STATE
DefaultPnpHandler, // IRP_MN_QUERY_BUS_INFORMATION
DefaultPnpHandler, // IRP_MN_DEVICE_USAGE_NOTIFICATION
DefaultPnpHandler, // IRP_MN_SURPRISE_REMOVAL
};
ULONG fcn = stack->MinorFunction;
if (fcn >= arraysize(fcntab))
{ // 未知的子功能代码
ntStatus = DefaultPnpHandler(pExtension, pIrp); // some function we don't know about
return ntStatus;
}
ntStatus = (*fcntab[fcn])(pExtension, pIrp);
return ntStatus;
}