前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows 内核驱动字符串操作

Windows 内核驱动字符串操作

作者头像
我与梦想有个约会
发布2023-10-21 14:09:40
2010
发布2023-10-21 14:09:40
举报
文章被收录于专栏:jiajia_dengjiajia_deng

在 Windows 内核开发中,字符串并非像 C 中使用的是一个 \0 结尾的字符数组,取而代之的是一个结构体,该结构体储存了指向字符的指针和字符的长度。因为没有了 \0,很多 C 语言库函数也无法使用了,但不用担心,Windows 提供了很多操作这种字符串的函数。见如下示例:

初始化、拷贝、拼接字符串

代码语言:javascript
复制
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
      // 使用字符串常量初始化字符串
      UNICODE_STRING src;
      RtlInitUnicodeString(&src, L "Hello My First Driver..\r\n");

      // 用一个缓冲区初始化字符串
      UNICODE_STRING dst;
      WCHAR dst_buf[256];
      RtlInitEmptyUnicodeString(&dst, dst_buf, 256 * sizeof( WCHAR));

      // Copy 字符串
      RtlCopyUnicodeString(&dst, &src);
      DbgPrint("src = %wZ\r\ndst = %wZ\r\n", &src, &dst);

      // Append 字符串
      RtlAppendUnicodeToString(&dst, L "Yes I'm Fine...\r\n");
      DbgPrint("Append String dst = %wZ\r\n", &dst);

      driver->DriverUnload = DriverUnload;
      return STATUS_SUCCESS;
}

实现类 C 语言函数 sprintf

代码语言:javascript
复制
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
      WCHAR dst_buf[512] = { 0 };
      UNICODE_STRING dst;
      NTSTATUS status;
      UNICODE_STRING file_path =
             RTL_CONSTANT_STRING(L "\\??\\c:\\winddk\\7600.16385.1\\inc\\cifs.h" );
      USHORT file_size = 1024;

      RtlInitEmptyUnicodeString(&dst, dst_buf, 512 * sizeof( WCHAR));

      // 实现类 sprintf 的功能
      status = RtlStringCbPrintfW(
            dst. Buffer,
            512 * sizeof( WCHAR),
            L "file path = %wZ file size = %d \r\n",
            &file_path, file_size);
      dst.Length = wcslen(dst.Buffer) * sizeof(WCHAR);

      DbgPrint("dst = %wZ\r\n", &dst);

      driver->DriverUnload = DriverUnload;
      return STATUS_SUCCESS;
}

动态分配内存储存字符串

代码语言:javascript
复制
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
      NTSTATUS status;
      UNICODE_STRING dst = { 0 };
      UNICODE_STRING src = RTL_CONSTANT_STRING(L "Hello My First Driver...\r\n");

      // 根据 src 长度给 dst 分配内存
      dst.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool, src.Length, MEM_TAG);
      if (NULL == dst.Buffer)
      {
             status = STATUS_INSUFFICIENT_RESOURCES;
      }

      // 指定 dst 字符串的长度
      dst.Length = dst.MaximumLength = src.Length;
      // 拷贝字符串
      RtlCopyUnicodeString(&dst, &src);

      // 包装一层 DbgPrint,让其只在 Debug 模式下打印
      KdPrint(("ExAllocatePoolWithTag: dst = %wZ\r\n", &dst));

      // 释放内存并将字符串指向 NULL,长度置为 0
      ExFreePool(dst.Buffer);
      dst.Buffer = NULL;
      dst.Length = dst.MaximumLength = 0;

      driver->DriverUnload = DriverUnload;
      return status;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 初始化、拷贝、拼接字符串
  • 实现类 C 语言函数 sprintf
  • 动态分配内存储存字符串
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档