繁体   English   中英

在内核模式下分配全局池

[英]allocate global pool in kernel mode

希望我能得到一个答案,即使这个问题听起来很愚蠢。 我已经读过关于使用ExAllocatePoolWithTag分配内存的信息,但是我仍然不知道我可以在哪里实现它,以及在哪里不可以实现它。

就我而言,我必须分配一个全局缓冲区。 这是我尝试的方式:

游泳池

#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_

#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呢?

extern关键字用于表示变量位于其他位置,例如,它存在于某个位置。 因此,合并有效。 链接器实际上正在寻找PoolData的实例,但找不到它。

在您的C文件中声明:

PPOOL_LIST PoolData; //没有extern

要么

static PPOOL_LIST PoolData; //仅可从此C文件访问

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM