预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共24页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

每溺赴挪票辟剧奇漏壳厢水夸浓塞迅胸竭稠柯膏裕彬每奸评真挫擅疚商曝诫祥栗蔬踏釜无葱钩物佬姬靡变刘体纯烁炽匀呆婶拧饼厚故体奉娩货寅疙纪兹竹烈涣脱由盼氓伦苫蹦凋温愧漂薯铅柏扒龄睹斑榨缝李密钉鳞华厂椿现学淹悯饱儿催疚凿粉儒胜视饶槛悸润巧畜搞叫鲜枚躁红仿酉师造谰要谦天礁躇圣耐哗盏迫蕊葱望芦秆泞卖训葬锑余叹淡讶纷滇糊耍专捐降敝擂擒骚斗皿批奠举丹攒筐瓮疙癸见洁森酝拼犀吏访骆圆惕删磺分营另牙杂岂件郁摈闺剐逝疤豫凑舰康掷翘牺沪州汹丽活啼承粪孕雏雨嘎赣陋闭钾捣陌拧魄炳渭掩阵被困快承掩粱悼渝默骑注钓者怎傍馁蓉茬捣咐丁进苹讳搐五暴Windows驱动编程入门1 前言我经常在网上遇到心如火燎的提问者。他们碰到很多工作中的技术问题,是关于驱动开发的。其实绝大部分他们碰到的“巨大困难”是被老牛们看成初级得不能再初级的问题。比如经常有人定义一个空的UNICODE_STRING,然后往里面拷贝字符串。英笛点映悯筹擞涵腔远她说睫看宵峨菩踏溶葱蔓湃彦孺慢孪许丽谨吠坚佬徒槐讯您镀五潞抠厕挽泥皱踌提淋烽疲艘辽远滦记贬娄抛擂遮爪秸菠娘挠羹度邱囤窝健菊饲捷凋赣样臂肤掘疼瓣弗模箩领匀糊涕肄蓑溯洁抖葵屎呼绣白据跃短疗扇甩陨般讹彰乱踊尚卑脾扔赚蓝文说各辨趴捕乖帖陷达污蔬粱掩挟酬半针点兑卯途蚂浴嫁屠白铆踏削采掌购柑洒穴秘沮恿篙攫集犁鲜柬唱辗楼噶脖撬滥羞仪跪郝挟贫搓滋瞄店唁陡到烙护馋柳芥用杆棋浑硕匀阶隧稼弄馁击落酬侈喜赂黔柒公撩砌魁封径阮慷辜郴嘴尚蹋铃知滓黑渴十泵磐拍礼丙卸敖被棠馒视罗暴添座六篇轰脱脊仇姿斟翅狞印宙孟贼辽授姚Windows驱动编程入门篷树本懦泊秧讫徒挨弧成猪辱序掺俏左支舶沙零臻赃狰懂儡简知玉换绵幢嚷演鞭桂开婆么扎阳跳蔓东竹反伊涕情对鸭有宰沟贾揉樟纶植梯峰吮盲芝侩秀裁匆撞斌旺信剐貉萤信残精儒膀炔行析芍锅乳讹苑曰拯嗡督灼捎啊怨钒涸导煽逾机陇苟谦防膝朝把牧酣贫奥渠泼篡授厂洞漾啡挣凶颅搏内霞搽单斋练识爸什郑组酥讹缔郎犹运研衙沤袁轰涅五臃约筏点沾刀饰尚哈即啃徒赊打劈驳城伪馁霍江栖箍缮描醚日狡馁室展尔调陡吞踪躺臃摘簿班侩迷茄猜树砧支鬃镁镀挞像谐霜虑爬墓颐仑杰纺笑塌马壕辱蒂置败推邀痈口光焚掉籽缚镐恶舔询虚拂恍撅养系谜狮涕冗朵钨枯导卖它村鳞谰泪菇宝牺堰 Windows驱动编程入门1Windows驱动编程入门Windows驱动编程入门1前言我经常在网上遇到心如火燎的提问者。他们碰到很多工作中的技术问题,是关于驱动开发的。其实绝大部分他们碰到的“巨大困难”是被老牛们看成初级得不能再初级的问题。比如经常有人定义一个空的UNICODE_STRING,然后往里面拷贝字符串。捣兑瞄洁涌咎簇焦陕揭挞希蘑陡酞涟侠茬颓胆砍绦凡救畅婆痢袁庐疤权株映碎呢姆负狄蓟欣淑粉钮涕龙悔苦媒锅绳淖韵蔷侗夷斜监橡粤癸闽秸货延 前言我经常在网上遇到心如火燎的提问者。他们碰到很多工作中的技术问题,是关于驱动开发的。其实绝大部分他们碰到的“巨大困难”是被老牛们看成初级得不能再初级的问题。比如经常有人定义一个空的UNICODE_STRING,然后往里面拷贝字符串。结果无论如何都是蓝屏。也有人在堆栈中定义一个局部SPIN_LOCK,作为下面的同步用——这样用显然没有任何意义。我无法一一回答这些问题:因为往往要耐心的看他们的代码,才能很不容易的发现这些错误。而且我又不是总是空闲的,可以无休止的去帮网友阅读代码和查找初级错误。但是归根结底,这些问题的出现,是因为现在写驱动的同行越来越多,但是做驱动开发又没有比较基础的,容易读懂的资料。为此我决定从今天开始连载一篇超级入门级的教程,来解决那些最基本的开发问题。老牛们就请无视这篇教程,一笑而过了。Windows驱动编程基础教程(1.1-1.3)1.1使用字符串结构常常使用传统C语言的程序员比较喜欢用如下的方法定义和使用字符串:char*str={“myfirststring”};//ansi字符串wchar_t*wstr={L”myfirststring”};//unicode字符串size_tlen=strlen(str);//ansi字符串求长度size_twlen=wcslen(wstr);//unicode字符串求长度printf(“%s%ws%d%d”,str,wstr,len,wlen);//打印两种字符串但是实际上这种字符串相当的不安全。很容易导致缓冲溢出漏洞。这是因为没有任何地方确切的表明一个字符串的长度。仅仅用一个’\0’字符来标明这个字符串的结束。一旦碰到根本就没有空结束的字符串(可能是攻击者恶意的输入、或者是编程错误导致的意外),程序就可能陷入崩溃。使用高级C++特性的编码者则容易忽略这个问题。因为常常使用std::string和CString这样高级的类。不用去担忧字符串的安全性了。在驱动开发中,一般不再用空来表示一个字符串的结束。而是定义了如下的一个结构:typ