如何使用 WinDbg 來進行 Windows Kernel Debug?

# Requirement

1. USB 3.0 Debug Cable (A-A crossover, no VBus).

2. 目標機(Target),也就是被除錯機器

 Target(SUT) with an xHCI (USB 3.0) host controller that supports debugging.

   – UsbView tool (in SDK).

3. 主機(Host):執行除錯工具(windbg)的機器

 Host with an xHCI (USB 3.0) host controller.

   – WinDBG tool (in SDK).

   – WinDBG Preview tool (in Edge Store).

# Steps

1.

首先先下載 [Windows SDK],安裝時可以只選擇 Debugging Tools for Windows 就好。

安裝好後,從 C:\Program Files (x86)\Windows Kits\10\Tools\x64 複製 usbview.exe 至隨身碟。

2.

將 usbview.exe 複製至 Target 機台上執行,開始利用 USB 隨身碟檢查各個 USB 3.x port 是否支援 debug,如果沒有支援,就不用往下走了。

如下,可以看到單一port的能力資訊。

[PortX]
Is Port User Connectable:         yes
Is Port Debug Capable:            yes
Companion Port Number:            3
Companion Hub Symbolic Link Name: USB#ROOT_HUB30#5&32bab638&0&0#{...}
Protocols Supported:
 USB 1.1:                         no
 USB 2.0:                         no
 USB 3.0:                         yes

我們要注意的是 User Connectable 和 Debug Capable 必須要 yes。

從該 port 再往上確認它的 host controller 的 Bus.Device.Function資訊,先記下後面會用到。

USB xHCI Compliant Host Controller
...
DriverKey: {36fc9e60-c465-11cf-8056-444553540000}\0020
...
Bus.Device.Function (in decimal): 0.20.0

3.

確認 Target 機台支援 debug 後,繼續將 Target 的 OS debug 打開。

先想好 TargetName ,避開debug字眼。

用 Administrator 權限的 cmd 執行:

bcdedit /debug on
bcdedit /dbgsettings usb targetname:TargetName
bcdedit /set "{dbgsettings}" busparams b.d.f

可以再執行

bcdedit /enum
bcdedit /v

或是執行 msconfig 來確認。

4.

Host 端開啟 WinDbg,要注意使用與 Target 匹配的 x86/x64/ARM 版本。

點擊 File > Kernel Debug…

選擇 USB 頁面,輸入前面在 Target 使用的 Target name,再按 OK。

5.

重啟 Target,Host 等待連線。

當 Target 在 POST 期間不會連線,直到進入 OS 後才會連線。

# 錯誤檢查與排除

1.

檢查 Host 端的 USB Device 狀況,若有 Yellow Bang,可利用 SDK 提供的 driver 重新安裝後再試。

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\usb

裝置正常的話會顯示為 Usb Debug Connection Device.

2.

關掉 Host 端 USB Device 的 Host Controller 和 Root Hub 上的電源控制。然後重新連接 cable 後再試。

# 官方資料

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/setting-up-a-usb-3-0-debug-cable-connection

如何建立個人Wiki系統

透過 [小隆網管日誌|個人化迷你Wiki系統]介紹,得知有個東西叫做 [TiddyWiki] , 它可以在本機建立,談不上架設,因為它連安裝資料庫、Server等都不需要,只有一個html檔案,用瀏覽器就可以用。

# 靜態方式建立

從TiddyWiki官網,找到 GettingStarted,按下"Download Empty"按鈕,下載它的空白檔案,就可以打開,開始編輯。

優點是非常簡單。

缺點是,似乎每一次編輯,都會以下載方式儲存成另一個TiddlyEmpty(xxx).html;所以每次都要去 Download 資料夾找最新的檔案來繼續新的編輯。

# 動態方式建立

參考 [TiddyWiki舞] 的說明,來做 TiddyDesktop 的安裝。

1. 從 [https://github.com/TiddlyWiki/TiddlyDesktop] ,找到綠色的"Code"按鈕,選擇"Download ZIP" 來下載並解壓縮到你想存放 WIKI 的目錄,可將資料夾命名為 TiddlyDesktop。

2. 另外也到 [https://github.com/Jermolene/TiddlyWiki5] ,一樣找到綠色的"Code"按鈕,選擇"Download ZIP" 來下載並解壓縮到TiddyDesktop的平行目錄,將資料夾命名為 TiddlyWiki5。

3. 因為 TiddlyDesktop 使用到 Node.js,所以還要到 [http://nodejs.org/]官網下載安裝軟體安裝。

可以用 Command line:

npm -v

來驗證 Node.js 是否正確安裝。

3. 先閱讀 TiddlyDesktop\readme.md。

按照 “Building" 章節 的指示,打開 Windows PowerShell,依序執行。

cd <your_TiddyDesktop>
.download-nwjs.sh
.bld.sh

4. 以上步驟都確認後,會在 TiddlyDesktop folder下產生 output folder。

執行

output\win64\TiddlyDesktop-win64-v0.0.15-prerelease.2\nw.exe

就可以開始建立你的個人 WIKI 啦!

# 參考資料

你害怕被檢討嗎?

某某說XXX出狀況了,要趕快排除。

終於解決了,老闆說要檢討…

老闆又要罵人了…
又要聽老闆說教了…
又要做一堆作業了…

在資訊科技業,這些都是日常。
研發單位們必須緊跟著工廠生產節奏,即時看顧、排除阻礙。

1. 狀況來了,收集資訊。
2. 分析現象,實驗釐清。
3. 判斷問題,研擬對策。
4. 找出真因,源頭改善。

1. 狀況來了,收集資訊。

「發生什麼事情了?」

如果一開始就被這樣的問題嚇到了,
那麼証明要嘛你膽子不夠大,
不然就是沒有經驗答不出來。

首先,這不是一個「質問」,
如果你有這樣的感覺,
那麼要先調整自己的思緒,
你可能以為老闆在針對你這個人,
其實是在問"這一件事"。
所以,思緒拉回來,情緒收回來,
深呼吸~ 我們先來辨識現場。
對!想像自己是CSI。
就像美國影集《CSI犯罪現場》一樣,
你就是『鑑識科學家』。

停!通通不准動!
現場証物通通保留、拍照、做記號,
有必要的採樣回去局裡分析。

2. 分析現象,實驗釐清。

然後開始有人在問:
「看出什麼了嗎?」
一個人問,兩個人問,三個人問…
老闆也問:
「現在狀況怎麼樣了?」
你又嚇到了嗎?
沒事沒事,分析需要時間,你知道嗎?
做快篩要等15分鐘才能看結果,
PCR要兩天才能出報告。
你覺得分析有那麼快嗎?

3. 判斷問題,研擬對策。

嗯~~~這個地方有蹊蹺,
快告訴我,這個地方有誰動了手腳,
趕快去調查,跟我回報。
你說:就這樣、那樣,然後就變這樣…
蛤~ 邏輯不對喔!太可疑了。
你試試@#$%^,看會不會變成那樣。
也試試$&*^&!,看會不會變成這樣。

4. 找出真因,源頭改善。


啊哈,抓到了齁。
光是提出解決方案還不夠,
必須要放到前面的測試中反覆確認,
沒有問題後再放小量確認,
最後才能全面導入。

「最後是怎麼解決的?」
「為什麼會發生這件事情?」

老闆又問了,客人也來關心了。
我們結束要來討論一下怎麼發生,以後怎麼避免。
也就是一個 Lesson Learn 會議和報告。

基本上如實回答,寫出有做到什麼,
若有缺失就坦白寫改善措施,
有的時候是整個團隊來看
從哪個環節可以加強來避免。

# 檢討可怕嗎?

所謂的檢討,必定來自一個問題。
平心面對問題,能提出解決方案,
你就是這局的Winner。
即使有缺失,你從失敗經驗中學習也是獲得。

老闆喜歡的,

除了解決問題的能力,

更愛你面對問題不退避的信心。

演算法也能拯救世界

「演算法改變世界」
這句話放在現在,是真真切切的。

那演算法是什麼呢?
你可以想像,把法律上每個條文都寫進一個城市環境,
然後把人丟進去,你只要過馬路沒走在斑馬線上,
你的手機馬上嗶!嗶!跳出一張罰單。
演算法可以理解為在某個環境下運作的規則。
你可以利用它來進行某項任務,或是計算出想要的結果。

某個程度,演算法像是統治了你。

演算法是無所不在的喔,
那些你每天打開的APP,
會瀏覽的貼文,
還有檢查那些尚未回覆的訊息數字,
這些都是經過演算法決定
該跳出什麼訊息給你,
何時跳出來,
讓你情不自禁一直看~下~去~

但,你知道嗎?
若好好地運用演算法,它也可以幫助世界。

這邊先來講一個情境…

主辦單位宣布舉行大賽,
每位參加的人都來拿領一個筆記本。
每個回合裡,
每個人都要想一個新名字來使用。
然後在本子上記錄下自己的新名字和遇到的人的名字。

於是王小雀的筆記本是:

[
第一回合:
我叫奇異博士;
我遇到雷神索爾,
我遇到美國隊長。

第二回合:
我叫天氣晴;
我遇到天黑黑,
我遇到風很透,
我遇到雨不停。
]

而郝小新的筆記本則是:

[
第一回合:
我叫邊緣人;
我沒有遇到誰。

第二回合:
我叫我很好;
我遇到你很好,
我遇到大家都很好。
]

而李小冠的筆記本則是:

[
第一回合:
我叫來自星星的我;
我遇到來自星星的你,
我遇到我們都來自星星。

第二回合:
我叫雨不停;
我遇到天黑黑,
我遇到風很透,
我遇到天氣晴。
]

接下來,大會宣布-
第二回合,天氣晴積分太低-淘汰,
有遇到他的人要進入待定區。
於是王小雀(天氣晴)OUT,他的筆記本交出來,
然後李小冠(雨不停)進入待定區。

故事來到這裡,要揭曉這是什麼把戲了。
登楞~ 這就是臺灣社交距離APP「背後的原理」啦。

我們再重新了解"臺灣社交距離APP"倒底在做什麼?

因為新冠疫情興起,疫調要花費太多的人力,
於是公共衛生單位呼籲大眾安裝這個APP,
大家仍照常進行日常活動,
晚上會收到今日"有沒有接觸到新冠確診者"的情報。

這是怎麼辦到的呢?分成三階段來解釋:

  1. 接觸
    在你安裝了 APP 之後,
    該 APP 會請求你開啟裝置的藍芽和網路的權限,
    另外它會每15分鐘會產生1個代表自己的隨機ID,
    然後利用藍牙短距離廣播來散播你的隨機ID。

(
在運算世界裡,這ID可能長的像AKEN2i3DS9,
不帶任何個人資訊,你根本不知道它代表誰。
就像你站在原地,大聲喊:我叫做"天氣晴"。
)

接著呢?在你附近的人若也裝了APP,
就會在自己的「接觸日記」,也就是前面說的筆記本,
寫下時間、距離、遇到的人的隨機ID。

(
我五月一日下午三點,身邊2公尺近,有個"雷神索爾"。
我五月二日早上十點,身邊1公尺近,有個"天氣晴"。
)

  1. 推播
    然後,突然有個人發現自己有症狀,經過篩檢後確診,
    那麼他就會把「接觸日記」上傳到公共衛生單位的主機上,
    該主機就會進入「揭露通知」程序,進行推播:
    某某某ID,在哪一天確診,可能傳染期間為…。

(“雨不停"於五月二日確診…。)

  1. 追溯
    再來,每個人就會收到通知,
    開始跟自己的「接觸日記」比對,
    在那些確診者的傳染期間,有沒有跟他接觸到,
    如果有,再計算出接觸時間長度,更加注意自主健康管理。

(接下來,你可以知道"天氣晴"該怎麼做了嗎?)

終於講完了,到這邊為止很多人應該直接跳離了吧。

這只算是粗略的說明了"臺灣社交距離APP"的演算機制,
感謝「數位時代」podcast 的訪談揭開了這一幕。

原來這個科技是拜Google與Apple所賜,
直接與各國官方或地區的公共衛生機構合作,
利用了兩項關鍵技術-
接觸追溯 (Contact Tracing) 通訊協定」與
揭露通知 (Exposure Notification, GAEN) 推播系統」,
來推出能保障個人隱私的足跡回溯解決方案

而這技術剛好在現今普及的手機都有搭載的藍芽上行得通。
也算是為規模經濟作了見証的演算法,怎麼說呢?

幾乎人手一只具有藍芽的手機 (第一層規模),
也要大多數人都安裝了這個 APP (第二層規模),
然後確診者如期回報 (第三層規模),
才能讓大眾得知自己的曝露風險,
愈早減少確診者在外與人接觸的足跡,
能減少一定程度疫情的擴散。

演算法真的能改變世界,
而演算法能不能拯救世界?看你怎麼創造它,怎麼使用它。

[參考資料]

新手快學標記語言不用怕,用 Markdown 來作高速筆記

Markdown ,簡單來說,它是一個輕量級的標記語法。
標記語法也就是帶有多階層、粗體、斜體、符號列表或數字列表的格式文章,也可以寫出帶有連結或圖片的訊息。
HTML 就是最原始的標記語言,我們其實可以把 Markdown 當作簡易版的 HTML,但是它更方便又快速。

基本上你只要學會十種左右的標記,你就可以寫出「易讀易懂」的文章了。
這也是 Markdown 的初衷,一種純文字型態,透過支援它的編輯器,就可以看到漂漂亮亮的文章。

支援 Markdown 的編輯器有哪些呢?很多,有電腦版的像是 Typora,也有很多線上版的,現在也愈來愈多筆記軟體開始支援了,像是 Evernote。
你隨意搜尋再找個看得順眼的就可以了,我喜歡選擇可以匯出 PDF 的編輯器。

Markdown 官網從此入
https://markdown.tw/

這裡再介紹一個最簡單的 Markdown 練習網站
不須要登入就可以練習,一道題解開不到五分鐘,不熟悉的話還有提示,你可以慢慢練習。
https://commonmark.org/help/tutorial/

這裡就可以先看介紹,或是開始練習。

全部練習完成,它會恭喜你,很有成就感。

語法就這麼多(很少囉),不熟悉可以隨時回來練習。

[Windows] Modern Standby

先講一下什麼是 Standby,簡單來說就是 Windows UI 下 Power 按鈕的 “Sleep", 用來讓 OS 進入睡眠狀態,可以省電,在 ACPI 規範來說,是屬於 S3 state。

後來 Windows 又希望能做到隨時喚醒,推出更新的省電方式,就像手機可以即時喚醒那樣,於是從 Windows 8 推出 Connected Standby ,爾後 Windows 10 再進化為 Disconnected Standby,於是更新統稱為 Modern Standby(中文別名:新式待命;所以 傳統的 Sleep 也就是 S3 state 就被叫做 Legacy Standby),以 ACPI 來看,新式待命是 S0ix state,是在 S0 state 且 Idle 時可以更省電又快速睡眠的方式,所以又叫 “S0 Low Power Idle"。

那麼,要如何分辨系統是支援 S3 還是 ModernStandby 呢?可以利用 Windows 內建指令:

 powercfg /a

支援 S3 者

 The following sleep states are available on this system:
    Standby (S3)

支援 Modern Standby 者之一

 The following sleep states are available on this system:
 Standby (S0 Low Power Idle) Network Connected

支援 Modern Standby 者之二

 The following sleep states are available on this system:
 Standby (S0 Low Power Idle) Network Disconnected

兩種 Modern Standby 的差別在於:

  • 一開始從 Windows 8 導入,為 Connected Standby
  • 後來演進到 Windows 10,變為 Disconnected Standby

總地來說,MS 是比 S3 更省電沒錯,而MS是一種漸近式的發展,所以在不同的 OS/系統上,細微的機制是不會完全相同的。

參考資料

https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/overview-of-modern-standby-validation

[線上工具] 如何將Google日曆匯出至Excel?

想把 Google 日曆的内容匯出成 Excel 做一些其它的應用,搜尋到這篇2014年的文章 [https://key.chtouch.com/cv.aspx?p=2152]
它利用線上工具Gcal2Excel來完成,不過該工具已被併入 TimeTackle了。
所以紀錄一下 2022年新方法和步驟。

  1. 進入 https://www.timetackle.com/,選擊上面 Login 按鈕。


  2. 有兩種帳號可以選擇登入,Google 或 Outlook。選擇 Google。


  3. 選擇你要使用的 Google 帳戶。


  4. 接下來就會帶出你的 Google 帳戶中所有的日曆。
    按左邊的 Calendars 選單可以看到全部的資料,包含自訂日曆、與他人共享的日曆等。
    選擇你想匯入的日曆,按下 Import 按鈕,使它的 Status 變成 Imported。



  5. 再選擇左邊選單的 Sheets,可以看出全部的行程資料。
    從上方的 Filter by 選擇你要匯出的日曆,可以多選。
    再按上方的 Download , 選擇 As XLSX 就可以下載囉。



  6. 之後打開下載的檔案就可以確認內容啦~

《線上工具》線上合併歌曲,將多個音檔結合在一起!免費又操作直覺,推薦~

Audio Joiner online
https://audio-joiner.com/tw/

1。按 “新增曲目",可一次選取多個音檔。
2。上傳完畢後一個音檔會變成一個BAR, 可以拖曳調整順序,或是左右調整做切割。
3。決定每個音檔是否要有淡入與淡出效果。
4。按三角型播放鍵作試聽,也可隨意點位置來聽。
5。選擇 mp3/m4a/wav/flac 格式後,按"合併"。
6。處理完畢即跳出下載畫面,也可上傳至 Google Drive 或是 DropBox。

[Qt] 開始安裝開發程式

為什麼是Qt

本來沒有什麼接觸到,因為剛好手邊要研究的程式是以它為基礎開發的,所以必須先研究一下。

簡單來說,它可以開發圖形介面 (GUI),也可以做 指令介面 (CUI),更多人喜愛它的理由是它可以跨平台,Windows / Linux 通吃,也就是說它能用在 PC / Android 等上面,它的模組也夠豐富,它也能做底層,像是驅動開發。

再來,它是C++ 基底的,所以在 Windows 環境下可以搭配 Visual Studio 或是 MinGW 來配置開發環境。為了簡化工具問題,這邊選用 MinGW。

安裝Qt開發環境

1。先從 https://www.qt.io/download 來下載,這邊有分商業版和試用版。

2。下載後安裝過程中會需要建立一個Qt帳號。

3。安裝過程中要勾選 Qt 的版本和 MinGW ,我沒有什麼概念,選擇了 Qt 5.12.12 和 MinGW 7.3.0 64-bit。

4。安裝完成後,就可以打開 Qt Creator 開始試跑程式了。

5。從 Qt Creator > Welcome > Examples 可以看到許多的開發模版,輸入 hello 選一個最簡單的 “Hello tr() Example" 來建立一個新專案。

6。專案建立的第一步,就是選擇使用的工具 kits,這邊選 Desktop Qt 5.12.12 MingGW 64-bit,最後按 “Configure Project"。這樣就建立好一個 Qt Project 啦。

7。再來,如何 Build & Run,按下左邊綠色播放鍵,就可以看到一個 hello world! 小視窗跑出來,表示建置成功!

8。接下來,試看看 QtCreator 外部,也就是直接執行 Build 之後產生的 EXE 是否正常。依序發現了以下問題:

✖ The code execution cannot proceed because Qt5Cored.dll was not found. Reinstalling the program may fix this problem.
✖ The code execution cannot proceed because Qt5Guid.dll was not found. Reinstalling the program may fix this problem.
✖ The code execution cannot proceed because Qt5Widgets.dll was not found. Reinstalling the program may fix this problem.
✖ The code execution cannot proceed because libgcc_s_seh-1.dll was not found. Reinstalling the program may fix this problem.

9。前面問題,表示 EXE 還需要一些外部鏈結 DLL 才能執行,官方建議使用 windeployqt.exe 來解決。該程式在 Qt 安裝目錄下可以找到,指令如下
windeployqt.exe
該指令會將這個 EXE 檔所需要的所有 Qt 資料都複製到 EXE 所在的路徑下。

10。再執行 EXE 看看,依然出現錯誤視窗。
✖ The code execution cannot proceed because libgcc_s_seh-1.dll was not found. Reinstalling the program may fix this problem.

有人建議使用 Dependency Walker 來檢查 EXE 需要哪些 dll,但這個程式似乎有點老舊。最後得知這個則是由 MinGW 來提供,於是一樣從 Qt 安裝目錄下的 MinGW 來複製出 libgcc_s_seh-1.dll,執行,結果出現無法正常啟動 (0xc000007b) 的錯誤…

11。再從 Qt 安裝目錄下的 MinGW 來複製出 libstdc++-6.dll, libwinpthread-1.dll ,再執行,成功囉!

參考連結

Qt 編程指南[簡] – 從開發環境到Hello World, 各項GUI介紹, 延伸各種應用, 加上最後的安裝佈署;一部誠意完整的線上電子書
https://qtguide.ustclug.org/

iT邦幫忙/第12屆iThome鐵人賽/Qt 跨平台應用程式開發 – chchwy 寫了三篇文章手把手的教學,後面沒有再更新有點可惜
https://ithelp.ithome.com.tw/articles/10233582

《線上工具》線上合併歌曲,將多個音檔結合在一起!免費又操作直覺,推薦~

Audio Joiner online
https://audio-joiner.com/tw/

1。按 “新增曲目",可一次選取多個音檔。
2。上傳完畢後一個音檔會變成一個BAR, 可以拖曳調整順序,或是左右調整做切割。
3。決定每個音檔是否要有淡入與淡出效果。
4。按三角型播放鍵作試聽,也可隨意點位置來聽。
5。選擇 mp3/m4a/wav/flac 格式後,按"合併"。

6。處理完畢即跳出下載畫面,也可上傳至 Google Drive 或是 DropBox。