- 限制剪切板,主要是限制不允许粘贴。我们对这两个系统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)
{
return NULL;
}
HANDLE hRet;
PAPIHOOK32_ENTRY phk = g_HookEntry[1];
RESTORE_OLDADDRESS(phk);
hRet = GetClipboardData( uFormat );
SET_NEWADDRESS(phk);
return hRet;
}
HRESULT _stdcall hook_OleGetClipboard( IDataObject ** ppDataObj )
{
HRESULT hRet;
PAPIHOOK32_ENTRY phk= g_HookEntry[2];
RESTORE_OLDADDRESS( phk);
hRet = OleGetClipboard( ppDataObj );
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;
}