当前位置: 首页 > 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.dtcms.com/a/310442.html

相关文章:

  • Python编程基础与实践
  • Linux 用户与组管理及权限委派
  • 自由学习记录(75)
  • [2025CVPR-图象处理方向]Z-Magic:零样本多属性引导图像创建器
  • SpringBoot与Rust实战指南
  • 深度SEO优化的方式有哪些,从技术层面来说
  • GitHub 趋势日报 (2025年07月31日)
  • 【实战】Dify从0到100进阶--插件开发(1)Github爬取插件
  • ansible.cfg 配置文件生成
  • [css]切角
  • 第十四天:C++内存管理
  • Agents-SDK智能体开发[2]之工具调用
  • Nginx 来正确地托管网站服务
  • 《软件测试与质量控制》实验报告一 测试用例设计
  • 自动化框架pytest
  • 小学阶段的学习机推荐:科大讯飞T30、Lumie 10学习机暑期16项AI功能升级
  • 2025电赛G题-发挥部分-参数自适应FIR滤波器
  • python列表推导式
  • uniapp基础 (二)
  • 电商作图,商品图、模特图、促销海报设计
  • Unity优化技巧:自动隐藏视野外的3D模型
  • 【人工智能-16】机器学习:概念、工具介绍、数据集、特征工程
  • 铁皮矫平机进阶小百科
  • C# _Json数据
  • MySQL 45 讲 18-20
  • React 19 革命性升级:编译器自动优化,告别手动性能调优时代
  • 携程PMO资深经理、携程技术委员会人工智能委员会秘书陈强受邀为PMO大会主持人
  • 开源vGPU解决方案HAMi
  • 2025.8.1
  • python中appium 的NoSuchElementException错误 原因以及解决办法