我开发了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。如果您试图访问的进程有特殊的保护,您无论如何都不应该篡改它;这将导致未定义的行为。