请教:一启用USB驱动程序就死机

maggiezjcc 2007-03-27 03:28:56
编写的USB驱动程序,主要的例程是Read(KIrp)和Write(KIrp)以及读写完成例程,打开应用程序,写数据ok,但一读数据电脑就黑屏重启,我的读写数据都是通过端点2,一个pipein一个pipeout, 请教各位大侠是什么原因
...全文
732 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
DISINHUI 2009-10-09
  • 打赏
  • 举报
回复
4。分配足够的电流给器件。
DISINHUI 2009-10-09
  • 打赏
  • 举报
回复
建议:
1。输入单独设置一个端点
2。输出单独设置一个端点

3.不知道你传输方式是什么,无论何种方式,都要处理等待异常,数据校验错误处理。不能占据总线不放。造成系统紊乱。
shf198608 2009-10-08
  • 打赏
  • 举报
回复
我也在等待答案
shf198608 2009-10-08
  • 打赏
  • 举报
回复
我也在等待答案
tocj2008 2007-03-31
  • 打赏
  • 举报
回复
跟USB的终端设备,单独供电,试试,,有时USB的电压不足,,也会使机子重起,,
HZJMAN 2007-03-30
  • 打赏
  • 举报
回复
应该是读数据的USB端口号不正确
pilixuanke 2007-03-28
  • 打赏
  • 举报
回复
设置为“不自动重启”。然后用softice或windbg调试。
maggiezjcc 2007-03-28
  • 打赏
  • 举报
回复
代码如下,一从USB设备读数据就死机,请各位大侠帮忙分析分析原因
NTSTATUS Test11Device::Read(KIrp I)
{
T.Trace(TraceInfo, __FUNCTION__"++. IRP %p\n", I);

NTSTATUS status = STATUS_SUCCESS;

// TODO: Validate the parameters of the IRP. Replace "FALSE"
// in the following line with error checking code that
// evaulates to TRUE if the request is not valid.
if (FALSE)
{
status = STATUS_INVALID_PARAMETER;
I.Information() = 0;
I.PnpComplete(status);

T.Trace(TraceWarning, __FUNCTION__"--. IRP %p, STATUS %x\n", I, status);

return status;
}

// Always ok to read 0 elements
if (I.ReadSize() == 0)
{
I.Information() = 0;
I.PnpComplete(this, status);

T.Trace(TraceInfo, __FUNCTION__"--. IRP %p, STATUS %x\n", I, status);

return status;
}

KMemory Mem(I.Mdl());

ULONG dwTotalSize = I.ReadSize(CURRENT);
ULONG dwMaxSize = PipeIn.MaximumTransferSize();

// If the total requested read size is greater than the Maximum Transfer
// Size for the Pipe, request to read only the Maximum Transfer Size since
// the bus driver will fail an URB with a TransferBufferLength of greater
// than the Maximum Transfer Size.
if (dwTotalSize > dwMaxSize)
{
ASSERT(dwMaxSize);
dwTotalSize = dwMaxSize;
}

// Allocate a new context structure for Irp completion
USB_COMPLETION_INFO* pCompInfo = new (NonPagedPool) USB_COMPLETION_INFO;
if (pCompInfo == NULL)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

// TODO: Select the correct pipe to read from

// Create an URB to do actual Bulk read from the pipe
PURB pUrb = PipeIn.BuildBulkTransfer(
Mem, // Where is data coming from?
dwTotalSize, // How much data to read?
TRUE, // direction (TRUE = IN)
NULL, // Link to next URB
TRUE // Allow a short transfer
);

if (pUrb == NULL)
{
delete pCompInfo;
I.Information() = 0;
return I.PnpComplete(this, STATUS_INSUFFICIENT_RESOURCES);
}

// Initialize context structure
pCompInfo->m_pClass = this;
pCompInfo->m_pUrb = pUrb;

// Submit the URB to our USB device
status = PipeIn.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0);
return status;
}

NTSTATUS Test11Device::ReadComplete(KIrp I, USB_COMPLETION_INFO* pContext)
{
// Normal completion routine code to propagate pending flag

if (I->PendingReturned)
{
I.MarkPending();
}

NTSTATUS status = I.Status();
PURB pUrb = pContext->m_pUrb;
ULONG nBytesRead = 0;

if ( NT_SUCCESS(status) )
{
nBytesRead = pUrb->UrbBulkOrInterruptTransfer.TransferBufferLength;
if (nBytesRead > 0)
T << "Read() got " << nBytesRead<< " bytes from USB\n";
}

// Deallocate Urb and context structure
delete pUrb;
delete pContext;

// set returned count
I.Information() = nBytesRead;
// I.PnpComplete(this, STATUS_SUCCESS);

// Plug and Play accounting
DecrementOutstandingRequestCount();

// allow IRP completion processing
return STATUS_SUCCESS;
}
maggiezjcc 2007-03-28
  • 打赏
  • 举报
回复
Read(KIrp)和ReadComplete()函数中,Irp完成后怎么取消它,I.PnpComplete()是不是说明她已经被取消了
maggiezjcc 2007-03-28
  • 打赏
  • 举报
回复
点击start softIce那个图标,弹出对话框说“由于线程退出或应用程序请求已放弃I/O操作”
maggiezjcc 2007-03-27
  • 打赏
  • 举报
回复
不是,写数据他都可以收到,就是一读数据就会死机,我想用 softIce调试,一设置好它,重启电脑就启动不起来,好郁闷
lbing7 2007-03-27
  • 打赏
  • 举报
回复
会不会是USB口坏了?

偶的本本接上一个USB的仿真器后,口也被干掉了,直接就死机...

555555555555555

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧