首页
社区
课程
招聘
[求助]驱动基础问题求助
发表于: 2014-1-1 18:43 3653

[求助]驱动基础问题求助

2014-1-1 18:43
3653
下面的代码怎么理解?貌似是语法问题,但是我基础太差,只能猜着理解,求基础过硬的前辈帮忙看下

/************************************************************************
* 函数名称:HelloWDMPnp
* 功能描述:对即插即用IRP进行处理
* 参数列表:
      fdo:功能设备对象
      Irp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
	PAGED_CODE();

	KdPrint(("Enter HelloWDMPnp\n"));
	NTSTATUS status = STATUS_SUCCESS;
	PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
	PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
	[COLOR="Red"]static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) = [/COLOR]
	{
		DefaultPnpHandler,		// IRP_MN_START_DEVICE
		DefaultPnpHandler,		// IRP_MN_QUERY_REMOVE_DEVICE
		HandleRemoveDevice,		// 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))
	{						// unknown function
		status = DefaultPnpHandler(pdx, Irp); // some function we don't know about
		return status;
	}						// unknown function

#if DBG
	static char* fcnname[] = 
	{
		"IRP_MN_START_DEVICE",
		"IRP_MN_QUERY_REMOVE_DEVICE",
		"IRP_MN_REMOVE_DEVICE",
		"IRP_MN_CANCEL_REMOVE_DEVICE",
		"IRP_MN_STOP_DEVICE",
		"IRP_MN_QUERY_STOP_DEVICE",
		"IRP_MN_CANCEL_STOP_DEVICE",
		"IRP_MN_QUERY_DEVICE_RELATIONS",
		"IRP_MN_QUERY_INTERFACE",
		"IRP_MN_QUERY_CAPABILITIES",
		"IRP_MN_QUERY_RESOURCES",
		"IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
		"IRP_MN_QUERY_DEVICE_TEXT",
		"IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
		"",
		"IRP_MN_READ_CONFIG",
		"IRP_MN_WRITE_CONFIG",
		"IRP_MN_EJECT",
		"IRP_MN_SET_LOCK",
		"IRP_MN_QUERY_ID",
		"IRP_MN_QUERY_PNP_DEVICE_STATE",
		"IRP_MN_QUERY_BUS_INFORMATION",
		"IRP_MN_DEVICE_USAGE_NOTIFICATION",
		"IRP_MN_SURPRISE_REMOVAL",
	};

	KdPrint(("PNP Request (%s)\n", fcnname[fcn]));
#endif // DBG

	status = (*fcntab[fcn])(pdx, Irp);
	KdPrint(("Leave HelloWDMPnp\n"));
	return status;
}


上面红色的代码是什么意思咧?我的理解是: 定义一个静态的函数指针数组,这函数有两个参数,返回值类型为ntstatus. 但是函数不都是类似 func(){}这种结构么? 为什么上面的代码是 func()={}? 还真没见过这种语法

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好吧  犯2了

其实就是定义一个函数指针数组,然后统一给里面的成员赋值,类似于


#include "stdafx.h"

int add(int,int);

int _tmain(int argc, _TCHAR* argv[])
{
	int (*funcarray[2])(int a, int b)=
	{
		add,
		add
	}; // 给数组成员赋值,等同于下面
	

	/*  
	int (*funcarray[2])(int a, int b);
	funcarray[0]=add;
	funcarray[1]=add;
	*/
	
	printf("%d\n",(*funcarray[0])(1,2));
	printf("%d\n",(*funcarray[1])(2,2));
	getchar();
	return 0;
}

int add(int a,int b)
{
	//printf("%d\n",a+b);
	return a+b;
}

2014-1-1 19:16
0
雪    币: 290
活跃值: (41)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
static NTSTATUS (*fcntab)(PDEVICE_EXTENSION pdx, PIRP Irp) =

static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) =

一个有中括,一个没有中括,
有 中括[] 是什么作用??????
2014-1-1 21:03
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=winwang;1251814]static NTSTATUS (*fcntab)(PDEVICE_EXTENSION pdx, PIRP Irp) =

static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) =

一个有中括,一个没有中括,
有 中括[] 是什么...[/QUOTE]

前者只是一个函数指针, 后者是函数指针数组。这个数组中的每一个项都是一个函数指针,声明就是前者。
2014-1-1 21:14
0
游客
登录 | 注册 方可回帖
返回
//