描述:
我用ds生成了一个驱动,然后根据ds提供的ezusb的例子,添加了一些代码。
在downloadfirmware这个函数中,先当下去了loader这个程序,然后再当一个dev_io程序(有cypress提供的例子),用drivermonitor察看,发现loader成功当下去,但当dev_io的时候就没反应了。然后,再拔出设备,才会出现“failed to download dev_io”的信息。
NTSTATUS USBDRMDevice::DownloadFirmware(void)
{
t << "Entering DownloadFirmware\n";
NTSTATUS status = STATUS_SUCCESS;
Reset8051(1);
status = DownloadIntelHex(loader);
if( !NT_SUCCESS(status) )
return status;
t<<"Download loader OK!\n";
Reset8051(0);
status = DownloadIntelHex(dev_io);
if( !NT_SUCCESS(status) )
{
t << "Fail to Download dev_io\n";
return status;
}
else
{
t << "Download dev_io OK!\n";
}
Reset8051(1);
Reset8051(0);
return status;
}
downloadintelhex调用了下面的函数
NTSTATUS USBDRMDevice::DownloadRAM(PINTEL_HEX_RECORD pHexRecord, bool fExternal)
{
t << "Entering DownloadRAM\n";
NTSTATUS status = STATUS_SUCCESS;
URB Urb;
while( 0 == pHexRecord->Type )
{
if( fExternal ?
(! INTERNAL_R(pHexRecord>Address )) :
(INTERNAL_RAM( pHexRecord->Address ))
)
{
m_Lower.BuildVendorRequest(
pHexRecord->Data,
pHexRecord->Length,
0,
static_cast<UCHAR>(
fExternal ?
ANCHOR_LOAD_EXTERNAL :
ANCHOR_LOAD_INTERNAL),
pHexRecord->Address,
FALSE, //default
FALSE, //default
NULL, //default
0, //default
URB_FUNCTION_VENDOR_DEVICE,//default
&Urb
);
status = m_Lower.SubmitUrb(&Urb);
if( !NT_SUCCESS(status) )
{
t << " SubmitUrb Failed ! \n";
break;
}
else
{
t << " SubmitUrb OK! \n";
break;
}
}
pHexRecord++;
}
return status;
}
SubmitUrb这个函数既没返回成功,也没返回失败?
它将irp传到底层的驱动,但我如何知道irp处理的情况?
irp到底是如何进行工作的?
这个问题已经搞了很久了,一直没搞定,还请各位指点指点!急啊!