- 博客(8)
- 收藏
- 关注
原创 08-驱动中的文件操作
文件的打开与关闭:ZwCreateFile用于打开或创建文件,其原型如下:NTSTATUS ZwCreateFile(Out PHANDLE FileHandle,In ACCESS_MASK DesiredAccess,In POBJECT_ATTRIBUTES ObjectAttributes,Out PIO_STATUS_BLOCK IoStatusBlock,In_opt PLARGE_INTEGER AllocationSize,In ULONG FileAttributes,I
2020-07-17 12:07:49 556
原创 07-驱动中的注册表
注册表的打开与创建:一般都需要打开或创建一个注册表键,可使用ZwCreateKey函数,函数原型如下:NTSTATUS ZwCreateKey(Out PHANDLE KeyHandle,In ACCESS_MASK DesiredAccess,In POBJECT_ATTRIBUTES ObjectAttributes,Reserved ULONG TitleIndex,In_opt PUNICODE_STRING Class,In ULONG CreateOptions,Out_opt
2020-07-16 18:37:52 535
原创 06-驱动中的内存管理
常规内存分配WDK提供了一系列内存分配函数,其中最基本的是ExAllocatePoolWithTag,函数原型如下:PVOID ExAllocatePoolWithTag (POOL_TYPE PoolType, SIZE_T NumberOfBytes, ULONG Tag);PoolType表示需要申请何种类型的内存,PoolType为POOL_TYPE枚举类型,常用的值是NonPagedPool与PagedPool;其中NonPagedPool表示非分页内存,PagedPool表示分页内存;这里
2020-07-16 14:58:31 695
原创 05-驱动中的自旋锁
链表,全局变量在多线程的使用中可能会存在多个地方同时调用,这时就会引出线程安全问题,这个时候就可以使用锁(不仅仅是自旋锁,当然自旋锁也能解决这个问题,需看实际情况选择)自旋锁是内核中提供的一种高IRQL锁,用同步以及独占的方式访问某个资源。下面给出一个自旋锁的申请和初始化:KSPIN_LOCK SLock;KeInitializeSpinLock(&SLock);KeInitializeSpinLock函数没有返回值。下面的代码展示了如何使用自旋锁。在KeAcquireSpinLock和K
2020-07-16 11:27:23 872
原创 04-驱动中的链表操作
链表分为单向链表和双向链表,但是在内核中一般都是使用的有头双向链表。有头双向链接指的是链表的第一项是没有数据的,只保存链表下一节点和上一节点的指向指针。WDK对链表的定义为:typedef struct _LIST_ENTRY {struct _LIST_ENTRY *Flink;struct _LIST_ENTRY *Blink;} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;LIST_ENTRY表示一个链表的节点,其中
2020-07-15 21:49:08 490
原创 03-驱动中的字符串操作
在内核层编程一般不使用Unicode而是使用UNICODE_STRING,(字符串长度以Length为准,不要去自己计算,未必是以’\0’结尾的,以免出错,都提供了还自己算它干嘛)typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;USHORT * Buffer;PWCH Buffer;} UNICODE_STRING;字符串初始化:常用的初始化函数RtlInitUnicodeString(Out PUN
2020-07-15 21:44:21 581
原创 02-上下文,IRQL概念
上下文环境上下文概念:泛指CPU在执行代码时,该代码所处的环境与状态。这些环境状态包括:当前代码所属线程,中断请求级别,CPU寄存器各状态等等。中断请求级别CPU提供了一个IRQL(中断请求级别)的概念,高IRQL的代码可以中断低IRQL的代码的执行过程,从而得到先执行的机会。常见的IRQL,数值越大级别越高PASSIVE_LEVEL 0 可使用所有的内核APIAPC_LEVEL 1 可使用大部分内核APIDISPATCH_LEVEL 2 只能使用特定的API,且只能访问非分页内存非
2020-07-15 17:59:52 218
原创 01-驱动入口函数
内核入口函数同应用层的Winmain函数入口一样,驱动程序也有自己的函数入口,函数名叫DriverEntry,函数原型如下:NTSTATUS DriverEntry(PDRIVER_OBJECT pdriver, PUNICODE_STRING reg)参数一为pdriver,表示一个驱动对象的指针,此参数有系统调用系统自动传入,这个指针,指向名为DRIVER_OBJECT的结构体,里面记录了驱动的详细信息。typedef struct _DRIVER_OBJECT {CSHORT Type;C
2020-07-15 17:17:30 1073
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人