ring0-内存可读、可写、有效性、指针是否为空、深度校验字符串(随手代码)

http://blog.csdn.net/hgy413/article/details/7907057

1.如在ring3下,则要判断是否可读可写:

[cpp] view plaincopy

  1. KPROCESSOR_MODE PreviousMode;
  2. ULONG PID;
  3. PreviousMode = ExGetPreviousMode();
  4. // 如果非内核模式,就要开始检查IN的这些参数都否可读
  5. if (PreviousMode != KernelMode)
  6. {
  7. try
  8. {
  9. ProbeForRead(ClientId, sizeof(CLIENT_ID), sizeof(ULONG));
  10. ProbeForWrite(ClientId, sizeof(CLIENT_ID), sizeof(ULONG));
  11. }
  12. __except(EXCEPTION_EXECUTE_HANDLER)
  13. {
  14. return GetExceptionCode();
  15. }
  16. }

2. 校验指针是否为空,内存有效性:

[cpp] view plaincopy

  1. // 效验ClientId是否为NULL
  2. if (ARGUMENT_PRESENT(ClientId)
  3. && MmIsAddressValid(ClientId))
  4. {
  5. //更安全的访问。
  6. PID = (ULONG)ClientId->UniqueProcess;
  7. KdPrint(("OpenProcess %d\r\n",PID));
  8. }

3.深度校验字符串函数:

[cpp] view plaincopy

  1. //深度的效验
  2. BOOLEAN ValidateUnicodeString(PUNICODE_STRING usStr)
  3. {
  4. ULONG i;
  5. __try
  6. {
  7. if (!MmIsAddressValid(usStr))
  8. {
  9. return FALSE;
  10. }
  11. if (usStr->Buffer == NULL || usStr->Length == 0)
  12. {
  13. return FALSE;
  14. }
  15. for (i = 0; i < usStr->Length; i++)
  16. {
  17. if (!MmIsAddressValid((PUCHAR)usStr->Buffer + i))
  18. {
  19. return FALSE;
  20. }
  21. }
  22. }__except(EXCEPTION_EXECUTE_HANDLER){
  23. }
  24. return TRUE;
  25. }

[cpp] view plaincopy

    1. //验证一个WCHAR内容的指针是否可以访问
    2. BOOLEAN ValidateWCHARString(WCHAR *pwzStr,ULONG_PTR Length)
    3. {
    4. ULONG i;
    5. __try
    6. {
    7. //第一步判断指针和大小是否为NULL,是的话就没必要验证了
    8. if  (pwzStr == NULL || Length == 0)
    9. {
    10. return FALSE;
    11. }
    12. //以length长度循环检查指针pwzStr里面的值
    13. for (i = 0; i < Length; i++)
    14. {
    15. //检查是否可以访问。
    16. if  (!MmIsAddressValid((PUCHAR)pwzStr + i))
    17. {
    18. //只要有一个字节是不可读取
    19. return FALSE;
    20. }
    21. }
    22. }
    23. __except(EXCEPTION_EXECUTE_HANDLER)
    24. { //触发了异常
    25. return FALSE;
    26. }
    27. return TRUE;
    28. }
时间: 2024-11-08 19:18:46

ring0-内存可读、可写、有效性、指针是否为空、深度校验字符串(随手代码)的相关文章

内存映射 读和写

//读 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) btn1: TButton; mmo1: TMemo; btn2: TButton;

hbase内存规划(读多写少型和写多读少型)

//简单说来主要包括读多写少型和写多读少型),内存的相关配置却完全不同. 1.针对不同应用场景,对多种工作模式下的参数进行详细说明,并结合相关示例对集群规划中最核心模块-内存规划进行介绍.2.HBase中内存规划直接涉及读缓存BlockCache.写缓存MemStore,影响系统内存利用率.IO利用率等资源以及读写性能等,重要性不言而喻.3.主要配置也是针对BlockCache和MemStore进行,4.然而针对不同业务类型(简单说来主要包括读多写少型和写多读少型),内存的相关配置却完全不同.5

关于读、写SD卡的操作

1.点击按钮将assets文件夹中的内容复制到SD卡中. private void copyToSD() { // 检测SD卡是否挂载  Environment.MEDIA_MOUNTED 表示被挂载 // Environment.getExternalStorageState() 将返回sd卡的状态 if(! Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Toast.makeText(thi

JAVA读、写EXCEL文件

采用jxl.jar包,网上下载,百度一下到出都是.希望可以帮助到大家. 接下来直接贴代码: <span style="font-size:18px;">public List getValue(String fileName){ String str=ExcelOparations.readExcel(fileName).trim(); String[] str4n= str.split("\n"); List list1 = new ArrayList

node.js 利用流实现读写同步,边读边写

//10个数 10个字节,每次读4b,写1b let fs=require("fs"); function pipe(source,target) { //先创建可读流,再创建可写流 //先读一次,rs.on(data) //将读到的类容写入目标中 ,返回布尔值,如果是ture,继续写,默认情况应该是false,暂停读取 //ws.on('drain'),抽干后,回复读取 //监听读取文件完毕后,关闭读取rs.on('end') let rs=fs.createReadStream(s

VB Open 函数详解 打开、关闭、读、写文件

(一)打开和关闭文件      1.顺序文件     打开顺序文件,我们可以使用Open语句.它的格式如下:Open pathname For [Input |Output |Append] As [#]filenumber [Len = buffersize]      说明:     (1)参数pathname 表示要打开的文件名,文件名可以包含有驱动器和目录     (2)Input Output 和Append用于设置顺序文件的打开方式.其中,Input表示从打开的文件中读取数据.以这种

C#文件流的读与写

工作中遇到了文件的跨平台传送 运用了文件流 而且将计算机上的文件读取到程序内存里 反之将内存里的数据以文件的形式保存 都是比较常用的 在这里做一个简单的应用示例. 1 将内存数据“写”到计算机的文件里 const string path = @"D:\text.txt";//保存文件的路径 string content = "文件内容!!!!";//定义内存里的数据 byte[] bytes = Encoding.Default.GetBytes(content);

OpenCV下的CSV文件读、写

1.CSV文件格式简介 逗号分隔值(Comma-SeparatedValues,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据.CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符.通常,所有记录都有完全相同的字段序列. CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的

python文件处理-读、写

Python中文件处理的操作包括读.写.修改,今天我们一起来先学习下读和写操作. 一.文件的读操作 例一: #文件读操作 f = open(file="first_blog.txt",mode = 'r',encoding='gbk') #'r'表示只读模式(打开仍然为文件),encoding = 'gbk'表示原文件的存储格式为'gbk',打开时必须告诉程序将gbk转成unicode(python3编码默认Unicode) data = f.read() # 读取所有内容,内容是已经