当前位置: 首页 > news >正文

osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标

第一部分:
VOID
DoGlobalInitialization(
IN PBOOT_CONTEXT BootContextRecord
)

{


//
// Turn the cursor off
//

    HW_CURSOR(0,127);

D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR           (*ExternalServicesTable->HardwareCursor)


第二部分:

一、中断显示服务—INT 10H

功能号:

00H —设置显示器模式
01H —设置光标形状
02H —设置光标位置
03H —读取光标信息
04H —读取光笔位置
05H —设置显示页
06H、07H —初始化或滚屏
08H —读光标处的字符及其属性
09H —在光标处按指定属性显示字符
0AH —在当前光标处显示字符
0BH —设置调色板、背景色或边框
0CH —写图形象素
0DH —读图形象素
0EH —在Teletype模式下显示字符
0FH —读取显示器模式
10H —颜色
11H —字体
12H —显示器的配置
13H —在终端模式下显示字符串
1AH —读取/设置显示组合编码
1BH —读取功能/状态信息
1CH —保存/恢复显示器状态


int 10h中断例程的在光标位置显示字符功能:

mov ah,9 ;在光标位置显示字符
mov al,'a' ;字符
mov bl,7 ;颜色属性
mov bh,0 ;第0页
mov cx,3 ;字符重复个数
int 10h

(ah)=9表示调用的第10h号的中断例程的9号子程序,功能为在光标位置显示字符,可以提供要显示的字符,颜色属性,页号字符重复个数作为参数

一般调用中断例程的某号子程序,存储在ah中


第三部分:

3、 功能02H
功能描述:用文本坐标下设置光标位置

入口参数:AH=02H

BH=显示页码

DH=行(Y坐标)

DL= 列(X坐标)

出口参数:无


第四部分:
//
// Turn the cursor off
//

    HW_CURSOR(0,127);

;++
;
; Name:
;
;       HardwareCursor
;
; Description:
;
;       Positions the hardware cursor and performs other display stuff.
;
; Arguments:
;
;             ULONG Y coord (0 based)
;             ULONG X coord (0 based)
;     TOS ->  ULONG Flat return address (must be used with KeCodeSelector)
;
;       If X = 0x80000000, then Y contains values that get placed into
;           ax (low word of Y) and bx (hi word of y).
;       Otherwise X,Y = coors for cursor
;
;
;--

EXPORT_ENTRY_MACRO    HardwareCursor
;
; Move the arguments from the caller's 32bit stack to the SU module's
; 16bit stack.
;

        MAKE_STACK_FRAME_MACRO  <HardwareCursorFrame>, ebx

;
; Go into real mode. We still have the same stack and sp
; but we'll be executing in realmode.
;

        ENTER_REALMODE_MACRO

;
; Get the requested sectors. Arguments on realmode stack
; Make (bp) point to the bottom of the argument frame.
;
push     bp
mov      bp,sp
add      bp,2

;
; Put the row (y coord) in dh and the column (x coord) in dl.
;

        mov      eax,[bp].YCoord
mov      edx,[bp].XCoord
cmp      edx,80000000h
jne      gotxy

        mov      ebx,eax
shr      ebx,16
jmp      doint10

    gotxy:
mov      dh,al                DH=行(Y坐标)        
mov      ah,2                02H —设置光标位置
mov      bh,0

    doint10:
int      10h

;
; Restore bp and remove stack-frame from stack
;
pop      bp

        REMOVE_STACK_FRAME_MACRO <HardwareCursorFrame>

;
; Re-enable protect-mode and paging.
;

        RE_ENABLE_PAGING_MACRO

;
; Return to caller and the 32bit universe.
;
EXPORT_EXIT_MACRO


kd> p
osloader!DoGlobalInitialization+0x3b:
004012a8 6a7f            push    7Fh
kd> p
osloader!DoGlobalInitialization+0x3d:
004012aa 6a00            push    0


第五部分:

    //
// Turn the cursor off
//

    HW_CURSOR(0,127);

kd> dv
BootContextRecord = 0x00024538
kd> dx -r1 ((osloader!_BOOT_CONTEXT *)0x24538)
((osloader!_BOOT_CONTEXT *)0x24538)                 : 0x24538 [Type: _BOOT_CONTEXT *]
[+0x000] FSContextPointer : 0x244e4 [Type: _FSCONTEXT_RECORD *]
[+0x004] ExternalServicesTable : 0x244ec [Type: _EXTERNAL_SERVICES_TABLE *]
[+0x008] MemoryDescriptorList : 0x70000 [Type: _SU_MEMORY_DESCRIPTOR *]
[+0x00c] MachineType      : 0x0 [Type: unsigned long]
[+0x010] OsLoaderStart    : 0x401000 [Type: unsigned long]
[+0x014] OsLoaderEnd      : 0x4894a8 [Type: unsigned long]
[+0x018] ResourceDirectory : 0x487000 [Type: unsigned long]
[+0x01c] ResourceOffset   : 0x87000 [Type: unsigned long]
[+0x020] OsLoaderBase     : 0x400000 [Type: unsigned long]
[+0x024] OsLoaderExports  : 0x443b40 [Type: unsigned long]
[+0x028] BootFlags        : 0x0 [Type: unsigned long]
[+0x02c] NtDetectStart    : 0x0 [Type: unsigned long]
[+0x030] NtDetectEnd      : 0x0 [Type: unsigned long]
[+0x034] SdiAddress       : 0x0 [Type: unsigned long]
kd> dx -r1 ((osloader!_FSCONTEXT_RECORD *)0x244e4)
((osloader!_FSCONTEXT_RECORD *)0x244e4)                 : 0x244e4 [Type: _FSCONTEXT_RECORD *]
[+0x000] BootDrive        : 0x80 [Type: unsigned char]
kd> dx -r1 ((osloader!_EXTERNAL_SERVICES_TABLE *)0x244ec)
((osloader!_EXTERNAL_SERVICES_TABLE *)0x244ec)                 : 0x244ec [Type: _EXTERNAL_SERVICES_TABLE *]
[+0x000] RebootProcessor  : 0x22e60 [Type: void (__cdecl*)()]
[+0x004] DiskIOSystem     : 0x22e6c [Type: long (__cdecl*)(unsigned char,unsigned char,unsigned short,unsigned short,unsigned char,unsigned char,unsigned char *)]
[+0x008] GetKey           : 0x22e84 [Type: unsigned long (__cdecl*)()]
[+0x00c] GetCounter       : 0x22e90 [Type: unsigned long (__cdecl*)()]
[+0x010] Reboot           : 0x22e9c [Type: void (__cdecl*)(unsigned long)]
[+0x014] DetectHardware   : 0x22ec0 [Type: void (__cdecl*)(unsigned long,unsigned long,void *,unsigned long *,char *,unsigned long)]
[+0x018] HardwareCursor   : 0x22ea8 [Type: void (__cdecl*)(unsigned long,unsigned long)]
[+0x01c] GetDateTime      : 0x22eb4 [Type: void (__cdecl*)(unsigned long *,unsigned long *)]
[+0x020] ComPort          : 0x22ecc [Type: void (__cdecl*)(long,unsigned long,unsigned char)]
[+0x024] GetStallCount    : 0x22ed8 [Type: unsigned long (__cdecl*)()]
[+0x028] InitializeDisplayForNt : 0x22ee4 [Type: void (__cdecl*)()]
[+0x02c] GetMemoryDescriptor : 0x22ef0 [Type: void (__cdecl*)()]
[+0x030] GetEddsSector    : 0x22e78 [Type: long (__cdecl*)(unsigned char,unsigned long,unsigned long,unsigned short,unsigned char *,unsigned char)]
[+0x034] GetElToritoStatus : 0x22efc [Type: long (__cdecl*)(unsigned char *,unsigned char)]
[+0x038] GetExtendedInt13Params : 0x22f08 [Type: unsigned char (__cdecl*)(unsigned char *,unsigned char)]
[+0x03c] NetPcRomServices : 0x0 [Type: unsigned short (__cdecl*)(unsigned long,void *)]
[+0x040] ApmAttemptReconnect : 0x22f14 [Type: void (__cdecl*)()]
[+0x044] BiosRedirectService : 0x0 [Type: unsigned long (__cdecl*)(unsigned long)]
kd> p


kd> p
osloader!DoGlobalInitialization+0x45:
004012b2 ff5018          call    dword ptr [eax+18h]        //[eax+18h]
kd> r
eax=000244ec ebx=004013a2 ecx=00000000 edx=00064544 esi=00024538 edi=0048164f
eip=004012b2 esp=00060ec4 ebp=00060ed0 iopl=0         nv up di pl zr na pe nc
cs=0008  ss=0010  ds=0010  es=0010  fs=0030  gs=0000             efl=00000046
osloader!DoGlobalInitialization+0x45:
004012b2 ff5018          call    dword ptr [eax+18h]  ds:0010:00024504=00022ea8

kd> dd 00060ec4
00060ec4  00000000 0000007f 00024538 00061ff0

kd> ?7f
Evaluate expression: 127 = 0000007f

y=7f    x=0

http://www.lryc.cn/news/606651.html

相关文章:

  • django操作orm整套
  • 学习设计模式《二十》——解释器模式
  • 如何使用Postman做接口测试
  • curl命令使用
  • 【机器学习与数据挖掘实战 | 医疗】案例20:基于交叉验证和LightGBM算法的糖尿病遗传风险预测
  • 机器学习②【字典特征提取、文本特征处理(TF-IDF)、数据标准化与归一化、特征降维】
  • 解决IDEA无法克隆GitHub上的工程的问题
  • 解决IDEA中MAVEN项目总是将LANGUAGE LEVEL重置的问题
  • SSL 剥离漏洞
  • 把上次做的图片的API改成国内版,让图片返回速度提升一个档次
  • 对于前端闭包的详细理解
  • LeetCode热题100——146. LRU 缓存
  • Typora v1.10.8 好用的 Markdown 编辑器
  • Linux 系统监控脚本实战:磁盘空间预警、Web 服务与访问测试全流程
  • ACM SIGCOMM 2024论文精选-01:5G【Prism5G】
  • 数据处理--生成Excel文档
  • 18.若依框架中的xss过滤器
  • 南太平洋金融基建革命:斐济-巴新交易所联盟的技术破局之路 ——从关税动荡到离岸红利,跨境科技如何重塑太平洋资本生态
  • 基于html,css,jquery,django,lstm,cnn,tensorflow,bert,推荐算法,mysql数据库
  • 元策联盈:深耕金融领域,赋能行业发展​
  • Apache RocketMQ for AI 战略升级,开启 AI MQ 新时代
  • 视频生成中如何选择GPU或NPU?
  • 《C++初阶之STL》【stack/queue/priority_queue容器适配器:详解 + 实现】(附加:deque容器介绍)
  • Eclipse中导入新项目,右键项目没有Run on Server,Tomcat的add and remove找不到项目
  • Apache RocketMQ 中 Producer(生产者)的详细说明
  • vivado扫描:synth_1 ​ 和 ​Out-of-Context (OOC) Modules Runs​ 的区别(腾讯元宝)
  • Apache RocketMQ 中 Consumer(消费者)的详细说明
  • 超越 ChatGPT:智能体崛起,开启全自主 AI 时代
  • 在VScode里运行并调试C++程序
  • 3-verilog的使用-1