gpt4 book ai didi

c - 在内核模式下分配全局池

转载 作者:行者123 更新时间:2023-11-30 17:43:03 24 4
gpt4 key购买 nike

希望我能得到答案,即使这个问题听起来很愚蠢。我现在已经阅读了有关使用 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 检查构建环境中遇到链接器错误:

error LNK2001: unresolved external symbol _PoolData
error LNK1120: 1 unresolved externals

如果我不将其声明为外部,只需 PPOOL_LIST PoolData; 我会收到另一个错误

error LNK2005: _PoolData already defined in filter.obj

但是我可以声明 pcount,为什么不能声明 PoolData 呢?

最佳答案

extern 关键字用于表示该变量位于其他位置 - 例如它存在于某处。所以编译有效。链接器实际上正在寻找 PoolData 的实例,但未能找到它。

在你的 C 文件中声明:

PPOOL_LIST PoolData;//不带extern

static PPOOL_LIST PoolData;//只能从此 C 文件访问

关于c - 在内核模式下分配全局池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20325624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com