佚名通过本文主要向大家介绍了内核模式,360浏览器内核模式,chrome内核模式,内核模式驱动程序,内核模式驱动程序框架等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 内核模式下内存释放问题,望大神解答!!
描述:
我在函数结束时释放和在调用函数后释放都会出错。
解决方案1:
描述:
内存释放
在下面的这段代码中,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;
}
解决方案1:
每个return之前都要加释放。
解决方案2:应该是已经释放了,加点打印看看什么时候释放的
解决方案3:看出错提示什么,如果提示没有空间释放,那么在代码某个部位已经释放了,如果不是,看函数,参数是否一致