Memory 内核模式下的GlobalLock和全局内存?
如何在内核模式下使用globallock 与kernel32.lib链接的驱动程序总是给我系统错误127。(环境是正确的)Memory 内核模式下的GlobalLock和全局内存?,memory,kernel,driver,Memory,Kernel,Driver,如何在内核模式下使用globallock 与kernel32.lib链接的驱动程序总是给我系统错误127。(环境是正确的) 我如何使用它,或者在内核模式下有什么工作吗?全局/本地内存在内核模式下没有任何意义 您可能希望使用ExAllocatePoolWithTag进行内核内存分配。全局/本地内存在内核模式下没有任何意义 您可能希望使用ExAllocatePoolWithTag进行内核内存分配。在内核模式下,将HGLOBAL句柄转换为指针的方法是位于Shadow SSDT中的NtUserCreat
我如何使用它,或者在内核模式下有什么工作吗?全局/本地内存在内核模式下没有任何意义
您可能希望使用
ExAllocatePoolWithTag
进行内核内存分配。全局/本地内存在内核模式下没有任何意义
您可能希望使用
ExAllocatePoolWithTag
进行内核内存分配。在内核模式下,将HGLOBAL句柄转换为指针的方法是位于Shadow SSDT中的NtUserCreateLocalMemHandle。
从reactos读取代码后,可以这样做
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);
在内核模式下,将HGLOBAL句柄转换为指针的方法是位于Shadow SSDT中的NtUserCreateLocalMemHandle。 从reactos读取代码后,可以这样做
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);
…释放内存和其他内容。我需要读取全局内存。一些功能正在发挥作用HGLOBAL@iamsleepy:一个内核模式函数返回给您
HGLOBAL
?这是什么功能?@iamseleepy:等等,这不就是你给它的缓冲区吗?为什么HGLOBAL是必需的?它返回一个句柄。我不知道如何处理它(ObjReferenceObjectByHandle是我的第一个想法,但不起作用)。在用户模式下,它肯定是HGLOBAL。有什么建议吗?我查过了,第二个参数(PVOID pParam)看起来像一个包含格式和其他信息的结构。我需要读取全局内存。一些功能正在发挥作用HGLOBAL@iamsleepy:一个内核模式函数返回给您HGLOBAL
?这是什么功能?@iamseleepy:等等,这不就是你给它的缓冲区吗?为什么HGLOBAL是必需的?它返回一个句柄。我不知道如何处理它(ObjReferenceObjectByHandle是我的第一个想法,但不起作用)。在用户模式下,它肯定是HGLOBAL。有什么建议吗?我查过了,第二个参数(PVOID pParam)看起来像一个包含格式和其他信息的结构。