PsConvertToGuiThread函数调用前传

PsConvertToGuiThread函数调用前传

第一部分:位置

ch@chenghaodeiMac base % grep "Kss_ErrorHandler" -nr ./

.//ntos/ke/i386/trap.asm:1026:Kss_ErrorHandler:

.//ntos/ke/i386/trap.asm:1220:        jae     Kss_ErrorHandler        ; if ae, try to convert to GUI thread

第二部分:

指定的系统服务号不在范围内。尝试转换为一个GUI线程。如果指定的系统服务不是基本服务,线程尚未转换为

GUI线程。

;

; The specified system service number is not within range. Attempt to

; convert the thread to a GUI thread if the specified system service is

; not a base service and the thread has not already been converted to a

; GUI thread.

;

Kss_ErrorHandler:

        cmp     ecx, SERVICE_TABLE_TEST ; test if GUI service

        jne     short Kss_LimitError    ; if ne, not GUI service

        push    edx                     ; save argument registers

        push    ebx                     ;

        stdcall _PsConvertToGuiThread   ; attempt to convert to GUI thread

        or      eax, eax                ; check if service was successful

        pop     eax                     ; restore argument registers

        pop     edx                     ;

        mov     ebp, esp                ; reset trap frame address

        mov     [esi]+ThTrapFrame, ebp  ; save address of trap frame

        jz      _KiSystemServiceRepeat  ; if eq, successful conversion

;

; The conversion to a GUI thread failed. The correct return value is encoded

; in a byte table indexed by the service number that is at the end of the

; service address table. The encoding is as follows:

;

;     0 - return 0.

;    -1 - return -1.

;     1 - return status code.

;

        lea     edx, _KeServiceDescriptorTableShadow + SERVICE_TABLE_TEST ;

        mov     ecx, [edx]+SdLimit      ; get service number limit

        mov     edx, [edx]+SdBase       ; get service table base

        lea     edx, [edx][ecx*4]       ; get ending service table address

        and     eax, SERVICE_NUMBER_MASK ; isolate service number

        add     edx, eax                ; compute return value address

        movsx   eax, byte ptr [edx]     ; get status byte

        or      eax, eax                ; check for 0 or -1

        jle     Kss70                   ; if le, return value set

Kss_LimitError:                         ;

        mov     eax, STATUS_INVALID_SYSTEM_SERVICE ; set return status

        jmp     kss70                   ;

ifndef NT_UP

        ENTER_DR_ASSIST kfce_a, kfce_t,NoAbiosAssist,NoV86Assist

endif

        ENTER_DR_ASSIST kss_a, kss_t,NoAbiosAssist,NoV86Assist

;

; Fast System Call entry point

;

;   At entry:

;   EAX = service number

;   EDX = Pointer to caller's arguments

;   ECX = unused

;   ESP = DPC stack for this processor

;

; Create a stack frame like a call to inner privilege then continue

; in KiSystemService.

;

;

; Normal entry is at KiFastCallEntry, not KiFastCallEntry2.   Entry

; is via KiFastCallEntry2 if a double fault (trap08) occured and EIP

; was KiFastCallEntry.  This happens if a single step exception occurs

; on the instruction following SYSENTER instruction because there is

; no kernel stack fot the debug exception (trap01) to run on.

;

; This is NOT a performance path.

        PUBLIC _KiFastCallEntry2

_KiFastCallEntry2:

ifndef NT_UP

        mov     ecx, KGDT_R0_PCR

else

        mov     ecx, KGDT_R3_TEB OR RPL_MASK

endif

        mov     fs, ecx

        mov     ecx, PCR[PcPrcbData+PbCurrentThread] ; get current thread address

;

; Calculate initial stack pointer from thread initial stack.

; If this isn't the same as esp0 then we are a VX86 thread and we are rejected

;

        mov     ecx, [ecx].ThInitialStack

        lea     esp, [ecx-(NPX_FRAME_LENGTH + (TsV86Gs - TsHardwareSegSS))]

        mov     ecx, PCR[PcTss]

        cmp     esp, [ecx].TssEsp0

        jne     Kfsc90

        ; adjust return address in user mode to renable EFLAGS TF so

        ; single step is turned back on.

        mov     ecx, MM_SHARED_USER_DATA_VA+UsSystemCall+fscrOffset+1

        jmp     short Kfsc10

        align 16

        PUBLIC _KiFastCallEntry

_KiFastCallEntry        proc

;

;       Return to the instruction immediately following the sysenter

;       instruction which is at a known location in the shared user

;       data structure (this is so we can dynamically place the right

;       code for the processor at system init).

;

ifndef NT_UP

        mov     ecx, KGDT_R0_PCR

        mov     fs, ecx

endif ;; NT_UP

        mov     ecx, PCR[PcPrcbData+PbCurrentThread] ; get current thread address

;

; Calculate initial stack pointer from thread initial stack.

; If this isn't the same as esp0 then we are a VX86 thread and we are rejected

;

        mov     ecx, [ecx].ThInitialStack

        lea     esp, [ecx-(NPX_FRAME_LENGTH + (TsV86Gs - TsHardwareSegSS))]

        mov     ecx, PCR[PcTss]

        cmp     esp, [ecx].TssEsp0

        jne     Kfsc90

;

;       Set ecx to return address in user mode

;

        mov     ecx, MM_SHARED_USER_DATA_VA+UsSystemCall+fscrOffset

Kfsc10:

        push    KGDT_R3_DATA  OR RPL_MASK   ; Push user SS

        push    edx                         ; Push ESP

        pushfd

        push    2                           ; Sanitize eflags

        popfd                               ;

        add     edx, 8                      ; (edx) -> arguments

        or      dword ptr [esp], EFLAGS_INTERRUPT_MASK ; Enable interrupts

        push    KGDT_R3_CODE OR RPL_MASK    ; Push user CS

        push    ecx                         ; push return address

ifndef NT_UP

        ; For the MP case, FS is already loaded above

        ENTER_SYSCALL   kfce_a, kfce_t, NoFSLoad

        jmp     _KiSystemServiceRepeat

endif ;; NT_UP

_KiFastCallEntry endp

;

; General System service entrypoint

;

        PUBLIC  _KiSystemService

_KiSystemService        proc

        ENTER_SYSCALL   kss_a, kss_t    ; set up trap frame and save state

?FpoValue = 0

;

; (eax) = Service number

; (edx) = Callers stack pointer

; (esi) = Current thread address

;

; All other registers have been saved and are free.

;

; Check if the service number within valid range

;

_KiSystemServiceRepeat:

        mov     edi, eax                ; copy system service number

        shr     edi, SERVICE_TABLE_SHIFT ; isolate service table number

        and     edi, SERVICE_TABLE_MASK ;

        mov     ecx, edi                ; save service table number

        add     edi, [esi]+ThServiceTable ; compute service descriptor address

        mov     ebx, eax                ; save system service number

        and     eax, SERVICE_NUMBER_MASK ; isolate service table offset

;

; If the specified system service number is not within range, then attempt

; to convert the thread to a GUI thread and retry the service dispatch.

;

        cmp     eax, [edi]+SdLimit      ; check if valid service

        jae     Kss_ErrorHandler        ; if ae, try to convert to GUI thread

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

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

相关文章

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…

FPGA实现多功能SDI视频采集卡,基于GTX+RIFFA架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Bloc…

C#面:ASP.NET MVC 中还有哪些注释属性用来验证?

在 ASP.NET MVC 中,除了常见的数据注解属性(如Required、StringLength等),还有一些其他的注解属性用来验证数据。以下是一些常用的注解属性: Range:用于验证数字类型的属性值是否在指定的范围内。 [Range(…

中文乱码解决方案

解决程序中的中文乱码问题通常涉及到几个关键点:字符编码的设置、环境变量的配置以及程序内部处理方式。这里提供一些常见的解决方案: 1. 设置正确的输入输出流编码 如果你的应用程序是在读取或写入文件时出现乱码,确保设置了正确的文件编码…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器) 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时(1分钟间隔)的路口的各向通行状况、红绿灯及溢出情况。 优势: 投入少,效果好,无需安装设备; 缺陷: 时间间隔…

人工智能在网络安全领域的应用探索

随着网络技术的飞速发展,网络安全问题日益凸显,成为制约数字化进程的重要瓶颈。人工智能(AI)作为一种变革性技术,正逐步在网络安全领域展现出其巨大的潜力和价值。本文旨在探讨人工智能在网络安全领域的应用现状、优势…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有: 一台装有Windows系统的宿主机,在该宿主机上装有Ubuntu 20.04虚拟系统; 瑞芯微RK3588开发板,开发板上的系统为Ubuntu22.04系统; 更新板子的 rknn_server 和 librknnrt.so,rknn_server 和…

单HTML文件集成Vue2+axios的使用

1、下载vue2.js和axios.js到本地 2、建一个HTML文件&#xff0c;内容如下&#xff1a; <html> <head><meta charset"UTF-8"><script src"./js/vue2.js"></script><script src"./js/axios.js"></script&…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

Array常用的函数

在JavaScript中&#xff0c;Array 对象提供了许多实用的方法来操作数组。以下是常用的几个函数及其简要说明&#xff1a; 1. Array.prototype.forEach forEach 用于遍历数组中的每个元素&#xff0c;并执行一个提供的函数。 语法 array.forEach(callback(currentValue[, in…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标(0,0)点为中心绘制一把扇子;扇面和扇把都是三分之一圆,扇面的半径 为 100 左右,扇把的半径为 20 左右。 编程实现 每次点击绿旗后,舞台背景为白色,…

【自动驾驶】控制算法(六)前馈控制与航向误差

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

vue按钮弹框

在Vue中实现按钮点击后弹出对话框&#xff08;弹框&#xff09;的功能&#xff0c;通常可以使用一些Vue的UI组件库&#xff0c;如Element UI、Vuetify、BootstrapVue等&#xff0c;这些库提供了丰富的组件&#xff0c;包括对话框&#xff08;Dialog&#xff09;、模态框&#x…

如何使用Gogs搭建自己的git服务器

最近偶然发现一款轻量级的git服务器&#xff0c;以前一直用的svn server&#xff0c;最近想搞个git服务器&#xff0c; 用gitlab资源占用太多了&#xff0c;gogs是一款轻量级git服务器&#xff0c;非常适合个人使用。 项目地址&#xff1a;GitHub - gogs/gogs: Gogs is a painl…

(十八)Flink CEP 详解

目录 Flink CEP 引用 模式 API 单个模式 组合模式 模式组 匹配后跳过策略 检测模式 从模式中选取 CEP 库中的时间 实用案例 Flink CEP 是在 Flink 上层实现的复杂事件处理库。它可以让你在无限事件流中检测出特定的事件模型,有机会掌握数据中重要的部分。Flink CEP …

图书项目要点

一、搭建项目 使用tarojs/cli进行搭建 taro init [项目名] 二、具体页面 页面声明&#xff1a; 在【app.config.ts】中对主页面进行声明&#xff1a;组件页面可以不用声明 pages: ["pages/index/index",pages/user/index,pages/book/index,], tabbar制作&…

三种tcp并发服务器实现程序

都需先进行tcp连接 1、多进程并发 2、多线程并发 3、IO多路复用并发 &#xff08;1&#xff09;select &#xff08;2&#xff09;epoll 注&#xff1a;select与epoll文件描述符限制的区别是指同时涌入的客户端数量&#xff0c;select最大只能有1024个&#xff0c;epoll可以超…

MSR810配置本地认证的有线802.1X认证

正文共&#xff1a;1567 字 15 图&#xff0c;预估阅读时间&#xff1a;2 分钟 IEEE 802.1X协议又称DOT1X协议&#xff0c;是一种基于端口的网络接入控制协议&#xff08;Port based network access control protocol&#xff09;&#xff0c;即在局域网接入设备的端口上对所接…

RabbitMQ 常见问题与故障排查

目录 前言 常见错误与解决方案 1. 连接失败 2. 队列阻塞 3. 消息丢失 4. 消费者不消费 5. 资源耗尽 日志分析 1. 配置 RabbitMQ 日志 2.日志文件位置 3. 日志分析工具 4. 分析日志文件 5. 常见日志问题及解决方案 Docker中日志分析 1. 查看 RabbitMQ 日志 2. 获…