close

中翻西

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");

翻譯公司宣佈了一個指標,然後又call一個Function 去點竄這個"指標內"的內容

}

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;

文章標籤
c說話 efi _cr

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
arrow
arrow
    文章標籤
    翻譯社
    全站熱搜
    創作者介紹
    創作者 georgikv6pq 的頭像
    georgikv6pq

    georgikv6pq@outlook.com

    georgikv6pq 發表在 痞客邦 留言(0) 人氣()