在用C语言编写 WINDOWS 的 SDK 程序的时候,经常会用到句柄。
当程序创建资源的时候,如果想在其它地方引用这个资源,一般的做法是使用这个资源所对应的句柄。
那么,句柄到底是什么呢?
很容易想到:在内存中创建资源之后,其首地址就固定了,所以,可以用其首地址当做句柄。
同样道理,在UEFI的编程中,也会有句柄这个概念。
还是用这汇编程序来讲解,如下:
mov [rsp+10h], rdx ;SystemTable
mov [rsp+8], rcx ;句柄ImageHandle
sub rsp, 28h
mov rax, [rsp+28h+10h]
mov rax, [rax+40h] ;ConOut
lea rdx, [szOK]
mov rcx, [rsp+28h+10h]
mov rcx, [rcx+40h] ;ConOut
call QWORD[rax+8] ;OutputString
xor eax, eax
add rsp, 28h
retn
程序中第2行,rcx是句柄。
这句柄是主板的固件程序加载这 efi 文件时,传来的。
如果仔细看这程序,会发现:这句柄在本程序中,没有使用。
因为:OutputString 函数并不需要句柄,但是,有的UEFI函数是需要句柄的。
所以,这句柄就是给调用这些函数准备的。
这个汇编程序从不同角度,讲解了好几遍。相信同学对这个汇编程序有一定的了解。
如果关于64位汇编的语法不清楚,请参考相关的大学计算机相关专业的教材,应该多少会有讲解的。
作者:UD64
2019年03月27日星期三下午