[英]Is it possible to “intercept” a 3rd party library's “WriteFile” operation
這可能是一個很長的鏡頭,但我想我還是會問。 我正在使用文檔管理系統的API。 它們提供了一種“WriteFile”方法,用於將給定文檔保存到磁盤。 但是,庫沒有辦法簡單地將文檔讀入內存。 我似乎唯一的選擇是寫入磁盤,然后再讀回來。 我想知道是否有更好的方法來解決這個明顯的限制。
該方法為生成的文件路徑采用字符串。 方法簽名:
void ImageInfo.WriteFile(string Filename);
理論上,有可能攔截任何進程的WriteFile win32 API調用,無論是.NET,C ++等,使用稱為導入地址表掛鈎的東西,它實際上是Windows上軟件測試的一個有價值的工具。
基本上,您可以覆蓋導入地址表中的WriteFile,kernel32.dll條目以指向您的方法,然后攔截嘗試寫入的字節。
在上面的層中可能還有其他方法,比如在.NET中你可以更改第三方應用程序DLL的ILASM代碼。 或者擁有自己的某些.NET dll版本,它們取代了一些標准的.NET類。
實際上,它可能並不值得,例如,如果API沒有明確地將文件刷新到磁盤,則后續讀取可能最終來自OS文件緩存,並且不會是那么大的性能問題。 您可以通過創建文件並在調用WriteFile之前保持打開來實現此目的(只是猜測)。
當然,我想你已經對它進行了分析和測量。
您需要一個可以調用托管代碼回調的Windows API掛鈎庫。 Easyhook就是這樣一個庫。 請注意,在完成后你可能沒有獲得任何東西,文件系統緩存已經提供了對文件數據的直接內存訪問。
聽起來API並不提供閱讀部分,因為它們無法提供比.NET框架中已有的更好(更高性能)的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.