首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >驱动编程——字符串与链表

驱动编程——字符串与链表

作者头像
用户1423082
发布2024-12-31 18:17:17
发布2024-12-31 18:17:17
8100
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

字符串操作

字符串初始化

代码语言:javascript
代码运行次数:0
运行
复制
UNICODE_STRING str = {0};
RtlInitUnicodeString(&str, L"my first string");

字符串拷贝

代码语言:javascript
代码运行次数:0
运行
复制
UNICODE_STRING dst; //目标字符串
WCHAR dst_buf[256]; //我们现在还不会分配内存,就定义固定长度的缓冲区吧
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my first string");

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

字符串连接

代码语言:javascript
代码运行次数:0
运行
复制
NTSTATUS status;
UNICODE_STRING dst; //目标字符串
WCHAR dst_buf[256]; //我们现在还不会分配内存,就定义固定长度的缓冲区吧
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my first string");

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

status = RtlAppendStringToString(&dst, L"my second string");
//如果连接两个UNICODE_STRING
//The RtlAppendUnicodeStringToString routine concatenates two Unicode strings. 
status = RtlAppendUnicodeStringToString(&dst, &another);

字符串打印

代码语言:javascript
代码运行次数:0
运行
复制
NTSTATUS
  RtlStringCbPrintfW(
    OUT LPWSTR  pszDest,
    IN size_t  cbDest,
    IN LPCWSTR  pszFormat,
    ...
    );

这个需要包含头文件ntsagestr.h

代码语言:javascript
代码运行次数:0
运行
复制
#include <ntsagestr.h>
......
......
status = RtlStringCbPrintfW(
dst->Buffer, 512*sizeof(WCHAR), L"filepath = %wz file size = %d \r\n",&file_path, file_size);
dst->Length = wcslen(dst->Buffer)*sizeof(WCHAR);

内存与链表

内存的分配与释放

代码语言:javascript
代码运行次数:0
运行
复制
NTSTATUS status;
#define MEM_TAG 'MyTt'
// 目标字符串,接下来为它分配空间
UNICODE_STRING dst; 
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my first string");
dst.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool, src.Length, MEM_TAG);
if (dst.Buffer == NULL)
{
    /* 错误处理 */
    status = STATUS_INSUFFICIENT_RESOURCES;
}
dst.Length = dst.MaximumLength = src.Length;
RtlCopyUnicodeString(&dst, &src);

ExFreePool(dst.Buffer);
dst.Buffer = NULL;
dst.Length = dst.MaximumLength = 0;

使用LIST_ENTRY

使用长长整形数据

代码语言:javascript
代码运行次数:0
运行
复制
#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    };
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

自旋锁

初始化

代码语言:javascript
代码运行次数:0
运行
复制
KSPIN_ my_Spin_Lock;  
KeInitializeSpinLock(&my_Spin_Lock);

使用

代码语言:javascript
代码运行次数:0
运行
复制
void MySafeFunction()  
{  
    KSPIN_LOCK my_spin_lock;  
    KIRQL irql;  
    KeInitialiezeSpinLock(&my_spin_lock);  
    KeAccquireSpinLock(&my_spin_lock, &irql);  
      
    //----do something  
      
    KeReleaseSpinLock(&my_spin_lock, &irql);  
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符串操作
    • 字符串初始化
    • 字符串拷贝
    • 字符串连接
    • 字符串打印
  • 内存与链表
    • 内存的分配与释放
    • 使用LIST_ENTRY
    • 使用长长整形数据
    • 自旋锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档