i开发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));
}
}
在我的步行功能中,我做这个
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 memoryn");
}
return STATUS_SUCCESS;
}
当我在驱动程序条目中使用这些功能时(当驱动程序加载时(,所有功能都很好。但是当我从dll调用它时;单词fine";只持续了2秒钟,然后我就看到了蓝色屏幕。
当我尝试从SM_MSI结构中删除Name变量时,一切都很完美。!!所以我理解问题是";wchar_t*名称"但我需要这个名字你知道该怎么办吗?
好吧,伙计们,我解决了这个问题,在我把它发送到dll,然后发送到驱动程序之前,我原谅了分配内存。
您正试图请求驱动程序在给定模块名称的进程中查找模块的基地址和大小。解决方案是根本不使用驱动程序,只需调用EnumProcessModules。如果你试图访问的进程有特殊保护,你无论如何都不应该篡改它;这将导致不明确的行为。