请问我这个最简单的StartIO为何只能被一次Write请求调用?

njuliao 2012-03-17 11:05:52

#pragma LOCKED
void StartIO(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
KdPrint(("Call StartIO\n"));
KSPIN_LOCK a;
KIRQL irql;
KeAcquireSpinLock(&a, &irql);
if(pIrp != pDevObj->CurrentIrp || pIrp->Cancel)
{
KeReleaseSpinLock(&a, irql);
return;
}
else
{
IoSetCancelRoutine(pIrp, NULL);
KeReleaseSpinLock(&a, irql);
}

PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);

int offset;
int length;
unsigned char key = stack->MajorFunction;
pDevice_ext pdx = (pDevice_ext)pDevObj->DeviceExtension;

if(key == IRP_MJ_READ)
{
offset = stack->Parameters.Read.ByteOffset.QuadPart;
length = stack->Parameters.Read.Length;
KdPrint(("Read %d %d\n", offset, length));
if(offset + length <= pdx->datalen)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = length;
memcpy(pIrp->AssociatedIrp.SystemBuffer, pdx->data + offset, length);
}
else
{
pIrp->IoStatus.Status = STATUS_END_OF_FILE;
pIrp->IoStatus.Information = 0;
}
}
else if(key == IRP_MJ_WRITE)
{
offset = stack->Parameters.Write.ByteOffset.QuadPart;
length = stack->Parameters.Write.Length;
KdPrint(("Write %d %d\n", offset, length));
if(offset + length <= pdx->datalen)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = length;
memcpy(pdx->data + offset, pIrp->AssociatedIrp.SystemBuffer, length);
}
else
{
pIrp->IoStatus.Status = STATUS_END_OF_FILE;
pIrp->IoStatus.Information = 0;
}
}
else
{
pIrp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
pIrp->IoStatus.Information = 0;
}


KdPrint(("status = %d\n", pIrp->IoStatus.Status));
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
IoStartNextPacket(pDevObj, true);
}


我设计一个用户进程,先后会调用两次异步的WriteFile
我的用户进程调用第一次WriteFile时,可以进入StartIO中并完成
调用第二次时,直接就没进入StartIO,一直就Pending着了。
我在IRP_MJ_WRITE的派遣函数中有这样子的句子:
KdPrint(("In io\n"));
IoStartPacket(pDevObj, pIrp, 0, OnCancelIRP);
KdPrint(("Out io\n"));
然后发现在调用IoStartPacket后,没进入StartIO函数
为什么?
...全文
81 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
downbj 2012-03-24
  • 打赏
  • 举报
回复
你在派遣函数中把IRP加入队列的前调用IoMarkIrpPending

21,599

社区成员

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

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