我开发了kervel驱动程序,并与dell进行了通信。尝试做一个快照功能和行走功能
我的结构是
struct SM_MSI {
wchar_t* Name;
SIZE_T Size;
uintptr_t Address;
};
在我的快照函数中,我这样做。
ModulesList = ExAllocatePool(PagedPool, sizeof(SM_MSI) * index);
if (ModulesList == NULL) // check memory is allocated or not.
{
return STATUS_UNSUCCESSFUL;
}
index = 0;
for (PLIST_ENTRY pListEntry = (PLIST_ENTRY)((PPEB_LDR_DATA)pPeb->Ldr)->InLoadOrderModuleList.Flink;
pListEntry != &((PPEB_LDR_DATA)pPeb->Ldr)->InLoadOrderModuleList; pListEntry = (PLIST_ENTRY)pListEntry->Flink)
{
PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
if (pEntry->BaseDllName.Buffer > 0 && pEntry->BaseDllName.Length < 256) {
ModulesListCount = ModulesListCount + 1;
SM_MSI temp = { 0 };
temp.Name = (wchar_t*)ExAllocatePool(PagedPool, sizeof(wchar_t) * 256);
if (temp.Name != NULL)
wcscpy_s(temp.Name, 256, pEntry->BaseDllName.Buffer);
temp.Size = pEntry->SizeOfImage;
temp.Address = (uintptr_t)pEntry->DllBase;
memcpy((PVOID)((ULONG_PTR)ModulesList + ((index++) * sizeof(SM_MSI))), &temp, sizeof(SM_MSI));
}
}
在walk函数中,我执行以下操作
NTSTATUS ProcModulesWalk(OUT SM_MSI* module_sys_info) {
if (ModulesListCount == 0)
return STATUS_ACCESS_DENIED;
memcpy(module_sys_info, (SM_MSI*)((ULONG_PTR)ModulesList) + ModulesListIndex++, sizeof(SM_MSI));
if (ModulesListIndex >= ModulesListCount) {
ModulesListCount = 0;
ModulesListIndex = 0;
ExFreePool(ModulesList); // free memory
DbgPrintEx(0, 0, "free memory\n");
}
return STATUS_SUCCESS;
}
当我在我的驱动程序条目中(当驱动程序加载时)使用这个函数时,所有的工作都很好。但当我从dll中调用它时,只有2秒钟的时间“Word Fine”,然后我就会出现蓝屏。
当我尝试从SM_MSI结构中删除Name变量时,所有工作都很完美。!!所以我知道问题是“wchar_t*name”,但我需要这个名字,所以知道该怎么做吗?
您正在尝试请求驱动程序在给定模块名称的进程中查找模块的基址和大小。解决方案是完全不使用驱动程序,只需调用EnumProcessModules。如果您试图访问的进程有特殊的保护,您无论如何都不应该篡改它;这将导致未定义的行为。
问题内容: 我正在尝试打电话 直接,但获得EFAULT错误代码。出现此错误是因为 buf 指向内核空间中的内存。 那么,是否有可能从内核分配用户空间内存? 与 内核内存相似并返回指向内核内存的指针。 问题答案: 您可以使用以下方法临时禁用内存地址有效性检查:
问题内容: 我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“ get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,并且其长度在size参数中传递。但是,meta_buf是可变长度的缓冲区,已分配(在用户空间程序的vm页面中)并由内核填充。用户空间程序将释放该区域。 (我无法在用户空间中分配数据,因为用
固定映射地址和输入输出重映射 固定映射地址是一组特殊的编译时确定的地址,它们与物理地址不一定具有减 __START_KERNEL_map 的线性映射关系。每一个固定映射的地址都会映射到一个内存页,内核会像指针一样使用它们,但是绝不会修改它们的地址。这是这种地址的主要特点。就像注释所说的那样,“在编译期就获得一个常量地址,只有在引导阶段才会被设定上物理地址。”你在本书的前面部分可以看到,我们已经设定
简介 内存管理是操作系统内核中最复杂的部分之一(我认为没有之一)。在讲解内核进入点之前的准备工作时,我们在调用 start_kernel 函数前停止了讲解。start_kernel 函数在内核启动第一个 init 进程前初始化了所有的内核特性(包括那些依赖于架构的特性)。你也许还记得在引导时建立了初期页表、识别页表和固定映射页表,但是复杂的内存管理部分还没有开始工作。当 start_kernel
问题内容: 我注意到当我运行高度依赖CPU的python程序时,它仅使用一个内核。运行该程序时是否可以为其分配多个内核? 问题答案: 您必须为多个内核进行显式编程。有关Python中的许多并行处理解决方案,请参见此页面上的“对称多处理”选项。如果您不愿意比较这些选项,那么并行Python是一个不错的选择,请查看此处的示例。 但是,有些问题不能利用多核。考虑一下如何在三个朋友的帮助下更快地上楼梯。不
目录 第9章 联编并安装 FreeBSD 内核 第10章 调试内核