Windows XP下usbport.sys驱动内部实现解析(四)

Windows XP USB启动安装全攻略:驱动注入原理与实战 操作系统安装的核心在于引导程序对硬件驱动的识别与加载。Windows XP等早期系统在安装阶段,其文本模式安装环境默认不包含USB大容量存储驱动,导致无法直接从USB设备启动安装。通过修改安装源文件中的关键配置文件,如TXTSETUP.SIF和DOSNET.INF,可以将USB存储驱动(如usbstor.sys)的加载时机提前至系统引导的初始阶段,这一过程被称为“驱动注入”。这项技术的价值在于突破了原生安装程序的限制,使得为老旧工业设备、嵌入式系统或特定兼容性测试创建便携式、隔离的Windows XP工作环 阅读详情

http://hi.baidu.com/jlgwxq/blog/item/e54543100b5cb7c5c2fd7860.html

Windows XP下usbport.sys驱动内部实现解析(四)
2010-01-22 18:16
(接上一篇)

然后来看看实际上的work routine,先看通用的这个。root hub的是一个特殊的函数。

USBPORT_DmaEndpointWorker(pEndpoint)
{
call _USBPORT_GetEndpointState(pEndpoint)

curState = return value
if(curState == active)
nextState=_USBPORT_DmaEndpointActive(pFdo,pEndpoint)
else if(curState == pause)
nextState=_USBPORT_DmaEndpointPaused(pFdo,pEndpoint)
else
ASSERT(0);

_USBPORT_FlushCancelList(pEndpoint)

if(nextState != curState)
_USBPORT_SetEndpointState(pEndpoint,nextState)
else if(nextState == pause)
_USBPORT_InvalidateEndpoint(pEndpoint)
}

很简单的一个函数,根据当前endpoint的state调用不同的函数,函数的返回值是新的状态。如果跟以前的状态不同,则要调用一次set state函数,这个函数完成的功能就是我上面说说的那样,把endpoint放入state change list,然后告诉miniport driver引发一次start of frame的中断。

对于一直处于pause状态的endpoint,不断的排队 CoreWorker调用,直到离开pause状态为止,为什么要这样呢?处于active状态的endpoint,corewoker的调用自然有 miniport通过invalidate来调用,但是pause状态却没有人去调用invalidate,只好自己来了。

接下来来看两个处理函数:

_USBPORT_DmaEndpointActive(pFdo,pEndpoint)
{
nextState = active
while(pEndpoint->ActiveTransfer is not empty)
{
go through the list,for each
if(pTransfer had been marked to force complete)
{
_USBPORT_QueueDoneTransfer(pTransfer)
break;
}

if(pTransfer had been submitted)
{
if(pTransfer had been marked canceled or aborted)
{
nextState = pause
break;
}
else continue;
}

if(pTransfer is iso transfer)
{
call miniport\'s IsoTransfer Routine
retValue = return value
}
else
{
call miniport\'s SubmitTransfer Routine
retValue = return value
}

if(retValue == sucess)
{
set this transfer has been submitted
set transfer\'s timeout value
}
else if(retValue == need_to_wait)
break;
else
{
ASSERT(pTransfer is Iso transfer)
_USBPORT_ErrorCompleteIsoTransfer
break;
}
}
return nextState
}

也 是个比较简单的函数,只是几个特殊情况要作一下说明:首先是第一个if判断,为什么会有些transfer被标记成了强制完成呢?主要是因为short packet ok这个标记允许传输比你设置的buffer要小的数据,就可能发生这样的情况。比如你期望传递1000个字节的数据,这个urb在提交的过程中可能超过 了最大传输长度,以至于被切成了两个transfer提交给硬件,而硬件却只是传输了其中的100个字节,这样只是完成了第一个transfer。这个时 候usbport检测到这种情况,标记第二个transfer为强制完成状态。这也就是这个标记的来源。

另 外的测试是关于cancel跟abort的,cancel跟abort实际上都只是设置了一个标记,然后就返回了。真正的cancel跟abort的操作 还很多,比如transfer结构的内存释放等等,但是如果这个transfer是已经提交给miniport了,就必须要先从miniport那里收回 这个transfer的控制权才可以。所以并不是在调用cancel或者abort的时候就能完成全部的操作的,只是设置了一个标记,这个部分马上就会讲 到。

接着注意:transfer一直都在active list里面,并没有取出来作处理,而只是单纯的遍历操作,所以有个submitted标记表示是否有提交给硬件。

至于timeout,是在提交urb的时候设置的一个参数。如果你希望urb只是占用一定的时间进行处理,不管完成了没有,都返回的话就可以使用这个功能。时间上urbport设置了一个定时器,周期的检查每个endpoint的active list里面设置了submitted标记并且启用了timeoute功能(也是设置一个标记)的transfer,时间到了当然是设置起abort标记了,下次endpoint的workroutine运行的时候就能检测到这种情况加以处理了。

transfer最终被提交给了miniport的相关routine,这个routine返回一个值表示自己还能继续接受transfer或者必须要等待或者是iso出错(其他的类型的transfer出错不是这样处理的)。

注意几个循环继续跟退出的条件以及返回值的变化:

在说pause处理之前,就必须要说cancel跟abort了,因为pause状态是专门为他们这两个操作设计的。

cancel发生在调用IoCancelIrp的时候,而abort则是发生在客户驱动abort pipe的时候。先说cancel,irp的cancel是个很经典的问题,随便找个写驱动的书上都会讲到(如果没有,那就扔了别看那个垃圾书了)。cancel最最主要的问题就是同步,这里就省略了,这种大众化的东西随便都能找到介绍。

usbport对cancel的处理方式是这样的:
先设置irp的cancelroutine
然后检查irp->Cancel值
如果为false就表示irp没有被cancel,正常处理
如果为true就将cancelroutine重新设置成0
如果返回得值非0就表示cancelroutine还没有被调用,则complete这个irp,否则表示cancelroutine已经被调用了,正常处理
正常处理就是把irp保存到一个数组里面(当然得在spinlock保护下)

而cancel routine里面则先到数组里面去寻找irp,如果没有找到就直接返回了,找到了则complete这个irp。cancel routine的语意是简单的,任何被cancel的irp都必须存在于那个irp的数组里面,不存在的就表示这个irp已经被完成了。

设置cancel routine的地方就必须要保证这个语意,没有被cancel的irp,将来就可能被cancel,就必须要加入到数组里面。正在被cancel的irp,因为cancel routine要从数组里面寻找这个irp,就可以选择是自己完成还是让cancel routine来完成。

CancelRoutine(pIrp)
{
IoReleaseCancelLock()
KeAcquireSpinLock(&IrpTableLock,..)
if(FindIrpInIrpTable(pIrpTable,pIrp))
RemoveIrpFromIrpTable(pIrpTable,pIrp)
else pIrp = NULL;
KeReleaseSpinLock(&IrpTableLock,..)

if(pIrp)
IoCompleteRequest(pIrp,...)
}

EnqueueIrp(pIrp)
{
KeAcquireSpinLock(&IrpTableLock,..)
IoSetCancelRoutine(pIrp,CancelRoutine)
if(pIrp->Cancel)
{
pCancel = IoSetCancelRoutine(pIrp,0)
if(pCancel)
{
KeReleaseSpinLock(&IrpTableLock,..)
IoCompleteRequest(pIrp,..)
return;
}
}

InsertIrpToIrpTable(pIrpTable,pIrp)
KeReleaseSpinLock(&IrpTableLock,..)
}

DequeueIrp
{
KeAcquireSpinLock(&IrpTableLock,..)
pCancel = IoSetCancelRoutine(pIrp,0)
if(pCancel)
RemoveIrpFromIrpTable(pIrpTable,pIrp)
else
pIrp = NULL

KeReleaseSpinLock(&IrpTableLock,...)

if( pIrp )
Contine to process the irp
}

这个部分没有什么特别的,irp的cancel模型到处都能找到。

usbport 所使用的模型就是上面我描述的这样,只不过对于不同阶段的transfer、cancel所表征的语意是不同的。对于pending阶段(也就是还在 pEndpoint->PendingTransfer list里面的transfer),cancel作的工作很简单,直接释放掉这个transfer所占的内存就够了。对于map阶段对于active阶段 就不行了,必须要作额外的工作,比如allocated的channel必须要free,对于提交到硬件的transfer必须要收回,这些工作就没有办 法在cancel routine里面来完成了。那么真正的cancel是怎么进行的呢(只是针对非pending list的transfer)?

被分成了两步,首先是相关irp的完成,这个部分没有任何疑问直接用STATUS_CANCELED完成这个irp。第二步就设置到内存,dma资源的是否问题了,这个是在endpoint的workroutine的帮助下完成的。

对于要cancel的transfer,cancel routine简单的给他设置一个标记,表示这个transfer已经被cancel掉了,然后InvalidateEndpoint一下,排队 CoreWorker调用,进而进入endpoint的workroutine(假定当前状态是一个active状态)。上面的代码可以看到active状态检查到active list里面有设置了cancel标记的transfer的时候,endpoint经过若干个步骤以后就转入到了pause状态,进入了下面这个函数:

_USBPORT_DmaEndpointPaused(pFdo,pEndpoint)
{
pTransfer = pEndpoint->ActiveTransfer->Flink
nextState = active
while(pTransfer != &pEndpoint->ActiveTransfer)
{
if(pTransfer had not been marked canceled and aborted)
{
pTransfer = pTransfer->TransferListEntry.Flink
continue
}

if(pTransfer had been submitted)
{
ask miniport to abort this transfer
}

remove this transfer from the active list

if(pTransfer is a child transfer)
call _USBPORT_CancelSplitTransfer
else
insert this transfer to endpoint\'s CancelTransferList
}
}

_USBPORT_CancelSplitTransfer函数很简单,把这个child transfer从其parent的children list里面remove出来然后释放掉自己,如果其parent的children list为空了,则把parent加入到endpoint\'s CancelTransferList里面。

pause 的操作很简单,加入那些cancel和abort的transfer到CancelTransferList里面,那么什么时候完成他们的呢?往上看你就 发现了在调用pause处理函数以后立即就有一个FlushCancelList的调用,这个函数的功能自然就水到渠成了,把 CancelTransferList里面的transfer一一取出来,释放掉为他们分配的资源。这里就不列举他们的代码了。

至于abort,跟上面的操作几乎一样。

回头来问一个问题,上面我们都假定transfer已经进入了active list了,如果transfer还位于map list怎么办?上面代码已经给出来了,他们直接就进入了cancel list,而没有去作映射也没有进入active list。

最后最后了,active list里面的transfer在Invalidate的帮助下源源不断的提交给硬件,那pending list呢?map list呢?那是怎么让transfer从pending list进入到map list然后进入到active list里面的呢?

实际上还是由InvalidateEndpoint来完成的,我们知道InvalidateEndpoint设置一个Event,通告一个work thread停止等待,work thread唤醒以后作的第一件事情就是调用函数 _USBPORT_FlushAllEndpoints。这个函数的功能自然就不言而喻了,他把每个非close状态的endpoint收集到一个list里面,然后为这个list里面的每个endpoint调用一次_USBPORT_FlushPendingList。

最后当然是urb的完成了,上面已经由代码展示了这个完成的处理:调用_USBPORT_QueueDoneTransfer函数把这个完成了的 transfer放入到fdo的DoneTransferList里面,然后排队一个dpc,在这个dpc的处理函数里面把他们一一取出来完成,自然少不了调用InvalidateEndpoint函数了。

作个总结

大部分urb被usbport排队,先进入pending list,然后在FlushPendingList的时候进入Map list,在MapTransfer的时候进入ActiveList,在CoreWorker的时候提交给硬件。

Pending list里面的transfer的cancel跟abort只是直接释放资源。

map list跟active list里面的cancel分成两步,一个是irp的cancel完成,一个是资源的释放。资源的释放被推迟了,cancel routine为其设置了一个标记,当coreworker检查到这个标记以后,endpoint进入pause状态,在这个状态下,收集所有设置了 cancel跟abort标记的transfer进入cancel list,在FlushCancelList中再cancel掉他们。

写完了..今天的文章..

比较的乱,自己都觉得...

毕竟usbport本身就是一个400多K的sys文件,似乎不应该是这样说说就能完完全全说明白的。实际上还有好多好多的东西都没有涉及到,比如电源管理,远程唤醒等等,毕竟是一个很大的驱动。。。

Windows 7 SP1增强型升级安装实战:USB3.0驱动注入与离线补丁部署 Windows 7作为NT6.x内核的经典操作系统,虽已终止支持,但在工控、教育及嵌入式场景中仍承担关键业务。其升级本质不是版本迭代,而是面向Legacy BIOS环境的系统兼容性工程——需解决USB3.0驱动缺失、NVMe识别失败、SHA-2签名支持不足等底层限制。技术核心在于离线镜像服务(DISM注入)、启动介质定制(Rufus+bootmgr适配)与补丁依赖链管理(KB4474419为前置基点)。该方案兼顾业务连续性与硬件兼容性,适用于戴尔OptiPlex等老平台在不重装系统前提下获得USB3.0识别 阅读详情

相关推荐

Windows 2000专用USB驱动完整安装包(含INF配置与微端口驱动)

简介:本资源为面向Windows 2000操作系统的USB设备兼容性解决方案,包含经验证的主机控制器驱动、通用USB驱动模型及设备级微端口驱动。核心文件win2000_usb.inf提供标准化安装指引,支持硬件ID识别与自动驱动部署;压缩包集成可执行安装程序、PUDN来源说明文档及完整驱动签名/配置信息,适用于解决Win2000下USB设备无法识别、枚举失败或功能异常等典型问题,助力老旧系统延续USB外设支持能力。

weixin_35755640的博客 255

winapi 鼠标 修改速度_鼠标调整小技巧

有时候鼠标精确度和移动速度很不灵活,这样就大大地影响了系统操作效率。如果调节鼠标适合自己的使用速度呢?1、一般情况下调节鼠标的方法:打开控制面板,在控制面板里面找到鼠标,然后就可以调整了。2、鼠标最重要的两个指标:DPI和刷新频率。DPI一般情况下是400-800之间,我们没办法修改,但是刷新时间我们是可以修改的。第一步:先找到系统所在分区的WindowsSystem32drivers下的usbp...

weixin_42302638的博客 563

HASP4加密锁Windows驱动包(含DOS下hdd32.exe调试工具与HTML版安装指南)

HASP4硬件加密锁配套驱动安装程序,支持主流Windows系统(XP至Win10/11 32位与64位),主安装程序HASP4_driver_setup自动完成驱动文件部署、注册表配置及服务注册,实现即插即用式硬件认证。包内附带hdd32.exe——专为纯DOS环境设计的32位HASP4设备识别与状态检测工具,适用于老旧工控系统、驱动兼容性验证或无GUI场景下的底层调试;readme.html提供完整操作指引,涵盖安装流程、系统要求(如需管理员权限、禁用驱动签名强制)、常见故障代码释义(如设备未识别、服务

mango的博客 207

Windows操作系统的USB驱动架构

Winows操作系统下关于USB的驱动可分为: Windows2000 在Windows2000时代,USB设备基本是USB1.0.USB1.1和少量的USB2.0设备。 所以USB驱动架构构为: Windows2000 USB控制器 usbd.sys - Universal Serial Bus Driver 这是USB控制器的类驱动程序,配合2个端口驱动程序openhci.sys和uhcd.sys,这2个端口驱动分别对应于usb1.0和usb.1.1 Windows2000 USB集线器-HUB US

T76230169的专栏 2272

QF9700 USB网卡驱动程序完整安装与配置指南

QF9700 USB网卡驱动是专为基于QF9700芯片组设计的USB接口网络适配器提供的核心软件支持,旨在实现设备与操作系统的无缝通信。该驱动不仅承担硬件识别、资源分配和数据传输调度等基础功能,还通过标准化接口向上层网络协议栈提供稳定的数据链路服务。作为连接物理网络与操作系统之间的桥梁,QF9700驱动在即插即用(Plug and Play)、电源管理(如Suspend/Resume)以及热拔插响应机制中发挥关键作用。

weixin_42600128的博客 843

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

Windows XP下usbport.sys驱动内部实现解析(一)

http://hi.baidu.com/jlgwxq/blog/item/a3bcc30356a3cc057aec2c64.html Windows XP下usbport.sys驱动内部实现解析(一) 2010-01-22 18:10 上一篇讲了USB驱动栈整体结构,说明了usbport.sys的重要作用,现在就具体分析usbport.sys的内部实现细节。 首先再重复一下:

killcpp的专栏 1294

《大明王朝1566》中,朝廷财政危机无法解决的根源分析

财政困局中的财富最终流向三重黑洞:​皇室挥霍​(如嘉靖炼丹修殿)、特权阶层贪腐​(严党年入百万两盐税)、制度性损耗​(宗室供养、低效官僚)。更深层的“钱”其实是被禁锢在道德化治理的牢笼中——当国家用“黄河长江皆可为用”的权术思维替代制度性改革时,财政危机便成为帝制王朝无法逃脱的宿命。

为了小家奋斗 1968

中断的系统内部过程

了解这个过程之后就能发现hook中断的地方可以有很多。。。 跳过中断硬件支持的部分,从系统的角度去看 Cpu从idt表中查找到routine地址,这个地址实际是保存在中断对象中 kd> !idt Dumping IDT: 37: 806e6864 hal!PicSpuriousService37 3d: 806e7e2c hal!HalpApc

Returns' Station 1854

手把手教你搞定6脚三位一体数码管的驱动(附C语言源码与Visual Studio调试技巧)

本文详细解析了6脚三位一体数码管的驱动原理与实战技巧,包括引脚复用、动态扫描时序、Visual Studio模拟调试及单片机实现。通过C语言源码示例和调试技巧,帮助开发者快速掌握非标准数码管的驱动方法,提升硬件开发效率。

weixin_30613727的博客 589

摄像头读取出现VIDIOC_STREAMON: No space left on device 错误

先说下原因,linux中为usb camera提供了一个标准的V4L2的驱动以方便使用,只要符合驱动规范就可以实现即插即用usb camera设备,即免驱动安装。 但市面上的USB 摄像头都是2.0的。usb bus的 bandwidth是有限的,而V4L2驱动采用的是贪心原则,即camera会要求获取最大带宽;因此将两个camera接入一路usb bus,打开第二个camera(尤其是采用YUV...

houge101的博客 9288

Windows XP下usbport.sys驱动内部实现解析(三)

Windows XP下usbport.sys驱动内部实现解析(三) 2010-01-22 18:16 (接上一篇) _USBPORT_MapTransfer是个比较复杂的函数了,他涉及到transfer的切割、sgList结构的填写,少安毋躁。。。哈哈 struct SG_LIST { ULONG Flags; PVOID CurrentVa; PVOID MappedSy

killcpp的专栏 665

机器视觉应用工程师职位深度解析与面试指南

广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。

郑伟强dev的专栏 431

Windows XP下usbport.sys驱动内部实现解析(二)

http://hi.baidu.com/jlgwxq/blog/item/e0f223312c0aa548ac4b5f67.html  Windows XP下usbport.sys驱动内部实现解析(二) 2010-01-22 18:15 (接上一篇) 4. 处理USB请求(URB) 在进入下一个主题之前我总结几个事实让大家注意: 1. 对于每个usb总线上的设备,usbpo

killcpp的专栏 716

基于深度学习的茶叶等级检测识别系统:YOLOv10 + UI界面 + 数据集

YOLOv10是YOLO系列的最新版本,继承了YOLO模型的优点,并对速度和精度进行了优化。YOLOv10在目标检测中使用卷积神经网络(CNN)作为基础,通过改进网络结构和优化训练策略,实现了在更低的延迟下进行高精度的目标检测。本文详细介绍了基于YOLOv10的茶叶等级检测与识别系统的设计与实现过程。我们从数据集准备、模型训练与推理、UI界面设计等多个方面进行了详细讲解,并给出了相应的代码实现。通过本系统,我们可以高效地自动检测茶叶的等级,并通过UI界面直观地展示结果。

YOLO 763

ROS2 CANopen 使用教程

第一步是定义一个结构,用于保存有关接头和相关 CANopen 数据的信息。该结构是 CANopen 网络的基础,可确保存储所有相关数据并在需要时进行访问。

机器人控制与仿真应用 3688

USB 驱动程序堆栈体系结构

USB 驱动程序堆栈体系结构 本主题提供了通用串行总线 (USB) 驱动程序堆栈体系结构的概述。 下图显示了 Windows 8 USB 驱动程序堆栈体系结构框图。该图分别显示了 USB 2.0 和 USB 3.0 的 USB 驱动程序堆栈。当设备附加到 xHCI 控制器时,Windows 会加载 USB 3.0 驱动程序堆栈。USB 3.0 堆栈是 Windows 8 中的新功能。 当

M_O_Bz的专栏 2437

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 366

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 262

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 42

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 227

[C++]:7.STL:list

好久不见,firdawn小课堂又和大家见面啦。今天我们要学习的内容是list容器,list也是一种常用的数据结构。下面是本章的思维导图,那么让我们开始学习吧!自定义的list,由三个结构构成。分别是链表的最小组成单位,也就是链表节点。以及迭代器类和list类其实要特别说明的是, List的迭代器,它不是单纯的指针,因为我们如果对指针直接进行解引用操作的话,我们得到的是这个节点,而不是节点里面存储的值并且我们对这个指针加加,得到的也不是下一个节点的地址,而是所在节点的下一个单位的地址。

2301_80817679的博客 170

RT-Thread 5.4.0 完整版架构剖析(下):IPC、时钟、内存、设备与组件

从 IPC 全量、时钟与定时器、内存管理,到设备框架、组件层、软件包机制、移植裁剪与速查表,补齐 RT-Thread 5.4.0 完整版的下半张地图。

188

CMake 多目录工程实战:静态库与动态库的完整构建示例

本文通过一个完整CMake项目示例,展示了如何构建静态库(math)与动态库(sort),并分别在test1、test2中链接使用。项目结构清晰,顶层CMakeLists.txt统一管理变量,各子目录独立配置编译规则。通过add_library生成库,link_directories和link_libraries实现链接,最终完成构建与验证。重点区分了静态库(打包进可执行文件)与动态库(运行时加载)的差异,适用于实际工程化开发与面试准备。

2303_77004089的博客 112

第2讲:提示注入攻击——原理与防御

提示注入是攻击者通过恶意指令绕过AI系统规则的安全威胁,分为直接注入(如覆盖指令、角色扮演越狱)和间接注入(藏于文档或搜索结果中)。防御需三重机制:检测(识别高危模式与多轮诱导)、加固(设置优先级、随机分隔符、锁定输出)、净化(清除控制字符、编码、截断超长输入)。结合上下文分析与多模态处理,可有效防范编码绕过、过度净化等陷阱。核心理念:防御需检测、加固、净化联动,筑牢AI应用安全防线。

sandaoliuge的博客 253
上一篇: Windows XP下usbport.sys驱动内部实现解析(三)
下一篇: Windows XP下usbhub.sys驱动内部实现解析
killcpp
博客等级 码龄20年 13粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值