希望我得到答案,即使这个问题可能听起来很愚蠢。
我已经阅读了关于使用ExAllocatePoolWithTag
分配内存的信息,但我仍然不知道我可以在哪里使用它以及我不允许这样做。
在我的情况下,我必须分配一个全局缓冲区。这是我尝试的方式:
POOL.H
#ifndef _POOL_H_
#define _POOL_H_
typedef struct _POOL_LIST {
CHAR list_data[500] ;
struct _POOL_LIST* next;
}
POOL_LIST, * PPOOL_LIST;
#ifdef __cplusplus
extern "C" {
#endif
extern ULONG pcount;
extern PPOOL_LIST PoolData;
void poolinitialize();
void poolterminate();
#ifdef __cplusplus
};
#endif
#endif // _POOL_H_
POOL.C
#include "precomp.h"
#pragma hdrstop
ULONG pcount = 0;
void poolinitialize()
{
PoolData = (PPOOL_LIST*) ExAllocatePoolWithTag(NonPagedPool, GLOBALBUFFERMAX, 'tag1');
}
void poolterminate()
{
ExFreePoolWithTag(PoolData, 'tag1');
}
这里我在WinXP x86 Checked构建环境中遇到链接器错误:
error LNK2001: unresolved external symbol _PoolData
error LNK1120: 1 unresolved externals
如果我不将其声明为extern,则PPOOL_LIST PoolData;
我会收到另一个错误
error LNK2005: _PoolData already defined in filter.obj
但我可以声明pcount,为什么不是PoolData?
答案 0 :(得分:0)
extern
关键字用于表示变量位于其他位置 - 例如它存在于某个地方。因此编译工作。
链接器实际上正在寻找PoolData的一个实例,但它找不到它。
在你的C文件中声明:
PPOOL_LIST PoolData;
//没有extern
。
或
static PPOOL_LIST PoolData;
//只能从此C文件中访问