
windows驱动开发
文章平均质量分 61
PandaMohist
这个作者很懒,什么都没留下…
展开
-
VS2013(update4) + wdk8.1 驱动开发环境搭建
这里,终于捣鼓出来了:windows下使用VS2013(update4) + wdk8.1 驱动开发环境的搭建。之前,也就在昨晚,我把wdk8.1下载下来并安装,但是就是在完成WDK8.1的安装后,在VS2013中就是找不到驱动开发的模版。如下图:我挨着把模版下面的 每个选项都找遍了, 就是没有。在谷歌和github 上找了解决方案,我是没有找到我遇到问题的解决原创 2015-07-08 12:00:33 · 6251 阅读 · 2 评论 -
Windows内核编程基础篇之文件操作(一)
使用OBJECT_ATTRIBUTES 通常来讲,打开文件应该传入文件的路径。但是内核并不接受这一字符串,使用者必须填写一个 OBJECT_ATTRIBUTES结构。这个结构是非透明的。但是这个结构体 被函数 InitializeObjectAttributes初始化。 下面是对 InitializeObjectAttributes 说明。函数原型:VOID In原创 2015-09-01 21:18:28 · 1547 阅读 · 0 评论 -
Windows内核编程基础篇之获得当前滴答数
获得系统日期和时间往往是为了写日志,获得启动毫秒数则很适合用来做一个随机数的种子。有时也是用时间相关函数来寻找程序的性能瓶颈。 比如API函数 GetTickcountry() , 这个函数返回系统自启动之后经历的毫秒数。在驱动开发中有一个对一个的函数KeQueryTickCount() ,原型如下:VOID KeQueryTickCount( _Out_ PLARGE_INTE原创 2015-09-03 16:53:50 · 2843 阅读 · 0 评论 -
Windows内核编程基础篇之系统线程
在驱动中停止等待很容易是哼歌系统陷入"停顿",最后只能重启电脑,但是一个单独的线程长期等待,还不至于对系统造成致命的影响。有些任务是希望长期不断的执行,比如 不断的写入日志,为此,启动一个特殊的线程来执行他们是最好的办法, 驱动中生成的线程一般是系统线程。系统线程所在的进程名:“System”,用到的内核API 函数原型如下:NTSTATUS PsCreateSystemThrea原创 2015-09-04 13:33:31 · 832 阅读 · 1 评论 -
Windows内核编程基础篇之在线程中睡眠
我们在C语言中 包含头文件: Windows.h。就能调用函数sleep() 是程序停下一段时间。在驱动中也可以睡眠,用到的函数原型如下:NTSTATUS KeDelayExecutionThread( _In_ KPROCESSOR_MODE WaitMode, _In_ BOOLEAN Alertable, _In_ PLARGE_INTEGER Interv原创 2015-09-04 13:48:21 · 3287 阅读 · 1 评论 -
Windows内核编程基础篇之定时器
驱动开发中,与SetTimer()对应的函数是KeSetTimer():BOOLEAN KeSetTimer( _Inout_ PKTIMER Timer, ///---定时器 _In_ LARGE_INTEGER DueTime, ///---延后执行的时间 _In_opt_ PKDPC Dpc ///---要执行的回调函数结构)原创 2015-09-03 21:12:17 · 2571 阅读 · 2 评论 -
Windows内核编程基础篇之获取当前系统时间
我们通常对时间的理解包括了,年,月,日,时,分,秒 这些元素。当然,我们在做驱动开发,不能使用类似CTime 之类的函数。我们要是用与之对应的TIME_FIELDS,这个结构体中含有对应的时间要素。 给自己科普下,看看这个结构体:ypedef struct _TIME_FIELDS{ SHORT Year; SHORT Month; SHORT Day原创 2015-09-03 17:18:09 · 3842 阅读 · 0 评论 -
windows内核编程基础篇之使用同步事件
内核中的事件是一个数据结构,这个结构的指针可以当作一个参数传入一个等待函数中。若这个事件不被“设置”,则这个等待函数不会返回。这个线程被阻塞,若这个事件被“设置”,则等待结束,可以继续下去。 这个常常用于多线程之间的同步,若一个线程需要等待另外一个线程完成某事后才能做某事,则可以使用事件等待,另一个线程完成后设置事件即可。 该数据结构是KEVENT, 器被 K原创 2015-09-11 21:24:29 · 1461 阅读 · 0 评论 -
Windows内核编程之注意事项
我们知道,在C语言中,入口函数是main。其实在main函数之前,系统还调用了其他的函数。而内核中的入口函数是DriverEntry。其原型如下:DRIVER_INITIALIZE DriverEntry;NTSTATUS DriverEntry( _In_ struct _DRIVER_OBJECT *DriverObject, _In_ PUNICODE_STRING原创 2015-09-11 22:32:45 · 1479 阅读 · 0 评论 -
IDA入门(1)
1、加载文件windows 下,用ida加载文件后,会在该文件同目录下生成几个文件,含义如下:.id0 : 二叉树数据库.id1: 文件包含描述每个程序字节的标记.nam: 包含 IDA NAME 窗口的数据库.til: 本地数据库有关信息2、保存don't pack database: 不将ida的加载文件打包原创 2016-03-13 20:37:00 · 3577 阅读 · 0 评论 -
ida入门(2)
A、桟帧 stack frame1、要先保护现场2、将参数按照调用约定,存放在被运行桟帧上, 这样, 这个桟帧的帧顶指针就会发生改变3、若有必要,调用函数会配置一个帧指针,保存调用方希望保持不变的内容(寄存器值)4、被调用函数为它可能需要的任何局部变分配空间,需要桟帧栈顶向上(-操作)开辟5、被调用函数返回值存放在eax寄存器中,或者存放在可以立即被调用到的地方6、原创 2016-03-13 22:58:27 · 1553 阅读 · 0 评论 -
Windows内核编程基础篇之常见内核数据结构
1,驱动框架常见数据结构有 驱动对象结构, 设备对象结构等。 A)驱动对象结构 (DRIVER_OBJECT) 每个驱动对象代表一个已加载的内核驱动程序,指向驱动对象结构的指针常常作为DriverEntry,AddDevice,Unload等函数的参数。驱动对象结构式半透明的。其中公开的域包括DeviceObject,DriverExtensio原创 2015-08-28 23:42:30 · 3499 阅读 · 0 评论 -
Windows内核编程基础篇之使用自旋锁
链表之类的结构总是涉及多线程,这时候就要用到使用锁。 当然在处理临界区的时候,这个是必须要考虑的呀。 在驱动开发的代码中,大多是在于多线程执行环境的。 下面将介绍使用简单的自旋锁。 如下的代码将初始化一个自旋锁:KSPIN_ my_Spin_Lock;KeInitializeSpinLock(&my_Spin_Lock); KeInitializ原创 2015-08-27 23:04:33 · 3689 阅读 · 0 评论 -
我认识的PE文件之基地址
什么是PE文件?摆个连接吧,人家比我专业呢PE文件:http://baike.baidu.com/view/1087038.htm-----------------------------------------------------------------------------------------------------------------------------------原创 2015-07-10 20:02:55 · 2580 阅读 · 0 评论 -
我认识的PE文件之相对虚拟地址 + 文件偏移地址
-------------------------------相对虚拟地址 --------------------------------------------------在可执行文件中,有很多地方需要指明内存中的地址,例如:引用全局变量时,需要制定它的地址。PE文件的尽管有一个首选的载入地址,但是,它们可以再入到进程的空间的任何地方,所以不能依赖于PE的载入点,由于这个原因,必须有一个方原创 2015-07-11 16:34:16 · 3139 阅读 · 0 评论 -
strcpy()函数编译报错
好久没玩过 这个函数了:函数原型:char *strcpy(char* dest, const char *src); 需要包含的头文件:#include string.h> #include 函数功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间----------------------------------------------原创 2015-07-14 16:41:51 · 2112 阅读 · 0 评论 -
windows内核编程基础篇之字符串的处理
1,使用字符串结构常常使用传统C语言的程序员比较喜欢用如下的方法定义和使用字符串:char *str ={"my first string"}; //ANSI字符串wchar_t *wstr = {L"my first string"}; //UNICODE字符串size_t len = strlen(str); //求出AN原创 2015-08-25 15:39:05 · 1312 阅读 · 0 评论 -
windows内核编程基础篇之字符串的初始化
我们再看看这个UNICODE_STRING结构。typedef struct _UNICODE_STRING{ USHORT Length; //---字符串的长度(字节数) USHORT MaximumLength; //---字符串缓冲区的长度(字节数) PWSTR Buffer; //---字符串缓冲区。}ANSI_STRING, *PANSI_STRING;UNIC原创 2015-08-25 16:02:03 · 1825 阅读 · 0 评论 -
Windows内核编程基础之内存的分配与释放
内存泄漏是C语言中一个臭名昭著的问题。但是作为内核开发者,读者将有必要自己来面对它。在传统的C语言中,分配内存常常使用的函数是:malloc,这个函数的使用非常简单,传入长度参数就得到内存空间。在驱动中使用内存分配,这个函数不再有效。驱动中分配内存,最常用的是调用ExAllocatePoolWithTag,其他的方法在本章范围内全部忽略。回忆前一节关于字符串处理的情况。一个字符串被复制到另一个字符原创 2015-08-26 15:05:48 · 3166 阅读 · 0 评论 -
Windows内核编程基础篇之字符串的打印
字符串的连接的另一种常见的情况是字符串和数字的组合。有时数字需要被转换为字符串,有时需要把若干数字和字符串混合组合起来。这往往用于打印日志的时候,日志中可能含有文件名,时间和行号,以及其他的信息。熟悉C远的读者会使用sprintf,这个函数的宽字符版本为swprintf。该函数在驱动开发中依然可以使用,但是不安全,微软建议使用RtlStringCbPrintfW 来带替它。RtlStri原创 2015-08-26 14:27:19 · 3158 阅读 · 1 评论 -
Windows内核编程基础篇之字符串的连接
UNICODE_STRING 字符串不再是简单的字符串。操作这个数据结构往往需要更多的耐心。读者会常常碰到这样的需求:要把两个字符串连接到一起。简单地追加一个字符串并不困难。重要的依然是保证目标字符串的空间的大小。下面是范例:原创 2015-08-25 19:41:00 · 1793 阅读 · 0 评论 -
Windows内核编程基础之使用长长整型数据
文件中的偏移量是一种常见的要使用64位数据的情况。同时,文件也是如此。32位数据无符号整型只能表示到4GB。在VC中,64位数据的类型为_int64。定义了如下写法:__int64 file_offset; 但是,实际上这个 __int64在驱动开发中很少被使用,基本上被使用到的是一个公用体:LARGE_INTEGER。宏定义如下:C++语法:typedef union _LARGE_原创 2015-08-27 19:28:16 · 770 阅读 · 0 评论 -
Windows内核编程基础之使用LIST_ENTRY
LIST_ENTRY 是一个双向链表结构。它总是在使用的时候被插入到已有的数据结构中。Windows内核中使用LIST_ENTRY作为i链表,这个结构随处可见。 看看下面的代码,构建了一个链表,每个节点是又一个文件名和一个文件大小两个数据成员组成的结构。此外有一个FILE_OBJECT指针对象,在驱动中代表一个文件对象。该链表的作用是保存了文件的文件长度和文件名。typedef st原创 2015-08-27 18:56:56 · 4500 阅读 · 1 评论 -
ida入门(3)
1、名称与变量 名称:可根据ida分析出来的结果中得变量进行重命名,使得更有利于逆向工作,特点是:对一处变量的修改,IDA会将整个文件中相同变量进行重新命名, 并且以高亮显修改的变量。 修改方法是:选中需要修改的想,按N键或者鼠标右键选择“rename”。 变量: 常见的有2种: A、argv_(), 属于 栈变量。 B、var_(),原创 2016-03-15 15:07:17 · 1087 阅读 · 0 评论