Note: CESYS.EXE for Install BLDR

距離上次看FAT好像是10年前了, 也是WinCE系統, 但那時主要是為了讓Bootloader 去support SDHC Card, 做了一兩週把規格讀熟後發現, 只需要改幾個SD Initial command, 然後把 offset address 從byte 改成 sector 很快就把Bootloader support SDHC做出來

這次重回這個場景, 從PXA270 變成了, x86系統(Intel 945G/Core2Duo), Bootloader從EBOOT, 換成了BIOSLoader(BLDR), 這是一個醫療設備, 因為當初開發的失誤, 對WINCE系統的不熟悉與FAT Filesystem 先天的無紀錄日誌混合引起的, 造成系統預設的Object Store Database在設備用過一段時間非正常開關機後毀損, 本來是給建議改OS configuration就可以解決, 像是有TFAT (SYSGEN_EXFAT) , 跟 ROM and RAM System (SYSGEN_FSRAMROM) 或是 WINCE6 R2 後多了一些 Filesystem Replication

set SYSGEN_FSREPLXFILT=1
set PRJ_ENABLE_FSEXTREPL=1
set PRJ_ENABLE_FSMOUNTASROOT=1

客戶端因為是醫療設備, 堅持OS configuration不能變動 因為會影響FDA認證, 這問題就變成一個Bootloader協助刪除預設的Database file 的workaroud處理, 因為WINCE當沒有檔案時會自動重新產生, 但是檔案損毀時確會因此Freeze

要改Bootloader 就要了解Legacy x86的開機順序如下

  1.  BIOS POST
  2.  Load MBR Sector, run boot code
  3.  Load Boot Sector from Active partition
  4.  Load OS Loader(IO.SYS, for MSDOS)

CESYS.EXE 是用來安裝 Boot sector 與 OS Loader的等於做一個開機, 它程式細節是先從MBR找到第一個active partition, 然後寫入boot sector到partition 的第一個sector, 接著移到Root Directory 刪除第一個檔案(透過寫入0xE5), 然後使用系統命令複製BLDR到該處

研究過Boot sector後是去Root Directory 找BLDR這個檔案載入跳轉執行, 需要改的就是在BLDR內做Workaround

基本上要做步驟是VFAT 的尋找, 先在Root Directory 找到對應的目錄, 然後移動到subdirectory 再去找要刪除的檔案名, 把filename的第一個字元改為0xE5(delete mark), 然後把FAT Table 的Cluster chain 填成0, 釋放使用過得 Cluster chain

CESYS.EXE 在WINCE 內部的版本是只能支持FAT12/FAT16 改了一個版本支持FAT32, 使用上要注意某些事情, 該版本會跳過Root directory 下面第一個entry , 認為是VOLUME LABLE使用

基本步驟是 用Diskpart 去format disk 成為FAT32 格式, 並設定VOLUME LABEL, 然後在設備上用DOS開機再用 cesys 去寫入開機磁區與寫入BLDR, 寫入開機磁區時要注意 offset 設定,  像是手上的BSP預先prebuilid好的FAT32 bootsector 是422 byte, 就要跳過前面 90 byte for FAT32 BPB的地方, 不然就會造成FAT32 檔案系統毀壞, 使用範例如下

cesys.exe -b:90 bsfat32 bldr X:

 

 

 

廣告

Note: Access SMBIOS in Kernel of Windows

因為老闆說要給部門做一個簡單的talk, 鑑於目前同事多數是 Junior level, 而公司從事的還是x86為主的硬體生意, 所以決定中秋過完的部門週會上, 簡單介紹一下SMBIOS 的來由與存取方法, 讀資料過程還是有新的收穫, 學到如何kernel 使用wmi

開始做一些研究, 找到一些舊的資料, 基本上SMBIOS 真的開始全面導入是 v2.3.1之後, Win95 就開始使用PNPBIOS 界面提供 SMBIOS的支援, 但是直到 1999年Microsoft 才開始加入 Design for Windows Logo 認證裡面(from PC 99 Design guide), 不過強制需求應該是從Windows XP SP2/Windows 2003 Server SP1 開始引入了mssmbios.sys, 在WinHEC 2005有Release了一個文件 smbios.doc

該文件解釋了mssmbios.sys的一些行為,  基本上是基於WMI機制等於內部做了MOF宣告, 然後會去parsing smbios table資料, 並且存在 registry path 下"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mssmbios\Data"

因為基於WMI, 所以它提供XP SP2與之後版本的user/kernel mode 的 wmi 存取, 為了更簡便使用user mode 還透過增加GetSystemFirmwareTable() API (from Windows 2003 server sp1), 而kernel mode 則從Vista 開始 多了 AuxKlibGetSystemFirmwareTable

kernel wmi 則是透過 IoWmiOpenBlock(), IoWMIQueryAllData(), “SMBIOS_DATA_GUID" 去取得, 這還要看一下 driver load order, 否則貿然在kernel driver使用應該會出問題

Note:精通施與受的建言藝術

今天恰巧讀到 精通施與受的建言藝術 其實在工作生活中, 常常會有人要求給予建議, 我通常會在力所能及內,  提供個人看法與建議, 不過這樣多年過去後發現真的蠻多人要求建議時只是需要一個贊同的聲音而不是真的想要聽你的意見, 離開前公司分析主因就是認清這點

文內有一些建議

1. 尋找最佳人選, 個人理解是要找一個你能力所及內, 你認知道對方是一個你能放心有信任感的幾位專家, 其實這第一步很重要, 找一些沒有信任感的人, 就算給你建言的人提供你正確有建設性的作法, 你也會因為自己的侷限性, 如格局, 眼界, 經驗所限一再否定對方給你的創新性的改革建議, 就如同現在流行一句話叫做 “貧窮限制了我的想像力" 是一個道理。而且這過程是漫長建立起來的,透過一些合作與徵詢累積彼此的信任

2. 建立共識 , 這重點是徵詢的人對自己的心態控制, 否則一切都是白搭, 有的人會有很受威脅的感覺, 甚至對建言者隱藏太多關鍵細節, 這樣也很難取得好的建言, 其實終歸還是回到信任這一個環節, 所以俗語有"用人不疑"這個建議, 這其實考驗徵詢者本身對人的判斷能力與自我信心的健全與否,  建言者則是要有耐心去跟徵詢者磨合, 設法引導對方思考。

3. 琢磨可能的方案, 這是要多方思考各種可能實行的方案, 要做細部推演, 做多方發想, 分析可能的途徑, 透過雙方合作腦力激盪, 建言者要多分析自己的提案的背後思維,

4. 擇定一個決策, 經過上面的步驟後, 最後就是開始最後抉擇可行的方案選定其中最合適的方案去執行, 但是文內有看到人有傾向便宜行事的業力, 這我也遇過, 不過這是人性, 常見寬以律己, 嚴以待人, 滿口要人奉獻犧牲, 但是事情落到它頭上時, 確發現他的應對完全是另外一個模式, 我自己歸類為專講幹話的人選, 這種人通常還意外受上司歡迎, 畢竟平常會讓人覺的很像盡心盡力為團體奉獻的樣子, 該文重點其實是針對各種方案要有個開放心態, 放開去找各種可能性, 千萬不要找一個看起來最簡單最容易的方案就去執行, 個人經驗也是通常看起來最近的最遠, 反而是那種看起來繁瑣但是穩紮穩打的方案, 才能真的一步一步推進, 最後才能成功實行真的才是最快方案

5. 化建言為行動, 基本上應該就是要有執行力與應變力, 就是俗話說的"計畫趕不上變化", 當執行決策時, 可能會發現事情跟當初設定不見得一樣, 要能靈活快速的應變, 持續保持開放心態, 對事情做當下最好的處理與建議

 

Bookmark: Windows Compact Embedded Documents

看來跟Windows CE 結下很深緣份 😦 , 上次碰WINCE在前公司是快2年前幫客戶做WINCE 5.0 的Timezone support, 因為早就沒更新Timezone information的update了, 不過還好經過研究Windows 系列的Timezone 資訊提供方法變化不大, 可以由Desktop版本直接轉換一些格式就可以套到WINCE上面用

但是近期換了公司後, 持續有WINCE支援工作要做, 但是M$這些年策略大轉換後, WINCE這個realtime kernel 已經被放棄, 雖然在很多領域還是有特定使用群, M$已經定調朝向Linux (Azure Sphere)進展與持續使用Windows 10 Kernel (Windows 10 IoT Enterprise/Core)做IoT時代的發展

而經過這些轉變與內部系統的變化, 整各 MSDN使用上面也已經排列排列方式不同以往, 變得我使用Google 查詢文件非常不變, 只好發這篇做一下紀錄, 之後要查文件比較方便

Windows Embedded Top Index for WinCE 3.0 ~ WEC 2013

 

這次要弄的是 Hive base/Object Store with FAT Filesystem 原生問題
https://slideplayer.com/slide/10609613/ , 雖然聽不懂韓文, 不過這個Slide一些介紹應該是同一個問題, 裡面的有建議用TFAT處理

可惜的是客戶本身產品不能更動OS image的configuration 了, 只能透過Bootloader 去Workaround

 

Note: SMBIOS/ACPI 觀察

這兩天因為要跟同事介紹 SMBIOS 所以重新把之前寫的code 拿出來測試一下, 公司配給我一台Asus Laptop 發現一件有趣的事情, ACPI 仍然可以在E/F Segment 內被找到 RSDP, 但是 SMBIOS 的 ESP 卻已經移掉, 這件事情讓我感覺蠻奇怪的

所以就查了一下SMBIOS v3.0規格內寫的是 Non-UEFI system 還是需要 在F Segment 內提供ESP呀, ACPI 猜想也是, 搞不太懂 ASUS 為啥一個拔掉一個還留著, 理論上為了最大相容性, 應該是都留著會比較好, 雖然他是UEFI only 的設計了, 但是我看過 WINCE一個詭異的設計是透過UEFI bootloader 去支援APIC mode 就是只在開機階段透過UEFI bootloader 去parsing ACPI table 然後自己切 Interrupt mode 到APIC mode其他部份保持WINCE本來的樣子

Note: OpenstreesMap 商業使用

昨天聽到一個很有趣的事情說OpenStreesMap 可以商用我就問了說架了Tile server 嗎? 對方說沒有它可以直接商用, 但是根據資料應該是資料可以商用但是Tile Server之類的需要自己提供, 畢竟他是一個慈善性基金會, 沒道理要提供Server 去服務商業行為呀

不過後來我很明智的閉嘴不在糾結這些問題上, 畢竟有時候對方思維陷入他自己的區域, 而且異常有自信時, 這時講啥對方都無法接受外來意見的

https://wiki.openstreetmap.org/wiki/Introduction_to_OSM_for_Business_Users

Note: Some C# code snippets

最近工作內容牽扯 customization Windows Image, 或是需要緊急處理狀況, 都在用C sharp 多, 有時候發現內建.Net 有大量System libraries 還蠻方便的

installProductKey 這個實際上是參考 slmgr.vbs 去找出它如何 Install Product Key of Windows, 至於 getBaseBoardManufacturer 就是透過WMI去讀SMBIOS Data, 是有遇過BIOS 沒填好SMBIOS的狀況

static void installProductKey(string key)
{
    var mbs = new ManagementObjectSearcher("Select Version From SoftwareLicensingService");
            
    foreach (ManagementObject mo in mbs.Get())
    {
        mo.InvokeMethod("InstallProductKey", new object[] { key });
    }

}

static public string getBaseBoardManufacturer()
{
    string ret = "Unknow";
    try
    {
        var mbs = new ManagementObjectSearcher("Select Manufacturer From Win32_BaseBoard");
        foreach (ManagementObject mo in mbs.Get())
        {
            ret = mo["Manufacturer"].ToString();
        }
    }
    catch (Exception)
    {
        ret = "Unknow"; // Normally don't have SMBIOS information
    }
    return ret;
}

snippets on github