再谈Windows NT/2000内部数据结构(http://webcrazy.yeah.net)

探究Windows 2000/XP原型PTE(http://webcrazy.yeah.net) 探究Windows 2000/XP原型PTE              WebCrazy(http://webcrazy.yeah.net)    内存管理可以说是操作系统实现中最重要的环节,也是最为复杂的一环节。对于相对贫乏的内存资源,内存共享也成了一个很重要的有效手段。Windows 2000/XP在此方面的实现借助于一个称为原型PTE(Prototype PTE,PPTE)的软件机制。在《小 阅读详情
再谈Windows NT/2000内部数据结构
               WebCrazy( tsu00@263.net)
                        注:本文最初见于 www.nsfocus.com
    现在我们结合Regmon( http://www.sysinternals.com/)在NT中的实现方法再来谈谈Windows NT/2000内部数据结构。

    Regmon是监视应用程序访问系统注册表的实用程序。大家都知道在应用程序中使用注册表一般都调用WinAPI Regxxx,而Regxxx最终会调用Native API Zwxxx!(参阅Windows NT/2000 DDK Documentation)。Regmon正是通过改变这些例程以达到监视注册表的目的。Zwxxx的实现方式如下:

    mov eax, ServiceId
    lea edx, ParameterTable
    int 2eh
    ret ParamTableBytes

    这就是所说的NT System Services,是不是与Linux有点相似(只不过Linux使用的是80h中断而已,它也有ServiceID,如fork系统调用ServiceID为2)。

    System Services在DDK Documentation是如下定义的:

    The set of native, user-mode routines exported by the executive for use only by protected subsystems. Each system service has a name of the form TwoLettersXxxYyy where:
    TwoLetters is the prefix for all system services.
    Xxx is usually a verb, describing the operation of a given service.
    Yyy is generally the object type the service operates on.

    System Services在系统中由两部分组成,一部分由win32k.sys导出,另一部分由ntoskrnl.exe提供服务。前者主要完成NT中win32、Posix与Os/2等子系统(subsystems)与内核的通信,仅能由用户态的应用程序调用,如user32!WaitMessage等。由于Regmon只涉及后者,所以本文将对其进行讨论,以下所有关于System Service的讨论均适合两者!

    上次( Nsfocus Magazine 10)我曾经提及KeServiceDescriptorTable,也说过它的结构如下:

    struct _ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase;
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
    }ServiceDescriptorTableEntry

    ntoskrnl.exe导出全局变量KeServiceDescriptorTable指向ServiceDescriptorTableEntry(由win32k.sys导出的System Services也有自己的ServiceDescriptorTable,在Win2000 Server中其Service ID从1000h始,由KeServiceDescriptorTable以下偏移50h处指向,其结构与ntosrknl.exe导出的基本一致,本文不作讨论,SoftICE中的ntcall命令在特定情况下可以列出所有的System Service)。

    下面我们先用SoftICE 4.05 For Windows NT/2000来分析分析x86平台Windows 2000 Server Build 2195的情况(以下仅摘录部分,不同版本不同时刻可能得到的数据未必一样)

    :dd KeServiceDescriptorTable l 4*4
    //如果看win32k.sys导出的表请使用dd KeServiceDescriptorTable+50 l 4*4
    //即将KeServiceDescriptorTable向下偏移50h处下同
    0008:8046AB80 804704D8             00000000 000000F8 804708BC ..G...........G.
              |      |_ServiceTableBase值 |           |     |_ParamTableBase值
              |                           |_似乎总为0 |
              |_KeServiceDescriptorTable地址          |_NumberOfService

    :dd @KeServiceDescriptorTable l byte(@(KeServiceDescriptorTable+08))*4
    // dd ServiceDescriptorTableEntry->ServiceTableBase l NumberOfService*4
    0008:804704D8 804AB3BF 804AE86B 804BDEF3 8050B034 ..J.k.J...K.4.P.
            |
            |_ServiceID=0的System Service入口地址(依次类推)

    0008:804704E8 804C11F4 80459214 8050C2FF 8050C33F ..L...E...P.?.P.
    0008:804704F8 804B581C 80508874 8049860A 804FC7E2 .XK.t.P...I...O.
    0008:80470508 804955F7 8049C8A6 80448472 804A8D50 .UI...I.r.D.P.J.
    0008:80470518 804B6BFB 804F0CEF 804FCB95 8040189A .kK...O...O...@.
    0008:80470528 804D06CB 80418F66 804F69D4 8049E0CC ..M.f.A..iO...I.
    ...(略)

    :db @(KeServiceDescriptorTable+0c) l byte(@(KeServiceDescriptorTable+08))
    // db ServiceDescriptorTableEntry->ParamTableBase
    0008:804708BC 18 20 2C 2C 40 2C 40 44-0C 18 18 08 04 04 0C 10 . ,,@,@D........
                  |
                  |_ServiceID=0的System Service参数个数*4(即参数个数为18h/4=6)

    0008:804708CC 18 08 08 0C 08 08 04 04-04 0C 04 20 08 0C 14 0C ........... ....
    ...(略)

    要获得哪个应用程序对系统注册表有过操作,只要在对其有操作的System Service中注入自己的代码,也就是改变这些System Service的执行流程,先执行自己的代码(Regmon中用于记录供GUI部分使用),接着返回至原先处继续执行即可。通过以上分析,我们知道只要修改ServiceTableBase到ServiceTableBase+NumberOfService*4范围的数据就可以改变System Service的执行流程,而只要知道System Service的ServiceID就可以改变这一System Service入口地址在这一区域的位置,那么又如何得到System Service的Service ID呢!我们可以随便以ZwOpenKey作个例子:

    :u ZwOpenKey
    ntoskrnl!ZwOpenKey
    0008:80400E2A B867000000 MOV EAX,00000067
                      |                 |_ServiceID
                      |_机器码(其中第二字节即ZwOpenKey线性地址加一处就是ServiceID)
    0008:80400E2F 8D542404 LEA EDX,[ESP+04]
    0008:80400E33 CD2E INT 2E
    0008:80400E35 C20C00 RET 000C

    这样只要知道Zwxxx例程名(即System Service在内存中的线性地址),是不是就可以实现我们的目的了呢?来看看Regmon的具体实现代码吧:
        .
        .
        .
    // 保存ZwOpenKey原先入口,在HookRegOpenKey中使用
    RealRegOpenKey = SYSCALL( ZwOpenKey );

    // 修改ZwOpenKey流程,指向新的入口,即调用ZwOpenKey时转向执行HookRegOpenKey
    SYSCALL( ZwOpenKey ) = (PVOID) HookRegOpenKey;
        .
        .
        .

    SYSCALL在intel平台是如下定义的:
    #define SYSCALL(_function) ServiceTable->ServiceTable[ *(PULONG)((PUCHAR)_function+1)]
    ServiceTable->ServiceTable就是我们上面所述的 ServiceDescriptorTableEntry->ServiceTableBase(为了便于描述)。_function+1即ServiceID所在地址。整个表达式即取得_function对应的System Service的入口地址在线性内存中的位置。其它定义请参阅Regsys.c与Regsys.h!
    可以使用SoftICE对比一下Regsys.sys装载前后ServiceTable中System Service入口地址的变化,加深对System Service拦截的理解.

    好了现在我们知道Regmon的基本实现方法了(当然真正要实现此功能还要考虑很多问题,如保护态应用程序与内核驱动程序之间的通信、线程同步等等)。

    让我们再来看看KeServiceDescriptorTable的另一个应用吧!如果我们重新分配段内存池,构造自己的ServiceTable与ParamTable数组(必须复制系统原有的System Services,否则...),然后修改结构中ServiceTableBase与ParamTableBase,使其指向自己的ServiceTable与ParamTable,再修改一下NumberOfServices,是不是可以增加自个儿的System Service呢!如果你有兴趣的话可以参阅<<UNDOCUMENTED NT>>。这书我也没见过,只知道网上它名声在外。哦,还要感谢James Shatlyk给我提供随书配套例子代码。如果您见过此书(不知道有没有Chinese 版,E文也可),能不能与我联系联系?

    谈完System Service后,再让我们来看看Regmon是如何在Driver中取得系统进程名的。
首先谈谈KTEB(Kernel Thread Environment Block)与KPEB(Kernel Process Environment Block),与TEB(其实应该是User-TEB)一样,KPEB/KTEB则纪录着系统内核进程/线程信息。要了解KTEB、KPEB,首先要知道如何得到当前进程/线程中它们的基址,可以先看看Native API IoGetCurrentProcess。在Windows 2000 DDK Document中它是如下定义的:
    PEPROCESS IoGetCurrentProcess();
    使用IDA Pro或SoftICE,可知其在ntoskrnl.exe仅是由几条汇编指令实现的:

    mov eax,fs:[00000124]
    mov eax,[eax+00000044] //NT 4.0以下这个值应为[eax+40]
    ret

    这个Native API很有典型性,它的第一条指令取得当前线程的KTEB,而整个API刚好将相对于KTEB始68(即16进制44)字节处取得当前进程的KPEB返回给使用者。你可以使用SoftICE验证一下。

    让我们再来看看其具体是如何实现的:

    //----------------------------------------------------------------------
    //
    // GetProcessNameOffset
    //
    // In an effort to remain version-independent, rather than using a
    // hard-coded into the KPEB (Kernel Process Environment Block), we
    // scan the KPEB looking for the name, which should match that
    // of the GUI process
    //
    //----------------------------------------------------------------------
    ULONG GetProcessNameOffset()
    {
        PEPROCESS curproc;
        int i;
        DbgPrint(("GetProcessNameOffset/n"));
        curproc = PsGetCurrentProcess();

        //
        // Scan for 12KB, hopping the KPEB never grows that big!
        //
        for( i = 0; i < 3*PAGE_SIZE; i++ ) {

            if( !strncmp( SYSNAME, (PCHAR) curproc + i, strlen(SYSNAME) )) {

                return i;
            }
        }

        //
        // Name not found - oh, well
        //
        return 0;
    }

    //----------------------------------------------------------------------
    //
    // GetProcess
    //
    // Uses undocumented data structure offsets to obtain the name of the
    // currently executing process.
    //
    //----------------------------------------------------------------------
    FILTERSTATUS GetProcess( PCHAR Name )
    {
        PEPROCESS curproc;
        char *nameptr;
        ULONG i;

        //
        // We only try and get the name if we located the name offset
        //
        if( ProcessNameOffset ) {

            curproc = PsGetCurrentProcess();
            nameptr = (PCHAR) curproc + ProcessNameOffset;
            strncpy( Name, nameptr, 16 );

        } else {

            strcpy( Name, "???");
        }
        .
        .
        .
    }

    这段代码从Regmon中NT Driver部分摘录,详细可参阅Regsys.c。
    这两函数主要功能是取得进程名称,供程序使用。大家都知道在Driver部分不能简单的调用WIN32 API,而NT执行体提供的NtQuerySystemInformation主要针对所有进程、线程或其他NT内部信息等,所以我们必须寻找其它方法(一般方法是跟踪相应的Win32 API用Debugger对其进行艰苦但充满挑战充满乐趣的逆向工程,然后找出其在NT执行体中的具体实现过程,你也可以使用此方法对本文所提及的进行验证)。

    Regmon中这两个函数通过查找KPEB取得进程名,GetProcessNameOffset主要是调用PsGetCurrentProcess取得KPEB基址,然后搜索KPEB,得到ProcessName相对KPEB的偏移量,存放在全局变量ProcessNameOffset中。在NT/2000 DDK中如下定义PsGetCurrentProcess:
    #define PsGetCurrentProcess() IoGetCurrentProcess()
而IoGetCurrentProcess已经在前面讨论过了。
    作者在3页内存区域(x86中一页为4k)查找,从程序中注释可知他也不知道是否会超出此范围,还有程序段中SYSNAME被定义为system,因为调用Driver中DriverEntry入口正是由system进程调度(GetProcessNameOffset在DriverEntry中调用)。你也可以使用SoftICE查出特定Windows NT/2000版本中ProcessNameOffset的值。在x86平台Windows 2000 Server Build 2195中它为1fch(NT 4.0与3.51中为1dch),然后根据这个值找几个进程核对核对。

    GetProcess将当前进程的KPEB基址加上ProcessNameOffset值取得当前进程(Regmon中即调用操作Registry的Native API进程)的名称。

  至于KPEB/KTEB等的具体结构,各字节的具体含义,由于其所谓的Undocument,我查MSDN,到各新闻组,追踪NT内核,也没找到其中的一小部分,这也是我着手写此篇的用意,希望懂得的高手,朋友能互相交流交流,还有本文有误之处,还望您能指出并与我说说,谢谢!

参考资料:
    1.Regmon 4.22源代码
    2.Windows 2000 DDK Documentation
AXI-5.6 Multiple region interfaces 规则:如果从设备实现的区域少于16个,它必须确保对任何访问未支持区域的尝试都能给出符合协议的响应。具体实现方式由设计者定义。场景:一个错误的软件驱动试图向区域 5(该加密加速器未实现)写入数据。实现方式一:提供错误响应(严格模式)行为:加密加速器检测到AxREGION的值大于2,立即对该事务返回一个DECERR(解码错误)或SLVERR(从设备错误)响应。举例:这类似于你访问一个不存在的网站,服务器返回“404 Not Found”。它明确告知请求者:“你要找的东西不存在”。优点安全、清晰。 阅读详情

相关推荐

从2-RSS-1U并联踝关节到双足机器人动态行走:雅可比矩阵与力矩控制实践

本文深入探讨了2-RSS-1U并联踝关节在双足机器人动态行走中的关键作用,详细解析了其设计原理、雅可比矩阵的应用及力矩控制实践。通过优化几何参数和控制算法,实现了低转动惯量、高刚度和紧凑设计,显著提升了机器人的行走稳定性和能量效率。文章还分享了从仿真到实物的跨越经验及未来优化方向。

weixin_42641998的博客 594

uni - app的 nfc功能使用鱼住未来第三方插件完成

使用 第三方插件,实现小程序 nfc功能

新人一枚,互相学习哦! 2282

lvgl 实现表格table,并且固定表头

嵌入式实现table,lvgl 实现原生表格table组件

m0_61704502的博客 1271

再谈Windows NT/2000环境切换(http://webcrazy.yeah.net)

再谈Windows NT/2000环境切换                           WebCrazy(tsu00@263.net)    线程是Windows NT/2000环境切换的最基本单位。在浅析Windows NT/2000环境切换>>(Nsfocus Magazine 12)一文中,我只对进程CR3切换进行了较详细的讨论,但未涉及线程调度的内容,本文将尽量讲述这些部分内容。在

FreeXploiT 2805

基于VH6501的Busoff测试

摘要: 本文介绍使用VH6501和CANoe工具测试ECU的Busoff Recovery机制。通过干扰报文触发Busoff状态,验证快恢复(连续32次,间隔100ms)和慢恢复(间隔1000ms)的时序及次数是否符合要求。测试步骤包括硬件配置、干扰参数设置及Trace窗口错误帧分析,最终通过错误帧间隔判定恢复机制的正确性。

酒酿丸子的博客 1039

从拆箱到跑通:Intel RealSense D435i开箱实测+ROS驱动配置全流程

本文详细记录了Intel RealSense D435i深度相机的开箱体验,并提供了在Ubuntu 22.04与ROS2 Humble环境下,从安装librealsense2 SDK到配置ROS2驱动的完整流程。重点解决了驱动安装、数据流发布、点云对齐以及IMU数据融合等关键步骤,帮助研究者和开发者快速实现D435i与机器人系统的集成。

weixin_29168393的博客 304

浅析Windows NT/2000环境切换(http://webcrazy.yeah.net)

浅析Windows NT/2000环境切换                  WebCrazy(tsu00@263.net)                       注:本文最初见于www.nsfocus.com    本文假设您已经了解Windows NT/2000系统体系,对Windows NT/2000内部KPEB/KTEB等数据结构与内核工作方式已有一定的概念,对80x86保护模式,I

FreeXploiT 2139

手把手教你学Simulink——基于Simulink的PMSM MTPA + FW 全速域平滑切换策略

本文提出一种基于Simulink的PMSM全速域平滑切换控制策略,通过融合MTPA和弱磁控制(FW)实现基速附近的无冲击过渡。在过渡区采用加权融合电流给定方法,使电流超调<5%、转速波动<2%,全速域效率>90%。文章详细介绍了系统架构、核心算法及Simulink建模步骤,包括融合控制器设计、切换逻辑实现和参数优化。仿真结果表明,该方法相比传统硬切换显著改善了动态性能,并扩展了调速范围。同时提供了可直接复用的工程模板和MATLAB代码,为电机控制工程师提供了实用的全速域控制解决方案。

MHD0815的博客 79

深入Windows NT/2000模块的组织(http://webcrazy.yeah.net)

深入Windows NT/2000模块的组织                    WebCrazy(http://webcrazy.yeah.net/)   在《小议Windows NT/2000分页机制 》中我对x86平台Windows NT/2000的非分页内存内部机制有了较为详细的说明,从中也可以看出地址空间可以分为进程空间与系统空间,其中每个进程有各自的进程空间,而所有的进程则共享同一个

FreeXploiT 1468

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1075

25、量子计算:中性原子与约瑟夫森结量子比特

本文详细探讨了中性原子和约瑟夫森结两种量子比特在量子计算中的应用。中性原子量子比特利用光晶格实现量子态的操控,具有长相干时间的优势,但面临可扩展性和多量子比特操作的挑战;而约瑟夫森结量子比特基于超导技术,结合半导体制造工艺,具有低耗散和潜在的高可扩展性,但在参数控制和环境干扰方面存在难题。文章还比较了这两种方案的性能、应用场景及未来发展趋势,展望了它们在量子计算发展中的潜力与突破方向。

ol789012的博客 212

解析Windows NT/2000窗口对象的组织(http://webcrazy.yeah.net/)

解析Windows NT/2000窗口对象的组织                        WebCrazy(http://webcrazy.yeah.net/)   Microsoft Visual Studio提供的Microsoft Spy对Windows的窗口组织有非常直观的表现,在Windows视图下的Window Properties可以显示窗口的很多内容或属性。本文将从Windo

FreeXploiT 2165

大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)

当一个新的硬件设备被插入系统时,内核会发送一个设备事件通知 udev,udev 会根据设备的属性和规则,为该设备创建一个合适的设备文件。通过去除不必要的驱动程序、禁用不需要的功能、选择合适的内核配置选项、优化内核编译选项和定制内核模块等方法,可以减小内核的大小和复杂性,提高系统的性能和稳定性。上半部通常是在中断关闭的情况下执行的,以确保中断处理的原子性。处理碎片化内存是内存管理中的一个重要问题,可以采用内存压缩、内存池管理、伙伴系统、首次适应算法和最佳适应算法等方法来减少内存碎片的产生,提高内存的利用率。

大模型大数据攻城狮的专栏 2927

小议Windows NT/2000分页机制(http://webcrazy.yeah.net)

 小议Windows NT/2000分页机制                     WebCrazy(tsu00@263.net)    内存管理是操作系统最重要的一部分,其决定了操作系统的性能。Intel X86采用分段、分页的内存机制,Windows NT/2000充分利用了此项先进的机制。段内IA-32体系使用页目录(Page Directory)与页表(Page Table,SoftIC

FreeXploiT 1966

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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...

Windows 2000 System Services列表(http://webcrazy.yeah.net)

Windows 2000 System Services列表              WebCrazy(tsu00@263.net)    Windows 2000 Server Build 2195 SP0 中文版共从ntoskrnl.exe(x86单处理器版本)中导出248个System Services,而从win2k.sys中导出639个System Services。SoftICE f

FreeXploiT 5136

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

浅谈Windows 2000/XP File Cache实现(http://webcrazy.yeah.net)

  浅谈Windows 2000/XP File Cache实现              WebCrazy(http://webcrazy.yeah.net)    声明:本文所叙内容为Windows NT/2000/XP的Cache管理内容,涉及内容均为Microsoft Undocumented内容。我在参考大量资料后分析而成,牵涉内容多多少少可能会有些许错误,甚至根本就是错误的,但本着学习

FreeXploiT 2380

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Windows XP System Services(http://webcrazy.yeah.net)

 Windows XP System Services              WebCrazy(http://webcrazy.yeah.net)    在《再谈Windows NT/2000内部数据结构》一文中我曾经介绍过Windows 2000 System Call。如今Windows XP正式版已经出来了。从总的System Call的组织上看是没有多大的改变。System Call调

FreeXploiT 6510

Windows 2000内核KPEB/KTEB详细结构(http://webcrazy.yeah.net/)

Windows 2000内核KPEB/KTEB详细结构            WebCrazy(http://webcrazy.yeah.net/)    EPROCESS与ETHREAD结构在Windows NT/2000内核的地位是不言而喻的。他们结构中的成员包含了内核的方方面面,是两个比较大的结构。在Windows 2000 Server Build 2195 Free Ke

FreeXploiT 2134

Windows NT/2000内部数据结构探究(http://webcrazy.yeah.net)

 Windows NT/2000内部数据结构探究                    WebCrazy(tsu00@263.net)                         注:本文最初见于www.nsfocus.com    WINDOWS系统隐含了不少内部数据结构,其记录着与系统相关的所有重要信息如线程、进程、内核调用等等,具体如Windows NT/2000模块ntoskrnl.e

FreeXploiT 1399

剖析Windows NT/2000内核对象组织(http://webcrazy.yeah.net)

剖析Windows NT/2000内核对象组织                     WebCrazy(http://webcrazy.yeah.net/)    对象管理器在Windows NT/2000内核中占了极其重要的位置,其一个最主要职能是组织管理系统内核对象。在Windows NT/2000中,内核对象管理器大量引入了C++面向对象的思想,即所有内核对象都封装在对象管理器内部,除对象

FreeXploiT 1671

分析Windows NT/2000堆内存与虚拟内存组织(http://webcrazy.yeah.net)

 分析Windows NT/2000堆内存与虚拟内存组织                      WebCrazy(http://webcrazy.yeah.net/)    在讨论今天这个主题时,我觉得是应该给大家重复推介以下两本书:    Matt Pietrek        >    Jeffrey Richter        >    两者分别从核心态与用户态出发全面阐述了Windo

FreeXploiT 1673

Windows NT/2000/XP下不用驱动的Ring0代码实现(http://webcrazy.yeah.net)

 Windows NT/2000/XP下不用驱动的Ring0代码实现                  WebCrazy(http://webcrazy.yeah.net/)     大家知道,Windows NT/2000为实现其可靠性,严格将系统划分为内核模式与用户模式,在i386系统中分别对应CPU的Ring0与Ring3级别。Ring0下,可以执行特权级指令,对任何I/O设备都有访问权等等

FreeXploiT 1614

解读Windows 2000/XP分层驱动模型(http://webcrazy.yeah.net)

 解读Windows 2000/XP分层驱动模型            WebCrazy(http://webcrazy.yeah.net)    可扩展性是Windows NT/2000/XP设计的目标之一,其分层驱动模型是可扩展性的最好体现。实现分层依赖于IO管理器的两个重要的设计:1、Windows中的任何一个驱动程序都被设计成Client/Server模式。对于客户端驱动,通过IoGetD

FreeXploiT 2544

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 176

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 672

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

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

emfuture的博客 375
上一篇: Windows NT/2000内部数据结构探究(http://webcrazy.yeah.net)
下一篇: Windows 2000 System Services列表(http://webcrazy.yeah.net)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值