变量类型

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. Typora怎么插入行内公式?内联公式设置

    文件 偏好设置 把内联公式那个勾上就可以了.然后就能写latex了,像这样,$\alpha\$ \(\alpha\) 输入一个\$后再按esc,会自动补全为$$

  2. Java 计算两个日期的时间间隔

    @Test public void durationTest(){ Temporal begin = LocalDateTime.of(2000,1,1,0,0); Temporal end = Lo ...

  3. android使用---->常用组件1

    在TextView中创建空心文字 <TextView android:layout_width="wrap_content" android:layout_height=&q ...

  4. 【Visual Leak Detector】QT 中 VLD 输出解析(四)

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用方式 2. 测试代码 3. 使用 32 bit 编译器时的输出 4. 使用 64 bit 编译器时的输出 5. 输 ...

  5. 设计模式(二十九)----综合应用-自定义Spring框架-Spring IOC相关接口分析

    1 BeanFactory解析 Spring中Bean的创建是典型的工厂模式,这一系列的Bean工厂,即IoC容器,为开发者管理对象之间的依赖关系提供了很多便利和基础服务,在Spring中有许多IoC ...

  6. VUEX面试题

    1.你有写过vuex中store的插件吗? 答:没有 2.你有使用过vuex的module吗?主要是在什么场景下使用? 答:把状态全部集中在状态树上,非常难以维护.按模块分成多个module,状态树延 ...

  7. webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题

    webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 目录 webrtc QOS笔记二 音频buffer数据不足生成很多gap的问题 记录个iusse. 插入音频数据后,GetAu ...

  8. solidity中的mapping

    mapping可以理解为python中对字典的键值遍历,键是唯一的而值是可以重复的 mapping函数的构造: mapping(_KeyType => _ValueType)  mapping ...

  9. Spring事务——传播性

    传播性 事务传播行为是为了解决业务层方法之间互相调用的事务问题,当一个事务方法被另一个事务方法调用时,事务该以何种状态存在?例如新方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运 ...

  10. python实现关闭usb功能

    禁用usb和启用usb 一禁用usb自动加载功能 公司内部有时候需要禁用usb接口的文件拷贝,但是打印机,扫描枪等待其他设备的使用,我们应该怎么做呢,很简单,可以通过修改BIOS,注册表和第三方软件实 ...