NtUserSetClipboardData находится в Win32k.sys (syscall(11e9) NtUserSetClipboardData)
попробуй чё-то вроде:
// импортируем версию ядра NT
extern PUSHORT NtBuildNumber;
#define NTCALL(_function) KeServiceDescriptorTable(Shadow)->win32k.ServiceTable[_function]
// определяем версию ядра системы
switch(*NtBuildNumber)
{
case 2195: // Windows 2000
FileID = 0x11e9;
break;
default:
return STATUS_NOT_IMPLEMENTED;
}
// устанавливаем перехват
TrueNtUserSetClipboardData = NTCALL(FileID);
__asm
{
cli // запрещаем прерывания
mov eax, cr0
mov uCR0, eax
and eax, 0xFFFEFFFF // сбросить WP bit
mov cr0, eax
}
NTCALL(FileID) = NewNtUserSetClipboardData;
__asm
{
mov eax, uCR0
mov cr0, eax // востановить содержимое CR0
sti // разрешаем прерывания
}
я не проверял, но вроде должно работать...