ExpTimerApcRoutine函数分析之作用是ActiveTimerListHead里面移除定时器_etimer

news2025/4/1 13:19:39


第一部分:
VOID
ExpTimerApcRoutine (
    IN PKAPC Apc,
    IN PKNORMAL_ROUTINE *NormalRoutine,
    IN PVOID *NormalContext,
    IN PVOID *SystemArgument1,
    IN PVOID *SystemArgument2
    )

/*++

Routine Description:

    This function is the special APC routine that is called to remove
    a timer from the current thread's active timer list.

Arguments:

    Apc - Supplies a pointer to the APC object used to invoke this routine.

    NormalRoutine - Supplies a pointer to a pointer to the normal routine
        function that was specified when the APC was initialized.

    NormalContext - Supplies a pointer to a pointer to an arbitrary data
        structure that was specified when the APC was initialized.

    SystemArgument1, SystemArgument2 - Supplies a set of two pointers to
        two arguments that contain untyped data.

Return Value:

    None.

--*/

{

    PETHREAD ExThread;
    PETIMER ExTimer;
    KIRQL OldIrql1;
    ULONG DerefCount;

    UNREFERENCED_PARAMETER (NormalContext);
    UNREFERENCED_PARAMETER (SystemArgument1);
    UNREFERENCED_PARAMETER (SystemArgument2);

    //
    // Get address of executive timer object and the current thread object.
    //

    ExThread = PsGetCurrentThread();
    ExTimer = CONTAINING_RECORD(Apc, ETIMER, TimerApc);

    //
    // If the timer is still in the current thread's active timer list, then
    // remove it if it is not a periodic timer and set APC associated FALSE.
    // It is possible for the timer not to be in the current thread's active
    // timer list since the APC could have been delivered, and then another
    // thread could have set the timer again with another APC. This would
    // have caused the timer to be removed from the current thread's active
    // timer list.
    //
    // N. B. The spin locks for the timer and the active timer list must be
    //  acquired in the order: 1) timer lock, 2) thread list lock.
    //

    DerefCount = 1;
    ExAcquireSpinLock(&ExTimer->Lock, &OldIrql1);
    ExAcquireSpinLockAtDpcLevel(&ExThread->ActiveTimerListLock);
    if ((ExTimer->ApcAssociated) && (&ExThread->Tcb == ExTimer->TimerApc.Thread)) {
        if (ExTimer->Period == 0) {
            RemoveEntryList(&ExTimer->ActiveTimerListEntry);
            ExTimer->ApcAssociated = FALSE;
            DerefCount++;
        }

    } else {
        *NormalRoutine = (PKNORMAL_ROUTINE)NULL;
    }

    ExReleaseSpinLockFromDpcLevel(&ExThread->ActiveTimerListLock);
    ExReleaseSpinLock(&ExTimer->Lock, OldIrql1);

    ObDereferenceObjectEx(ExTimer, DerefCount);

    return;
}


1: kd> dv
            Apc = 0x893b13b0
  NormalRoutine = 0xba30ed48
  NormalContext = 0xba30ed3c
SystemArgument1 = 0xba30ed40
SystemArgument2 = 0xba30ed44
       OldIrql1 = 0x89 ''
     DerefCount = 0x3d


1: kd> dt kapc 893b13b0
CSRSRV!KAPC
   +0x000 Type             : 0n18
   +0x002 Size             : 0n48
   +0x004 Spare0           : 0x220
   +0x008 Thread           : 0x896d9da0 _KTHREAD
   +0x00c ApcListEntry     : _LIST_ENTRY [ 0x896d9ddc - 0x896d9ddc ]
   +0x014 KernelRoutine    : 0x80af2e9a     void  nt!ExpTimerApcRoutine+0
   +0x018 RundownRoutine   : (null)
   +0x01c NormalRoutine    : 0x7340a79a     void  +7340a79a
   +0x020 NormalContext    : (null)
   +0x024 SystemArgument1  : 0x3218d5d4 Void
   +0x028 SystemArgument2  : 0x01db94bc Void
   +0x02c ApcStateIndex    : 0 ''
   +0x02d ApcMode          : 1 ''
   +0x02e Inserted         : 0x1 ''


    ExTimer = CONTAINING_RECORD(Apc, ETIMER, TimerApc);


//
// Executive timer object structure definition.
//

typedef struct _ETIMER {
    KTIMER KeTimer;
    KAPC TimerApc;
    KDPC TimerDpc;
    LIST_ENTRY ActiveTimerListEntry;
    KSPIN_LOCK Lock;
    LONG Period;
    BOOLEAN ApcAssociated;
    BOOLEAN WakeTimer;
    LIST_ENTRY WakeTimerListEntry;
} ETIMER, *PETIMER;

1: kd> dt _etimer 893b13b0-28
nt!_ETIMER
   +0x000 KeTimer          : _KTIMER
   +0x028 TimerApc         : _KAPC
   +0x058 TimerDpc         : _KDPC
   +0x078 ActiveTimerListEntry : _LIST_ENTRY [ 0x896d9f8c - 0x896d9f8c ]
   +0x080 Lock             : 0
   +0x084 Period           : 0n0
   +0x088 ApcAssociated    : 0x1 ''
   +0x089 WakeTimer        : 0 ''
   +0x08c WakeTimerListEntry : _LIST_ENTRY [ 0x0 - 0x5000000 ]
1: kd> dx -id 0,0,89601250 -r1 (*((ntkrnlmp!_KAPC *)0x893b13b0))
(*((ntkrnlmp!_KAPC *)0x893b13b0))                 [Type: _KAPC]
    [+0x000] Type             : 18 [Type: short]
    [+0x002] Size             : 48 [Type: short]
    [+0x004] Spare0           : 0x220 [Type: unsigned long]
    [+0x008] Thread           : 0x896d9da0 [Type: _KTHREAD *]
    [+0x00c] ApcListEntry     [Type: _LIST_ENTRY]
    [+0x014] KernelRoutine    : 0x80af2e9a [Type: void (*)(_KAPC *,void (**)(void *,void *,void *),void * *,void * *,void * *)]
    [+0x018] RundownRoutine   : 0x0 [Type: void (*)(_KAPC *)]
    [+0x01c] NormalRoutine    : 0x7340a79a [Type: void (*)(void *,void *,void *)]
    [+0x020] NormalContext    : 0x0 [Type: void *]
    [+0x024] SystemArgument1  : 0x3218d5d4 [Type: void *]
    [+0x028] SystemArgument2  : 0x1db94bc [Type: void *]
    [+0x02c] ApcStateIndex    : 0 [Type: char]
    [+0x02d] ApcMode          : 1 [Type: char]
    [+0x02e] Inserted         : 0x0 [Type: unsigned char]
1: kd> dx -id 0,0,89601250 -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x893b1400))
(*((ntkrnlmp!_LIST_ENTRY *)0x893b1400))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x896d9f8c [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x896d9f8c [Type: _LIST_ENTRY *]

0x896d9f8c-0x896d9da0=0x1ec


第二部分:    ExAcquireSpinLockAtDpcLevel(&ExThread->ActiveTimerListLock);之后

ExAcquireSpinLockAtDpcLevel(&ExThread->ActiveTimerListLock);之前
1: kd> dt eTHREAD 896d9da0
ntdll!ETHREAD
   +0x000 Tcb              : _KTHREAD
   +0x1c8 CreateTime       : _LARGE_INTEGER 0x0edca5e1`45f8e6e0
   +0x1c8 NestedFaultCount : 0y00
   +0x1c8 ApcNeeded        : 0y0
   +0x1d0 ExitTime         : _LARGE_INTEGER 0x896d9f70`896d9f70
   +0x1d0 LpcReplyChain    : _LIST_ENTRY [ 0x896d9f70 - 0x896d9f70 ]
   +0x1d0 KeyedWaitChain   : _LIST_ENTRY [ 0x896d9f70 - 0x896d9f70 ]
   +0x1d8 ExitStatus       : 0n0
   +0x1d8 OfsChain         : (null)
   +0x1dc PostBlockList    : _LIST_ENTRY [ 0x896d9f7c - 0x896d9f7c ]
   +0x1e4 TerminationPort  : 0xe15ae778 _TERMINATION_PORT
   +0x1e4 ReaperLink       : 0xe15ae778 _ETHREAD
   +0x1e4 KeyedWaitValue   : 0xe15ae778 Void
   +0x1e8 ActiveTimerListLock : 0
   +0x1ec ActiveTimerListHead : _LIST_ENTRY [ 0x893b1400 - 0x893b1400 ]

ExAcquireSpinLockAtDpcLevel(&ExThread->ActiveTimerListLock);之后

1: kd> dt eTHREAD 896d9da0
ntdll!ETHREAD
   +0x000 Tcb              : _KTHREAD
 
   +0x1e8 ActiveTimerListLock : 0x896d9da1

第三部分:RemoveEntryList(&ExTimer->ActiveTimerListEntry);之后


RemoveEntryList(&ExTimer->ActiveTimerListEntry);之前

1: kd> dt eTHREAD 896d9da0
ntdll!ETHREAD
   +0x000 Tcb              : _KTHREAD
   +0x1c8 CreateTime       : _LARGE_INTEGER 0x0edca5e1`45f8e6e0
   +0x1c8 NestedFaultCount : 0y00
   +0x1c8 ApcNeeded        : 0y0
   +0x1d0 ExitTime         : _LARGE_INTEGER 0x896d9f70`896d9f70
   +0x1d0 LpcReplyChain    : _LIST_ENTRY [ 0x896d9f70 - 0x896d9f70 ]
   +0x1d0 KeyedWaitChain   : _LIST_ENTRY [ 0x896d9f70 - 0x896d9f70 ]
   +0x1d8 ExitStatus       : 0n0
   +0x1d8 OfsChain         : (null)
   +0x1dc PostBlockList    : _LIST_ENTRY [ 0x896d9f7c - 0x896d9f7c ]
   +0x1e4 TerminationPort  : 0xe15ae778 _TERMINATION_PORT
   +0x1e4 ReaperLink       : 0xe15ae778 _ETHREAD
   +0x1e4 KeyedWaitValue   : 0xe15ae778 Void
   +0x1e8 ActiveTimerListLock : 0
   +0x1ec ActiveTimerListHead : _LIST_ENTRY [ 0x893b1400 - 0x893b1400 ]

1: kd> dx -id 0,0,89601250 -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x893b1400))
(*((ntkrnlmp!_LIST_ENTRY *)0x893b1400))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x896d9f8c [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x896d9f8c [Type: _LIST_ENTRY *]


RemoveEntryList(&ExTimer->ActiveTimerListEntry);之后

1: kd> dt eTHREAD 896d9da0
ntdll!ETHREAD
   +0x000 Tcb              : _KTHREAD

   +0x1e8 ActiveTimerListLock : 0x896d9da1
   +0x1ec ActiveTimerListHead : _LIST_ENTRY [ 0x896d9f8c - 0x896d9f8c ]


1: kd> dx -id 0,0,89601250 -r1 (*((ntdll!_LIST_ENTRY *)0x896d9f8c))
(*((ntdll!_LIST_ENTRY *)0x896d9f8c))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x896d9f8c [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0x896d9f8c [Type: _LIST_ENTRY *]

第四部分:    ExReleaseSpinLockFromDpcLevel(&ExThread->ActiveTimerListLock);之后
1: kd> dt eTHREAD 896d9da0
ntdll!ETHREAD
   +0x000 Tcb              : _KTHREAD

   +0x1e8 ActiveTimerListLock : 0

第五部分:      ExReleaseSpinLock(&ExTimer->Lock, OldIrql1);之后
1: kd> dt _etimer 893b13b0-28
nt!_ETIMER
   +0x000 KeTimer          : _KTIMER
   +0x028 TimerApc         : _KAPC
   +0x058 TimerDpc         : _KDPC
   +0x078 ActiveTimerListEntry : _LIST_ENTRY [ 0x896d9f8c - 0x896d9f8c ]
   +0x080 Lock             : 0x896d9da1
   +0x084 Period           : 0n0
   +0x088 ApcAssociated    : 0 ''
   +0x089 WakeTimer        : 0 ''
   +0x08c WakeTimerListEntry : _LIST_ENTRY [ 0x0 - 0x5000000 ]

    ExReleaseSpinLock(&ExTimer->Lock, OldIrql1);之后

1: kd> dt _etimer 893b13b0-28
nt!_ETIMER
   +0x000 KeTimer          : _KTIMER
   +0x028 TimerApc         : _KAPC
   +0x058 TimerDpc         : _KDPC
   +0x078 ActiveTimerListEntry : _LIST_ENTRY [ 0x896d9f8c - 0x896d9f8c ]
   +0x080 Lock             : 0
   +0x084 Period           : 0n0
   +0x088 ApcAssociated    : 0 ''
   +0x089 WakeTimer        : 0 ''
   +0x08c WakeTimerListEntry : _LIST_ENTRY [ 0x0 - 0x5000000 ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2324394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ovito的python脚本

在 OVITO 里,Python 对象是构建脚本化操作的基础。下面为你详细介绍 OVITO 中 Python 对象的基本概念: 1. 数据管道(Pipeline) 数据管道是 OVITO 里最核心的对象之一。它就像一个流水线,把数据输入进来,经过一系列处理步骤,最后输出处理好的数据。 创建管道:借助 imp…

【免费】2007-2019年各省地方财政文化体育与传媒支出数据

2007-2019年各省地方财政文化体育与传媒支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政文化体育与传媒支出 4、范围:31省 5、指标说明:地方财政在文化、…

NOIP2007提高组.矩阵取数游戏

题目 492. 矩阵取数游戏 思路 不难发现, 每一行之间是独立的, 因此可以求出每一行的最大值, 然后行与行之间最大值相加, 就是总的最大值 对于行内来说, 每次可以选取左边或者右边, 可以使用区间 d p dp dp求解, 时间复杂度 O ( n 3 ) O(n ^ 3) O(n3), 因为列的最大值是 80 …

项目实战--权限列表

后端数据: 用表格实现权限列表 const dataSource [{key: 1,name: 胡彦斌,age: 32,address: 西湖区湖底公园1号,},{key: 2,name: 胡彦祖,age: 42,address: 西湖区湖底公园1号,}, ];const columns [{title: 姓名,dataIndex: name,key: name,},{title: 年龄,dataInd…

若依赖前端处理后端返回的错误状态码

【背景】 后端新增加了一个过滤器,用来处理前端请求中的session 若依赖存放过滤器的目录:RuoYi-Vue\ruoyi-framework\src\main\java\com\ruoyi\framework\security\filter\ 【问题】 后端返回了一个状态码为403的错误,现在前端需要处理这…

【计网】数据包

期末复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 1.数据包的定义: 数据包是网络通信中的基本单元,它包含了通过网络传输的所有必要信息。数据包的结构…

web权限划分提权和移权

前言:权限的基本认知 渗透权限划分:假如我们通过弱口令进入到web的后台 这样我们就拿到了web的管理员权限 管理员权限是web中最高的权限(一般我们进入web的时候数据库会进行用户权限的划分:假设 0-10为最高的权限 11-10000为普通…

LocalDateTime序列化总结

版权说明: 本文由CSDN博主keep丶原创,转载请保留此块内容在文首。 原文地址: https://blog.csdn.net/qq_38688267/article/details/146703276 文章目录 1.背景2.序列化介绍常见场景关键问题 3.总体方案4.各场景实现方式WEB接口EasyExcelMybat…

[ 春秋云境 ] Initial 仿真场景

文章目录 靶标介绍:外网内网信呼oa永恒之蓝hash传递 靶标介绍: Initial是一套难度为简单的靶场环境,完成该挑战可以帮助玩家初步认识内网渗透的简单流程。该靶场只有一个flag,各部分位于不同的机器上。 外网 打开给的网址, 有一…

unity 截图并且展现在UI中

using UnityEngine; using UnityEngine.UI; using System.IO; using System.Collections.Generic; using System; using System.Collections;public class ScreenshotManager : MonoBehaviour {[Header("UI 设置")]public RawImage latestScreenshotDisplay; // 显示…

中断管理常用API(四)

一、request_irq(...) request_irq 函数主要用于硬中断相关操作,它的核心作用是把一个中断处理函数和特定的中断号进行绑定。当硬件设备触发该中断号对应的中断时,内核就会调用绑定的中断处理函数,像 irqhandler_func 这类。 此函数在多种硬件…

pyspark学习rdd处理数据方法——学习记录

python黑马程序员 """ 文件,按JSON字符串存储 1. 城市按销售额排名 2. 全部城市有哪些商品类别在售卖 3. 上海市有哪些商品类别在售卖 """ from pyspark import SparkConf, SparkContext import os import jsonos.environ[PYSPARK_P…

【HTML 基础教程】HTML <head>

HTML <head> 查看在线实例 - 定义了HTML文档的标题"><title> - 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 - 定义了所有链接的URL"><base> - 定义了所有链接的URL 使用 <base> 定义页面中所有链接默认的链接目…

混合知识表示系统框架python示例

前文我们已经深入学习了框架表示法、产生式规则和一阶谓词逻辑,并对它们进行了深度对比,发现它们在不同的应用场景下各有优缺点。 一阶谓词逻辑适合复杂逻辑推理场景,具有数学定理证明、形式化系统规范的优点;产生式规则适合动态决策系统,支持实时决策(如风控、诊断),规…

MATLAB 控制系统设计与仿真 - 30

用极点配置设计伺服系统 方法2-反馈修正 如果我们想只用前馈校正输入&#xff0c;从而达到伺服控制的效果&#xff0c;我们需要很精确的知道系统的参数模型&#xff0c;否则系统输出仍然具有较大的静态误差。 但是如果我们在误差比较器和系统的前馈通道之间插入一个积分器&a…

Baklib知识中台驱动智能架构升级

构建四库体系驱动架构升级 在数字化转型过程中&#xff0c;企业普遍面临知识资源分散、隐性经验难以沉淀的痛点。Baklib通过构建知识库、案例库、流程库及资源库四层核心体系&#xff0c;为知识中台搭建起结构化基础框架。知识库以AI分类引擎实现文档标签化存储&#xff0c;案…

IP第一次笔记

一、TCP协议 第0步&#xff1a;如果浏览器和host文件存在域名对应的P地址记录关系 则直接封装HTTP数据报文&#xff0c;如果没有记录则触发DNS解析获 取目标域名对应的P地址 第一步&#xff1a;终端主机想服务器发起TCP三次握手 1.TCP的三次握手 2.传输网页数据 HTTP --应用层…

vue3实现router路由

说明&#xff1a; vue3实现router路由 效果图&#xff1a; step1:项目结构 src/ ├── views/ │ ├── Home.vue │ └── User.vue ├── router/ │ └── index.js ├── App.vue └── main.jsstep2:左边路由列表C:\Users\wangrusheng\PycharmProjects\un…

1500 字节 MTU | 溯源 / 技术权衡 / 应用影响

注&#xff1a;本文为 “MTU 字节” 相关文章合辑。 机翻&#xff0c;未校。 讨论部分&#xff0c;以提交人为分界。 单行只有阿拉伯数字的&#xff0c;为引文转译时对回复的点赞数。 How 1500 bytes became the MTU of the internet 1500 字节是如何成为互联网 MTU 的 Fe…

智能仪表板DevExpress Dashboard v24.2新版亮点:支持.NET 9

使用DevExpress BI Dashboard&#xff0c;再选择合适的UI元素&#xff08;图表、数据透视表、数据卡、计量器、地图和网格&#xff09;&#xff0c;删除相应参数、值和序列的数据字段&#xff0c;就可以轻松地为执行主管和商业用户创建有洞察力、信息丰富的、跨平台和设备的决策…