最近需要實現乙個功能,在驅動中建立檔案的符號鏈結。搜了一圈,只能找到 mklink 命令, mklink 命令顯然不能在核心呼叫。
因為大部分的系統呼叫最終都會呼叫到核心層的實現,所以整體思路就是搞清楚 mklink 的實現,找到對應的核心介面。
簡單搜尋了下系統目錄,發現並沒有 mklink 檔案,因此懷疑 mklink 是 cmd 的內建命令。驗證這個想法很簡單,直接把 cmd 拖入 ida,搜尋相關字串(mklink),果然:
看到這個,一般的猜想就是 mklink 是命令名,emklink是對應的命令處理函式。
我們可以驗證一把。
使用 windbg 載入 cmd,根據 _makelinkstr 的偏移,也就是圖一中的 401be8,計算出載入後的真實位址。對這個位址下乙個讀斷點(windbg:ba r命令;gdb:watch命令),之後 f5。在 cmd 中輸入 mklink,回車。我們就會發現斷點被斷下來了,斷下的位置是wcsicmp,也就是在字串比較,那麼只可能是在比較命令字串,畢竟 cmd 中內建了很多命令,需要乙個乙個比較。
我們可以先 shift+f11 出來,到達 cmd 的領空,之後一直 f10,記得盯著 cmd 的輸出,如果 cmd 有新的輸出,那麼就說明咱們走過了^_^。最終可以確定,emklink 就是 mklink 的命令處理函式。
進入 emklink 之後,我們跳過 stub 函式,到達makelink函式。從函式的實現來看除了驗證引數之外,一共有以下的幾個實現:
makesymlink
makehardlink
makejunction
對應著 mklink 的幾個功能。因為這次我們要實現的功能是檔案的符號鏈結,所以我們進入makesymlink函式。函式的實現很簡單,呼叫了createsymboliclinkw函式。從 msdn 上或者 windbg 上都能知道,這個函式從 kernel32(win7)中匯出(因為家裡的工作機是 win8.1,所以函式是從 kernelbase.dll 中匯出的)。那麼接著我們就需要開擼createsymboliclinkw。
createsymboliclinkw的實現也很簡單,主要做了路徑轉換,之後呼叫ntcreatefile與ntfscontrolfile。我們知道 ntdll 中的 nt* 函式,最終對應 nt 中的 zw* 函式,nt!zw* 函式最終執行到 nt!nt* 函式。
因此對於我們而言,到目前為止,我們已經知道了建立檔案符號鏈結的整個過程,只要在驅動層呼叫zwcreatefile與zwfscontrolfile即可。唯一需要確定的就是呼叫這兩個函式的引數。
本著大家都要動手實踐的原則,具體引數的賦值我就不給出了,只說明下關鍵的乙個引數。
在ntcreatefile中,createoptions 包含了 file_open_reparse_point 屬性;在ntfscontrolfile中,其fscontrolcode 值為 fsctl_set_reparse_point。
另外還有乙個神坑需要注意:ntfscontrolfile中的 inputbuffer 在末尾不能包含多餘的0位元組,否則會直接返回 錯誤。
重解析點的原理比較簡單,有興趣的可以翻閱 ntfs 的原始碼,裡面有相關的實現。
另外有部分部落格講的也很好,推薦下面這個部落格 ntfs重解析點(reparse points)。
windows批量建立資料夾
後處理的時候需要建立非常多的資料夾用以存放資料,而且資料夾的名字是有規律的。手動建立的話非常慢而且繁瑣,於是就搜尋批量建立資料夾的方法。在windows中可以用bat命令實現批量建立資料夾,但首先需要得到資料夾的名字。這可以用excel來實現。比如,我要建立的資料夾的名字只包含數字,從641到670...
windows用tree建立檔案目錄結構整理檔案
列表是體現檔案結構個具體檔名稱做簡單易懂的表現手法。簡單命令 1 生成詳細樹狀結構圖並列出所有檔名 cmd 進入命令列介面 d 進入相應碟符或檔案目錄 cd 指定目錄 tree f filetree.txt 到指定目錄下生成檔案的樹狀結構圖 2 生成詳細樹狀結構圖並列出目錄中的檔名稱 cmd 進入命...
IO 建立檔案
public class demo03 catch exception e public static void test3 throws ioexception,interruptedexception 刪除檔案 boolean flag src.delete system.out.println...