Способ преобразования дескриптора HGLOBAL в указатель в режиме ядра - это NtUserCreateLocalMemHandle, расположенный в Shadow SSDT.
После прочтения кода из реакторов это можно сделать следующим образом.
HANDLE hRetVal;
PVOID mem = NULL;
NTSTATUS status;
PDWORD size = NULL;
DWORD dwordsize = 4;
DWORD realsize = 0;
KAPC_STATE apcstate;
ZwAllocateVirtualMemory(NtCurrentProcess(), &size, 0, &dwordsize, MEM_COMMIT, PAGE_READWRITE)
KeStackAttachProcess(PsGetCurrentProcess(),&apcstate)
hRetVal = NtUserGetClipboardData(uFormat, pParam);//I am calling it in my hook
status = NtUserCreateLocalMemHandle(hRetVal, NULL, 0, size);
realsize = *size;
if(status == STATUS_BUFFER_TOO_SMALL)
{
ZwAllocateVirtualMemory(NtCurrentProcess(),&mem,0,size,MEM_COMMIT,PAGE_READWRITE);
status = NtUserCreateLocalMemHandle(hRetVal, mem, realsize, NULL);
ZwFreeVirtualMemory(NtCurrentProcess(),&mem,size,MEM_DECOMMIT)
}
if(mem != NULL)
{
ZwFreeVirtualMemory(NtCurrentProcess(),&size,&dwordsize,MEM_DECOMMIT);
}
KeUnstackDetachProcess(&apcstate);
... Свободная память и что-то еще.