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;
没看明白这块,哪个大哥教教我