在驱动编程中,处理字符串最好用UNICODE_STRING,UNICODE_STRING是一个结构,查看MSDN如下:

typedef struct _UNICODE_STRING{

USHORT length;\\字符串的长度

USHORT MaxnumLength;\\整个缓冲区的最大长度

PWSTR Buffer;\\缓冲

}UNICODE_STRING *PUNICODE_STRING;

字符串不是以00结尾,而是用一个结构来指定字符串的长度。

DDK提供了一个函数用于初始化字符串

VOID RtlInitUnicodeString(

IN OUT PUNICODE_STRING DestiantionString,//定义的字符串结构指针

IN PCWSTR SourceString//字符串

);

创建好一个工程框架,在框架中加入下面代码:

UNICODE_STRING mystr;//定义字符串

RtlInitUnicodeString(&mystr,L”www.lingdux.com“);//字符串初始化

DbgPrint(“%wZ”,&mystr);//打印字符串

加载驱动,用DEBUG View 成功看到结果www.lingdux.com

接下来在定义一个字符串结构,把字符串copy到新的结构

要为新的字符串初始化,并且分配空间

ddk提供了一个函数来分配空间

PVOID ExAllocatePool(
    IN POOL_TYPE  PoolType,//分页方式
    IN SIZE_T  NumberOfBytes//大小
    );

用下面的函数copy字符串

VOID RtlInitUnicodeString(

IN OUT PUNICODE_STRING destinationString,//目标字符串指针

IN PUNICODE_STRING SourceString//源字符串指针

);

UNICODE_STRING mynewstr;//定义字符串

mynewstr.Buffer=(PWSTR)ExAllocatePool(PagedPool,256);//分配内存空间

RtlInitUnicodeString(&mynewstr,&mystr);//copy字符串

DbgPrint(“%wZ”,&mynewstr);//打印字符串

载入驱动后用Debug Viwe成功截获到两个www.lingdux.com

最终代码如下

#include <ntddk.h>
VOID Unload(IN PDRIVER_OBJECT DriverObject)
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
 UNICODE_STRING mystr;
 UNICODE_STRING mynewstr;
 RtlInitUnicodeString(&mystr,L”www.lingdux.com“);
 DbgPrint(“%wZ”,&mystr);
 mynewstr.Buffer=(PWSTR)ExAllocatePool(PagedPool,256);
 RtlCopyUnicodeString(&mynewstr,&mystr);
 DbgPrint(“%wZ”,&mynewstr);
 DriverObject->DriverUnload=Unload;
 return STATUS_SUCCESS;
}

, , , , ,
Trackback

本文到目前为止还暂无回复

添加回复