2018年12月5日 星期三

高深的底層語法(講解CR)

在台灣幾乎都是用老美已經做好的專案修修改改, 像CR這麼底層的語法很常用卻也很少人深究, 事實上CR是一個隱藏資料的概念, CR的大方向是假設你把一個又一個的資料結構存在DATABASE, 壓入DATABASE的進入點是一個LINK, 那麼你使用CR只要有LINK就可以得到原有的資料結構, 同時核心服務程式開發者也可以把DATABASE隱藏起來, 只給你LINK而不給你看到DATABASE, 範例連結如下各位可去下載

https://drive.google.com/open?id=1wuq9fo3IxEXd7wgq_X6guLK5bvRLQ5YV

讓我們從CloudDxeDriver.c開始看, 首先很特別的mCloudCrDatabase只能宣告成global變數, 這應該是INITIALIZE_LIST_HEAD_VARIABLE巨集搭配Nt32的古怪結果, 一般會寫C語言的人都知道global變數的特性, 但在BIOS Code更進一步的是只要你把變數宣告成global那在其他支INF裡變數都會存在, 再來SIGNATURE_32是一個再簡單不過的數字移位巨集, AllEntries是一開頭介紹CR大方向時所提到要壓入的節點, AllocatePool()如同其名就是分配記憶體給CloudCrInstance使用, InitializeListHead()可以進去LinkedList.c裡面看, 並不難, InsertTailList()則畫個圖介紹一下, 左邊是原本的鏈結串列, 右邊是經過InsertTailList()的鏈結串列
接下來的DEBUG訊息才是主軸, 比對LOG.txt可知Link的位址是0x58B0C14, 而AllEntries因為起始位址是0而且Signature佔4個位元所以第二行DEBUG message的值是4, 再比對LOG.txt可知第三行message是Item是0x58B0C10, 而Item也是我們用CR所得到的完整資料結構, 恰巧和Link減掉Signature相同, 由此可知只要有了Link再使用CR即可獲得原本的資料結構起始位址, 再來看最後一行DEBUG message, 第4個DEBUG在使用CR前先把它指向了下一個Link, 然後第4行DEBUG印出來的guid是7160586F-37D4-45CE-84AB-762965FF960F, 這是我們壓入mCloudCrDatabase的第二個元素, 會印出第2個是因為有Link=Link->ForwardLink的關係, 其他的註解各位可以嘗試著拿掉編譯看看, 都滿有意思, 妙趣無窮

沒有留言:

張貼留言