变量类型

kernel user
ULONG unsigned long
PULONG unsigned long*
UCHAR unsigned char
PUCHAR unsigned char*
UINT unsigned int
PUNIT unsigned int*
VOID void
PVOID void*

P代表指针

程序入口

DriverEntry,相当于main函数

函数原型

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)

typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size; PDEVICE_OBJECT DeviceObject;
ULONG Flags; PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension; UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch; PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; } DRIVER_OBJECT;

字符串

内核中使用ANSI_STRING/UNICODE_STRING来代表普通字符和宽字符

NTSTATUS testString()
{
//初始化字符串
ANSI_STRING as0;
UNICODE_STRING us0;
RtlInitAnsiString(&as0, "ansi string");
RtlInitUnicodeString(&us0, L"unicode string");
KdPrint(("%Z\n %wZ\n", &as0, &us0)); ////拷贝字符串
//复制字符串要自定义缓冲区
ANSI_STRING as1;
UNICODE_STRING us1;
CHAR as[128] = { 0 };
WCHAR ws[128] = { 0 }; RtlInitEmptyAnsiString(&as1, as, sizeof(as));
RtlInitEmptyUnicodeString(&us1, ws, sizeof(ws));
RtlCopyString(&as1, &as0);
RtlCopyUnicodeString(&us1, &us0);
KdPrint(("%Z\n %wZ\n", &as1, &us1)); ////比较字符串
ANSI_STRING as2;
UNICODE_STRING us2;
RtlInitAnsiString(&as2, "second ansi string");
RtlInitUnicodeString(&us2, L"second unicode string");
//为true代表忽略大小写
BOOLEAN b0 = RtlCompareString(&as0, &as2, FALSE);
BOOLEAN b1 = RtlCompareString(&as0, &as2, TRUE);
BOOLEAN b2 = RtlCompareUnicodeString(&us0, &us2, FALSE);
BOOLEAN b3 = RtlCompareString(&as0, &as1, FALSE);
KdPrint(("%d %d %d %d\n", b0, b1, b2, b3)); ////ansi与unicode相互转化
ANSI_STRING as3;
UNICODE_STRING us3;
RtlAnsiStringToUnicodeString(&us3, &as0, TRUE);
RtlUnicodeStringToAnsiString(&as3, &us0, TRUE);
KdPrint(("%Z\n %wZ\n", &as3, &us3)); //释放
RtlFreeAnsiString(&as3);
RtlFreeUnicodeString(&us3);
return STATUS_SUCCESS;
}

句柄表

一个进程打开或创建一个内核对象时会得到一个句柄,这样可以防止直接操作内存引起蓝屏。每个进程一个句柄表。句柄表在_EPROCESS结构体+0xc4处。句柄项位于句柄值/4*8+句柄表基址。可以通过遍历其他进程的句柄表来判断自身是否被其他程序所使用。

存在一个全局句柄表,为多级结构。

windows内核学习一的更多相关文章

  1. 学习windows内核书籍推荐 ----------转自http://tieshow.iteye.com/blog/1565926

      虽然,多年java,正在java,看样子还得继续java.(IT小城,还是整java随意点)应用程序 运行于操作系统之上,  晓操作系统,方更晓应用程序. 主看windows,因为可玩性高,闭源才 ...

  2. 【翻译】 Windows 内核漏洞学习—空指针解引用

    Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/windo ...

  3. Windows 内核漏洞学习—空指针解引用

    原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...

  4. windows内核Api的学习

    windows内核api就是ntoskrnl.exe导出的函数.我们能够跟调用应用层的api一样,调用内核api. 只是内核api须要注意的是.假设函数导出了.而且函数文档化(也就是能够直接在msdn ...

  5. Windows内核驱动开发入门学习资料

    声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...

  6. windows内核对象管理学习笔记

    目前正在阅读毛老师的<windows内核情景分析>一书对象管理章节,作此笔记. Win内核中是使用对象概念来描述管理内核中使用到的数据结构.此对象(Object)均是由对象头(Object ...

  7. Windows原理深入学习系列-Windows内核提权

    这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...

  8. windows内核编程之常用数据结构

    1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...

  9. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  10. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

随机推荐

  1. 如何获取obs视频帧的二进制数据

    前面几篇文章梳理了obs的录屏和推流流程,几条纵线整理下来,算是基本理清了obs的工作流程. 现在回到第一个目标:捕捉桌面的帧数据,用rendertarget显示并输出到UE5材质. 那么,帧数据到底 ...

  2. Java面试——阻塞队列

    一.阻塞队列 [1]首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示:

  3. JVM Dump分析

    Thread Dump介绍 Thread Dump是非常有用的诊断 Java应用问题的工具.每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚 ...

  4. Mybatis模糊查询的两种方式

    第一种 使用 || 字符: ** ** 第二种 使用 CONCAT 函数: ** ** 温馨提醒: 当然你也可以使用 $符 ,但是这种方式会导致不安全,让非法分子有机可寻,轻则数据库瘫痪,重则数据泄露 ...

  5. Win10系统总是锁屏关闭屏幕该怎么办?

    Win10系统总是锁屏关闭屏幕该怎么办? 转目前发现最早之帖,自脚本之家:https://www.jb51.net/os/win10/398451.html   使用Win10系统很长时间了,最近发现 ...

  6. vue中新的状态管理器-pinia

    背景 对于pinia的使用,可参考官方文档在这不做过多赘述.这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下 ...

  7. 在k8s(kubernetes)上安装 ingress V1.1.3

    介绍 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由.流量路由由 Ingress 资源上定义的规则控制. 下面是一个将所有流量都发送到同一 Service 的简单 In ...

  8. 逍遥自在学C语言 | 位运算符&的高级用法

    前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位 ...

  9. LeeCode 433 最小基因变化

    LeeCode 433 最小基因变化 题目描述: 基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A'.'C'.'G' 和 'T' 之一. 假设我们需要调查从基因序列 start ...

  10. 亿级Web系统负载均衡几种实现方式

    负载均衡(Load Balance)是集群技术(Cluster)的一种应用技术.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web负载均衡.根据实现的原理 ...