当前位置: 代码迷 >> 驱动开发 >> 《Windows驱动开发技术详解》部分代码请问
  详细解决方案

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

热度:86   发布时间:2016-04-28 10:49:06.0
《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
  相关解决方案