第一部分:
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