UNICODE_STRING 总结

【Window内核编程】——UNICODE_STRING,ANSI_STRING和PCHAR 【我的】Window驱动开发——UNICODE_STRING,ANSI_STRING和PCHAR 作者:zcr214 时间:2016/4/15   Windows驱动开发最常接触的就是指针了,各种类型的地址很容易搞晕,绝大多数的API需要的参数都是UNICODE_STRING的指针类型的,当我们自己要使用它的时候,多少会有些麻烦,需要借助ANSI_STRING和PCHAR才能转换到我们更熟悉 阅读详情

UNICODE_STRING:

typedef struct _UNICODE_STRING {
  USHORT  Length;     //UNICODE占用的内存字节数,个数*2;
  USHORT  MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING ,*PUNICODE_STRING;

参数定义:
Length-----buffer的字节长度,不包括终止符“NULL”
MaximumLength---buffer的的总的字节大小。Up to MaximumLength bytes may be written into the                  buffer without trampling memory.
Buffer---Pointer to a wide-character string指向宽字符串的指针

ANSI_STRING:

typedef struct _STRING {
  USHORT  Length;
  USHORT  MaximumLength;
  PCHAR  Buffer;
} STRING, *PANSI_STRING;

实例:

WCAHR temp[] = L"Hello World!";   //定义宽字符串

UNICODE_STRING str ;

str.Buffer = temp;

str.Length  = wcslen(temp)*sizeof(WCHAR)   //这个长度为UNICODE字符串所占用的字节数,即字符的个数乘以每个字符所占的字节数。通常为: 字符个数*2 ; 


    当使用UNICODE_STRING 时,一定要手动设置UNICODE_STRING 的Length和MaximumLength 成员,不要想当然的认为设置了Buffer后,Length和MaximumLength 成员就会根据Buffer被自动设置。由其是当自己写的函数用UNICODE_STRING作为参数返回时,一定要设置Length和MaximumLength 成员,不然很可能得到非预期结果。


 当应用程序与驱动通信时,一般应用程序传入的字符串为ANSI,所以在驱动中应先定义ANSI_STRING,然后再使用RtlAnsiStringToUnicodeString 将其转换成UNICODE_STRING,作为后用。例:

ANSI_STRING  str_a;

UNICODE_STRING  str_u;

WCHAR buf_u[1024] = L"";

str_a.Buffer = InputBuffer ;  //InputBuffer 为输入缓冲区地址

str_a.Length = str_a.MaximumLength = strlen(InputBuffer);

//开辟UNICODE内存空间

str_u.Buffer = buf_u;

str_u.Length = str_u.MaximumLength = strlen(InputBuffer) * sizeof(WCHAR);

RtlAnsiStringToUnicodeString(&str_u, &str_a , TRUE);

........

........

//当RtlAnsiStringToUnicodeString第三个参数为TRUE时,要用RtlFreeUnicodeString释放临时的UNICODE_STRING

RtlFreeUnicodeString(&str_u);


拼接UNICODE_STRING

  当拼接UNICODE_STRING 时,注意目标UNICODE的Length为当前UNICODE中存储字符的字节数。如:

WCHAR str1[] = L"12345";

UNICODE_STRING str2;

str2.Buffer = ExAllocatePool(NonPagedPool, wcslen(str1)*sizeof(WCHAR))

str2.Length = 0;

str2.MaximumLength = wcslen(str1)*sizeof(WCHAR);

 RtlAppendUnicodeToString(&str2, str1);


 UNICODE 和 ExAllocatePool

   内核在UNICODE拼接或其他临时操作时,经常使用ExAllocatePool动态分配UNICODE的Buffer,简单情况:

UNICODE_STRING str;

str.Buffer = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));

str.Length = 0;

str.MaximumLength = 50*sizeof(WCHAR);

但若是定义一个UNICODE的指针,则如何初始化UNICODE ? 

PUNICODE_STRING pStr;

因为定义了一个指针,但指针目前并没有指向可用的内存地址,故先分配一块内存(NonPagedPool),让pStr指向这块内存。

pStr = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));

接着初始化成员:

pStr.Length = 0;

pStr.MaximumLength = ???;

如何初始化Buffer ?

    因为UNICODE_STRING 是一个数据结构,我们申请一块内存来存储这个数据结构,所以这块内存不仅存储了Buffer这个我们最关心的字符串,而且还储存这个数据结构,即Length 、 MaximumLength 和 Buffer (指针)成员。因为pStr是这块内存的起始地址,所以:

&pStr.Length = (USHORT*)pStr

&pStr.MaximumLength = (USHORT*)pStr + 1

&pStr.Buffer = (USHORT*)pStr + 2

所以得:

pStr.Buffer = (WCHAR*)((USHORT*)pStr + 2 + 2 )  因为一个USHORT占2个字节,一个指针占4个字节。这时得出,pStr.MaximumLength =  50*sizeof(WCHAR) - (2+2+4);

(注意,以上是为了方便观察特意写成赋值形式,但在编译器中并不适用,因为=左边得为左值。)

 整体:

PUNICODE_STRING pStr;

pStr = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));

pStr.Length = 0;

pStr.Buffer = (WCHAR*)( (USHORT*)pStr + 2 + 2 ) ; 

总结:

    定义UNICODE_STRING 时,编译器在栈上自动分配了存储UNICODE_STRING这个数据结构的空间,我们唯一要做的就是给Buffer这个指针成员(指向)分配内存。

    而定义PUNICODE_STRING时,在堆上分配了一块内存,这块内存不仅存储了Buffer,而且还存储了UNICODE_STRING这个数据结构。所以定义为PUNICODE_STRING时,要比预期的字符串至少多8个字节,就因为此。

pStr.MaximumLength = 50*sizeof(WCHAR) - (2+2+4);

UNICODE_STRING在驱动应用比较多,其操作大致有如下几个:
(1)初始化,常见的初始化有两种方式:
1.调用RtlInitUnicodeString,该函数原型如下:

程序代码

VOID  RtlInitUnicodeString(
    IN OUT PUNICODE_STRING  DestinationString,
    IN PCWSTR  SourceString
);
该方法的实际原理是:将SourceString的宽字符串指针赋值给UNICODE_STRING的Buffer值,同时SourceString的长度值填入结构的Length域,默认的MaximumLength = Length + 2;
如:RtlInitUnicodeString(&ustrRegString,L"Hello");
2.采用动态分配内存的方式初始化,其调用方式如下:

程序代码

UNICODE_STRING ustr;
ustr.Length= 0;
ustr.MaximumLength = 256;
ustr.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool,256,MEM_TAG);  //MEM_TAG为自定义
这样就动态分配了一个存储空间给ustr。
(2)字符串连接
连接常见的就是将两个UNICODE_STRING或者将WCHAR_T的字符串连接起来
首先,将两个UNICODE_STRING连接起来,调用RtlAppendUnicodeStringToString函数实现,其原型如下:

程序代码

NTSTATUS  RtlAppendUnicodeStringToString(
    IN OUT PUNICODE_STRING  Destination,
    IN PUNICODE_STRING  Source
);
调用该函数的原理是将两者的字符串Buffer拼接起来,同时,更新对应的Length和MaxLength域。在调用的
过程中要注意Destination的MaxLength域,若MaxLength小于Destination和Source的Length域的和的时候,该函数调用不成功,返回0xC0000023,即缓冲区溢出错误。所以在调用该函数的时候,一定要确定Destination的MaxLength 域。
若将WCHAR_T字符串串接到UNICODE_STRING之后,则需要调用RtlAppendUnicodeToString,函数原型如下:

程序代码

NTSTATUS  RtlAppendUnicodeToString(
IN OUT PUNICODE_STRING  Destination,
IN PCWSTR  Source
);
该函数和上面函数并没有特别多的不一致,但该函数较上一个函数不同的地方就是不会出现缓冲区溢出的错误,也就是即使Destination的MaxLength域为0,也可以执行RtlAppendUnicodeToString的操作。
还有另外一个需要注明的地方,如果UNICODE_STRING是通过RtlInitUnicodeString初始化,那么不管调用什么函数,修改UNICODE_STRING值的时候,初始化使用的PCWSTR数组的值也会发生改变,因为他们指向的是同一个Buffer。
注上一例,备后用:

程序代码

UNICODE_STRING  ustrStr,ustrName;
ustrStr.Length = wcslen(strKey) * 2;
RtlAppendUnicodeToString(&ustrStr,strKey);
ustrStr.MaximumLength = 256;
RtlAppendUnicodeToString(&ustrStr,L"\\");
RtlAppendUnicodeStringToString(&ustrStr,&ustrName);
(3)字符串转换
转换目的可能涉及到中文显示的问题,如果简单的UNICODE_STRING转换为wchar_t或者char的形式,采用RtlCopyMemory的方式,因为UNICODE_STRING字符串并不一定以\0作为结束符,所以需要使用RtlCopyMemory,拷贝定长的字符串。
对于中文显示的问题,采用ANSI_STRING的方式进行输出。从UNICODE_STRING到ANSI_STRING转换,可以通过RtlUnicodeStringToAnsiString实现,其原型如下:

程序代码

NTSTATUS  RtlUnicodeStringToAnsiString(
    IN OUT PANSI_STRING  DestinationString,
    IN PUNICODE_STRING  SourceString,
    IN BOOLEAN  AllocateDestinationString
);
典型例子如下:

程序代码

UNICODE_STRING src;
ANSI_STRING dst;
RtlInitUnicodeString(&src,L”打印汉字”);
RtlUnicodeStringToAnsiString(&dst,&src,TRUE);
DbgPrint(“%Z”,&dst);
RtlFreeAnsiString(&dst);

 

 

 

 

 

RtlInitUnicodeString与UNICODE_STRING的区别

UNICODE_STRING是一个结构.当你声明一个UNICODE_STRING时它的成员未初始化.而RtlInitUnicodeString是一个函数用来初始化一个UNICODE_STRING.

UNICODE_STRING
The UNICODE_STRING structure is used to define Unicode strings.

typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING *PUNICODE_STRING;
Members
Length
The length in bytes of the string stored in Buffer.
MaximumLength
The maximum length in bytes of Buffer.
Buffer
Pointer to a buffer used to contain a string of wide characters.
Headers
Defined in ntdef.h. Include wdm.h or ntddk.h.

Comments
The UNICODE_STRING structure is used to pass Unicode strings. Use RtlInitUnicodeString to initialize a UNICODE_STRING.

If the string is NULL-terminated, Length does not include the trailing NULL.

The MaximumLength is used to indicate the length of Buffer so that if the string is passed to a conversion routine such as RtlAnsiStringToUnicodeString the returned string does not exceed the buffer size.

 

 

我经常在网上遇到心如火燎的提问者。他们碰到很多工作中的技术问题,是关于驱动开发的。其实绝大部分他们碰到的“巨大困难”是被老牛们看成初级得不能再初级的问题。比如经常有人定义一个空的UNICODE_STRING,然后往里面拷贝字符串。结果无论如何都是蓝屏。也有人在堆栈中定义一个局部SPIN_LOCK,作为下面的同步用——这样用显然没有任何意义。我无法一一回答这些问题:因为往往要耐心的看他们的代码,才能很不容易的发现这些错误。而且我又不是总是空闲的,可以无休止的去帮网友阅读代码和查找初级错误。但是归根结底,这些问题的出现,是因为现在写驱动的同行越来越多,但是做驱动开发又没有比较基础的,容易读懂的资料。为此我决定从今天开始连载一篇超级入门级的教程,来解决那些最基本的开发问题。老牛们就请无视这篇教程,一笑而过了。

Windows驱动编程基础教程(1.1-1.3)

1.1 使用字符串结构

常常使用传统C语言的程序员比较喜欢用如下的方法定义和使用字符串:

char *str = { “my first string” }; // ansi字符串
wchar_t *wstr = { L”my first string” }; // unicode字符串
size_t len = strlen(str); // ansi字符串求长度
size_t wlen = wcslen(wstr); // unicode字符串求长度
printf(“%s %ws %d %d”,str,wstr,len,wlen); // 打印两种字符串

但是实际上这种字符串相当的不安全。很容易导致缓冲溢出漏洞。这是因为没有任何地方确切的表明一个字符串的长度。仅仅用一个’\0’字符来标明这个字符串的结束。一旦碰到根本就没有空结束的字符串(可能是攻击者恶意的输入、或者是编程错误导致的意外),程序就可能陷入崩溃。
使用高级C++特性的编码者则容易忽略这个问题。因为常常使用std::string和CString这样高级的类。不用去担忧字符串的安全性了。
在驱动开发中,一般不再用空来表示一个字符串的结束。而是定义了如下的一个结构:

typedef struct _UNICODE_STRING {
USHORT Length; // 字符串的长度(字节数)
USHORT MaximumLength; // 字符串缓冲区的长度(字节数)
PWSTR Buffer; // 字符串缓冲区
} UNICODE_STRING, *PUNICODE_STRING;

以上是Unicode字符串,一个字符为双字节。与之对应的还有一个Ansi字符串。Ansi字符串就是C语言中常用的单字节表示一个字符的窄字符串。

typedef struct _STRING {
USHORT Length;
USHORT MaximumLength;
PSTR Buffer;
} ANSI_STRING, *PANSI_STRING;

在驱动开发中四处可见的是Unicode字符串。因此可以说:Windows的内核是使用Uincode编码的。ANSI_STRING仅仅在某些碰到窄字符的场合使用。而且这种场合非常罕见。
UNICODE_STRING并不保证Buffer中的字符串是以空结束的。因此,类似下面的做法都是错误的,可能会会导致内核崩溃:

UNICODE_STRING str;
…
len = wcslen(str.Buffer); // 试图求长度。
DbgPrint(“%ws”,str.Buffer); // 试图打印str.Buffer。

如果要用以上的方法,必须在编码中保证Buffer始终是以空结束。但这又是一个麻烦的问题。所以,使用微软提供的Rtl系列函数来操作字符串,才是正确的方法。下文逐步的讲述这个系列的函数的使用。

1.2 字符串的初始化

请回顾之前的UNICODE_STRING结构。读者应该可以注意到,这个结构中并不含有字符串缓冲的空间。这是一个初学者常见的出问题的来源。以下的代码是完全错误的,内核会立刻崩溃:

UNICODE_STRING str;
wcscpy(str.Buffer,L”my first string!”);
str.Length = str.MaximumLength = wcslen(L”my first string!”) * sizeof(WCHAR);

以上的代码定义了一个字符串并试图初始化它的值。但是非常遗憾这样做是不对的。因为str.Buffer只是一个未初始化的指针。它并没有指向有意义的空间。相反以下的方法是正确的:

// 先定义后,再定义空间
UNICODE_STRING str;
str.Buffer = L”my first string!”;
str.Length = str.MaximumLength = wcslen(L”my first string!”) * sizeof(WCHAR);
… …

上面代码的第二行手写的常数字符串在代码中形成了“常数”内存空间。这个空间位于代码段。将被分配于可执行页面上。一般的情况下不可写。为此,要注意的是这个字符串空间一旦初始化就不要再更改。否则可能引发系统的保护异常。实际上更好的写法如下:

//请分析一下为何这样写是对的:
UNICODE_STRING str = {
sizeof(L”my first string!”) – sizeof((L”my first string!”)[0]),
sizeof(L”my first string!”),
L”my first_string!” };

但是这样定义一个字符串实在太繁琐了。但是在头文件ntdef.h中有一个宏方便这种定义。使用这个宏之后,我们就可以简单的定义一个常数字符串如下:

#include <ntdef.h>
UNICODE_STRING str = RTL_CONSTANT_STRING(L“my first string!”);

这只能在定义这个字符串的时候使用。为了随时初始化一个字符串,可以使用RtlInitUnicodeString。示例如下:

UNICODE_STRING str;
RtlInitUnicodeString(&str,L”my first string!”);

用本小节的方法初始化的字符串,不用担心内存释放方面的问题。因为我们并没有分配任何内存。

1.3 字符串的拷贝

因为字符串不再是空结束的,所以使用wcscpy来拷贝字符串是不行的。UNICODE_STRING可以用RtlCopyUnicodeString来进行拷贝。在进行这种拷贝的时候,最需要注意的一点是:拷贝目的字符串的Buffer必须有足够的空间。如果Buffer的空间不足,字符串会拷贝不完全。这是一个比较隐蔽的错误。
下面举一个例子。

UNICODE_STRING dst; // 目标字符串
WCHAR dst_buf[256]; // 我们现在还不会分配内存,所以先定义缓冲区
UNICODE_STRING src = RTL_CONST_STRING(L”My source string!”);

// 把目标字符串初始化为拥有缓冲区长度为256的UNICODE_STRING空串。
RtlInitEmptyString(dst,dst_buf,256*sizeof(WCHAR));
RtlCopyUnicodeString(&dst,&src); // 字符串拷贝!

以上这个拷贝之所以可以成功,是因为256比L” My source string!”的长度要大。如果小,则拷贝也不会出现任何明示的错误。但是拷贝结束之后,与使用者的目标不符,字符串实际上被截短了。
我曾经犯过的一个错误是没有调用RtlInitEmptyString。结果dst字符串被初始化认为缓冲区长度为0。虽然程序没有崩溃,却实际上没有拷贝任何内容。
在拷贝之前,最谨慎的方法是根据源字符串的长度动态分配空间。

转自:http://www.cnblogs.com/zudn/archive/2010/12/30/1921457.html#top

SPI 协议帧格式深度解析:从 8 位数据到 16 位扩展的 3 种模式 本文深入解析SPI协议的帧格式,涵盖从8位标准到16位扩展的三种模式。通过详细讲解SPI时钟模式、数据宽度配置及实际应用案例,帮助开发者掌握SPI外设的深度定制能力,提升嵌入式系统开发效率。特别适用于连接传感器、存储器和显示器等高速通讯场景。 阅读详情

相关推荐

瑞萨单片机,把CS文件转换为CC

1、打开CC的软件: 点击坐上角的"START" 点击"Create New Project"的"GO": 导入工程: 如下图设置后,点击"Create" 2、进入到CC的开发界面: 可以看到原启动库文件以asm文件的方式直接出现在工程中: 删除新生成的main.c,保留导入的r_main.c(以你自己的代码为准): 注意添加所有的头文件路径: 点击"...

weixin_37611121的博客 1228

UNICODE_STRING

UNICODE_STRING 是在内核中描述字符串的结构体,和应用层的Char不一样,Unicode_String 每个字占两个字节,计算length是 *sizeof(WCHAR) 定义为 UNICODE_STRING Str = {0} 结构为 typedef struct _UNICODE_STRING{ USHORT Length;//字节数 USHORT MaximumLength;//字节数,告诉系统函数多少内存可用 PWSTR Buffer;//指向字符串的指针 }UNICODE_STRING

Misaka10046的博客 1838

数据基础设施建设任务中的技术名词解析

近日,国家数据局确定了18个数据基础设施建设任务(先行先试)承担地区,建设任务内容为:数场、数据空间、数据原件、隐私计算、数联网、区块链。这些概念都有什么样的内涵,他们的相互关系是怎样的?

五角大寨 5303

UNICODE_STRING详解及注意事项

UNICODE_STRING

DontBeProud 8484

别再乱调了!Zygo MetroPro软件滤波功能保姆级指南,从均值到鲁棒高斯样条一次讲清

本文深入解析Zygo MetroPro软件的滤波功能,从均值滤波到鲁棒高斯样条等九种算法,帮助用户根据测量对象特性选择最佳滤波组合。通过真实工业案例和参数配置指南,提升光学测量数据的准确性和效率,特别适用于硅晶圆、光学镜片等精密测量场景。

weixin_30888413的博客 156

INMP441麦克风与ESP32的I2S音频采集实战指南

本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。

weixin_28396629的博客 598

驱动开发:内核字符串转换方法

也需要调用专用的初始化函数,如下分别初始化ANSI和UNCODE字符串,我们来看看代码是如何实现的。,这两种格式是微软推出的安全版本的字符串结构体,也是微软推荐使用的格式,通常情况下。也就是UNCODE类型的字符,如下文章将介绍这两种字符格式在内核中是如何转换的。也就是ANSI多字节模式的字符串,而。内核函数,该函数也是微软提供的。这两个内核函数也是非常常用的。在内核编程中字符串有两种格式。之间的灵活转换,内核中提供了。继续看另一种转换模式,将。如果将上述过程反过来,将。这个内核专用函数实现。

微软技术分享 1万+

告别环境配置烦恼:用Conda一键搞定GATK4、samtools、fastp等生信分析全家桶

本文介绍如何利用Conda快速搭建包含GATK4、samtools、fastp等工具的生物信息学分析环境,解决软件安装和版本冲突问题。通过详细的配置步骤和实战案例,帮助研究者十分钟内完成重测序分析全家桶的环境配置,显著提升上游分析效率。

weixin_30753873的博客 334

c语言怎么输出unicode字符,C/C++语言使用Unicode的方法

一、在C/C++控制台应用程序中使用Unicode的方法可能很多人都知道C/C++中Unicode字符串是wchar_t*,Unicode字符串常量是L"string",但是通常没办法在console中直接输出这些字符串,因为C/C++默认的设置是locale="C"(C区域),不支持Unicode字符串。其实在C/C++中输出Unicode字符串很简单,只要重新设置一下区域,将区域设置为loca...

weixin_42499899的博客 6132

【详细】芯片设计全流程(包括每个流程需要用到的工具以及需要参与的工作人员)

一颗芯片的诞生经历了设计、制造和测试(分别对应集成电路产业链的设计业、制造业和封测业),而每一步都包含了复杂的步骤和流程。 图0-1 集成电路产业链 现在,我们重点介绍芯片设计的全流程以及每个流程需要用到的设计工具和需要参与的工作人员。 一、IC设计分类 首先对IC设计的分类做个介绍,如图1-1所示。 图1-1 IC设计分类 如图1-1所示,IC设计可以粗分为数字IC设计和射频/模拟IC设计,数字IC设计又可分为ASIC设计和FPGA/CPLD设计,此外还有一部分IC设计.

qq_36045093的博客 8万+

WPS访问权限不足怎么解决??具体怎么操作?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 4169

UNICODE_STRING的技术总结

UNICODE_STRING一般是用在windows的内核驱动编程中,由于内核对安全的问题放在软件开发的首位,哪怕连一个字符串的使用都不能掉以轻心。 先看UNICODE_STRING的结构定义 typedef struct  _UNICODE_STRING {     USHORT Length;     USHORT MaximumLength;     PWCH   Buffer;

苏权的专栏 5486

081、空间降噪(Spatial Denoise)实战:双边滤波、非局部均值与BM3D在ISP中的调优

调参时,别只看PSNR/SSIM。找几个典型场景(夜景、人像、文字、天空),在真实设备上肉眼对比。我见过PSNR涨了2dB但图像看起来更差的案例——因为PSNR不惩罚纹理丢失。空间降噪这块,理论说再多,不如动手调一次。下次遇到噪点问题,先别急着上BM3D,试试双边滤波的自适应参数,说不定有惊喜。

zzfmlxs的博客 43

内核开发中的UNICODE String

<br /><br />UNICODE 和 ExAllocatePool<br />   内核在UNICODE拼接或其他临时操作时,经常使用ExAllocatePool动态分配UNICODE的Buffer,简单情况:<br />UNICODE_STRING str;<br />str.Buffer = ExAllocatePool(NonPagedPool, 50*sizeof(WCHAR));<br />str.Length = 0;<br />str.MaximumLength = 50*sizeof(

似水流年 -- 韩欣的博客 1279

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

驱动开发之 UNICODE_STRING 总结

UNICODE_STRING: typedef struct _UNICODE_STRING {   USHORT  Length;     //UNICODE占用的内存字节数,个数*2;   USHORT  MaximumLength;   PWSTR  Buffer; } UNICODE_STRING ,*PUNICODE_STRING; 参数定义: Length

Lydia的博客 3876

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Unicode转String

最近调用关联系统的接口,对方返回的msg内容是Unicode编码的,于是学习了一下Unicode转String的方法 先上代码: public static String unicode2String(String unicode) { StringBuffer string = new StringBuffer(); String[] hex = unicode.split("\\\

yufeng1397的博客 2152

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

UNICODE_STRING 处理

转自:http://www.cnblogs.com/zudn/archive/2010/12/30/1921457.html UNICODE_STRING: typedef struct _UNICODE_STRING {   USHORT  Length;     //UNICODE占用的内存字节数,个数*2;   USHORT  MaximumLength;  

ShadowAssassin的专栏 3831

UNICODE_STRING structure

UNICODE_STRING structure The UNICODE_STRING structure is used to define Unicode strings. Syntax typedef struct _UNICODE_STRING {   USHORT Length;   USHORT MaximumLength;   PWSTR  Buffer; } UNIC

死胖子的博客 915

打印UNICODE_STRING 

在用DbgPrint打印UNICODE_STRING变量时,要注意是DbgPrint 变量的Buffer才能显示出字符串。例UNICODE_STRING str = RTL_CONSTANT_STRING(L“my first string!”);DbgPrint("The Str is: %ws",str.Buffer );若直接打印str,则打印的只是指向UNICODE_STRIN

2288

Python Unicode和string

Python Unicode和string那些事 开发过程中总是会碰到string,Unicode,ASCII,中文字符等编码的问题,本文力求搞清楚Python的string和Unicode到底是怎么回事! 基础知识 我们都知道计算机只认0和1,要想在计算机显示26个字母,就要给他们一套映射规则:计算机能认得的符号——>人类可读的符号,这转换的过程就是一套编码规则。 字符集:就是一套字符的...

qq_42269354的博客 2830

javascript中unicode和String类型互相转换

javascript 中 unicode 和 String 类型互相转换 unicode 转 String // unicode --> String // 第一种方法 eval("'" + '\u5e74\u6708\u65e5' + "'")// 众所周知, 用eval的时候要特别注意空格, 建议在此处复制 // 第二种方法 unescape("\u5e74\u6708\u65e5") String 转 unicode // 1, 文字转 unicode 码 "\\u"+parseInt('我'

powerFulCat的博客 3074

C++11 Unicode string literals 从入门到精通

Unicode 是计算机领域的一项行业标准,它对世界上绝大部分的文字进行整理和统一编码。Unicode 的编码空间可以划分为 17 个平面(plane),每个平面包含 2 的 16 次方(65536)个码位。17 个平面的码位可表示为从 U+0000 到 U+10FFFF,共计 1114112 个码位。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0),其他平面称为辅助平面(Supplementary Planes)。

码事漫谈 1816

驱动开发初探之UNICODE_STRING

由于前一阵子有一个实验是关于驱动开发的,觉得很有意思就看了一下,但是这一看就看了两个星期,很多事情都耽误了,希望我写出的这些可以帮助大家少走弯路。 关于UNICODE_STRING是有很多RTL函数可以用的,然而在我做实验的过程中,由于不太熟悉,从刚开始全用RTL函数到后来尽可能不用,我对不告诉我它内部到底是怎么样的东西一般比较排斥。 下面言归正传,下面一段代码的作用是完整的从内存分配到初始化

zgl07的专栏 2325
上一篇: VMware 虚拟机中添加新硬盘的方法
下一篇: IoSetCompletionRoutine
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值