使用字符串结构
传统C语言总定义和使用字符串:
ansi和unicode
ansi
unicode
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
//print
printf("%s %ws %d %d",str,wstr,len,wlen);
1 字符串定义
驱动中常用的字符串结构
typedef struct _UNICODE_STRING{
USHORT Length;//字符串长度
USHORT MaximumLength;//缓冲区长度
PWSTR Buffer;//缓冲区
}UNICODE_STRING,*PUNICODE_STRING;
typedef struct _ANSI_STRING{
USHORT Length; //字符串长度
USHOTT MaximumLength;//缓冲区长度
PSTR Buffer;//缓冲区
}ANSI_STRING,*PANSI_STRING;
对UNICODE_STRING的赋值:
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中有一个宏RTL_CONSTANT_STRING,使用这个宏后,我们就可以简单的
定义一个常数字符串如下:
UNICODE_STRING str=RTL_CONSTANT_STRING(L"my first string");
UNICODE_STRING str;
RtlInitUnicodeString(&str,L"my first string");
2 字符串的拷贝
UNICODE_STRING dst;//目标字符串
WCHAR dst_buf[256];
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my source string!");
//分配缓冲区
RtlInitEmptyString(dst,dst_buf,256*sizeof(WCHAR)); //
RtlCopyUnicodeString(&dst,&src); //字符串拷贝
3 字符串的连接
NTSTATUS status;
UNICODE_STRING dst; //目标字符串
WCHAR dst_buf[256];//定义缓冲区
UNICODE_STRING src = RTL_CONSTANT_STRING(L"My source string!");//定义
//初始化目标字符串
RtlInitEmptyString(dst,dst_buf,256*sizeof(WCHAR));
RtlCopyUnicodeString(&dst,&src); //字符串拷贝
status = RtlAppendUnicodeToString(
&dst,
L"my second string!");
if(status != STATUS_SUCCESS)
{
... ...
}
4 字符串的打印
1)字符串和数字的集合
sprintf(),swprintf()不安全.微软推荐RtlStringCbPrintW
// 调用RtlStringCbPrintfW来进行打印
status = RtlStringCbPrintfW(
dst->Buffer,L”file path = %wZ file size = %d \r\n”,
&file_path,file_size);
// 这里调用wcslen没问题,这是因为RtlStringCbPrintfW打印的
// 字符串是以空结束的。
dst->Length = wcslen(dst->Buffer) * sizeof(WCHAR);
2)输出打印
DbgPrint() 打印调试信息