• 驱动中字符串的操作


    /如果本文有不对的地方,望即时指点!

    字符串的初始化

    定义一个UNICODE_STRING类型的变量,这只是一个空的结构体而已,我们并没有给它分配任何的内存。如果直接对其进行字符串拷贝等操作,肯定会 引起异常的,当我们定义这样类型的一个变量,我们应该就把它看作一个WCHAR型的指针,没有“new”空间,所以我们必须去“new”空间给它。

    typedef struct

    {

        USHORT Length;

        USHORT MaximumLength;

        PWCHAR Buffer;

    }UNICODE_STRING, *PUNICODE_STRING;

    有以下几种方式:

    1.RtlInitEmptyUnicodeString

    UNICODE_STRING str;

    WCHAR wcsBuffer[1024] = {0};

    RtlEmptyUnicodeString(&str, wcsBuffer, sizeof(wcsBuffer));

    这种方式就像定义一个静态的串 WCHAR wcsBuffer[1024] = {0}。

    2.动态申请空间

    UNICODE_STRING str;

    str.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonpagePool, 1024, ‘1234’);

    str.Length = 0;

    str.MaximumLength = 1024;

    这种方式就像定义一个WCHAR* pwcsBuffer = new WCHAR[1024];

    使用完之后,必须释放内存。

    ExFreePool或者是ExFreePoolWithTag。

    3.定义常量UNICODE_STRING

    可以使用宏RTL_CONSTANT_STRING

    UNICODE_STRING str = RTL_CONSTANT_STRING(L”my first string”);

    记住这个字符串不能再被修改,因为这就像定义了char *str = “123”; 该字符串不能再被修改。

    字符串的拷贝

    RtlCopyUnicodeString(&dst, &src);

    字符串的连接

    RtlAppendUnicodeToString(&dst, L”123”);

    RtlAppendUnicodeToUnicodeString(&dst, &src);

     

    //下面的表格是转载的,找不到出处了,见谅!

    驱动中使用的字符串操作函数 ,这里给出ANSI和UNICODE的对比

    操作

    ANSI串函数

    Unicode串函数

    Length

    Strlen

    wcslen

    Concatenate

    Strcat

    strncat

    Wcscat

    wcsncat

    RtlAppendUnicodeStringToString

    RtlAppendUnicodeToString

    Copy

    Strcpy

    strncpy

    RtlCopyString

    Wcscpy

    wcsncpy

    TrlCopyUnicodeString

    Reverse

    _strrev

    _wcsrev

    Compare

    Strcmp

    Strncmp

    _stricmp

    _strnicmp

    RtlCompareString

    RtlEqualString

    Wcscmp

    Wcsncmp

    _wcsicmp

    _wcsnicmp

    RtlCompareUnicodeString

    RtlEqualUnicodeString

    RtlPrefixUnicodeString

    Initialize

    _strset

    _strnset

    RtlInitAnsiString

    RtlInitString

    _wcsnset

    RtlInitUnicodeString

    Search

    Strchr

    strrchr

    strspn

    strstr

    Wcschr

    wcsrchr

    wcsspn

    wcsstr

    Upper/Lowercase

    _strlwr

    _strupr

    RtlUpperString,

    _wcslwr

    _wcsupr

    RtlUpcaseUnicodeString

    Character

    isdigit

    islower

    isprint

    isspace

    isupper

    isxdigit

    tolower

    toupper

    RtlUpperChar

    Towolower

    towupper

    RtlUpcaseUnicodeString

    Format

    Sprintf

    vsprintf

    _snprintf

    _vsnprintf

    Swprintf

    _snwprintf

    String Conversion

    Atoi

    Atoll

    _itoa

    _itow

    RtlIntegerToUnicodeString

    RtlUnicodeStringToInteger

    Type conversion

    RtlAnsiStringToUnicodeString

    RtlAnsiStringToUnicodeString

    RtlUnicodeStringToAnsiString

    Memory Release

    RtlFreeAnsiString

    RtlFreeUnicodeString

  • 相关阅读:
    ActiveMq C#客户端 消息队列的使用(存和取)
    .NET中RabbitMQ的使用
    如何写入和读取从 Microsoft 消息队列在 Visual C#
    完整的站内搜索Demo(Lucene.Net+盘古分词)
    最大熵,熵,MLE的解释,还行
    JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
    Fundebug发布Vue插件,简化BUG监控接入代码
    Spring Boot统一异常处理实践
    预计2019年发布的Vue3.0到底有什么不一样的地方?
    开源前端脚本错误监控及跟踪解决项目BadJS试用
  • 原文地址:https://www.cnblogs.com/15157737693zsp/p/4526481.html
Copyright © 2020-2023  润新知