1,字符串操作
UNICODE_STRING //UNICODE_STRING结构体
ANSII_STRING
RTL_CONSTANT_STRING(); //UNICODE_STRING初始化
RtlCopyUnicodeString() //UNICODE_STRING复制
RtlxxxUnicodeString(); //UNICODE_STRING操作
NTSTATUS; //返回值
LARGE_INTEGER; //64位的数据
2,内存分配和销毁
ExAllocatePoolWithTag(); //
ExFreePool();
3,双向链表结构
typedef struct
{
LIST_ENTRY list_entry; //链表头指针
PFILE_OBJECT file_object;
UNICODE_STRING file_name;
LARGE_INTEGER file_length;
}MY_fILE_INFOR;
InitializeListHead(); //初始化链表头
InsertHeadList(); //插入节点
ExInterlockedInsertHeadList(); //加锁后插入节点
ExInterlockedRemoveHeadList(); //加锁后删除节点
4,多线程安全,在内核驱动开发中必须考虑
自旋锁
KSPIN_LOCK //内存分配在全局区域或者静态区域
KIRQL //中断级
KeInitializeSpinLock(); //初始化锁
KeAcquireSpinLock(); //加锁
KeReleaseSpinLock(); //解锁
5,文件操作
OBJECT_ATTRIBUTES
InitializeObjectAttributes(); //初始化一个对象
ZwCreateFile(); //打开文件
ZwClose(); //关闭文件
ZwReadFile(); //文件读取
ZwWriteFile(); //文件写入
内核句柄在各进程之间通用.
6,注册表操作
ZwOpenKey(); //打开注册表
ZWQueryValueKEx(); //注册表值的读取
ZwSetValueKey(); //注册表值的写入
7,系统时间
KeQueryTickCount(); //获取系统“滴答”数
KeQueryTimeIncrement(); //获取一个“滴答”的具体100纳米数
KeQuerySystemTime(); //得到格林威治时间
ExSystemTimeToLocalTime(); //得到当前时间
RtlTimeToTimeFields(); //转换为TIME_FIELDS格式的时间
TIME_FIELDS //结构体
8,使用定时器
KeSetTimer(); //设置定时器,循环需要再次调用
PKTIMER; //
KeInitializeTimer(); //初始化一个TIMER
PKDPC; //
KeInitializeDpc(); //初始化一个回调结构
9,线程
PsCreateSystemThread(); //创建线程
PsTerminateSystemThread(); //终结线程,在线程中手动
ZwClose();//关闭句柄 注意:关闭句柄并不结束线程.
10,同步事件
KEVENT; //
KeInitializeEvent(); //参数2:SynchronizationEvent自动重设; NotificationEvent手动 重设.
//参数3: 初始化状态 FALSE未设定; TRUE已设定.
KeSetEvent(); //设置事件
KeResetEvent(); //手动重设
KeWaitForSingleObject();//等待函数
11,驱动设备
DEVICE_OBJECT;
DriverEntry(PDRIVER_OBJECT do,PUNICODE_STRING s) //驱动的入口函数
IRP_MJ_MAXIMUM_FUNCTION; //分发函数的个数
DriverObject->MajorFunctions //分发函数
DriverObject->DriverUnload //没有返回值
MyDispatchFunction(PDEVICE_OBJECT device, PIRP irp);
IoCreateDevice(); //创建设备对象
IoCreateDeviceSecure(); //创建设备对象,适用于所有的用户,需要链接库wdmsec.lib
IoDeleteDevice(); //删除设备对象
IoCreateSymbolicLink(); //创建符号链接,"\\\\.\\name" 符号链接名表示
device->Flags &= ~DO_DEVICE_INITIALIZING; //设备生成后打开初始化完成标志
IoIsWdmVersionAvailable(1, 0x10); //是否支持符号链接用户相关性的操作系统
12,请求处理 IRP
//打开请求
//关闭请求
//发送消息
//接受消息
UNICODE_STRING //UNICODE_STRING结构体
ANSII_STRING
RTL_CONSTANT_STRING(); //UNICODE_STRING初始化
RtlCopyUnicodeString() //UNICODE_STRING复制
RtlxxxUnicodeString(); //UNICODE_STRING操作
NTSTATUS; //返回值
LARGE_INTEGER; //64位的数据
2,内存分配和销毁
ExAllocatePoolWithTag(); //
ExFreePool();
3,双向链表结构
typedef struct
{
LIST_ENTRY list_entry; //链表头指针
PFILE_OBJECT file_object;
UNICODE_STRING file_name;
LARGE_INTEGER file_length;
}MY_fILE_INFOR;
InitializeListHead(); //初始化链表头
InsertHeadList(); //插入节点
ExInterlockedInsertHeadList(); //加锁后插入节点
ExInterlockedRemoveHeadList(); //加锁后删除节点
4,多线程安全,在内核驱动开发中必须考虑
自旋锁
KSPIN_LOCK //内存分配在全局区域或者静态区域
KIRQL //中断级
KeInitializeSpinLock(); //初始化锁
KeAcquireSpinLock(); //加锁
KeReleaseSpinLock(); //解锁
5,文件操作
OBJECT_ATTRIBUTES
InitializeObjectAttributes(); //初始化一个对象
ZwCreateFile(); //打开文件
ZwClose(); //关闭文件
ZwReadFile(); //文件读取
ZwWriteFile(); //文件写入
内核句柄在各进程之间通用.
6,注册表操作
ZwOpenKey(); //打开注册表
ZWQueryValueKEx(); //注册表值的读取
ZwSetValueKey(); //注册表值的写入
7,系统时间
KeQueryTickCount(); //获取系统“滴答”数
KeQueryTimeIncrement(); //获取一个“滴答”的具体100纳米数
KeQuerySystemTime(); //得到格林威治时间
ExSystemTimeToLocalTime(); //得到当前时间
RtlTimeToTimeFields(); //转换为TIME_FIELDS格式的时间
TIME_FIELDS //结构体
8,使用定时器
KeSetTimer(); //设置定时器,循环需要再次调用
PKTIMER; //
KeInitializeTimer(); //初始化一个TIMER
PKDPC; //
KeInitializeDpc(); //初始化一个回调结构
9,线程
PsCreateSystemThread(); //创建线程
PsTerminateSystemThread(); //终结线程,在线程中手动
ZwClose();//关闭句柄 注意:关闭句柄并不结束线程.
10,同步事件
KEVENT; //
KeInitializeEvent(); //参数2:SynchronizationEvent自动重设; NotificationEvent手动 重设.
//参数3: 初始化状态 FALSE未设定; TRUE已设定.
KeSetEvent(); //设置事件
KeResetEvent(); //手动重设
KeWaitForSingleObject();//等待函数
11,驱动设备
DEVICE_OBJECT;
DriverEntry(PDRIVER_OBJECT do,PUNICODE_STRING s) //驱动的入口函数
IRP_MJ_MAXIMUM_FUNCTION; //分发函数的个数
DriverObject->MajorFunctions //分发函数
DriverObject->DriverUnload //没有返回值
MyDispatchFunction(PDEVICE_OBJECT device, PIRP irp);
IoCreateDevice(); //创建设备对象
IoCreateDeviceSecure(); //创建设备对象,适用于所有的用户,需要链接库wdmsec.lib
IoDeleteDevice(); //删除设备对象
IoCreateSymbolicLink(); //创建符号链接,"\\\\.\\name" 符号链接名表示
device->Flags &= ~DO_DEVICE_INITIALIZING; //设备生成后打开初始化完成标志
IoIsWdmVersionAvailable(1, 0x10); //是否支持符号链接用户相关性的操作系统
12,请求处理 IRP
//打开请求
//关闭请求
//发送消息
//接受消息