2015-10-14 43 views
3

當系統中的任何進程加載特定的DLL或所有DLL加載事件(我可以過濾掉)時,是否可以在我的程序中獲得通知? 就像進程管理器如何從所有進程獲取通知一樣。 我可以使用進程資源管理器來達到這個目的,但是我想在一個特定的DLL加載事件的情況下采取行動(顯示一個彈出窗口)。DLL負載通知

我也在尋找任何可以爲我完成這項工作的開源程序。

非常感謝您提前。

+0

看到此問題[C#相當於C(WinAPI)中的DllMain](http://stackoverflow.com/questions/8206736/c-sharp-equivalent-of-dllmain-in-c-winapi) – lsalamon

+0

@lsalamon你可以使用'DllMain'來知道*特定的* DLL在一個進程中被加載的時間,但是它不會幫助你知道什麼時候一個任意的DLL被加載到一個任意的進程中,這兩個進程都是你控制的,我認爲這是@rplusg在尋找。 –

回答

2

是的,您可以通過Windows'ETW(Windows事件跟蹤)工具獲取映像(.dll,.exe)加載事件。 ETW是一種快速,低開銷的日誌記錄機制,並且大多數Windows內核都是用來發布事件的。

ETW具有發佈事件集合的「提供者」的概念。例如,.NET運行時有一個CLR提供程序,內存管理器/驅動程序/映像/文件系統/用戶事件的內核提供程序,HTTP /網絡事件的IIS提供程序,甚至是第三方編寫的自定義提供程序。

您需要在ETW內核提供者上啓用EVENT_TRACE_FLAG_IMAGE_LOAD才能獲得Image_Load事件。對於託管代碼,您可以使用CLR ETW提供程序中的AssemblyLoadModuleLoad事件。

您可以從本機代碼和託管代碼生成並使用ETW事件。與之合作有點困難,但一旦你開始收集數據,就有大量數據可用。 Vance Morrison創建了short walkthrough on consuming ETW events via C#並創建了TraceEvent庫。

此外,請參閱我以前的SO帖子herehere瞭解ETW的更多信息。

或者,您可以使用WMI(Windows Management Instrumentation)來獲取這些事件,但您必須爲它們進行輪詢。與輪詢系統中所有進程中的所有模塊相比,輪詢WMI仍然需要的資源更少。

如果你走WMI路線,看看Win32_ModuleLoadTrace and Win32_Process類型。 .NET框架有一個reasonable WMI API

+0

非常感謝chris! – rplusg

0

請與我裸露,我是相當新的C#和.NET,但你可以使用這裏顯示的東西,如例如:https://msdn.microsoft.com/en-us/library/27688t9c(v=vs.90).aspx和迭代ProcessModuleCollection列出DLL的每個進程加載,記錄這些和監控改變?可能資源密集雖然.....

+0

是的,枚舉通過所有加載的DLL是資源密集型的並且多次執行不是一個選項。感謝您的建議,但。 – rplusg

+0

可能在這裏幫助:http://stackoverflow.com/questions/6503013/how-to-get-notification-of-dll-loads-happening-in-my-software-inside-my-own-pro看起來像hotpatch到LoadLibrary選項是你想要的,但看起來相當複雜。 – Gavzooka