NowLink 是 華頓翻譯公司們要取的阿誰構造內的Link 位址
接下來是重點
#define _CR(Record翻譯社 TYPE, Field)
替代後以下
Status = LibGetSystemConfigurationTable (&gEfiAcpiTableGuid, TablePtr); // gEfiAcpi20TableGuid "ACPI 2.0 Table"
if (EFI_ERROR (Status)) {
Status = AcpiMain(&RsdpPtr);
ST->ConOut->SetAttribute(ST->ConOut翻譯社 EFI_BACKGROUND_BLACK | EFI_LIGHTGREEN );
Print (L"ACPI Utility by Harry Lin
%N");
當
}
Address : 0x6194C90
起首先講Struct
ST->ConOut->SetAttribute(ST->ConOut, EFI_BACKGROUND_BLACK | EFI_LIGHTGREEN );
Print (L"ACPI Utility by Harry Lin
%N");
Script = _CR(NowLink, EFI_MEMORY_POOLS_LISI, Link);
}
好,那_CR 又是怎麼做的呢??
((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
((EFI_MEMORY_POOLS_LISI *) ( (CHAR8 *)(NowLink) - (CHAR8 *) &(((EFI_MEMORY_POOLS_LISI *) 0)->Link)))
&(((EFI_MEMORY_POOLS_LISI *) 0)->Link) : C
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpPtr;
PoolSize : 0x6194C98
Entry {
}
速記法 : 要點竄內容請傳址 (&Ptr)
原本寫法,這一種方式不可!!
ex:
...
Script = _CR(NowLink, EFI_MEMORY_POOLS_LISI, Link);
拆解以後 Print 的效果 :
#define _CR(Record翻譯社 TYPE, Field)
...
Status = EFI_SUCCESS;
重點在於 &(((EFI_MEMORY_POOLS_LISI *) 0)->Link) 這個特殊的用法
Struct 內的物件記憶體排列以下 :
_CR tracing
EFI_MEMORY_POOLS_LISI *Script;
EFI_STATUS
AcpiMain (
IN OUT EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER **TablePtr
)
{
EFI_STATUS Status;
...
(CHAR8 *)(NowLink) : 6194C9C
Script : 0x6194C90
Status = AcpiMain(RsdpPtr);
Link : 0x6194C9C
利用雙指標的時機
利用_CR 的體例 :
Status = LibGetSystemConfigurationTable (&gEfiAcpiTableGuid, &TablePtr); // gEfiAcpi20TableGuid "ACPI 2.0 Table"
if (EFI_ERROR (Status)) {
_CR 會去計較出構造的起始位址,然後回傳回來
}
typedef struct _EFI_MEMORY_POOLS_LISI{
EFI_PHYSICAL_ADDRESS Address;
UINTN PoolSize;
EFI_LIST_ENTRY Link;
} EFI_MEMORY_POOLS_LISI;
(CHAR8 *) &(((EFI_MEMORY_POOLS_LISI *) 0)->Link) : C => 注意他掏出 Link 的 Offset
Entry {
Status = EFI_SUCCESS;
EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpPtr;
再來是 _CR(Record, TYPE翻譯社 Field)
所以 NowLink 的位址減掉 Offset,就會是它的佈局起始點位址!!!
...
((EFI_MEMORY_POOLS_LISI *) 0) : 0
RsdpPtr 內容不會被改
((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
EFI_STATUS
AcpiMain (
IN OUT EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *TablePtr
)
{
EFI_STATUS Status;
本篇文章引用自此: http://linch0520.pixnet.net/blog/post/53222884-%5bcode%5d-c%e8%aa%9e%e8%a8%80---%e9%9b%9c...-有關各國語文翻譯公證的問題歡迎諮詢華頓翻譯公司02-77260932