UNICODE_STRING结构:

typedef struct  _UNICODE_STRING {

USHORT Length;                                   //字节长度,不包括终止符“NULL”
    USHORT MaximumLength;                  //字符串所能占的最大字节数字符串的指针
    PWCH   Buffer;                                       //字符串的地址,也即指针
} UNICODE_STRING;

一.用户模式初始化,拷贝操作

// UnicodeString(User).cpp : 定义控制台应用程序的入口点。
// #include <windows.h>
#include <iostream>
using namespace std;
#define BUFFER_SIZE 0x400
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWCHAR Buffer;
}UNICODE_STRING,*PUNICODE_STRING; /************************************************************************/
/* 初始化 */
/************************************************************************/
void InitUNICODESTRING_1();
VOID
SeRtlInitUnicodeString(
OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString OPTIONAL); void InitUNICODESTRING_2();
void InitUNICODESTRING_3(); void InitUNICODESTRING_4();
VOID
SeRtlCopyUnicodeString(
OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString OPTIONAL);
VOID
SeRtlFreeUnicodeString(
IN OUT PUNICODE_STRING UnicodeString); /*
typedef struct _UNICODE_STRING {
USHORT Length; //UNICODE占用的内存字节数,个数*2;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING ,*PUNICODE_STRING;
*/ int main()
{
InitUNICODESTRING_1();
InitUNICODESTRING_2();
InitUNICODESTRING_3();
InitUNICODESTRING_4();
printf("Input AnyKey To Exit\r\n");
getchar(); return 0;
} void InitUNICODESTRING_1()
{ UNICODE_STRING v1; SeRtlInitUnicodeString(&v1, L"HelloWorld"); printf("%wZ\r\n", &v1); //ASCI_STRING %Z UNICODE_STRING %wZ } VOID
SeRtlInitUnicodeString(
OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString OPTIONAL)
{
USHORT Length = 0;
DestinationString->Length = 0;
DestinationString->Buffer = (PWSTR)SourceString;
if (SourceString!=NULL)
{
while (*SourceString++)
{
Length += sizeof(*SourceString);
}
DestinationString->Length = Length;
DestinationString->MaximumLength = Length + (USHORT)sizeof(UNICODE_NULL);
}
else {
DestinationString->MaximumLength = 0;
}
} void InitUNICODESTRING_2()
{
UNICODE_STRING v1;
WCHAR BufferData[] = L"HelloWorld";
v1.Buffer = BufferData;
v1.Length = wcslen(BufferData) * sizeof(WCHAR);
v1.MaximumLength = (wcslen(BufferData) + 1) * sizeof(WCHAR);
printf("%wZ\r\n", &v1);
}
void InitUNICODESTRING_3()
{
UNICODE_STRING v1;
WCHAR BufferData[] = L"HelloWorld"; v1.Length = wcslen(BufferData) * sizeof(WCHAR);
v1.MaximumLength = (wcslen(BufferData) + 1) * sizeof(WCHAR);
v1.Buffer = (WCHAR*)malloc(v1.MaximumLength);
RtlZeroMemory(v1.Buffer, v1.MaximumLength);
RtlCopyMemory(v1.Buffer, BufferData, v1.Length); printf("%wZ\r\n", &v1);
if (v1.Buffer != NULL)
{
free(v1.Buffer);
v1.Buffer = NULL;
v1.Length = v1.MaximumLength = 0;
}
} void InitUNICODESTRING_4()
{ UNICODE_STRING SourceString;
SeRtlInitUnicodeString(&SourceString, L"HelloWorld");
UNICODE_STRING DestinationString = { 0 };
DestinationString.Buffer = (PWSTR)malloc(BUFFER_SIZE);
DestinationString.MaximumLength = BUFFER_SIZE;
SeRtlCopyUnicodeString(&DestinationString, &SourceString);
printf("SourceString:%wZ\n", &SourceString);
printf("DestinationString:%wZ\n", &DestinationString);
SeRtlFreeUnicodeString(&DestinationString);
} VOID
SeRtlCopyUnicodeString(
OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString OPTIONAL
)
{
WCHAR *v1, *v2;
ULONG SourceStringLength = 0; if (SourceString!=NULL)
{
v2 = DestinationString->Buffer;
v1 = SourceString->Buffer;
SourceStringLength = SourceString->Length;
if ((USHORT)SourceStringLength > DestinationString->MaximumLength) {
SourceStringLength = DestinationString->MaximumLength;
} DestinationString->Length = (USHORT)SourceStringLength;
RtlCopyMemory(v2, v1, SourceStringLength);
if (DestinationString->Length < DestinationString->MaximumLength)
{
v2[SourceStringLength / sizeof(WCHAR)] = UNICODE_NULL;
} } else {
DestinationString->Length = 0;
} return;
}
VOID
SeRtlFreeUnicodeString(
IN OUT PUNICODE_STRING UnicodeString
)
{ if (UnicodeString->Buffer)
{
free(UnicodeString->Buffer);
memset( UnicodeString, 0, sizeof( *UnicodeString ) ); }
}

  

二.内核模式初始化,拷贝操作

  初始化UNICODE_STRING:

  1.常量内存,RtlInitUnicodeString 函数Buffer指针指向字符串的首地址,然后对Length和 MaximumLength成员赋值为字符串的字节数。

  2.动态内存,ExAllocatePool函数动态分配。

3.栈区内存,局部变量手动赋值。

#include <ntifs.h>
#define MAX_PATH 260
#define BUFFER_SIZE 0x400 /************************************************************************/
/* 初始化 */
/************************************************************************/
void Sub_1(); //常量内存
void Sub_2(); //栈区内存
void Sub_3(); //动态内存
/************************************************************************/
/* 拷贝操作 */
/************************************************************************/
void Sub_4(); VOID DriverUnload(PDRIVER_OBJECT DriverObject);
//bp UnicodeString(Kernel)!DriverEntry NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
NTSTATUS Status = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject = NULL;
DriverObject->DriverUnload = DriverUnload; Sub_1();
return Status;
} //初始操作
void Sub_1()
{
UNICODE_STRING v1;
RtlInitUnicodeString(&v1, L"HelloWorld"); DbgPrint("%wZ\r\n", &v1);
}
void Sub_2()
{
UNICODE_STRING v1;
WCHAR BufferData[] = L"HelloWorld";
v1.Buffer = BufferData;
v1.Length = wcslen(BufferData)*sizeof(WCHAR);
v1.MaximumLength = (wcslen(BufferData)+1)*sizeof(WCHAR);
DbgPrint("%wZ\r\n", &v1); }
void Sub_3()
{
UNICODE_STRING v1;
WCHAR BufferData[] = L"HelloWorld"; v1.Length = wcslen(BufferData) * sizeof(WCHAR);
v1.MaximumLength = (wcslen(BufferData) + 1) * sizeof(WCHAR);
v1.Buffer = ExAllocatePool(PagedPool, v1.MaximumLength);
RtlZeroMemory(v1.Buffer, v1.MaximumLength);
RtlCopyMemory(v1.Buffer,BufferData,v1.Length); DbgPrint("%wZ\r\n", &v1);
if (v1.Buffer!=NULL)
{
ExFreePool(v1.Buffer);
v1.Buffer = NULL;
v1.Length = v1.MaximumLength = 0;
} }
//拷贝操作
void Sub_4()
{ UNICODE_STRING SourceString;
RtlInitUnicodeString(&SourceString, L"HelloWorld"); UNICODE_STRING DestinationString = { 0 };
DestinationString.Buffer = (PWSTR)ExAllocatePool(PagedPool, BUFFER_SIZE);
DestinationString.MaximumLength = BUFFER_SIZE; RtlCopyUnicodeString(&DestinationString, &SourceString); KdPrint(("SourceString:%wZ\n", &SourceString));
KdPrint(("DestinationString:%wZ\n", &DestinationString));
RtlFreeUnicodeString(&DestinationString);
} VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("DriverUnload()\r\n");
}

  

UNICODE_STRING(用户模式 内核模式)的更多相关文章

  1. Windows 用户和内核模式

    上图: APP -> user mode OS-> kernel mode Drivers -> user or kernel mode 正所谓 一阴一阳之谓道,继之者善也,成之者性 ...

  2. 理解Windows内核模式与用户模式

     1.基础 执行 Windows 的计算机中的处理器有两个不同模式:"用户模式"和"内核模式". 依据处理器上执行的代码的类型,处理器在两个模式之间切换.应 ...

  3. Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式

    引言 本来在写一篇Windows内存管理的文章,写着写着就发现好多基础的概念都要先讲.更可怕的是,这些基础的概念我却不能完全讲清楚.只好再把这本<深入解析Windows操作系统>翻到第一章 ...

  4. C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

    参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008 C#中的几种锁:用户模式锁.内核模式锁.动态计数.监视锁介绍 ...

  5. 【windows 操作系统】【CPU】用户模式和内核模式(用户层和内核层)

    所有的现代操作系统中,CPU是在两种不同的模式下运行的: 注意以下内容来自微软: windows用户模式和内核模式 运行 Windows 的计算机中的处理器有两个不同模式:用户模式 和内核模式 . 用 ...

  6. core--线程同步(内核模式)

    什么是内核?windows操作系统为了更好的管理进程,线程,创建了很多数据结构,这些数据结构运行在windows的底层,并不开放给开发人员:所以开发人员称这些结构为内核,但是为了开发人员能够使用,wi ...

  7. centos单用户 救援 运行级别 yum,单用户模式,救援模式,inittab :启动级别 e2fsck wetty mingetty 物理终端 /dev/console 虚拟终端 /dev/tty(0,6) 模拟终端 /dev/pts/# grub-md5-crypt 给grub加密码 initrd 第二节课

    centos单用户 救援 运行级别  yum,单用户模式,救援模式,inittab :启动级别  e2fsck  wetty  mingetty  物理终端 /dev/console  虚拟终端 /d ...

  8. C#异步编程(三)内核模式线程同步

    其实,在开发过程中,无论是用户模式的同步构造还是内核模式,都应该尽量避免.因为线程同步都会造成阻塞,这就影响了我们的并发量,也影响整个应用的效率.不过有些情况,我们不得不进行线程同步. 内核模式 wi ...

  9. 使用WinDbg调试入门(内核模式)

    windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中.这里我们提供了一些实践练习,可以帮助您开始使用windbg作为内核模式调试器. 设置内核模式调试 内核模式调试环境通常有两台 ...

随机推荐

  1. 池建强 Mac Tips

    摘自<MacTalk 人生元编程>,原文有130条,从中摘录出7条:大部分与  Terminal 相关 1. 终端说英语 在终端输入 " say hello" ,Mac ...

  2. PHP操作MySQL数据库--PHP的应用

    一.Apache服务器的安装 <1>安装版(计算机相关专业所用软件---百度云链接下载)-直接install<2>非安装版(https://www.apachehaus.com ...

  3. 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归

    Step1: 目标: 使用线性模拟器模拟指定的直线:y = 0.1*x + 0.3 代码: import tensorflow as tf import numpy as np import matp ...

  4. python-django rest framework框架之解析器

    1.解析器 : 对请求的数据进行解析 - 请求体进行解析. 解析器在你不拿请求体数据时 不会调用. class UsersView(APIView): def get(self,request,*ar ...

  5. 微信公众号使用LocalStorage解决返回缓存问题

    在开发微信公众号上应用程序时,遇到了一个普遍的问题,从A页跳转到B页后,再由B页跳转回A页,A要要保持跟跳转前一致,通过LocalStorage可以解决. LocalStorage,很好的解决了返回的 ...

  6. Alibaba Java Coding Guidelines

    阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的<阿里巴巴Java开发规约>扫描插件!该插件由阿里巴巴P3C项目组研发.P3C是世界知名的反潜机,专门对付水下潜水艇,寓意是扫描出 ...

  7. Session重点整理

    首先明确几个概念 (1)JSessionID:通过tomcat运行的Java项目,为新用户生成的随机字符串.(应该是tomcat设置的,我没试过别的服务器,如有错误请指正) (2)Session请求( ...

  8. PostgreSQL&PostGIS完全安装

    检查PostGIS.PostgreSQL.GEOS.GDAL.PROJ等各软件的版本依赖关系 http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQ ...

  9. 如何使a标签打开新页面并阻止刷新当前页面

    错误: HTML中,使用href属性时,当前页面和新页面均跳转到URL指定的页面,即当前页面也刷新: <li id='goToBack'><a href='**.action' ta ...

  10. 解决maven 找不到指定路径应该如何

    如果打开每个项目都有红x!!!解决办法: 1) 2)-->点击clean ,ok!!