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

njuliao njuliao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

#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函数
为什么?
...全文

相关推荐

WDM Driver Structure

Basic Structure of a WDM Driver

achellies

DriverWorks关于DMA的驱动编程

DriverWorks关于DMA的驱动编程

Augusdi

使用粒子群算法估计漂移扩散模型的参数Matlab实现.rar

使用粒子群算法估计漂移扩散模型的参数Matlab实现.rar

天天Matlab科研工作室

复现基于积分滑模与快速终端滑模的三维多弹协同攻击制导律复现与实现-带攻击角约束的高速大机动目标同时攻击(Simulink仿真、Matlab代码实现)

内容概要:本文围绕“基于积分滑模与快速终端滑模的三维多弹协同攻击制导律”的复现与实现展开,重点研究在攻击角约束条件下,针对高速大机动目标实现多枚导弹的同时攻击。方案结合Simulink仿真与Matlab代码实现,综合运用积分滑模控制(ISMC)提升系统鲁棒性与稳态精度,并引入快速终端滑模控制(FTSMC)加快收敛速度,实现有限时间收敛。通过建立三维空间弹目相对运动模型,考虑视线角加速度、相对距离、速度等关键变量,设计具备时间协同与角度约束双重能力的制导律,确保多弹在满足预定攻击角度的前提下实现精确同步打击,适用于复杂战场环境中对高机动目标的精确制导任务。 适合人群:具备一定现代控制理论基础和Matlab/Simulink仿真能力的研究生、科研人员,以及从事飞行器制导、控制算法开发的工程技术人员。 使用场景及目标:① 解决多弹协同攻击中的时间一致性与攻击角度双重约束制导问题;② 掌握积分滑模与快速终端滑模在非线性、强耦合系统中的设计方法与稳定性分析技巧;③ 利用Matlab/Simulink完成复杂动态系统的建模、仿真与性能验证,提升先进控制算法在实际工程中的转化与应用能力。 阅读建议:建议读者结合滑模变结构控制、非线性系统稳定性理论等相关知识进行学习,重点关注制导律的设计思路、李雅普诺夫稳定性证明过程及仿真参数整定,动手运行并调试所提供的Matlab代码与Simulink模型,深入理解各模块之间的协同机制与控制逻辑,从而全面掌握此类先进协同制导算法的核心实现原理与工程细节。

程序猿鑫

基于人工智能的认知无线电系统,利用MATLAB进行智能射频信号检测与分类。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

海神之光
评论 1
收藏 已收藏
分享
返回顶部
njuliao
驱动开发/核心开发 21,620 成员 21,709 内容