qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  windows Driver

1 2 下一页

摘要://断点相关bp + 地址 设置断点bl显示已经设定的断点bu + 地址 设置断点,但是这种类型断点再下一次启动时被记录bc 清除断点对于断点范围,可以用*匹配,-表示一个范围,表达多个可用,号隔开程序入口伪寄存器WinDbg里有个伪寄存器叫$exentry,里面记录了程序的入口点。所以我们只要在命... 阅读全文
posted @ 2014-10-09 18:21 qintangtao 阅读(373) 评论(0) 推荐(0)

该文被密码保护。
posted @ 2014-08-14 17:31 qintangtao 阅读(0) 评论(0) 推荐(0)

摘要:在驱动编程学习中,往往需要通过DbgPrint或者KdPrint来输出调试信息,对于Check版本,KdPrint只是DbgPrint的一个宏定义,而对于Free版本,KdPrint将被优化掉。这些输出信息可以通过DebugView对内核的监控来看到。KdPrintis identical to t... 阅读全文
posted @ 2014-04-30 16:24 qintangtao 阅读(3700) 评论(0) 推荐(0)

摘要:当使用Windbg 6.2.9200.16384 进行源码调试时,无法在代码文件中F9设置断点,会出现“code not found breakpoint not set”,我们只有启动下我们自己的驱动,或者需要".reload /f"下符号,然后才可能用F9设置。 这是由于源码文件symbol问题,但是Windbg 6.12.2.633以及之前其他版本都没有此问题,一个猜测就是当我们F9时,Windbg 6.2.9200.16384只会搜索已经加载的symbol,而Windbg 6.12.2.633以及之前其他版本不仅会搜索已加载的symbol,而且还会搜索我们设置的sy 阅读全文
posted @ 2014-02-27 13:12 qintangtao 阅读(698) 评论(0) 推荐(0)

摘要:#pragma alloc_text编译时控制分页能力有时,驱动程序的某些部分必须驻留内存而另一些可以被分页,这就需要一种能控制代码和数据是否分页的方法。通过指导编译器的段分配可以实现这个目的。在运行时,装入器通过检查驱动程序中的段名, 把段放到你指定的内存池中。此外在运行时调用内存管理器的例程也能实现这个目的。需要注意的是:--------------------------------------------------------------------------------(1)Win32 执行文件,包括内核模式驱动程序,在内部都是由一个或多个段组合而成。段可以包含代码或数据,通常还 阅读全文
posted @ 2014-01-10 10:32 qintangtao 阅读(1497) 评论(0) 推荐(0)

摘要:By default, the kernel loader will load all driver executables and any global data that you may have defined in your driver into nonpaged memory. Therefore, if you want your driver to reside in nonpaged memory, there is nothing further you need to do besides compiling, linking, and loading the drive 阅读全文
posted @ 2014-01-10 10:09 qintangtao 阅读(934) 评论(0) 推荐(0)

摘要:#if DBG#define PAGED_CODE() \ if (VideoPortGetCurrentIrql() > 1 /*APC_LEVEL*/) { \ VideoPortDebugPrint(0, "Video: Pageable code called at IRQL %d\n", VideoPortGetCurrentIrql() ); \ ASSERT(FALSE); \ }#else#define PAGED_CODE()#endif 阅读全文
posted @ 2014-01-10 09:47 qintangtao 阅读(383) 评论(0) 推荐(0)

摘要:1、IoCopyCurrentIrpStackLocationToNext是拷贝本层的IO_STACK_LOCATION到下一层。在楚狂人的驱动教程中说:如果对irp完成之后的事情有兴趣,并打算在完成函数中处理,应该首先拷贝当前IO_STACK_LOCATION(IoCopyCurrentIrpStackLocationToNext),然后指定完成函数,并返回IoCallDriver()所返回的status.完成函数中,不需要调用IoCompleteRequest!直接返回Irp的当前状态即可.但是IoCopyCurrentIrpStackLocationToNext是这样的:将本层的IO_S 阅读全文
posted @ 2013-11-22 12:11 qintangtao 阅读(2269) 评论(0) 推荐(0)

摘要:中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。#pragma pack(push, 1)//IDT的内存空间是一个数组。每个元素都有如下的结构typedef struct P2C_IDT_ENTRY_ { P2C_U16 offset_low; P2C_U16 selector; P2C_U8 reserved; P2C_U8 type:4; P2C_U8 ... 阅读全文
posted @ 2013-09-17 12:08 qintangtao 阅读(15420) 评论(2) 推荐(3)

摘要:Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存有些虚拟内存永远不会交换到文件中,这些内存叫非分页内存#define PAGEDCODE code_seg(“PAGE”);//分页内存#define LOCKEDCODE code_seg();//非分页的#define INITCODE code_seg(“INIT”); #define PAGEDDATA data_seg(“PAGE”);#define LOCKEDDATA data_seg();#define INITDATA data_seg(“INIT”);例:如果将某个函数载入到分页内存中,可用下... 阅读全文
posted @ 2013-09-15 14:11 qintangtao 阅读(1500) 评论(0) 推荐(0)

该文被密码保护。
posted @ 2013-09-12 14:51 qintangtao 阅读(3) 评论(0) 推荐(0)

该文被密码保护。
posted @ 2013-09-06 15:59 qintangtao 阅读(5) 评论(0) 推荐(0)

该文被密码保护。
posted @ 2013-08-27 15:31 qintangtao 阅读(5) 评论(0) 推荐(0)

该文被密码保护。
posted @ 2013-08-22 14:23 qintangtao 阅读(5) 评论(0) 推荐(0)

摘要:注册表项:注册表中的一个项目,类似于目录的概念注册表子项:类似于目录中的子目录键名:通过键名可以寻找到相应的键值键值类别:每个键值存储的时候有不同的类别,可以是整形,字符串等数据键值:键名下对应存储的数据 1、创建关闭注册表/************************************************************************* 函数名称:ZwCreateKey* 功能描述:打开注册表句柄* 参数列表: KeyHandle:获得的注册表句柄 DesiredAccess:访问权限,一般设置为KEY_ALL_ACCESS ... 阅读全文
posted @ 2013-05-17 15:55 qintangtao 阅读(1995) 评论(0) 推荐(0)

摘要:一:文件的创建/************************************************************************* 函数名称:ZwCreateFile* 功能描述:文件的创建* 参数列表: FileHandle:返回打开文件的句柄 DesiredAccess:对打开文件操作的描述,读,写或是其他。一般指定为GENERIC_READ 或 GENERIC_WRITE ObjectAttributes:是OBJECT_ATTRIBUTES结构的地址,该结构包含要打开的文件名 IoStatusBlo... 阅读全文
posted @ 2013-05-08 17:25 qintangtao 阅读(2910) 评论(1) 推荐(0)

摘要:内核模式下的字符串操作1、ASCII字符串和宽字符串在驱动程序开发中,DDK将char和wchar_t类别,替换成CHAR和WCHAR类别驱动程序中用KdPrint打印ASCII字符串和宽字符串:打印ASCII字符串CHAR *string = "Hello";KdPrint("%s\n", string);打印宽字符串WCHAR *string = L"Hello";KdPrint("%S\n", string);2、ANSI_STRING字符串与UNICODE_STRING字符串2.1、ANSI_STRING字 阅读全文
posted @ 2013-04-15 22:23 qintangtao 阅读(10713) 评论(0) 推荐(0)

摘要:在驱动程序开发中,还有一个技巧,就是使用"断言"。在驱动程序使用"断言"一般是通过使用ASSERT宏。例如:NTSTATUS Foo(PCHAR* str){ ASSERT(str != NULL); //断言 //对于str的操作}这段代码认为输入参数绝不可能是空指针,因此在函数的开头做一个断言(ASSERT)。一旦断言失败,会引发一个异常 阅读全文
posted @ 2013-04-14 21:40 qintangtao 阅读(201) 评论(0) 推荐(0)

摘要:DDK提供了大量的宏。在使用这些宏的时候,要注意一种错误的发生,这就是"侧效"(Side Effect)宏一般由多行组成,如下面的形式,其中的"\"代表换行#define PRINT(msg) KdPrint(("====================\n"));\ KdPrint(msg);\ KdPrint(("===================\n"));在C语言中规定,for或者if语句块中的内容如果只是一句,可以省略掉{}。如:if(bRet){ Foo();}//等价于if(bRet) Foo() 阅读全文
posted @ 2013-04-14 21:36 qintangtao 阅读(406) 评论(0) 推荐(0)

摘要://结构化异常处理(try-except块)__try{}__except(filter_value){}在被__try{}包围的块中,如果出现异常,会根据filter_value的数值,判断是否需要在__except{}块中处理。filter_value的数值会有三种可能。(1)EXCEPTION_EXECUTE_HANDLER,该数值为1。进入到__except进行错误处理,处理完后不再回到__try{}块中,转而继续执行(2)EXCEPTION_CONTINUE_SEARCH,该数值为0。不使用__except块中的异常处理,转而向上一层回卷。如果已经是最外层,则向操作系统请求异常处理函 阅读全文
posted @ 2013-04-14 21:24 qintangtao 阅读(1476) 评论(0) 推荐(0)

1 2 下一页