首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

《Windows驱动开发技术详解》部分代码请问

2012-09-06 
《Windows驱动开发技术详解》部分代码请教代码如下:[codeAssembly][/code]NTSTATUS HelloDDKDispatchRoutin

《Windows驱动开发技术详解》部分代码请教
代码如下:[code=Assembly][/code]
NTSTATUS HelloDDKDispatchRoutin(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp) 
{
KdPrint(("Enter HelloDDKDispatchRoutin\n"));

PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
//建立一个字符串数组与IRP类型对应起来
static char* irpname[] = 
{
"IRP_MJ_CREATE",
"IRP_MJ_CREATE_NAMED_PIPE",
"IRP_MJ_CLOSE",
"IRP_MJ_READ",
"IRP_MJ_WRITE",
"IRP_MJ_QUERY_INFORMATION",
"IRP_MJ_SET_INFORMATION",
"IRP_MJ_QUERY_EA",
"IRP_MJ_SET_EA",
"IRP_MJ_FLUSH_BUFFERS",
"IRP_MJ_QUERY_VOLUME_INFORMATION",
"IRP_MJ_SET_VOLUME_INFORMATION",
"IRP_MJ_DIRECTORY_CONTROL",
"IRP_MJ_FILE_SYSTEM_CONTROL",
"IRP_MJ_DEVICE_CONTROL",
"IRP_MJ_INTERNAL_DEVICE_CONTROL",
"IRP_MJ_SHUTDOWN",
"IRP_MJ_LOCK_CONTROL",
"IRP_MJ_CLEANUP",
"IRP_MJ_CREATE_MAILSLOT",
"IRP_MJ_QUERY_SECURITY",
"IRP_MJ_SET_SECURITY",
"IRP_MJ_POWER",
"IRP_MJ_SYSTEM_CONTROL",
"IRP_MJ_DEVICE_CHANGE",
"IRP_MJ_QUERY_QUOTA",
"IRP_MJ_SET_QUOTA",
"IRP_MJ_PNP",
};

UCHAR type = stack->MajorFunction;
if (type >= arraysize(irpname))//计算数组元素个数
KdPrint((" - Unknown IRP, major type %X\n", type));
else
KdPrint(("\t%s\n", irpname[type]));


//对一般IRP的简单操作,后面会介绍对IRP更复杂的操作
NTSTATUS status = STATUS_SUCCESS;
// 完成IRP
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;// bytes xfered
IoCompleteRequest( pIrp, IO_NO_INCREMENT );

KdPrint(("Leave HelloDDKDispatchRoutin\n"));

return status;
}
小弟对
UCHAR type = stack->MajorFunction;
if (type >= arraysize(irpname))//计算数组元素个数
KdPrint((" - Unknown IRP, major type %X\n", type));
else
KdPrint(("\t%s\n", irpname[type]));
这部分代码理解不清楚,不知道怎么会根据type就出来了KdPrint(("\t%s\n", irpname[type]));
谢谢

[解决办法]
type是UCHAR类型,在C里边当作1字节非负整数使用,因此可以作为数组下标。
[解决办法]
这个字符串数组和MajorFunction里的是一一对应的!!!!!!!
看下ntddk.h头文件就知道了!!!!!!!!!
[解决办法]
ntddk.h头文件中没有,要看wdm.h头文件中。
[解决办法]
stack->MajorFunction 返回IRP的主功能号,如IRP_MJ_CREATE。
事实上IRP_MJ_CREATE是一个宏嘛,定义为0x00,正好对应字符串数组的下标。你可以看wdm.h的定义,你会发现数组的IRP功能号和字符串都是一一对应的:
[code=C]
#define IRP_MJ_CREATE          0x00
#define IRP_MJ_CREATE_NAMED_PIPE    0x01
#define IRP_MJ_CLOSE          0x02
#define IRP_MJ_READ          0x03
#define IRP_MJ_WRITE          0x04
#define IRP_MJ_QUERY_INFORMATION    0x05
#define IRP_MJ_SET_INFORMATION      0x06
#define IRP_MJ_QUERY_EA        0x07
#define IRP_MJ_SET_EA          0x08
#define IRP_MJ_FLUSH_BUFFERS      0x09
#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
#define IRP_MJ_SET_VOLUME_INFORMATION  0x0b
#define IRP_MJ_DIRECTORY_CONTROL    0x0c
#define IRP_MJ_FILE_SYSTEM_CONTROL    0x0d
#define IRP_MJ_DEVICE_CONTROL      0x0e
#define IRP_MJ_INTERNAL_DEVICE_CONTROL  0x0f


#define IRP_MJ_SHUTDOWN        0x10
#define IRP_MJ_LOCK_CONTROL      0x11
#define IRP_MJ_CLEANUP          0x12
#define IRP_MJ_CREATE_MAILSLOT      0x13
#define IRP_MJ_QUERY_SECURITY      0x14
#define IRP_MJ_SET_SECURITY      0x15
#define IRP_MJ_POWER          0x16
#define IRP_MJ_SYSTEM_CONTROL      0x17
#define IRP_MJ_DEVICE_CHANGE      0x18
#define IRP_MJ_QUERY_QUOTA        0x19
#define IRP_MJ_SET_QUOTA        0x1a
#define IRP_MJ_PNP            0x1b
#define IRP_MJ_PNP_POWER        IRP_MJ_PNP    // Obsolete....
#define IRP_MJ_MAXIMUM_FUNCTION    0x1b
[/code]

热点排行