<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zuishikonghuan的博客]]></title><description><![CDATA[welcome to my blog ^_^]]></description><link>https://blog.youkuaiyun.com/zuishikonghuan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zuishikonghuan]]></copyright><item><title><![CDATA[MinGW 与 MSVC 生成 DLL 各种情况的折腾笔记]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51918076</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51918076</guid><author>zuishikonghuan</author><pubDate>Fri, 15 Jul 2016 18:43:55 +0800</pubDate><description><![CDATA[写这篇博客，主要是刚折腾 MinGW，相关内容网上的资料不全，而且错误很多

其实之前我根本没把这个当回事，我就想 MinGW 跟 Linux 上的 GNU 编译器不会有差别，但是事实却不是这样。。。

提示：所有代码均使用 __stdcall

安装 MSVC 和 MinGW

MSVC：安装 Visual Studio，之后即可在开始菜单中找到“Visual Studio开发人员命令提示”，启]]></description><category></category></item><item><title><![CDATA[Ring3 下 API Inline Hook 优化方案探索与实现]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51302024</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51302024</guid><author>zuishikonghuan</author><pubDate>Tue, 03 May 2016 09:30:33 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/51302024 
﻿﻿ 
以前写过两篇“[Win32] API Hook（1）在32/64位系统上的实现”博客，介绍并给出了 API inline hook 代码，如下： 
﻿﻿﻿﻿bl]]></description><category></category></item><item><title><![CDATA[驱动开发（13）IRP 的异步完成和 CancelRoutine]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51301922</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51301922</guid><author>zuishikonghuan</author><pubDate>Tue, 03 May 2016 09:26:53 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/51301922在之前的博文中，我们对于IRP，都是同步完成的，但是 Windows 对异步操作很友好，我们来看看如何异步完成 IRP 。在应用程序中异步访问设备在开始之前，我认为有必要提]]></description><category></category></item><item><title><![CDATA[驱动开发（12）内核中的多线程和同步对象]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51301896</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51301896</guid><author>zuishikonghuan</author><pubDate>Tue, 03 May 2016 09:04:24 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：在内核模式下创建线程在驱动程序中创建线程的方法是调用 PsCreateSystemThread 内核函数，此函数即可以创建系统线程，也可以创建用户线程。此函数的原型如下：NTSTATUS PsCreateSystemThread(
  _Out_     PHANDLE]]></description><category></category></item><item><title><![CDATA[驱动开发（11）中断请求级]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51062287</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/51062287</guid><author>zuishikonghuan</author><pubDate>Mon, 02 May 2016 08:35:44 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/51062287
“中断”是一个非常重要的概念，在 80x86 的设备上，Windows 引入了“中断请求级”（IRQL）这一个概念，（在 x86 平台）其中0-2为软件中断，3-31]]></description><category></category></item><item><title><![CDATA[驱动开发（10）直接I/O和内存描述符表]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50643005</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50643005</guid><author>zuishikonghuan</author><pubDate>Fri, 18 Mar 2016 16:52:27 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/50643005
在上篇博文中，我们实现了在驱动程序中处理设备收到读写I/O请求，这个请求我们是使用缓冲I/O处理的。
在上一篇中，我已经详细解释了使用缓冲I/O的原因，在这里简]]></description><category></category></item><item><title><![CDATA[内核编程之SSDTHook（3）Hook NtCreateSection监控所有可执行模块加载]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50924829</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50924829</guid><author>zuishikonghuan</author><pubDate>Fri, 18 Mar 2016 16:51:54 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/50924829
在上两篇博文中，我介绍了SSDTHook的原理，并给出了一个实例--通过Hook NtOpenProcess来实现进程保护：http://blog.youkuaiyun.com/]]></description><category></category></item><item><title><![CDATA[内核编程之SSDTHook（2）Hook NtOpenProcess实现进程保护]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50765464</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50765464</guid><author>zuishikonghuan</author><pubDate>Fri, 11 Mar 2016 14:20:36 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：
上一篇博文“内核编程之SSDTHook（1）原理（地址：）”中，介绍了SSDTHook的原理，这一篇博文，我们来写一个实例，通过Hook NtOpenProcess来的实现进程保护。
我之前写过两篇Ring3下的API Inline Hook的博文，这两篇博文通过Inline]]></description><category></category></item><item><title><![CDATA[内核编程之SSDTHook（1）原理]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50717936</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50717936</guid><author>zuishikonghuan</author><pubDate>Fri, 11 Mar 2016 14:19:58 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：
说驱动开发这么长时间了，也玩玩内核钩子，钩子（Hook）技术是一种截获对某一对象访问的技术，不仅在Windows平台，Linux平台上也有Hook技术。Hook技术种类繁多，实现细节也不同，还可以灵活使用。
我之前写过两篇Ring3下的API Inline Hook的博文，这]]></description><category></category></item><item><title><![CDATA[驱动开发（9）处理缓冲I/O设备的读写请求]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50413094</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50413094</guid><author>zuishikonghuan</author><pubDate>Sun, 03 Jan 2016 16:32:16 +0800</pubDate><description><![CDATA[﻿﻿本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/50413094
在上面的几篇博文中，介绍了 IRP 与派遣函数，通过例子“磁盘设备的绝对读写”演示了在应用程序中向一个设备发出I/O请求，并实现了驱动程序中处理一个I/O请求——]]></description><category></category></item><item><title><![CDATA[驱动开发（8）处理设备I/O控制函数DeviceIoControl]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50380577</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50380577</guid><author>zuishikonghuan</author><pubDate>Sun, 03 Jan 2016 16:31:37 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：
在上面的两篇博文中，介绍了IRP与派遣函数，以及我们通过了一个例子“磁盘设备的绝对读写”来演示了在应用程序中是如何向一个设备发出I/O请求的。这篇博文将演示在驱动程序中处理一个非常简单的I/O请求——由DeviceIoControl这个Win32API经过一系列的调用，在内核中]]></description><category></category></item><item><title><![CDATA[[Win32] 直接读写磁盘扇区（磁盘绝对读写）]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50380313</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50380313</guid><author>zuishikonghuan</author><pubDate>Sun, 03 Jan 2016 16:31:00 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：
正讲着驱动开发呢，这里突然插一篇Win32的博文，其实，还是做引子，上一篇博文“IRP与派遣函数”中，我们知道了驱动程序需要处理I/O请求，我们先来看看怎么发出一个I/O请求。
一般的程序不会直接去访问磁盘，毕竟有文件系统（FileSystem）帮助我们轻松地组织文件，但是有]]></description><category></category></item><item><title><![CDATA[驱动开发（7）IRP与派遣函数]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50190339</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/50190339</guid><author>zuishikonghuan</author><pubDate>Sun, 03 Jan 2016 16:30:19 +0800</pubDate><description><![CDATA[在上一篇博文中，介绍了NT驱动的基本结构，这几篇博文，博主来说说驱动开发的一个核心内容——如何处理I/O请求。
为何要处理I/O请求？因为通常一个驱动程序是为了控制硬件而设计的（虽然没有对应具体硬件的驱动远比有对应具体硬件的驱动要多得多），可以说，是操作系统与硬件通信的桥梁。而I/O操作是控制硬件的基本方法（不考虑对CPU和内存的操作），而驱动程序就是为操作系统提供了一种抽象，驱动程序如]]></description><category></category></item><item><title><![CDATA[驱动开发（6）NT驱动的基本结构]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49047055</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49047055</guid><author>zuishikonghuan</author><pubDate>Sun, 08 Nov 2015 13:25:55 +0800</pubDate><description><![CDATA[本博文由优快云博主zuishikonghuan所作，版权归zuishikonghuan所有，转载请注明出处：http://blog.youkuaiyun.com/zuishikonghuan/article/details/49047055
在之前的一篇博文“驱动开发（2）第一个NT驱动和NT驱动的编译”（http://blog.youkuaiyun.com/zuishikonghuan/article/detail]]></description><category></category></item><item><title><![CDATA[[Win32] ShellHook的实现]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49133099</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49133099</guid><author>zuishikonghuan</author><pubDate>Sun, 08 Nov 2015 13:25:01 +0800</pubDate><description><![CDATA[启动Windows，加载Win32子系统，登录一个用户会话后，会启动Shell程序，默认是explorer.exe，就是我们看到的桌面和任务栏等，其实Shell是可以自定义的，我们完全可以自己编写一个Shell取代系统的Shell。下面我们来看看编写Windows Shell的核心技术之一——ShellHook。
ShellHook是什么？当一个窗口创建、激活、关闭时，explorer总]]></description><category></category></item><item><title><![CDATA[驱动开发（5）内核中的字符串]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49717715</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49717715</guid><author>zuishikonghuan</author><pubDate>Sun, 08 Nov 2015 13:23:40 +0800</pubDate><description><![CDATA[在驱动开发中，内核函数使用的字符串不再是应用程序使用的Win32子系统API和Native API中的char*和wchar_t*，而是内核Unicode字符串UNICODE_STRING。
内核字符串有两种，ANSI字符串是ANSI_STRING，Unicode字符串是UNICODE_STRING，他们的结构是这样定义的：]]></description><category></category></item><item><title><![CDATA[驱动开发（4）内核中的内存分配和错误码]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49717679</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/49717679</guid><author>zuishikonghuan</author><pubDate>Sun, 08 Nov 2015 12:36:53 +0800</pubDate><description><![CDATA[在驱动开发中，我们不应该使用C/C++运行时函数中的malloc或者calloc函数分配内存，更不应该使用new关键字，因为内核中的内存分配需要特殊处理。
在应用程序中，每个应用都有2G的虚拟内存，因此内存并不紧张，而所有的驱动程序共用内核模式的2G虚拟内存，因此内核中的资源非常宝贵，应该尽量节省。
更可怕的是内存泄露，应用程序即使发生了内存泄露，在其结束时操作系统可以通过进程上下文中的虚拟内]]></description><category></category></item><item><title><![CDATA[驱动开发（3）使用SCM加载NT驱动（用应用程序加载驱动）]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/48827825</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/48827825</guid><author>zuishikonghuan</author><pubDate>Fri, 02 Oct 2015 11:02:59 +0800</pubDate><description><![CDATA[在上一篇中，我简单介绍编写了一个NT驱动空壳，这一篇中，将介绍如何自己编写一个驱动程序加载器，即使用编程的方法加载驱动，而不是使用工具。
我在上一篇中也提到了，驱动程序是通过服务加载的，我以前写过SCM（服务控制管理器）API的文章，详细介绍各函数的具体用法，详见：
[Win32] SCManager 服务控制管理器API（1）：http://blog.youkuaiyun.com/zuishi]]></description><category></category></item><item><title><![CDATA[驱动开发（2）第一个NT驱动和NT驱动的编译]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/48805945</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/48805945</guid><author>zuishikonghuan</author><pubDate>Fri, 02 Oct 2015 10:59:21 +0800</pubDate><description><![CDATA[在上一篇中，我简单介绍了驱动开发的基础知识，这一篇中，将介绍编写一个NT空壳驱动（驱动基础框架）
一、驱动入口
驱动程序的入口点是DriverEntry，此函数的原型是：
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath) 
参数1：系统发来的驱动对象]]></description><category></category></item><item><title><![CDATA[驱动开发（1）基础知识]]></title><link>https://blog.youkuaiyun.com/zuishikonghuan/article/details/48545623</link><guid>https://blog.youkuaiyun.com/zuishikonghuan/article/details/48545623</guid><author>zuishikonghuan</author><pubDate>Fri, 02 Oct 2015 10:51:21 +0800</pubDate><description><![CDATA[驱动程序是操作系统和硬件通讯的桥梁，同时，驱动程序可以实现很多特殊功能，比如，虚拟光驱（虚拟设备），内核级hook，文件系统透明加密（过滤驱动），修改Windows内核等等
并非所有驱动程序都必须由设备的设计方编写。如果设备根据已发布的硬件标准来设计。这时驱动程序可以由 Microsoft 编写，设备设计者无须提供驱动程序。
并非所有的驱动程序都与硬件关联。某些驱动程序与任何硬件设备根]]></description><category></category></item></channel></rss>