版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fzuim/article/details/81302056
- 限制剪切板,主要是限制不允许粘贴。我们对这两个系统API进行挂钩:
GetClipboardData和OleGetClipboard
//!<限制剪切板
InitHook("user32.dll", "GetClipboardData", (DWORD)hook_GetClipboardData);
InitHook("ole32.dll", "OleGetClipboard", (DWORD)hook_OleGetClipboard);
HANDLE _stdcall hook_GetClipboardData( UINT uFormat )
{
if (CF_HDROP == uFormat)
{//如果是文件,直接返回NULL
return NULL;
}
HANDLE hRet;
PAPIHOOK32_ENTRY phk = g_HookEntry[1];//我这边是用了全局数组存储InitHook New出来的指针
//恢复API头8个字节
RESTORE_OLDADDRESS(phk);
/* 这里可以添加想要进行的处理过程*/
//真正执行API函数
hRet = GetClipboardData( uFormat );
//写入跳转语句,继续Hook
SET_NEWADDRESS(phk);
return hRet;
}
HRESULT _stdcall hook_OleGetClipboard( IDataObject ** ppDataObj )
{
HRESULT hRet;
PAPIHOOK32_ENTRY phk= g_HookEntry[2];
//恢复API头8个字节
RESTORE_OLDADDRESS( phk);
/* 这里可以添加想要进行的处理过程*/
//真正执行API函数
hRet = OleGetClipboard( ppDataObj );
//写入跳转语句,继续Hook
SET_NEWADDRESS( phk);
// 判断是否是文件类型
FORMATETC cFmt = {(CLIPFORMAT) CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
HRESULT hTemp = (*ppDataObj)->QueryGetData( &cFmt);
if ( S_OK == hTemp)
{
return CLIPBRD_E_CANT_OPEN ;
}
return hRet;
}