GlobalLock и глобальная память в режиме ядра? - PullRequest
1 голос
/ 16 сентября 2011

Как использовать globallock в режиме ядра?

Драйвер, связанный с kernel32.lib, всегда выдает системную ошибку 127. (Среда правильная)

Как я могу его использовать или что-то работает в режиме ядра?

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Глобальная / локальная память не имеет никакого смысла в режиме ядра.

Вы можете использовать ExAllocatePoolWithTag для выделения памяти ядра.

0 голосов
/ 16 сентября 2011

Способ преобразования дескриптора 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);

... Свободная память и что-то еще.

...