内存与链表

来源:互联网 发布:淘宝网如何注销账户 编辑:程序博客网 时间:2024/05/16 19:07

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;

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

0 0
原创粉丝点击