UnicodeString基本操作(Ring0)

  1 #include "Unicode_String_Ring0.h"
  2
  3 //bp Unicode_String_Ring0!DriverEntry
  4 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
  5 {
  6     NTSTATUS Status = STATUS_SUCCESS;
  7     PDEVICE_OBJECT  DeviceObject = NULL;
  8
  9     DriverObject->DriverUnload = DriverUnload;
 10
 11     Test();
 12
 13     return Status;
 14 }
 15
 16
 17 void Test()
 18 {
 19     //初始化
 20     //StringInitTest();
 21
 22     //拷贝操作
 23     //StringCopyTest();
 24
 25     //字符串比较
 26     //StringCompareTest();
 27
 28     //字符串变大写
 29     //StringToUpperTest();
 30
 31     //字符串与整型相互转化
 32     //StringToIntegerTest();
 33
 34
 35     //ANSI_STRING字符串与UNICODE_STRING字符串相互转换
 36     StringConverTest();
 37
 38
 39 }
 40
 41 //初始化
 42 void StringInitTest()
 43 {
 44     //Sub_1();//常量初始化
 45     //Sub_2();
 46     Sub_3();//堆
 47 }
 48 void Sub_1()
 49 {
 50     //UNICODE_STRING
 51     //常量初始化
 52     UNICODE_STRING v1;
 53     RtlInitUnicodeString(&v1, L"HelloWorld");
 54
 55     //v1.Buffer = 常量指针
 56     //v1.Length = 20
 57     //v1.MaximumLength = 22
 58
 59     DbgPrint("%wZ\r\n", &v1);//Unicode打印L""
 60
 61
 62     /*
 63     //常量初始化ANSI_STRING
 64     //(1)用RtlInitAnsiString初始化字符串
 65     ANSI_STRING  AnsiString;
 66     CHAR * string = "hello";
 67     //初始化ANSI_STRING字符串
 68     RtlInitAnsiString(&AnsiString, string);
 69     DbgPrint("AnsiString:%Z\n", &AnsiString);
 70     */
 71 }
 72 void Sub_2()
 73 {
 74     UNICODE_STRING v1;
 75     WCHAR BufferData[] = L"HelloWorld";
 76     v1.Buffer = BufferData;
 77     v1.Length = wcslen(BufferData) * sizeof(WCHAR);
 78     v1.MaximumLength = (wcslen(BufferData) + 1) * sizeof(WCHAR);
 79
 80     DbgPrint("%wZ\r\n", &v1);
 81 }
 82 void Sub_3()
 83 {
 84     UNICODE_STRING v1;
 85     WCHAR BufferData[] = L"HelloWorld";
 86
 87     v1.Length = wcslen(BufferData) * sizeof(WCHAR);
 88     v1.MaximumLength = (wcslen(BufferData) + 1) * sizeof(WCHAR);
 89     v1.Buffer = ExAllocatePool(PagedPool, v1.MaximumLength);
 90
 91     RtlZeroMemory(v1.Buffer, v1.MaximumLength);
 92     RtlCopyMemory(v1.Buffer, BufferData, v1.Length);
 93
 94     DbgPrint("%wZ\r\n", &v1);
 95
 96     if (v1.Buffer != NULL)
 97     {
 98         ExFreePool(v1.Buffer);
 99         v1.Buffer = NULL;
100         v1.Length = v1.MaximumLength = 0;
101     }
102 }
103
104 //拷贝操作
105 void StringCopyTest()
106 {
107     UNICODE_STRING SourceString;
108     RtlInitUnicodeString(&SourceString, L"HelloWorld");
109
110     UNICODE_STRING DestinationString = { 0 };
111     DestinationString.Buffer = (PWSTR)ExAllocatePool(PagedPool, BUFFER_SIZE);
112     DestinationString.MaximumLength = BUFFER_SIZE;
113
114     RtlCopyUnicodeString(&DestinationString, &SourceString);
115
116     DbgPrint("SourceString:%wZ\r\n", &SourceString);
117     DbgPrint("DestinationString:%wZ\n", &DestinationString);
118
119     RtlFreeUnicodeString(&DestinationString);
120 }
121
122 //字符串比较
123 void StringCompareTest()
124 {
125     //初始化UnicodeString1
126     UNICODE_STRING UnicodeString1;
127     RtlInitUnicodeString(&UnicodeString1,L"HELLOWORLD");
128
129     //初始化UnicodeString2
130     UNICODE_STRING UnicodeString2;
131     //RtlInitUnicodeString(&UnicodeString2, L"Hello");
132     //RtlInitUnicodeString(&UnicodeString2, L"HELLOWORLD");
133     RtlInitUnicodeString(&UnicodeString2, L"helloworld");
134
135
136     if (RtlEqualUnicodeString(
137         &UnicodeString1,
138         &UnicodeString2,
139         TRUE
140         //If TRUE,
141         //case should be ignored when doing the comparison.
142     )
143         )
144     {
145         DbgPrint("UnicodeString1 and UnicodeString2 are equal\n");
146     }
147     else
148     {
149         DbgPrint("UnicodeString1 and UnicodeString2 are NOT equal\n");
150     }
151
152
153
154
155
156 }
157
158 //字符串变大写
159 void StringToUpperTest()
160 {
161     UNICODE_STRING SourceString;
162     RtlInitUnicodeString(&SourceString, L"Hello World");
163
164     UNICODE_STRING DestinationString;
165     DestinationString.Buffer = (PWSTR)ExAllocatePool(PagedPool, BUFFER_SIZE);
166     DestinationString.MaximumLength = BUFFER_SIZE;
167
168     //变化前
169     DbgPrint("变化前:%wZ\n", &SourceString);
170     //变大写
171     RtlUpcaseUnicodeString(
172         &DestinationString, //DestinationString
173         &SourceString, //SourceString
174         FALSE//Specifies if RtlUpcaseUnicodeString is to allocate the buffer space for the DestinationString.
175              //If it does, the buffer must be deallocated by calling RtlFreeUnicodeString.
176     );
177
178     //变化后
179     DbgPrint("变化后:%wZ\n", &DestinationString);
180
181     RtlFreeUnicodeString(&DestinationString);
182 }
183
184
185
186 //字符串与整型相互转化
187 void StringToIntegerTest()
188 {
189     //(1)字符串转换成数字
190     UNICODE_STRING UnicodeString1;
191     RtlInitUnicodeString(&UnicodeString1, L"-100");
192
193     ULONG lNumber;
194     NTSTATUS Status =
195         RtlUnicodeStringToInteger(//第二个参数Base
196             &UnicodeString1,
197             //10,//-100是10进制 //输出-100
198             //16,//-100是16进制  //输出-256
199             8,   //-100是8进制 //输出-64
200             &lNumber
201         );
202
203     if (NT_SUCCESS(Status))
204     {
205         DbgPrint("Conver to integer succussfully!\n");
206         DbgPrint("Result:%d\n", lNumber);
207     }
208     else
209     {
210         DbgPrint("Conver to integer unsuccessfully!\n");
211     }
212     //(2)数字转换成字符串
213     UNICODE_STRING UnicodeString2 = { 0 };
214     UnicodeString2.Buffer = (PWSTR)ExAllocatePool(PagedPool, BUFFER_SIZE);
215     UnicodeString2.MaximumLength = BUFFER_SIZE;
216
217     Status = RtlIntegerToUnicodeString(//同上 第二参数是Base
218         200,
219         //10, //输出200
220         //8,  //输出310
221         16,   //输出  C8
222         &UnicodeString2
223     );
224
225     /*
226     HEX C8
227     DEC 200
228     OCT 310
229     */
230
231     if (NT_SUCCESS(Status))
232     {
233         DbgPrint("Conver to string succussfully!\n");
234         DbgPrint("Result:%wZ\n", &UnicodeString2);
235     }
236     else
237     {
238         DbgPrint("Conver to string unsuccessfully!\n");
239     }
240
241     //销毁UnicodeString2
242     //注意!!UnicodeString1不用销毁
243     RtlFreeUnicodeString(&UnicodeString2);
244
245
246 }
247
248
249
250 //ANSI_STRING字符串与UNICODE_STRING字符串相互
251 void StringConverTest()
252 {
253     //(1)将UNICODE_STRING字符串转换成ANSI_STRING字符串
254     //初始化UnicodeString1
255     UNICODE_STRING UnicodeString1;
256     RtlInitUnicodeString(&UnicodeString1, L"HelloWorld");
257
258     ANSI_STRING AnsiString1;
259     NTSTATUS Status = RtlUnicodeStringToAnsiString(
260         &AnsiString1,
261         &UnicodeString1,
262         TRUE
263         //TRUE if this routine is to allocate the buffer space for the DestinationString.
264         //If it does, the buffer must be deallocated by calling RtlFreeAnsiString.
265     );
266
267     if (NT_SUCCESS(Status))
268     {
269         DbgPrint("Conver succussfully!\n");
270         DbgPrint("Result:%Z\n", &AnsiString1);
271     }
272     else
273     {
274         DbgPrint("Conver unsuccessfully!\n");
275     }
276
277     //销毁AnsiString1
278     RtlFreeAnsiString(&AnsiString1);
279
280     //(2)将ANSI_STRING字符串转换成UNICODE_STRING字符串
281
282     ANSI_STRING AnsiString2;
283     RtlInitString(&AnsiString2, "HelloWorld");
284
285     UNICODE_STRING UnicodeString2;
286     Status = RtlAnsiStringToUnicodeString(
287         &UnicodeString2,
288         &AnsiString2,
289         TRUE
290         //Specifies if this routine should allocate the buffer space for the destination string.
291         //If it does, the caller must deallocate the buffer by calling RtlFreeUnicodeString.
292
293
294     );
295
296     if (NT_SUCCESS(Status))
297     {
298         DbgPrint("Conver succussfully!\n");
299         DbgPrint("Result:%wZ\n", &UnicodeString2);
300     }
301     else
302     {
303         DbgPrint("Conver unsuccessfully!\n");
304     }
305
306     //销毁UnicodeString2
307     RtlFreeUnicodeString(&UnicodeString2);
308 }
309
310 VOID DriverUnload(PDRIVER_OBJECT DriverObject)
311 {
312     DbgPrint("DriverUnload()\r\n");
313 }
 1 #include <ntifs.h>
 2
 3
 4 #define BUFFER_SIZE 0x400
 5
 6 void Test();
 7
 8 //初始化操作
 9 void StringInitTest();
10 void Sub_1();//常量初始化
11 void Sub_2();
12 void Sub_3();
13
14 //拷贝操作
15 void StringCopyTest();
16
17 //字符串比较
18 void StringCompareTest();
19
20 //字符串变大写
21 void StringToUpperTest();
22
23 //字符串与整型相互转化
24 void StringToIntegerTest();
25
26 //ANSI_STRING字符串与UNICODE_STRING字符串相互
27 void StringConverTest();
28
29
30 VOID DriverUnload(PDRIVER_OBJECT DriverObject);
时间: 2024-10-16 00:18:19

UnicodeString基本操作(Ring0)的相关文章

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

iOS_UITextField 基本操作

基本操作 UITextField *userNameTextField = [[UITextField alloc] init]; userNameTextField.frame = CGRectMake(30, 100, 220, 50); [self.window addSubview:userNameTextField]; [userNameTextField release]; // 设置样式 userNameTextField.borderStyle = UITextBorderSty

Mongodb入门系列(4)——Mongodb体系结构与客户端基本操作及注意细节

说到Mongodb的体系结构,免不了与关系型数据库做个对比.这里以MySQL为例,我们进行一些比较: 从逻辑结构上对比: MySQL层次概念 MongoDB层次概念 数据库(database) 数据库(database) 表(table) 集合(collection) 记录(row) 文档(document) 在MongoDB中没有行.列.关系的概念,集合中的文档相当于一条记录,这体现了模式自由的特点. 从数据存储结构上对比: MySQL的每个数据库存放在一个与数据库同名的文件夹中,MySQL如

Oracle的基本操作-解除用户,赋予权限

一.表的基本操作 1. 用户管理 1.1 初始状态下系统的用户 在系统用户下,执行下面的查询语句可以查看到当前系统的所有用户  select * from dba_users; 1.2 创建一个用户 SQL> create user xp identified by xp; User created. 授予连接数据库的权限:SQL> grant connect to xp; Grant succeeded. SQL> conn xp/xp;Connected. 1.3 解锁一个用户并修改

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

【华为技术】VRP平台基本操作

一.显示系统信息 <Huawei>display version 图上所示可以知道VRP平台信息,运行的版本,运行的时间 二.修改和查看设备系统时间参数 1.查看时间 <Huawei>display clock 2.修改系统日期和时间 三.进入系统视图界面 <Huawei>system-view 可以配置接口.路由协议等 四.修改设备名称 五.配置登录标语信息 [R1]header shell information "Welcome to Huawei ro

Mysql查询优化从入门到跑路(三)查询的基本操作

查询的基本操作 1.选择操作 对应的是限制条件,操作对象是二维表的行. 优化方式:选择操作下推 目的:尽量减少连接操作前的元租数,使得中间临时关系尽量少(元祖数少,连接得到的元组数就少) 好处:这样可能减少IO和CPU的消耗.节约内存空间 2.投影操作 对用的SELECT查询的目的列对象 优化方式:投影操作下推 目的:尽量减少连接操作前的列数,使得中间临时关系尽量小(选择操作是使元组的个数尽量少,投影操作是使一条元组尽量少) 好处:虽然不能减少IO(多数数据库存储方式是行存储,元组是读取的最基本

TP框架对数据库的基本操作

数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作,一步步的讲述一下框架对数据库的操作 想要操作数据库,第一步必然是要:链接数据库 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 我这里是这样的文件路径 (2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中 1 2 3 4 5 6 7 8 9 /

图形数据库Neo4J的基本操作

1.创建一个节点 1 语法:CREATE (node-name:label-name{Property1-name:Property1-Value,...Propertyn-name:Propertyn-Value}) 2 如: 3 create(江湖流派:明教{name:'张无忌',skill:'九阳真经'}) 2.为两个节点建立关系 1 语法:CREATE(node1:label1)-[relationship-name:relationship-label-name]->(node2:la