ULONG numData;
numData=*(PUCHAR)I.IoctlBuffer();//设置读取的数据个数
pUrb=m_Lower.BuildVendorRequest(
(PUCHAR)I.IoctlBuffer(),//驱动程序存放读取的数据的内存区
numData,//wLength,读取的数据个数
0,
0x0c,//bRequest
0,//wValue
TRUE,//input
TRUE,
NULL,
0x0472,//wIndex,传输到固件程序的读数命令码
URB_FUNCTION_VENDOR_ENDPOINT,
NULL
);
if(pUrb==NULL)
{
I.Information() =0;
status=STATUS_INSUFFICIENT_RESOURCES;
}
else
{
I.Information() =numData;
status=m_Lower.SubmitUrb(pUrb,NULL,NULL,0);
delete pUrb;
}
return status;
}
对象I包含了应用程序下传的IRP内容,包括命令或数据等参数,函数BuildVendorRequest用来分配并初始化一个用于厂商请求的URB(USB Request Block),该URB将作为下传IRP的一个参数,通过函数SubmitUrb发送给总线驱动程序,以便完成与硬件的通信。
在初始化URB时需要了解USB的传输方式及传输协议,该功能使用了USB的控制传输方式,该方式包括三个阶段:设置阶段、数据阶段和状态阶段,其中数据阶段可选,开发者主要关注设置阶段中的8个关键字节的定义,8字节分成了5个字段,定义了传输请求及相关信息,这8个字节的格式如图3所示。
bmRequestType
bRequest
wValue
wIndex
wLength