icopyhook監控資料夾(一)
一 stdmethodimp型別的含義
#if defined(_win32) || defined(_mppc_)
// win32 doesn't support __export
#ifdef _68k_
#define stdmethodcalltype __cdecl
#else
#define stdmethodcalltype __stdcall
#endif
#define stdmethodvcalltype __cdecl
#define stdapicalltype __stdcall
#define stdapivcalltype __cdecl
#else
#define stdmethodcalltype __export __stdcall
#define stdmethodvcalltype __export __cdecl
#define stdapicalltype __export __stdcall
#define stdapivcalltype __export __cdecl
#endif
__stdcall
引數傳遞順序: 從右向左 最後乙個引數先傳遞,第乙個引數最後傳遞
棧的維護:被呼叫方清空棧
名字修飾約定:在函式名前面加下劃線,後面加「@」符號和引數的位元組數
從上面的巨集定義可以看出com介面中的呼叫方式採用的是__stdcall,也就是由com來維護棧。
二 那麼com是如何維護棧的呢?
com規範規定com介面都必須從iunknown繼承,iunknown包含三個函式,分別是 queryinte***ce、addref、
release。
在iclassfactory中的兩個虛函式createinstance和lockserver
iclassfactory : public iunknown
;在iunknown中可以看到三個虛函式queryinte***ce,addref,release
virtual hresult stdmethodcalltype queryinte***ce(
/* [in] */ refiid riid,
/* [iid_is][out] */ __rpc__deref_out void __rpc_far *__rpc_far *ppvobject) = 0;
virtual ulong stdmethodcalltype addref( void) = 0;
virtual ulong stdmethodcalltype release( void) = 0;
這兩段**在unknwn.h檔案中
com中對com物件生存週期的控制使用了「引用計數」技術
每乙個com物件都記錄了乙個稱為「引用計數」的數值,這個在程式中就是
long nlocks=0;
nlocks表示為有多少有效指標在引用該com物件。當得到了乙個指向該物件的介面指標時,引用計數值加1,當
用完了該介面指標後,引用計數減1,當引用計數減到0時,com物件就應該把自己從記憶體中清除掉,這樣也就達
到了維護棧的目的。
在addref函式中引用計數值加1,
在release函式中引用計數減1,如果為0,就清空該com物件。
三 icopyhook介紹
icopyhook是乙個用於建立拷貝鉤子處理程式com介面,可以用來監控資料夾的拷貝,移動,重新命名和刪除。如
果我們執行這些操作,那麼shell會在執行這些操作之前,呼叫icopyhook介面的copycallback方法對這些操作
進行驗證。
copycallback
函式原型
uint copycallback( hwnd hwnd,
uint wfunc,
uint wflags,
lpctstr pszsrcfile,
dword dwsrcattribs,
lpctstr pszdestfile,
dword dwdestattribs
);其中的引數hwnd是乙個視窗控制代碼
引數wfunc指定要被執行的操作,其取值為下表中所列之一:
常量 取值 含義
fo_copy 複製 由pszsrcfile指定的檔案到由pszdestfile指定的位置。
fo_delete 刪除 由pszsrcfile指定的檔案。
fo_move 移動 由pszsrcfile指定的檔案到由pszdestfile指定的位置。
fo_rename 重新命名 由pszsrcfile指定的檔案。
引數wflags指操作的標誌;
引數pszsrcfile指源資料夾
引數dwsrcattribs指源資料夾屬性。
引數pszdestfile指目標資料夾
引數dwdesattribs目標資料夾屬性
函式返回值可以為idyes、idno和idcancel。
copycallback返回乙個uint值指示shell是否應該繼續執行這個操作。返回值idyes表示繼續,而返回值idno和
idcancel則表示終止。
注意:當乙個資料夾物件可以安裝多個拷貝鉤子處理程式時,shell會依次呼叫每個處理程式。只有當每個處理
程式都返回idyes,或者任何乙個拷貝鉤子返回idno或者idcancel,shell才真正執行使用者請求的操作。
拷貝鉤子需要在登錄檔的下面這些地方註冊
註冊資料夾的地方
hkey_classes_root
directory
shellex
copyhookhandlers
your_copyhook
(default) =
C 監控 Windows 資料夾
您是否為無法看到孩子在電腦上儲存的而發愁,您是否為無法監控員工在電腦上儲存的東西而發愁,那麼今天給您推薦的這款產品絕對是您不二的選擇,它是由美國大廠生產,完全符合國際標準的產品,完美支援 windows 98 以上系統,他就是filesystemwatcher牌監控儀。他會偵聽檔案系統更改通知,並在...
Streaming監控指定資料夾檔案內容變化
導入庫 fromoperator importadd frompyspark importsparkcontext,sparkconf frompyspark.streaming importstreamingcontext 配置建立streamingcontext物件 conf sparkconf...
Windows C 監控共享資料夾變化
最近由於專案需求,需要編寫乙個監控本機共享資料夾的變化的模組,經過查詢資料,找到並實現了乙個較為穩定的方式 專案實現是使用win32 c 的,測試平台是win 7 64和win 10 64,xp測試也是好使的。下面是具體實現 首先要獲取並監控系統共享資料夾的路徑,相關登錄檔路徑為 hkey loca...