2012年4月8日 星期日

[Win32] Disk raw data read/write

會特別寫這篇就是因為, raw data 讀寫在 linux 下是很簡單的工作, 在 windows 下我卻找了很久才找到方法.

讀寫方法要用 CreateFile/ReadFile/WriteFile/DeviceIoControl 的方法下去操作, 而 CreateFile 要用
\\PhysicalDriveN
這個名字, N 從 0 開始, 而哪一個數字代表哪一個磁碟機, 可以在 windows 管理裡看的到:
理想上 PhysicalDrive 號碼是連續的, 但實際上通常不是, 所以最好還是依號去掃描看看哪一個是可以用的.
抓出 PhysicalDrive 後, 就可以用 ReadFile 跟 WriteFile 讀寫每一顆硬碟的 MBR 跟實體磁區資料, 但這樣做太危險了, 所以這裡只對可熱插拔 removable 的下手. 而要知道哪一個 physicaldrive 是 removable disk, 就要用 DeviceIoControl 搭 IOCTL_DISK_GET_DRIVE_GEOMETRY 去查, 如這一頁寫的 code:
DISK_GEOMETRY 裡的成員 MediaType 值如果是 11(dec), 就是可移除的.

至於怎麼抓出被 mount 到哪一個 label, 重改 MBR 時怎麼 unmount, 那就再研究....


[後記 2012/04/26]
直接去找 PhysicalDrive 有好有壞, 好處是即使不被 OS mount 起來也可以找的到 (例如檔案系統如果是 ExtFS 或 linux swap 時), 壞處是無法直接推得它被 OS mount 到哪一個 driver letter 去. 在後者, 比較好的做法, 是從已被 mount 上 OS 後的 driver letter 去回推它是哪一個 physical driver. 如果要知道目前有哪些 driver letter 是有效的, 可以用:
DWORD GetLogicalDrives(void);
的回傳值取得, 因為 windows 只能 A: ~ Z: 共 26 個代號, 所以分別是 bit 0 ~ bit 25, 該 bit 為 1, 就表示這個 driver letter 存在.
然後再用
DeviceIoControl 的
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
命令取得有多少 physical driver 被 mount 到這個 driver letter 來 (因為在 NTFS 裡可以這樣做),
VOLUME_DISK_EXTENTS[0].DiskNumber 就是被找出的第一個 PhysicalDrive 數字代號.


嗯, 然後回到原來的文章, 這樣就可以從指定 driver letter 去做實體層磁區的讀寫動作.

[後記 2012/11/18]
如果是對 SD 卡讀寫, 而且 SD 卡要被用在非 windows 族 OS 上讀寫的話, 可能要注意一下 SD 卡對應 c/h/s 參數的問題, 因為在 windows 下會被統一設定成 255 heads, 63 sectors by track. 但 linux 或 BSD 底下看到的就不一定是這樣的數字...
解決方法嘛... 個人會建議把整張卡 geometric 重做, 當然, 重做之前要記得備份...
重設 geometric 的方法:
http://processors.wiki.ti.com/index.php/SD/MMC_format_for_OMAP3_boot


2012年3月18日 星期日

八里的小吃..

昨天突發奇想跑來這個地方逛... 這篇要講的店離這個座標約 10 公尺:

這種餅原型是東北大餅, 但原始的東北大餅很硬, 後來有人把內餡改良成軟質的之後, 才比較開始看的到它 (以前台北車站舊國光站那有個攤子有, 現在那攤子不知道去哪了..), 這種蔥花餅是後來才有的, 它完全有抓餅的特性, 但皮與餡的感覺更加分明, 而且就算冷掉, 拿去烤箱重新烤過, 風味不變, 我非常喜歡.
這間攤位的正面....

老闆特地端出來給我拍, 真的很大一張...

餅跟老闆的合照:

大約在這個位置, 老榕樹碉堡再往南走一點

2012年1月10日 星期二

USB image tool

備份一下這個工具
它是整個 USB storage 備份/還原 的軟體, 所以 storage 有多大它就備份多少...

2012年1月5日 星期四

有關選舉...

南方公園這集對選舉的描述, 中肯跟貼切的程度, 只有核彈爆炸可以比擬...


南方公園S08E08,由於動物保護聯盟強烈譴責南方公園小學女籃隊的吉祥物是一隻乳牛,然後到南方公園小學去潑紅漆,搞到全校都很不爽,但是最後校方還是妥協了。

因此到最後學校準備了投票表決新吉祥物。憤怒的凱子決定發起南方公園吉祥物是"巨型浣腸器"的運動,用這種方法來表達南方公園小學生的不滿。

然後阿ㄆㄧㄚˇ拾人牙慧,推出另一個候選人"大便三明治",後來學校重選吉祥物的事件演變成兩個超爛吉祥物候選人的PK戰,巨型浣腸器 vs 大便三明治。

屎蛋變成雙方拉票的焦點,但是他在遭受凱子派饒舌歌手拿槍威脅他(vote or die, bitch)投票之後,又受到阿ㄆㄧㄚˇ拿糖果賄選的雙重打擊之下,提出了"兩黨一樣爛,我決定不投票"的看法。

結果因為這個決定,讓屎蛋被自己老爸老媽,還有全南方公園的鎮民唾棄,還被他們驅逐出南方公園。

被驅逐的屎蛋因緣際會之下加入動保聯盟,沒想到動保聯盟只是一群熱愛人獸交的白痴,但是其中有一個動保聯盟的成員說了一番話,啟發了他:

小屎蛋,你說要在浣腸器跟大便中間選一個,很白痴,但問題是,自從有投票之後,所有人一向都是在浣腸器跟大便中間,選一個他們覺得比較好的,不管他們覺得浣腸器比較好,還是大便比較好。

最後想通的屎蛋終於回去南方公園投票了,因為他明白,雖然他只能在浣腸器跟大便中間選一個,但是這一票的價值是不容許抹滅的,而他如果什麼都不投,等於是蔑視自己身為公民的權利與義務,還有過去這麼多人犧牲性命與人生,所換來的民主成果以及社會價值。

這個故事告訴我們,當你以為你在享受民主成果的時候,你不是一個合格的公民,民主,自由,公民投票,這些東西不是你他媽的與生俱來的,是你的前輩,你的同胞,你的很多很多不太相關的人幫你爭取來的,當你以為你可以什麼都不付出就享受民主的權利,當你以為你可以什麼都不管就踐踏你自己的那張票,當你以為你可以輕視你那張票的價值的時候,你完全就搞不清楚狀況。

因為民主不只是你的權利,她還是你他媽的義務,因為只有每個人都不再輕視自己手上的票,只有當每個人都願意揹上自己這個選擇的責任,只有當每個人都願意為民主而鄭重且忠於良心地投下這一票,並且在選出浣腸器或者是大便之後,能夠把責任放在自己的選擇上面,民主才能夠真正延續,我們的未來才有一個真正的民主,而非死去的民主軀殼。

所以你懂了沒??小屁孩??

不管你要選一號二號還是三號,快點去投票吧。

2011年12月11日 星期日

[心得] intel 跟 microsoft 的差別..

intel 努力把機器的速度從石器時代提升到文明時代,
microsoft 努力把機器的速度從文明時代拉回到石器時代.

2011年11月29日 星期二

沒有標題

ARM_VFPv2_R0P0_00BET0.zip 請不要問我這是什麼東西..
我只是很討厭 ARM 沒事情就亂改 link.
https://skydrive.live.com/?cid=ea95177ed13eeda8&sc=documents&uc=1&id=EA95177ED13EEDA8%21342

2011年11月23日 星期三

FAT 12/16/32 檔案讀寫機

修改自這個東西
因為這個會不時去讀 FAT, 往往會因為相對位址跳太遠造成 cache miss, 我就寫了一個 LRU cache 外掛給它用, 讓它即使是回去讀 FAT 都可以在 cache memory 裡找到資料. 檔案:
https://skydrive.live.com/?cid=ea95177ed13eeda8&sc=documents&uc=1&id=EA95177ED13EEDA8%21342#

原本這個軟體就是寫給 SD/MMC 卡用的, 還是需要自行將 raw data 讀寫 function 掛上去, 掛的方法可以參考 hostemu.h, hostemu.c 中的寫法.

會特別去找這個東西, 是因為 eboot 中 aruba board bsp 中的 FAT 讀檔機讀 FAT32 會不明原因死當, 有個自己可以掌握的 code 以後也可以方便 porting 到 MCU 之類的東西上..