note : add COM interface To Shell Extension DLL
发布日期:2021-06-30 22:03:58 浏览次数:2 分类:技术文章

本文共 3882 字,大约阅读时间需要 12 分钟。

引言

CodeProject上有一篇文章, 讲了怎么进行COM Hook.

Com 接口 Hook 后, 当Windows特定操作发生时,  

会由我们重载的COM接口实现, 来决定那个COM操作成功还是失败.

达到Windows行为管控的目的.

对于新手来说, 那个文章看完,还达不到能随意加入自己想要的COM接口的目的.

经过试验, Vs2010产生的ATL COM DLL 框架很难按照那篇文章加入想要的COM接口.

我采用的方法是, 用VC6产生COM DLL 框架, 加入自己想要的COM接口重载, 然后用VS2010打开,修改逻辑, 编译.

我的本来目的,是要加入一个IFileOperation接口, 实现在Win7上,管控文件操作.

因为在Win7上, 用API Hook 的方法,来拦截文件操作, 无法同时得到源文件和目标文件的全路径.

在搞这个之前,先彻底搞清楚, 如何利用VS编译器,加入自己想要的COM接口.

学了这篇文章,收获不小.

经过试验, 将最简化的加COM接口到COM DLL的试验, 记录如下:

建立ATL COM DLL 工程

这个ATL Object 的属性,默认属性符合要求,不用改

修改加入的Hook类 CLsDOHook

// LsDOHook.h : Declaration of the CLsDOHook#ifndef __LSDOHOOK_H_#define __LSDOHOOK_H_#include "resource.h"       // main symbols#include 
///< @note 3. 加入ICopyHook 头文件定义/// CLsDOHook/// CLsDOHook mean's LostSpeed Dir Operation Hook Classclass ATL_NO_VTABLE CLsDOHook : public CComObjectRootEx
, public CComCoClass
, public ICopyHook, ///< @note 1. 手工加入要继承的COM类 public IDispatchImpl
{public: CLsDOHook() { } /// @note 4. 加入必须实现的COM虚函数接口定义 /// 由SHLOBJ.H抄来的纯虚函数定义, 将 PURE 修饰拿掉 // *** ICopyHook methods ***// STDMETHOD_(UINT,CopyCallback) (THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs,// LPCWSTR pszDestFile, DWORD dwDestAttribs) PURE; STDMETHOD_(UINT,CopyCallback) ( THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs, LPCWSTR pszDestFile, DWORD dwDestAttribs);DECLARE_REGISTRY_RESOURCEID(IDR_LSDOHOOK)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CLsDOHook) COM_INTERFACE_ENTRY(ILsDOHook) COM_INTERFACE_ENTRY(IDispatch) /// @note 2. 指定 ICopyHook 由 CLsDOHook处理 COM_INTERFACE_ENTRY_IID(IID_IShellCopyHook, CLsDOHook)END_COM_MAP()// ILsDOHookpublic:};#endif //__LSDOHOOK_H_
// LsDOHook.cpp : Implementation of CLsDOHook#include "stdafx.h"#include "LsComHookShellExt.h"#include "LsDOHook.h"/// CLsDOHook/// @note 5. 实现继承来的纯虚COM接口STDMETHODIMP_(UINT) CLsDOHook::CopyCallback(	THIS_ HWND hwnd, 	UINT wFunc, 	UINT wFlags, 	LPCWSTR pszSrcFile, 	DWORD dwSrcAttribs,	LPCWSTR pszDestFile, 	DWORD dwDestAttribs){	/// do some thing ...	/// 工程需要选择 "Win32 Unicode Release MinDependency" 编译 !	::MessageBoxW(		NULL, 		pszSrcFile, 		pszDestFile, 		MB_OK | MB_ICONINFORMATION);		return IDYES; ///< 允许}/// @note 6. 按照 msdn CopyCallback 说明, 修改 LsDOHook.rgs/// 使Windows操作和COM DLL关联/** msdn CopyCallback descriptionhttp://msdn.microsoft.com/en-us/library/windows/desktop/bb776048(v=vs.85).aspx	Copy hook handlers for folders are registered under the following key.   	HKEY_CLASSES_ROOT		Directory			Shellex				CopyHookHandlers					your_copyhook						(Default) = {copyhook CLSID value}							Copy hook handlers for printers are registered under the following key. 		HKEY_CLASSES_ROOT		Printers			Shellex				CopyHookHandlers					your_copyhook						(Default) = {copyhook CLSID value}*/

修改.rgs文件, 使COMDLL的Hook操作和Windows动作关联

HKCR{	LsComHookShellExt.LsDOHook.1 = s 'LsDOHook Class'	{		CLSID = s '{03E13B03-DE82-41D8-BAEF-E61927F589C2}'	}	LsComHookShellExt.LsDOHook = s 'LsDOHook Class'	{		CLSID = s '{03E13B03-DE82-41D8-BAEF-E61927F589C2}'		CurVer = s 'LsComHookShellExt.LsDOHook.1'	}	NoRemove CLSID	{		ForceRemove {03E13B03-DE82-41D8-BAEF-E61927F589C2} = s 'LsDOHook Class'		{			ProgID = s 'LsComHookShellExt.LsDOHook.1'			VersionIndependentProgID = s 'LsComHookShellExt.LsDOHook'			ForceRemove 'Programmable'			InprocServer32 = s '%MODULE%'			{				val ThreadingModel = s 'Apartment'			}			'TypeLib' = s '{FDBCC028-75E1-48FA-9070-78C9CE2B8B0D}'		}	}	Directory	{		Shellex		{			CopyHookHandlers			{				LsDOHook = s '{03E13B03-DE82-41D8-BAEF-E61927F589C2}'			}		}	}}

注册COM DLL

C:\Documents and Settings\Administrator>regsvr32 C:\lstmp\LsComHookShellExt\ReleaseUMinDependency\LsComHookShellExt.dll

重启计算机, 试验Hook效果

当我们拷贝一个目录到另一个目录时, 操作会进入我们的 COM Shell 扩展DLL

备注

有了上面的试验基础,  我们添加想要的 COM接口 到 我们自己的Shell Extension DLL, 应该很容易了~~

转载地址:https://lostspeed.blog.csdn.net/article/details/12133471 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:note : Creates a hidden IE window
下一篇:Disk Opt

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月13日 04时36分03秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章