簡體   English   中英

是否可以“攔截”第三方庫的“WriteFile”操作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM