当前位置:首页 > > 充电吧
[导读]1、字符串Unicode字符串有一个结构体定义如下:typedef struct _UNICODE_STRING {  USHORT Length; //字符串的长度(字节数)  USHORT Max

1、字符串

Unicode字符串有一个结构体定义如下:

typedef struct _UNICODE_STRING {

  USHORT Length; //字符串的长度(字节数)

  USHORT MaximumLength; //字符串缓冲区的长度(字节数)

  PWSTR Buffer; //字符串缓冲区

} UNICODE_STRING, *PUNICODE_STRING;

需要注意的是,当我们定义了一个UNICODE_STRING变量之后,它的Buffer域还没有分配空间,因此我们不能直接赋值,好的做法是使用微软提供的Rtl系列函数。

  UNICODE_STRING str;

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

  或者如下所示:

  #include

  UNICODE_STRING str =RTL_CONSTANT_STRING(L"my first string!");

与ring3不同,我们的UNICODE字符串并不是以“”来表示字符串结束的,而是依靠UNICODE_STRING的Length域来确定。


1)字符串的很多操作都有相应的函数

  例如字符串的复制可以使用RtlCopyUnicodeString函数;

  字符串的比较可以使用RtlCompareUnicodeString函数;

  字符串转换成大写可以使用RtlUpcaseUnicodeString函数(没有转换成小写的);

  字符串与整数数字互相转换分别可以使用RtlUnicodeStringToInteger和RtlIntegerToUnicodeString函数。

比如在输出日志记录的时候,我们往往同时涉及数字、字符等信息,在C语言中我们可以使用sprintf和swprintf函数来完成任务,这两个函数在驱动中仍然可以使用,但很不安全,因为有许多C语言的运行时函数都是基于Win32 API的,在驱动中绝对不能使用,如果我们不清楚哪些可以使用哪些不能使用,就都不要使用,而使用微软推荐的Rtl系列函数。对应sprintf的功能函数是RtlStringCbPrintfW,它需要包含头文件“ntstrsafe.h”和静态连接库“ntsafestr.lib”。

?WCHARbuf[512] = { 0 };UNICODE_STRING dst;NTSTATUS status;……// 字符串初始化为空串。缓冲区长度为512*sizeof (WCHAR)RtlInitEmptyString(dst,dst_buf,512*sizeof(WCHAR));// 调用RtlStringCbPrintfW 来进行打印status = RtlStringCbPrintfW(  dst->Buffer,L”file path = %wZ file size = %d rn”,  &file_path,file_size);//这里调用wcslen 没问题,这是因为RtlStringCbPrintfW打印的字符串是以空结束的。dst->Length = wcslen(dst->Buffer) * sizeof(WCHAR);

  RtlStringCbPrintfW在目标缓冲区内存不足的时候依然可以打印,但是多余的部分被截

去了。返回的status值为STATUS_BUFFER_OVERFLOW。调用这个函数之前很难知道究竟需要多长的缓冲区。一般都采取倍增尝试。每次都传入一个为前次尝试长度为2倍长度的新缓冲区,直到这个函数返回STATUS_SUCCESS为止。

值得注意的是UNICODE_STRING类型的指针,通常用%wZ可以打印出字符串。在不能保证字符串为空结束的时候,必须避免使用%ws或者%s。其他的打印格式字符串与传统C语言中的printf函数完全相同。可以尽情使用。


2)内核模式下各种开头函数的区别

函数开头含义

Cc

Cache manager

Cm

Configuration manager

Ex

Executive support routines

FsRtl

File system driver run-time library

Hal

Hardware abstraction layer

Io

I/O manager

Ke

Kernel

Lpc

Local Procedure Call

Lsa

Local security authentication

Mm

Memory manager

Nt

Windows 2000 system services (most of which are exported as Win32 functions),例如NtCreateFile往往导出为CreateFile

Ob

Object manager

Po

Power manager

Pp

PnP manager

Ps

Process support

Rtl

Run-time library

Se

Security

Wmi

Windows Management Instrumentation

Zw

Mirror entry point for system services (beginning with Nt) that setsprevious access mode to kernel, which eliminates parametervalidation, since Nt system services validate parameters only ifprevious access mode is user see Inside Microsoft Windows 2000


3)大部分的Win32 API都是通过Native API实现的,Native API函数一般都是Win32 API函数前面加上Nt两个字符,例如CreateFile函数对应着NtCreateFile函数,这些Nt函数都是在“ntdll.dll”实现的,而多数Win32 API都是在“kernel.dll”导出的,也有少部分GDI或窗口相关的函数是在“gdi32.dll”和“user32.dll”导出的。

Native API从用户模式穿越进入到内核模式调用系统服务,这个穿越过程是通过软中断的方式进入的。这个软中断的实现方法在不同版本的Windows实现方式略有不同,在Win 2K下是通过“int 2eh”实现的,在Win XP是通过“sysenter”指令完成的。

软中断会将Native API的参数和系统服务号的参数一起传进内核模式,不同的NativeAPI会对应不同的系统服务号,这个过程是由SSDT辅助完成的。

系统服务函数一般和Native API具有相同的名字,例如都是NtCreateFile,但它们的实现不同,系统服务调用是在“ntoskrnl.exe”导出的。


4)创建文件

代码 1NTSTATUS
2
3CreateFileTest( IN PUNICODE_STRING FileName )
4
5{
6
7HANDLE hFile=NULL;
8
9NTSTATUS status;
10
11IO_STATUS_BLOCK Io_Status_Block;
12
13//初始化文件路径
14
15OBJECT_ATTRIBUTES obj_attrib;
16
17InitializeObjectAttributes(&obj_attrib,
18
19  FileName,
20
21  OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
22
23  NULL,
24
25  NULL );
26
27//创建文件
28
29status=ZwCreateFile(&hFile,
30
31GENERIC_ALL,
32
33&obj_attrib,
34
35&Io_Status_Block,
36
37NULL,
38
39FILE_ATTRIBUTE_NORMAL,
40
41FILE_SHARE_READ,
42
43FILE_CREATE,
44
45FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT,
46
47NULL,
48
490);
50
51if(NT_SUCCESS(status))
52
53{
54
55  status=STATUS_SUCCESS;
56
57}
58
59else
60
61{
62
63  status=Io_Status_Block.Status;
64
65}
66
67KdPrint(("hFile = %08X", hFile));
68
69//关闭句柄
70
71if(hFile)
72
73{
74
75  ZwClose(hFile);
76
77}
78
79  returnstatus;
80
81}


5)长长整形:

typedef __int64 LONGLONG;

typedef union _LARGE_INTEGER {

struct {

ULONG LowPart;

LONG HighPart;

};

struct {

ULONG LowPart;

LONG HighPart;

} u;

LONGLONG  QuadPart;

} LARGE_INTEGER;

<p class="p0" style="margin:0pt auto; padding-top:0px;

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭