我无法获得内存损坏的地方,我发送指向FooFile_Factory的指针,它在Heap上分配内存并初始化它。但是当控件返回到调用FooFile_Factory的void时,分配的内存就是 损坏/随机值。无法理解为什么?
typedef struct _FOO_FILE{
PFLT_CONTEXT StreamContext;
...
} FOO_FILE, *PFOO_FILE;
NTSTATUS
FooFile_Factory(
_Out_ PFOO_FILE pFile
)
{
NTSTATUS status;
pFile = ExAllocatePoolWithTag( //Allocation on heap
NonPagedPool,
sizeof(FOO_FILE),
FOO_FILES_TAG);
if (!pFile) {
return INSTALL_MORE_MEMORY;
}
RtlZeroMemory(pFile, sizeof(FOO_FILE));
//Some Initializatoin
//Here pFile fields values are correct, PFLT_CONTEXT is null
return status;
}
NTSTATUS
VoidThatCall()
{
NTSTATUS status;
PFOO_FILE pFile = NULL;
status = FooFile_Factory(pFile);
//--> Here PFOO_FILE fields values became corrupted (PFLT_CONTEXT give memory access error)
...
}
答案 0 :(得分:3)
我们可以找到一个类比:
#include <stdio.h>
void f(int n) { n = 42; }
int main(void) { int n = 3; f(n); printf("%d\n", n); return 0; }
由于按值调用函数,将打印3
。
在你的例子中,同样的事情发生了。
#include <stdio.h>
void f(int *p) { p = ...; }
int main(void) { int *p = NULL; f(p); printf("%p\n", (void *)p); return 0; }
调用函数中p
的值不会改变。解决它的一种方法是使用指向指针的指针:
#include <stdio.h>
void f(int **p) { *p = ...; }
int main(void) { int *p = NULL; f(&p); printf("%p\n", (void *)p); return 0; }