whypro 发表于 2010-10-15 17:58:58

驱动学习笔记

驱动学习笔记。

1.数据类型变了(参考ntdef.h文件头):
ULONG
UCHAR 对应c中的unsigned char
UINT
VOID 对应c中的void
PUNLONG
PUCHAR
等等,大家自行参考文件头吧。

2.字符串也变了(参考ntddk.h文件头)
对于字符串来说,安全真的很重要。所以弄得这么麻烦,大家看看函数吧:
RtlCopyUnicodeString   字符串拷贝函数
RtlAppendUnicodeStringToString 字符串连接函数

例子1:
UNICODE_STRING dst;      //目标字符串
WCHAR dst_buf;      //缓冲区
UNICODE_STRING src;      //源字符串
RtlInitUniocdeString(&src,L”unicodestring”);
RtlInitEmptyUnicodeString(&dst,dst_buf,256*sizeof(WCHAAR)); //把目标字符串初始化为缓冲区长度为256双字的UNICODE_STRING结构
RtlCopyUnicodeString(&dst,&src);   //字符串拷贝

例子2:
WCHAR buf;
UNICODE_STRING dst,src;
RtlInitEmptyUnicodeString(&dst,buf,256*sizeof(WCHAR));
RtlInitUnicodeString(&src,L"myunicode");
RtlCopyUnicodeString(&dst,&src);
RtlInitUnicodeString(&src,L"string");
RtlAppendUnicodeStringToString(&dst,&src);
KdPrint(("%wZ",&dst));
其实还有很多,大家自己看吧。


3.说说字符串打印(参考ntstrsafe.h文件头):
其实你可以使用sprintf或者wsprintf但是还是使用头文件中的RtlStringCbPrintf比较安全。
例子:
int const arraysize = 30;
WCHAR pszDest;
size_t cbDest = arraysize * sizeof(WCHAR);
LPCWSTR pszFormat = L"%s %d + %d = %d.";
WCHAR* pszTxt = L"The answer is";
NTSTATUS status = RtlStringCbPrintfW(pszDest, cbDest, pszFormat, pszTxt, 1, 2, 3);

4.打印函数DbgPrint、KdPrint(参考ntddk.h文件头)
我只是说一下格式控制符(比较像C中的printf):
%C, %S, %lc, %ls, %wc, %ws, and %wZ
都是代表字符串你用那个都可以的(有些控制字符不安全,推荐使用%wZ)。

echo 发表于 2010-10-15 18:51:35

好**,期待能看懂/:011

still 发表于 2010-10-16 00:29:11

哎、看不懂。。。。

abe520 发表于 2010-10-16 20:48:29

新手 看不懂

psjdh 发表于 2010-11-1 14:59:57

驱动,底层权限最高

236686595 发表于 2016-5-16 21:57:54

页: [1]
查看完整版本: 驱动学习笔记