[筆記] 什麼是 TCG Opal 2.0?

## Acronym

TCG – Trusted Computing Group
SSC – Security Subsystem Class
PSID – Physical Presence SID
OFS – Original Factory State

## TCG

TCG 為一非營利國際組織,負責開發、定義及發展公開的安全運算標準與規範。

## Trusted Storage Specification

TCG 組織有個小組 Storage Work Group 發布了關於儲存裝置的安全與可信任性的標準 – Trusted Storage Specification,主要是規範直接將安全機制建立在儲存裝置上面,涵蓋了 Hard driver, flash, tape drivers。

## TCG Storage Architecture

為此,他們建立了一個儲存架構,其中包含了 Security Subsystem Class (SSC) 來為安全管理協定作分級。

同時也為了認證,提供了相關的標準認證測試程序。

## TCG Opal 2.0

Opal 即為 SSC 其中一個安全級別規範,目前版本是2.0。

換句話說,Opal SSC 明定

1) 指定必要的 TCG 核心規範能力;
2) 指定可選的 TCG 核心規範能力;
3) 指定如何啟用可信賴的儲存裝置,以及亦可將之回復到出廠狀態。

它是自我加密硬碟 (SED) 常見的一種標準。

特色在於

* pre-boot authentication 啟動前驗證
* LBA-specific permission 定址模式對應許可

也就是說一開始開機的磁區與真正開始的磁區是不同的。


[圖片來源:https://tw.transcend-info.com/embedded/technology/tcg-opal-specifications]

創見利用圖示作了很漂亮的說明 ─ 磁區分開管理,同時也針對不同的使用者作區別管理。

## PSID

PSID 為 Opal SSC 的功能之一,它是硬體裝置 (hard driver) 專用來回復出廠預設模式的密鑰。所以 PSID 必須儲存在安全且秘密的地方。

[參考資料]
https://trustedcomputinggroup.org/work-groups/storage/
https://trustedcomputinggroup.org/wp-content/uploads/TCG_Storage-Opal_Feature_Set_PSID_v1.00_r1.00.pdf

Windows Device – Power Management

[2023/01/13 再更新]

從 Device Manager 確認 Device 的設定

我們知道從 Device Manager (DevMgmt.msc) 可以確認各個 Device 的狀態與設定等資訊,有些設定可以給使用者決定開或關,那它們都儲存在哪裡呢?

例如:使用者可勾選

“Allow the computer to turn off this device to save power"

有些是存在 Windows Registry 中,那要如何去確認 Registry 的位置呢?

1. 開啟 Device Manager 裡點選你要確認的裝置,按右鍵看內容 Properties。

這裡以在 Windows 10 下檢視

Intel USB 3.1 eXtensible Host Controller 為例。

2. 切換到 Details 那頁,找出 Driver key,按右鍵做 Copy 。

3. 叫出 regedit,從 HKEY_LOCAL_MACHINE\SYSTEM\ 進行搜尋剛剛複製的 Driver key。

可以看到 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_8086&DEV_06ED&SUBSYS_098D1028&REV_00\3&11583659&0&A0] 裡的 Driver 是符合的,那麼這組就是我們的目標。

4. 接下來可以檢視裡面的項目,可以推測

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_8086&DEV_06ED&SUBSYS_098D1028&REV_00\3&11583659&0&A0\Device Parameters\WDF]

IdleInWorkingState“=dword:00000001

對應到

“Allow the computer to turn off this device to save power"

IdleInWorkingState 這個鍵值可儲存該設定。

1 為勾選,0 為取消。

使用者看到的 Power Management 三個開關

從 Device Management 找到 Device 後點出 Property,找出 Power Management 的頁面,可以看到三個開關:

□ Allow the computer to turn off this device to save power
□ Allow this device to wake the computer
□ Only allow a magic packet to wake the computer

Network Adapter 的秘密在 “PnPCapabilities"

此篇 [January 15] Allow the computer to turn off this device to save power is grayed out

提到"Allow the computer to turn off this device to save power" 是由 DWORD registry “PnPCapabilities" 來控制:

當值為24時,該選項會灰底。
當值為0,表示允許在Idle時關閉裝置。

但僅在 Network Device 找到,推測:
“PnPCapabilities" 似乎僅為 Network Device 所用?

微軟怎麼說…

參考這篇 https://learn.microsoft.com/en-US/troubleshoot/windows-client/networking/power-management-on-network-adapter

裡面詳述關於 networking 有三種選項:

□ Allow the computer to turn off this device to save power
□ Allow this device to wake the computer
□ Only allow a magic packet to wake the computer

對照 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\0010]

(注意:0010為Device Number,各機台不同)

當三個選項勾選狀況為以下:

  • VVX – PnPCapabilities = 0 (預設)
  • VVV – PnPCapabilities = 0x100 (256)
  • VXX – PnPCapabilities = 0x110 (272)
  • X– – PnPCapabilities = 0x118 (280)

微軟文件也指出,有些操作會導致矛盾的值產生,例:

  1. 先開三個勾勾 VVV – PnPCapabilities = 0x100 (256)
  2. 取消第一個勾勾 Xvv – PnPCapabilities = 0x118 (280)
  3. 再勾第一及第二,第三不勾 VVx – PnPCapabilities = 0
  4. 再重覆第二步(取消第一個勾勾) Xvx – PnPCapabilities = 0x18 (24)

這樣的操作後竟然和前面說明的不同結果??其中邏輯真的是讓人一頭霧水…

實際還是得依歸微軟黑盒子的內部邏輯…。

[程式C] 記憶體對齊單位

#pragma pack(1) 用來表示記憶體對齊單位

1 表示以 BYTE 作 align

4 表示以 DWORD 作 align

() 裡可選擇的是 1,2,4,16

#pragma pack 會要求compiler 使用特別的對齊方式來包裝 Structure Member . 大多數的compilers, 當你宣告一個結構時, 將會在彼此成元之間插入 padding 來確保他們在記憶體中的對齊。

範例程式:

#pragma pack(1)
typedef struct _TEST_PACK_1 {
  char AAA;
  short BBB;
  __int32 CCC;
} TEST_PACK_1;
#pragma pack()

#pragma pack(2)
typedef struct _TEST_PACK_2 {
  char AAA;
  char BBB;
  __int32 CCC;
} TEST_PACK_2;
#pragma pack()

#pragma pack(4)
typedef struct _TEST_PACK_4 {
  char AAA;
  char BBB;
  __int32 CCC;
} TEST_PACK_4;
#pragma pack()

#pragma pack(16)
typedef struct _TEST_PACK_H {
  char AAA;
  short BBB;
  __int32 CCC;
  __int32 CCC;
} TEST_PACK_H;
#pragma pack()

typedef struct _TEST_PACK_F {
  char AAA;
  short BBB;
  __int32 CCC;
} TEST_PACK_F;

    printf("sizeof char %X \n", sizeof(char));
    printf("sizeof short %X \n", sizeof(short));
    printf("sizeof __int32 %X \n", sizeof(__int32));
    printf("sizeof TEST_PACK_1 %X \n", sizeof(TEST_PACK_1));
    printf("sizeof TEST_PACK_2 %X \n", sizeof(TEST_PACK_2));
    printf("sizeof TEST_PACK_4 %X \n", sizeof(TEST_PACK_4));
    printf("sizeof TEST_PACK_H %X \n", sizeof(TEST_PACK_H));
    printf("sizeof TEST_PACK_F %X \n", sizeof(TEST_PACK_F));

   

輸出結果:

sizeof char 1
sizeof short 2
sizeof __int32 4
sizeof TEST_PACK_1 7
sizeof TEST_PACK_2 6
sizeof TEST_PACK_4 8
sizeof TEST_PACK_H C
sizeof TEST_PACK_F 8

如何利用 CTags 來快速檢索程式碼?

## 什麼是 CTags?

在程式碼變得龐大時,各種變數與函數的搜尋與快速定位變得好重要,而 CTags 工具就是用來解決這種困擾。

在開始 coding 前先執行 CTags ,讓它把所有指定的程式語言的檔案,將所有變數、函數等等先收集起來儲存到一個索引檔。

CTags 也算是一個古老的工具,最新的一版是 v5.8,2009/07/09放出來的。

https://ctags.sourceforge.net/

https://sourceforge.net/projects/ctags/

下載後可以找到執行檔來使用,裡面也有 ctags.html 來說明各參數的使用方法。

例:

* -R 表示遞迴

* –languages 可指令程式語言

* –langmap 可指令程式語言與要處理索引的相關副檔名

## C 語言可以這樣用

**ctags –langmap=c:.c.h.mak -R %1**

## Python 語言可以這樣用

**ctags -R –fields=+l –languages=python –python-kinds=-iv**

當我們使用支援 CTags 的編輯器時,就可以輕輕鬆鬆瀏覽程式碼啦!

專案裡的時間觀

這裡紀錄一些在執行產品開發過程中,常見的 acronym。

acronym 是多個單字的第一個字母組成的特別縮寫,在工作日常中常常會用到,但不一定完全了解,有時是邊做邊理會,可能你身邊的人也不一定知道。

用久了,猜一猜或許可以猜到八九成,但何不認真來認識一下呢?

產品周期裡各階段的命名

  • EVT – Engineering Validate Time 工程驗証期,第一份樣版通常需要大量修正
  • DVT – Design Validate Time 設計驗証期,開始確認各項設計是否符合一開始的設定
  • PVT – Product Validate Time 產品驗証期,確認設計後進行問題收斂
  • |- RC – Release Candidate 候選版本
  • |- Golden 黃金樣本
    |- PR – Pilot Run 小量試產,來觀察工廠可能發生什麼問題
  • MP – Mass Production 大量生產,正式成為產品

另一種是偏軟體類型的產品各階段的命名

  • Pre-Alpha
  • Alpha
  • Beta
  • PV
  • RTM – Release to Manufacturing 我自己以為 Ready to Market (HAHAHA)

產品上市後的里程碑

  • EOM – End Of Marketing 停止生產;仍在銷售期
  • EOS – End Of Sale 停止銷售;庫存繼續賣
  • EOL – End Of Life 停止服務;宣告維護終止

與開發周期相關的物料時間點

這邊通常指的是單一樣品 sample 的時間

  • ES – Engineering Sample
  • QS – Qualification Sample
  • Prod – Production
  • RTS – Ready to Ship 可以正式出貨

還有物料往返的時間,明確交待,以便工作御接。

  • ETD – Estimated Time of Delivery 預計寄出時間
  • ETA – Estimated Time of Arrival 預計抵達時間

專案開啟前的規畫相關文件

  • RFQ – Request for Quotation 徵詢廠家的意見,協議報價、時程、項目…
  • RFP – Request of Proposal 需求建議書,通常就是對於這個專案的提案。
  • PCR – Project Change Request 專案的規格以外的變更需求。
  • NDA – Non Disclosure Agreement 保密協議。
  • SOW – Statement of Work 工作說明,通常會說明參與各方的活動與要求。

工作日常信件來往常用單詞

  • AR – Action Required 行動要求,針對單項事務列出負責人與下一步動作。
  • EOB – End Of Business 下班前(個人也有營業時間嗎?)
  • EOD – End of Day 今天以前
  • WFH – Work From Homw 在家工作
  • OOO – Out of Office 不在辦公室,請假時用。
  • TBA – To Be Announced 待公佈
  • TBC – To Be Confirmed 待確認
  • TBD – To Be Determined 待決議

(To Be Continued …)

C# – 如何利用 Console 輸出來協助開發?

在開發 WinForm 程式時,會需要將執行檔移至其它機台驗証。

但我們不會在每個機台都裝上 Visual Studio 來編譯,那麼要如何debug呢?

這時可以利用 Console 輸出來輔助。

首先,要加入正確的 Name Space。

**using System.Runtime.InteropServices;**

再來在程式開始時引用並呼叫 **AllocConsole();**

    public Form1()
    {
        InitializeComponent();

        AllocConsole();

        ...
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool AllocConsole();

程式執行時,即可利用 **Console.WriteLine()** 等來輸出 debug 訊息。

結束時,記得做 **FreeConsole();**

另外,若程式執行後仍無看到 Console 視窗,可以暫時修改專案屬性來測試。

還要注意一件事,當程式執行時,Console 同時也在運作。

此時若關閉 Console,則程式也會停止執行。

PC 裡為何要自帶 CMOS?

每台電腦都有帶有一顆 CMOS 電池,它的作用在於為了主機板上的[1](揮發性記憶體)晶片供電,來保存[2](使用者的設定)。

另一個主要的功能在於提供一個時鐘功能,也就是 Real-Time Clock (RTC),使 PC 取得一個可靠的參考時鐘得以正常運作。

若移除 CMOS 電池,當 PC **完全** 斷電重新開機後,BIOS 就會進行恢復預設程序,重載出廠設定。另一方面,CMOS 內部儲存的資料會以亂數重置,所以說,RTC 這個時間會是一個隨意的時間值,這樣 PC 就會亂了套,當 PC 開進 OS , OS 會參考這個時間值,但並不一定會完全接受;至於 OS 如何判斷與處置,這是一個黑盒子,無法得知。

CMOS 內部的資料,其實是有一套標準的配置定義表,簡單以 RTC 為例,系統目前的時間分為世紀、年、月、日、時、分、秒等來分別儲存。這些數值的儲存方式不是使用一般的十進位轉十六進位,而是一種叫做 [4](BCD) 格式的方式來儲存,目的是高度的可讀性可以直接了解目前的系統時間。

[圖片來源:http://www.bioscentral.com/misc/cmosmap.htm]

CMOS 資料基本上透過 IO 0x70/0x71 來存取,使用 RW Everything 可以查看。從以下這張範例可以知道,目前系統時間是,2022/1/6 15:26:50。

目前 Microsoft 已經推出了 Windows 10,在使用的過程中發現若是 CMOS Battery 電力消失過久之後再重置, PC 要開進 OS 時有時會發生無法開機的狀況,這是因為 RTC 的世紀 Century 已經被隨機洗成一個不可能的值,像是 99xx 年(現代新電腦過10年能開機要偷笑了),觀察 OS 一直試圖運算卻轉不出一個結果,通常在這種狀況下,OS 已經阿達,必須重新安裝。

最好的處理方法是,若有 CMOS Battery 重置,最好先開進 Setup Menu 確認時間沒有問題再開進 OS。而 Windows 11 也有這樣的現象。

# 參考

[http://www.bioscentral.com/misc/cmosmap.htm](CMOS RAM memory map)

[https://www.techbang.com/posts/58282-why-is-there-a-battery-on-the-computer-board] ([2018/7/4,T客邦,MikaBrea]為什麼電腦主機板上面有電池?很多人可能根本不知道!)

# 備註

[1] **揮發性記憶體***揮發性*的意思是資料的儲存必須靠電力來維持住,一旦沒有電力,則所有資料都會消失。

[2] **使用者的設定**:在古早的 PC 裡大多儲存在 CMOS 中,現由於它是揮發性記憶體,且安全性不足,所以現在已經大多搬到儲存 BIOS 的 SPI Part 等非揮發性記憶a體中。

[3] BCD :

[https://en.wikipedia.org/wiki/Binary-coded_decimal]([WIKI|Binary-coded decimal])

硬體基本規格檢查工具 CPU-Z

# 硬體基本規格檢查工具 CPU-Z

除了 HWiNFO 之外,CPU-Z 也很佛心的工具,同樣可用來分析檢測電腦硬體規格,包含了處理器(CPU, 快取 Caches)、主機版(Mainboard)、記憶體(Memory, SPD儲存出廠參數)、簡易算分(Bench)等資訊。

從官網 https://www.cpuid.com/softwares/cpu-z.html 即可下載。

從這邊可以知道 CPU-Z 也被電腦廠商用來作加值應用。

來下載一般免費版用用吧!

執行後,就可以點擊你想確認的項目來看看。

另外,也可以利用 Tools 來匯出 TXT/HTML等格式的報告。

什麼是 xHCI debug capability

xHCI debug capability 也就是 DbC,這是由 xHCI host controller 所提供的獨立但非一定必要的功能。

簡單來說,它主要是擴充來支援 USB 3.0 debug,

擴充方式是在 XHCI Controller 內必須有個 PCI Capability ID 為 0xA (Debug port) 來宣示擁有這個能力 Capability。若沒有這個 Capability ,那麼就無法支援 XHCI debug。

PCI Capability ID 可於 PCI_Code-ID_r_1_5_6_Mar_2014_ncb.pdf 的 2. Capability IDs 查表。

而 Debug Capability 長得如何呢?可以參見 eXtensible Host Controller Interface for Universal Serial Bus (xHCI) 7.6.8 來了解結構。

連接 USB 3 Debug Cable 並開始進行 XHCI debug (啟用 DbC) 後,在 debug host 可見到一個 debug 裝置,它是以全雙工方式進行。

由於 USB3 已經將TX與RX分開,因此,USB 3 Debug Cable 即是略過 USB 2.0 的 VBUS/D-/D+ 不接,並把 USB3 的TX與RX交換,就像一般會說的「跳線」。

這樣的設計下來,就可以直接讓兩個 Host Port 來進行對接。而且可以使用 Debug Target 的 XHCI 上任一個 port 來進行。(不像 EHCI 時代,僅能以 Port 0 來 debug)。


[圖片來源:https://www.usb.org/sites/default/files/documents/usb_debug_class_rev_1_0_final_0.pdf]

如何檢查 Windows Update?

進行 Windows Update 已經是日前資安議題下,一般使用者必備的項目。

Widnows Update 不僅包含安全性更新,更有驅動程式、穩定性更新等等。

Win 10

依此順序開啟 Windows Update 介面:

 Start > Settings > Update & Security

“Update available" 列出目前尚未更新的清單,在這裡可以進行手動更新。

“View update history" 列出目前已更新的項目清單。

可對照官網來確認更詳細的更新細節:

https://support.microsoft.com/en-us/topic/windows-10-update-history-857b8ccb-71e4-49e5-b3f6-7073197d98fb

Windows 11

依此順序開啟 Windows Update 介面:

 Start > Settings > Windows Update

“Update history" 列出目前已更新的項目清單。

這邊分為四大類:

  • Quality Updates
  • Driver Updates
  • Definition Updates
  • Other Updates

除了Driver本身有version 可作版本控管之外,其它更新因為是雜項,所以 Microsoft 利用 KB number 來編號控管這些 hotfix 。

可對照官網來確認更詳細的更新細節:

https://support.microsoft.com/en-us/topic/windows-11-update-history-a19cd327-b57f-44b9-84e0-26ced7109ba9

利用內建指令來取得 Windows Update History

1. Windows Command

wmic qfe list

或是尋找特定的 hotfix

wmic qfe | find "5016695"

2. PowerShell with administrator

Install-Module PSWindows Update

撈出最近更新的十項:

Get-WUHisotry | Select-Object -First 10

或是 確認最新的更新:

Get-WindowsUpdate

或是 更新特定的 hotfix

Install-WindowsUpdate -KBArticleID KBNUMBER

終極更新,全部下載並安裝

Install-WindowsUpdate

Reference

https://support.microsoft.com/en-us/windows/get-the-latest-windows-update-7d20e88c-0568-483a-37bc-c3885390d212#WindowsVersion=Windows_11