<?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>swigger's BLOG &#187; 注册表 内核</title>
	<atom:link href="http://www.swigger.net/archives/tag/%e6%b3%a8%e5%86%8c%e8%a1%a8-%e5%86%85%e6%a0%b8/feed" rel="self" type="application/rss+xml" />
	<link>http://www.swigger.net</link>
	<description>醉卧沙场君莫笑 古来征战几人回</description>
	<lastBuildDate>Tue, 24 Jan 2012 05:34:35 +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>windows 注册表的初始化</title>
		<link>http://www.swigger.net/archives/26.html</link>
		<comments>http://www.swigger.net/archives/26.html#comments</comments>
		<pubDate>Tue, 15 Apr 2008 15:19:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[注册表 内核]]></category>

		<guid isPermaLink="false">http://www.swigger.net/?p=26</guid>
		<description><![CDATA[看了看wrk的代码，发现一个函数会调用ZwCreateFile打开注册表的文件，这个函数就是CmpOpenHiveFiles 这个函数会打开两个注册表文件，master为不带后辍的，secondary为带后辍的。 system32\config\system和software就是这样被加载的。   查找过程，先找SAM，这个词不常见，grep一下找到一个配置表: &#160; HIVE_LIST_ENTRY CmpMachineHiveList&#91;&#93; = &#123;     &#123; L&#34;HARDWARE&#34;, L&#34;MACHINE\\&#34;, NULL, HIVE_VOLATILE    , 0                         ,   NULL,   FALSE,  FALSE,  FALSE&#125;,     &#123; L&#34;SECURITY&#34;, L&#34;MACHINE\\&#34;, NULL, 0                , 0                         ,   NULL,   FALSE,  FALSE,  FALSE&#125;,     &#123; L&#34;SOFTWARE&#34;, L&#34;MACHINE\\&#34;, NULL, 0                , 0                         ,   NULL,   FALSE,  FALSE,  FALSE&#125;,     &#123; L&#34;SYSTEM&#34;,   L&#34;MACHINE\\&#34;, NULL, 0                [...]]]></description>
			<content:encoded><![CDATA[<p>看了看wrk的代码，发现一个函数会调用ZwCreateFile打开注册表的文件，这个函数就是CmpOpenHiveFiles</p>
<p>这个函数会打开两个注册表文件，master为不带后辍的，secondary为带后辍的。</p>
<p>system32\config\system和software就是这样被加载的。</p>
<p> </p>
<p>查找过程，先找SAM，这个词不常见，grep一下找到一个配置表:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">&nbsp;
HIVE_LIST_ENTRY CmpMachineHiveList<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#123;</span> L<span style="color: #ff0000;">&quot;HARDWARE&quot;</span><span style="color: #339933;">,</span> L<span style="color: #ff0000;">&quot;MACHINE<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> HIVE_VOLATILE    <span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                         <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> L<span style="color: #ff0000;">&quot;SECURITY&quot;</span><span style="color: #339933;">,</span> L<span style="color: #ff0000;">&quot;MACHINE<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                <span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                         <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> L<span style="color: #ff0000;">&quot;SOFTWARE&quot;</span><span style="color: #339933;">,</span> L<span style="color: #ff0000;">&quot;MACHINE<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                <span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                         <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> L<span style="color: #ff0000;">&quot;SYSTEM&quot;</span><span style="color: #339933;">,</span>   L<span style="color: #ff0000;">&quot;MACHINE<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                <span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                         <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> L<span style="color: #ff0000;">&quot;DEFAULT&quot;</span><span style="color: #339933;">,</span>  L<span style="color: #ff0000;">&quot;USER<span style="color: #000099; font-weight: bold;">\\</span>.DEFAULT&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>           <span style="color: #339933;">,</span> CM_CMHIVE_FLAG_UNTRUSTED  <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> L<span style="color: #ff0000;">&quot;SAM&quot;</span><span style="color: #339933;">,</span>      L<span style="color: #ff0000;">&quot;MACHINE<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> HIVE_NOLAZYFLUSH <span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                         <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span> NULL<span style="color: #339933;">,</span>        NULL<span style="color: #339933;">,</span>         <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                   <span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span>                         <span style="color: #339933;">,</span>   NULL<span style="color: #339933;">,</span>   FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #339933;">,</span>  FALSE<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>注册表应该就是从这里初始化的了。</p>
<p>再找引用：</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> CM_NUMBER_OF_MACHINE_HIVES<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ASSERT<span style="color: #009900;">&#40;</span> CmpMachineHiveList<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">Name</span> <span style="color: #339933;">!=</span> NULL <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//  </span>
        <span style="color: #666666; font-style: italic;">// just spawn the Threads to load the hives in parallel</span>
        <span style="color: #666666; font-style: italic;">//  </span>
        Status <span style="color: #339933;">=</span> PsCreateSystemThread<span style="color: #009900;">&#40;</span>
            <span style="color: #339933;">&amp;</span>Thread<span style="color: #339933;">,</span>
            THREAD_ALL_ACCESS<span style="color: #339933;">,</span>
            NULL<span style="color: #339933;">,</span>
            <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>  
            NULL<span style="color: #339933;">,</span>
            CmpLoadHiveThread<span style="color: #339933;">,</span>
            <span style="color: #009900;">&#40;</span>PVOID<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ULONG_PTR<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>ULONG<span style="color: #009900;">&#41;</span>i
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>NT_SUCCESS<span style="color: #009900;">&#40;</span>Status<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            ZwClose<span style="color: #009900;">&#40;</span>Thread<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">//  </span>
            <span style="color: #666666; font-style: italic;">// cannot spawn thread; Fatal error</span>
            <span style="color: #666666; font-style: italic;">//  </span>
            CM_BUGCHECK<span style="color: #009900;">&#40;</span>BAD_SYSTEM_CONFIG_INFO<span style="color: #339933;">,</span>BAD_HIVE_LIST<span style="color: #339933;">,</span><span style="color: #0000dd;">3</span><span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>Status<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>   
    <span style="color: #009900;">&#125;</span>   </pre></div></div>

<p>这里为每个hive创建一个线程，进入CmpLoadHiveThread函数：</p>
<p>  </p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"> 
&nbsp;
<span style="color: #666666; font-style: italic;">// &lt;sysroot&gt;\config\hive</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>CmpMachineHiveList<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">CmHive</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">//</span>
        <span style="color: #666666; font-style: italic;">// Hive has not been initialized in any way.</span>
        <span style="color: #666666; font-style: italic;">//</span>
&nbsp;
        CmpMachineHiveList<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">Allocate</span> <span style="color: #339933;">=</span> TRUE<span style="color: #339933;">;</span>
        Status <span style="color: #339933;">=</span> CmpInitHiveFromFile<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>FileName<span style="color: #339933;">,</span>
                                     CmpMachineHiveList<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">HHiveFlags</span><span style="color: #339933;">,</span>
                                     <span style="color: #339933;">&amp;</span>CmHive<span style="color: #339933;">,</span>
                                     <span style="color: #339933;">&amp;</span><span style="color: #009900;">&#40;</span>CmpMachineHiveList<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">Allocate</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                     CM_CHECK_REGISTRY_CHECK_CLEAN
                                     <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>NT_SUCCESS<span style="color: #009900;">&#40;</span>Status<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
             <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>CmpShareSystemHives <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>CmHive<span style="color: #339933;">-&gt;</span>FileHandles<span style="color: #009900;">&#91;</span>HFILE_TYPE_LOG<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            ErrorParameters <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>FileName<span style="color: #339933;">;</span>
            ExRaiseHardError<span style="color: #009900;">&#40;</span>
                STATUS_CANNOT_LOAD_REGISTRY_FILE<span style="color: #339933;">,</span>
                <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
                <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#40;</span>PULONG_PTR<span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>ErrorParameters<span style="color: #339933;">,</span>
                OptionOk<span style="color: #339933;">,</span>
                <span style="color: #339933;">&amp;</span>ErrorResponse
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
&nbsp;
 </pre></div></div>

<p>CmpInitHiveFromFile会调用CmpOpenHiveFiles，后者会调用zwcreatefile打开相应的注册表文件。</p>
<p>如果要保护注册表，在创建线程前处理一下就好了。还只是猜想，哪天闲出毛病了再试试。</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.swigger.net/archives/26.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

