内核模式下内存释放问题,望大神解答!!

Vinx911 2016-04-28 11:16:30
在下面的这段代码中,
pValue->Buffer = (PWSTR)ExAllocatePool(PagedPool, pBuffer->DataLength);
申请的内存在哪里释放??
我在函数结束时释放和在调用函数后释放都会出错。


NTSTATUS Reg_GetStringValue(IN HANDLE hKey, IN LPCWSTR pszValueName, OUT PUNICODE_STRING pValue)
{
NTSTATUS status = STATUS_SUCCESS;
UNICODE_STRING ValueName;
RtlInitUnicodeString(&ValueName, pszValueName);
ULONG ResultLength = 0;
status = ZwQueryValueKey(hKey, &ValueName, KeyValuePartialInformation, NULL, 0, &ResultLength);

if (status == STATUS_OBJECT_NAME_NOT_FOUND || ResultLength == 0)
{
KdPrint(("注册表键值不存在!\n"));
return CUSTOM_STATUS_REGISTRY_KEY_NOTEXIST;
}
KEY_VALUE_PARTIAL_INFORMATION *pBuffer =
(PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, ResultLength);
if (pBuffer)
{
status = ZwQueryValueKey(hKey, &ValueName, KeyValuePartialInformation, pBuffer, ResultLength, &ResultLength);
if (pBuffer->Type != REG_SZ)
{
KdPrint(("注册表键值类型不匹配!\n"));
return CUSTOM_STATUS_REGISTRY_KEYVALUE_TYPEMISMATCH;
}
pValue->Buffer = (PWSTR)ExAllocatePool(PagedPool, pBuffer->DataLength);
if (pValue->Buffer)
{
pValue->MaximumLength = (USHORT)pBuffer->DataLength;
pValue->Length = pValue->MaximumLength-2;
RtlMoveMemory(pValue->Buffer, pBuffer->Data, pBuffer->DataLength);
}
else
{
return STATUS_INSUFFICIENT_RESOURCES;
}
ExFreePool(pBuffer);
}
else
{
return STATUS_INSUFFICIENT_RESOURCES;
}

return STATUS_SUCCESS;
}
...全文
181 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
i80428048 2016-05-20
  • 打赏
  • 举报
回复
每个return之前都要加释放。
HeroKern 2016-04-30
  • 打赏
  • 举报
回复
看出错提示什么,如果提示没有空间释放,那么在代码某个部位已经释放了,如果不是,看函数,参数是否一致
fly 100% 2016-04-30
  • 打赏
  • 举报
回复
应该是已经释放了,加点打印看看什么时候释放的

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧