内存与链表

3.2.1 内存分配与释放

NTSTATUS status;
//定义一个内存分配标记
##define MEM_TAG ‘MyTt’
//定义目标字符串
UNICODE_STRING dst ={0;
UNICODE_STRING src = RTL_constant_STRING(L"my source string!");
//分配内存空间
dst.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool,src.Length,MEM_TAG);
if(dst.Buffer ==NULL)
{
status = STATUS_INSUFFICIENT_RESOURCES;
}
dst.Length = dst.MaximumLength = src.Length;
RtlCopyUnicodeString(&dst,&src);

//EXAllocatePoolWithTag和ExFreePool必须成对存在,ExFreePool释放内存
ExFreePool(dst.Buffer);
dst.Buffer = NULL;
dst.Length = dst.MaxinumLength = 0;

3.2.2 LIST_ENTRY

//构造个链表
typedef struct{
PFILE_OBJECT file_object;
UNICODE_STRING file_name;
LARGE_INTEGER file_length;
}MY_FILE_INFOR,*PMY_FILE_INFOR;

//双向链表LIST_ENTRY的结构
typedef struct _LIST_ENTRY{
//下个节点的指针
struct _LIST_ENTRY *Flink;
//上个节点的指针
struct _LIST_ENTRY *Blink;
}LIST_ENTRY,*PLIST_ENTRY;

//结合起来作为一个链表节点

//list_entry做链表头时候,初始化LIST_ENTRY的方法
//链表头
LIST_ENTRY  my_list_head;
//链表头初始化,在程序入口处调用一下
void MyFileInforInit()
{
InitializeListHead(&my_list_head);
}
//链表节点,保存文件名和长度信息
typedef struct{
LIST_ENTRY list_entry;
PFILE_OBJECT file_object;
UNICODE_STRING file_name;
LARGE_INTEGER file_length;
}MY_FILE_INFOR,*PMY_FILE_INFOR;

//追加一条信息,增加一个节点
NTSTATUS MyFileInforAppendNode(
PFILE_OBJECT file_object;
UNICODE_STRING file_name;
LARGE_INTEGER file_length;
)
PMY_FILE_INFOR my_file_infor = (PMY_FILE_INFOR)ExAllocatePoolWithTag(
PagedPool,sizeof(MY_FILE_INFOR),MEM_TAG);
if(my_file_infor == NULL)
return STATUS_INSUFFCIENT_RESOURES;
my_file_infor->file_object = file_object;
my_file_infor->file_name =  file_name ;
my_file_infor->file_length = file_length;
//插入到链表末尾
InsertHeadList(&my_list_head,(PLIST_ENTRY)&my_file_infor);
return STATUS_SUCCESS;
}

//上面的代码示例实现了插入,LIST_ENTRY插入到MY_FILE_INFOR,这样一个MY_FILE_INFOR看起来就像是LIST_ENTRY
//但是巨硬的许多结构喜欢开头定义长度,因此,通过LIST_ENTRY结构的地址获取所在节点的地址,有个计算地址偏移的过程。可以在下面一个典型的遍历链表例子中看到:
for(p = my_list_head.Flink; p!=&my_list_head.Flink; p->Flink)
{
PMY_FILE_INFOR elem = CONTAINING_RECORD(p,MY_FILE_INFOR,list_entry);
// todo something here..
}

3.2.3 使用长整型数据
LARGE_INTEGER结构
64位数据并未必须在64位系统下使用,VC中其类型为__int64 ,定义写法:__int64 file_offset;
__int64在驱动开发中很少直接用,而是被包装成共用体:LARGE_INTEGER,其定义如下:

typedef __int64 LONGLONG;
typedef union _LARGE_INTEGER {
struct 
{
        ULONG LowPart;
        Long HighPart;
};
struct {
        ULONG LowPart;
        LONG HighPart;
} u;
LONGLONG QuadPart;
}LARGE_INTEGER;

没看明白这块,哪个大哥教教我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值