<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Free2000fly&#039;s Official Blog &#187; 内核编程</title>
	<atom:link href="http://blog.tinybrowser.net/archives/category/%e5%86%85%e6%a0%b8%e7%bc%96%e7%a8%8b/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.tinybrowser.net</link>
	<description>Free2000fly 个人博客</description>
	<lastBuildDate>Fri, 06 Jan 2012 21:12:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>扩展内核函数 PsSetCreateProcessNotifyRoutine 等的蹲坑数量</title>
		<link>http://blog.tinybrowser.net/archives/2534</link>
		<comments>http://blog.tinybrowser.net/archives/2534#comments</comments>
		<pubDate>Sat, 22 Jan 2011 03:55:47 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>
		<category><![CDATA[PsSetCreateProcessNotifyRoutine]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2534</guid>
		<description><![CDATA[Windows 内核提供的 PsSetCreateProcessNotifyRoutine 等函数能够容纳的回调函数的数量是有限的,目前仅区区 8 个 “蹲位”, 被占用满了以后, 再调用 PsSetCreateProcessNotifyRoutine 等函数将会失败. 因此, 我编写了一个驱动, 用以扩展 PsSetCreateProcessNotifyRoutine 等函数能够容纳回调函数的数量. 经过扩展后, 能够容纳的回调函数是无限的, 这个驱动有五个导出函数, 其使用方法与原始函数完全相同. 列表如下. 扩展后的函数名 原始函数名 Ext_PsSetCreateProcessNotifyRoutine PsSetCreateProcessNotifyRoutine Ext_PsSetCreateThreadNotifyRoutine PsSetCreateThreadNotifyRoutine Ext_PsRemoveCreateThreadNotifyRoutine PsRemoveCreateThreadNotifyRoutine Ext_PsSetLoadImageNotifyRoutine PsSetLoadImageNotifyRoutine Ext_PsRemoveLoadImageNotifyRoutine PsRemoveLoadImageNotifyRoutine 本驱动的启动方式建议为 boot 方式, 当其他驱动使用了本驱动的服务时, 不要卸载本驱动; 另外, 本驱动在 windows 2000 系统下不能卸载, 只能通过删除服务然后重启计算机的方式卸载本驱动. 本地下载 knlcbext.zip 项目主页 https://winutilities.svn.sourceforge.net/svnroot/winutilities/knlcbext/]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2534/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用 NT 缓存管理器</title>
		<link>http://blog.tinybrowser.net/archives/2387</link>
		<comments>http://blog.tinybrowser.net/archives/2387#comments</comments>
		<pubDate>Tue, 09 Nov 2010 12:20:36 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2387</guid>
		<description><![CDATA[使用 NT 缓存管理器 (中文版) 转载自 这里 英文原版 Cache Me if You Can: Using the NT Cache Manager 缓存管理器 在这篇文章中, 我们将对缓存管理器的一个运行时例程做个基本的描述. 此外, 对于这些例程使用的一些方法以及示例代码, 可以参考 Microsoft IFS Kit. 缓存管理器概述 缓存管理器是一个软件部分, 集成在 Windows Nt 内存管理器中, 以集成文件系统 (数据) 和虚拟内存系统. 一些操作系统完成它们自己的文件系统, 所以它们有自己的数据cache. 然而, 因为这些caches受物理内存限制, 它们在大小上受限 &#8211; 用作cache的这块内存在系统中也不能做其它用途使用了. 因此, 使用windows NT缓存管理器的一个关键优势是, 它可以使文件缓存和程序运行所需要的物理内存达到平衡. 当应用程序是I/O密集型的时候, 所谓的“平衡”就倾向于做缓存数据. 当应用程序非常耗内存, 那么用来缓存数据的内存可能会被减为0. 因此最终结果是系统更好地使用物理内存从而提供更好的性能. 文件系统使用缓存管理器的另一个重要原因是, 文件能这样被访问: 通过标准文件系统接口 (例如读和写) [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2387/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于 windows 内核下的读写锁</title>
		<link>http://blog.tinybrowser.net/archives/2379</link>
		<comments>http://blog.tinybrowser.net/archives/2379#comments</comments>
		<pubDate>Tue, 09 Nov 2010 11:09:34 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>
		<category><![CDATA[ERESOURCE]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2379</guid>
		<description><![CDATA[参考 FILEMON 中的代码，以及 DDK 中的说明： ERESOURCE 对象相当于读写锁, 即用于同时只能有一个 WRITER 写入, 多个 READER 读的情况： 函数名称 作用 ExInitializeResourceLite 初始化一个 ERESOURCE 对象 ExDeleteResourceLite 删除一个 ERESOURC 对象 ExAcquireResourceExclusiveLite 用于获取 ERESOURCE (写访问) ExAcquireResourceSharedLite 用于获取 ERESOURCE (读访问) ExReleaseResourceLite 用于释放 ERESOURCE 参考文献: Driver Threads, Dispatcher Objects, and Resources]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2379/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]Windows文件系统的杂谈</title>
		<link>http://blog.tinybrowser.net/archives/2361</link>
		<comments>http://blog.tinybrowser.net/archives/2361#comments</comments>
		<pubDate>Fri, 05 Nov 2010 10:08:07 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2361</guid>
		<description><![CDATA[author: jonathan 本文档的CopyRight归jonathan所有，可自由转载，转载时请保持文档的完整性。 /*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*/ 1 杂谈 1.1 FCB/SCB的COMMON结构定义 OwnerId 和 InstanceId都需要有意义的值： OwnerId = 可以是驱动对象的地址等 InstanceId = 可以是流上下文地址 (FsRtlGetPerStreamContextPointer) 1.2 Cleanup和Close的区别 在FCB或者SCB中都有如下两个变量： CLONG CleanupCount; 打开未关闭文件句柄。 CLONG CloseCount; 打开未关闭文件对象。 在SCB中还有一变量： 1.3 资源同步问题 在文件过滤驱动中，如要访问 ExAcquireResourceExclusive 等资源时，为了防止一般内核的 APC 调度，需调用如下接口： 关于设置 TopLevelIrp 也是很重要的，在访问ExAcquireResourceExclusive 等资源时，也需要考虑该接口调用： 设置 IoSetTopLevelIrp 目的：当前调用的 irp 是否是原始的线程操作 irp 还是由于线程的其他操作从而又产生的新的 irp 操作。 1.4 文件对象状态跟踪 跟踪一个文件操作的状态，一般使用 FCB。而 FCB 的生命周期，又是以 CREATE [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2361/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>文件过滤驱动的东东，总结的比较全面</title>
		<link>http://blog.tinybrowser.net/archives/2346</link>
		<comments>http://blog.tinybrowser.net/archives/2346#comments</comments>
		<pubDate>Thu, 21 Oct 2010 14:00:26 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2346</guid>
		<description><![CDATA[1> IFS 流程图 a.生成一个控制设备.当然此前你必须给控制设置指定名称. b.设置Dispatch Functions. c.设置Fast Io Functions. d.编写一个my_fs_notify回调函数，在其中绑定刚激活的FS CDO. e.使用wdff_reg_notify调用注册这个回调函数。 f.编写默认的dispatch functions. g.处理IRP_MJ_FILE_SYSTEM_CONTROL,在其中监控Volumne的Mount和Dismount. h.下一步自然是绑定Volumne了. (全路径是在 FileObject->FileName.Buffer中得到的.) 2>一些必要知识 a.几个概念的区别 1.多数的storage drivers 是PNP管理的，存在一个设备节点（DEVNODE），（It is important to note that file systems and file system filter drivers are not PnP device drivers;），每个设备节点上维护一个Storage Device Stacks，这个就是因为每个存储设备，例如磁盘设备，可能包含一个或者多个逻辑卷（分区或者动态卷），这些卷就是通过这个Storage Device Stack来保存的。该设备点的信息就是functional device object (FDO)。剩下的就是physical device objects (PDO)代表各个分区。 2.通过下面的方式可以得到卷的名称 The Mount Manager responds [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2346/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>若干关于 file system driver stack</title>
		<link>http://blog.tinybrowser.net/archives/2325</link>
		<comments>http://blog.tinybrowser.net/archives/2325#comments</comments>
		<pubDate>Thu, 21 Oct 2010 08:08:27 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2325</guid>
		<description><![CDATA[写这个文章的初衷是想知道究竟一个读写文件的 irp 都是怎样被处理的….. 大家都知道这样的一个读写文件 irp 是发送给 file system 的 driver 的, file system 把这个 irp 交给了下层的 device. 这个 device 叫 logical volume device, 它由 device 的 vbp 里面的 realdevice 指针指出 (不一定就会是这个 device, 而应该是这个 device 所在的 stack 的最上层的 device). 那这个 device 是个什么东西呢? 它是怎么来的呢? 按照道理, 这个 irp 应该被发送到 disk 的驱动去才对? 那么这个 device 是 disk 的驱动创建的么? 如果不是, 那中间都有些什么步骤呢? [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2325/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>驱动对象 设备对象 设备栈 乱杂谈</title>
		<link>http://blog.tinybrowser.net/archives/2322</link>
		<comments>http://blog.tinybrowser.net/archives/2322#comments</comments>
		<pubDate>Thu, 21 Oct 2010 07:35:04 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2322</guid>
		<description><![CDATA[作者: JIURL 　 　　 用有限的几句话就舒舒服服的建立起对驱动对象和设备对象的概念是不可能的。刚开始是一片模糊，了解的多了，慢慢就清楚。下面的内容会使你对他们了解的清楚些。 　　为了后面的叙述方便，首先列出驱动对象和设备对象的结构。 　　驱动对象结构 DRIVER_OBJECT ，定义如下 　　struct _DRIVER_OBJECT (sizeof=168) 　　+00 int16 Type 　　+02 int16 Size 　　+04 struct _DEVICE_OBJECT *DeviceObject 　　+08 uint32 Flags 　　+0c void *DriverStart 　　+10 uint32 DriverSize 　　+14 void *DriverSection 　　+18 struct _DRIVER_EXTENSION *DriverExtension 　　+1c struct _UNICODE_STRING DriverName 　　+1c uint16 Length 　　+1e uint16 MaximumLength 　　+20 uint16 *Buffer 　　+24 struct _UNICODE_STRING *HardwareDatabase [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2322/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TrueCrypt 源码</title>
		<link>http://blog.tinybrowser.net/archives/2005</link>
		<comments>http://blog.tinybrowser.net/archives/2005#comments</comments>
		<pubDate>Tue, 06 Jul 2010 14:22:40 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[AES]]></category>
		<category><![CDATA[truecrypt]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=2005</guid>
		<description><![CDATA[TrueCrypt 可编译版本, 主要做了一些微调, 使得能通过vs2008, 并且不再吐出警告信息, 源码TrueCrypt-6-3-a-Src 下载, 要完整编译本源代码, 需要自己下载以下编译工具: vs 2008 或者 VS 2010 download nasm 下载地址 nasm 下载后将 nasm.exe 文件解压出来, 放到 system32 目录里 gzip 下载地址 gzip 下载后将 gzip.exe 文件解压出来, 放到 system32 目录里 vc1.5 下载地址 或这里(本地) 下载后解压到一个文件夹, 如 d:\vc1.5 , 然后创建一个环境变量 MSVC16_ROOT = d:\vc1.5 这是微软提供的最后一个能生成 16 位代码的编译工具 WDK 下载地址 微软提供, 安装后用目标目录创建环境变量 BASEDIR, 如 BASEDIR = [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/2005/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips of Windows Programming</title>
		<link>http://blog.tinybrowser.net/archives/1957</link>
		<comments>http://blog.tinybrowser.net/archives/1957#comments</comments>
		<pubDate>Fri, 11 Jun 2010 01:43:44 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[IRP]]></category>
		<category><![CDATA[SYSTEMTIME]]></category>
		<category><![CDATA[只读内存]]></category>
		<category><![CDATA[自旋锁]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=1957</guid>
		<description><![CDATA[窗口总在最前 窗口总保持激活状态, 这段代码可以放在定时器内. 怎么跟自旋锁打交道 The code within a critical region guarded by an spin lock must neither be pageable nor make any references to pageable data. The code within a critical region guarded by a spin lock can neither call any external function that might access pageable data or raise an exception, nor can it [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/1957/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>驱动开发中应该注意的事项</title>
		<link>http://blog.tinybrowser.net/archives/1951</link>
		<comments>http://blog.tinybrowser.net/archives/1951#comments</comments>
		<pubDate>Wed, 09 Jun 2010 22:53:03 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>
		<category><![CDATA[技术心得]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=1951</guid>
		<description><![CDATA[1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。 2. 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。 3. 一定不要将 DeviceObject->Flags 设置为 DO_BUFFERED_IO 和 DO_DIRECT_IO。 它会扰乱系统并最终导致致命错误。 而且，一定不要在 DeviceObject->Flags 中设置 METHOD_BUFFERED、METHOD_NEITHER、METHOD_IN_DIRECT 或 METHOD_OUT_DIRECT，因为这些值只在定义 IOCTL 时使用。 4. 一定不要通过页面缓冲池分配调度程序对象。 如果这样做，将会偶尔导致系统故障检测 (Bugcheck)。 5. 当运行于 IRQL >= DISPATCH_LEVEL 时，一定不要通过页面缓冲池分配内存，或访问页面缓冲池中的内存。 这是一个致命错误。 6. 一定不要在 IRQL >= DISPATCH_LEVEL 上等候核心调度程序对象出现非零间隔。 这是一个致命错误。 7. 在 IRQL >= DISPATCH_LEVEL 上执行时，一定不要调用任何导致调用线程发生直接或间接等待的函数。 [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/1951/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

