<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
 >

  <channel rdf:about="http://sourceforge.jp/projects/yamy/wiki/!feeds/diff">
    <title>Updates of Yet Another Mado tsukai no Yuutsu Wiki</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/!feeds/diff</link>
    <description>
      SourceForge.jp Wiki page updates for Yet Another Mado tsukai no Yuutsu project.    </description>
        <dc:date>2009-08-22T22:16:31+09:00</dc:date>
        <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem" />
              </rdf:Seq>
    </items>
  </channel>

    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-22T22:16:31+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -696,24 +696,36 @@
 {{{
 Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function before it (or any other application) can receive WH_SHELL messages. This function must be called with SPI_SETMINIMIZEDMETRICS and a MINIMIZEDMETRICS structure. Set the iArrange member of this structure to ARW_HIDE.
 }}}
 との記載があり、bbLean 内でもそのような処理が行われていた。そこで、SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, ...)で保存しておいた MINIMIZEDMETRICS を !UpdatePerUserSystemParameters()呼び出し後に SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, ...)で再設定してやると、正常な動作(最小化するとタスクバーに入る・アプリを起動するとタスクバーに現われる)をするようになった。
+
+----
 
 !CreateRemoteThread のドキュメントには
 {{{
 lTerminal Services isolates each terminal session by design. Therefore, CreateRemoteThread fails if the target process is in a different session than the calling process.
 }}}
 とあるが、タスクマネージャで確認したところ、幸いなことに winlogon.exe は SYSTEM 権限で動いているもののセッションはログオンしているユーザと同じもののようだ。
 
 ただし、ユーザ切り替え機能を使うとログオンしているユーザ毎に winlogon.exe プロセスが生成されるので、!ProcessIdToSessionId()を使って判別する必要がある。
+
+----
 
 Vista以降のUAC下では管理者権限でないと、
  * winlogon に対する !ProcessIdToSessionId()は失敗する。
  * !SeDebugPrivilege が(単に無効ではなく)割り当てられない。(たとえ当該ユーザが Administrators に属していても)
+
+----
 
 Windows7 RCで試したところ !HKEY_CURRENT_USER の Scancode Map が使えなさそう。!HKEY_LOCAL_MACHINE のほうは有効。尚、Scancode Map については !HKCU のほうはログオフ→ログオンで、!HKLM のほうは再起動で有効になるという情報が多く見られるが、少なくとも WinXP SP3 以降では、!HKLM のほうもログオフ→ログオンで有効になった。
+
+----
 
 !UpdatePerUserSystemParameters()のinjectionでの実行時にハングしているプロセスがあると、inject したスレッドが制御を返さない。notepad.exe を windbg.exe でデバッグブレークさせてハング状態を作り出して確認した。この場合、Scancode Map は更新されない。
 
 notepad.exe をハング→injection→タイムアウト→!VirtualFree()→notepad.exe を復活
 
 という手順を踏むと、winlogon.exe がクラッシュしたような挙動を示すので、ハングプロセスが復活したら処理は継続されるようだ。ただし、この「継続」でも Scancode Map は更新されていない。また、そのプロセスがハングしたままでも再度 injection すればリモートスレッドは制御を返し、Scancode Map は更新される。
+
+----
+
+WinXP の場合、クラシックテーマだとロックから復帰時(WTS_SESSION_UNLOCK受信時)に !UpdatePerUserSystemParameters() を実行すると失敗する場合がある。Luna なら問題ない。WTS_SESSION_UNLOCK受信時に自分に投げたメッセージで !UpdatePerUserSystemParameters() を呼ぶようにしてみたがそれでもダメ。そこで失敗した場合はWM_TIMERを使って何秒後かに !UpdatePerUserSystemParameters() を呼ぶようにしたら上手くいったもののスマートなやり方ではない…
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-17T00:03:07+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -710,4 +710,10 @@
  * winlogon に対する !ProcessIdToSessionId()は失敗する。
  * !SeDebugPrivilege が(単に無効ではなく)割り当てられない。(たとえ当該ユーザが Administrators に属していても)
 
 Windows7 RCで試したところ !HKEY_CURRENT_USER の Scancode Map が使えなさそう。!HKEY_LOCAL_MACHINE のほうは有効。尚、Scancode Map については !HKCU のほうはログオフ→ログオンで、!HKLM のほうは再起動で有効になるという情報が多く見られるが、少なくとも WinXP SP3 以降では、!HKLM のほうもログオフ→ログオンで有効になった。
+
+!UpdatePerUserSystemParameters()のinjectionでの実行時にハングしているプロセスがあると、inject したスレッドが制御を返さない。notepad.exe を windbg.exe でデバッグブレークさせてハング状態を作り出して確認した。この場合、Scancode Map は更新されない。
+
+notepad.exe をハング→injection→タイムアウト→!VirtualFree()→notepad.exe を復活
+
+という手順を踏むと、winlogon.exe がクラッシュしたような挙動を示すので、ハングプロセスが復活したら処理は継続されるようだ。ただし、この「継続」でも Scancode Map は更新されていない。また、そのプロセスがハングしたままでも再度 injection すればリモートスレッドは制御を返し、Scancode Map は更新される。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-12T11:34:22+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -709,4 +709,5 @@
 Vista以降のUAC下では管理者権限でないと、
  * winlogon に対する !ProcessIdToSessionId()は失敗する。
  * !SeDebugPrivilege が(単に無効ではなく)割り当てられない。(たとえ当該ユーザが Administrators に属していても)
 
+Windows7 RCで試したところ !HKEY_CURRENT_USER の Scancode Map が使えなさそう。!HKEY_LOCAL_MACHINE のほうは有効。尚、Scancode Map については !HKCU のほうはログオフ→ログオンで、!HKLM のほうは再起動で有効になるという情報が多く見られるが、少なくとも WinXP SP3 以降では、!HKLM のほうもログオフ→ログオンで有効になった。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-12T00:13:58+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -704,4 +704,9 @@
 }}}
 とあるが、タスクマネージャで確認したところ、幸いなことに winlogon.exe は SYSTEM 権限で動いているもののセッションはログオンしているユーザと同じもののようだ。
 
 ただし、ユーザ切り替え機能を使うとログオンしているユーザ毎に winlogon.exe プロセスが生成されるので、!ProcessIdToSessionId()を使って判別する必要がある。
+
+Vista以降のUAC下では管理者権限でないと、
+ * winlogon に対する !ProcessIdToSessionId()は失敗する。
+ * !SeDebugPrivilege が(単に無効ではなく)割り当てられない。(たとえ当該ユーザが Administrators に属していても)
+
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-11T13:06:55+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -696,4 +696,12 @@
 {{{
 Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function before it (or any other application) can receive WH_SHELL messages. This function must be called with SPI_SETMINIMIZEDMETRICS and a MINIMIZEDMETRICS structure. Set the iArrange member of this structure to ARW_HIDE.
 }}}
 との記載があり、bbLean 内でもそのような処理が行われていた。そこで、SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, ...)で保存しておいた MINIMIZEDMETRICS を !UpdatePerUserSystemParameters()呼び出し後に SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, ...)で再設定してやると、正常な動作(最小化するとタスクバーに入る・アプリを起動するとタスクバーに現われる)をするようになった。
+
+!CreateRemoteThread のドキュメントには
+{{{
+lTerminal Services isolates each terminal session by design. Therefore, CreateRemoteThread fails if the target process is in a different session than the calling process.
+}}}
+とあるが、タスクマネージャで確認したところ、幸いなことに winlogon.exe は SYSTEM 権限で動いているもののセッションはログオンしているユーザと同じもののようだ。
+
+ただし、ユーザ切り替え機能を使うとログオンしているユーザ毎に winlogon.exe プロセスが生成されるので、!ProcessIdToSessionId()を使って判別する必要がある。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-10T19:59:57+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -695,5 +695,5 @@
 」の項に
 {{{
 Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function before it (or any other application) can receive WH_SHELL messages. This function must be called with SPI_SETMINIMIZEDMETRICS and a MINIMIZEDMETRICS structure. Set the iArrange member of this structure to ARW_HIDE.
 }}}
-との記載があり、bbLean 内でもそのような処理が行われていた。
+との記載があり、bbLean 内でもそのような処理が行われていた。そこで、SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, ...)で保存しておいた MINIMIZEDMETRICS を !UpdatePerUserSystemParameters()呼び出し後に SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, ...)で再設定してやると、正常な動作(最小化するとタスクバーに入る・アプリを起動するとタスクバーに現われる)をするようになった。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-10T19:26:45+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -690,5 +690,10 @@
 uiParam = 0x00000014(sizeof(MINIMIZEDMETRICS))
 pvParam = 01a6f67c(MINIMIZEDMETRICS*)
 fWinIni = 0
 }}}
-となることが判る。
+となることが判る。改めて MSDN を調べてみると http://msdn.microsoft.com/en-us/library/ms644959(VS.85).aspx の「WH_SHELL Hook
+」の項に
+{{{
+Note that custom shell applications do not receive WH_SHELL messages. Therefore, any application that registers itself as the default shell must call the SystemParametersInfo function before it (or any other application) can receive WH_SHELL messages. This function must be called with SPI_SETMINIMIZEDMETRICS and a MINIMIZEDMETRICS structure. Set the iArrange member of this structure to ARW_HIDE.
+}}}
+との記載があり、bbLean 内でもそのような処理が行われていた。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-10T18:19:53+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -668,5 +668,27 @@
 01a6f89c 805016a0 ntdll!KiUserCallbackDispatcher+0x13
 f7b7e764 805990ed nt!KiCallUserMode+0x4
 f7b7e7c0 bf83d6c5 nt!KeUserModeCallback+0x87
 }}}
-となる。この場合と同じパラメータで user32!!SystemParametersInfo を呼べば良いのではないかと推測される。
+となる。この場合と同じパラメータで user32!!SystemParametersInfo を呼べば良いのではないかと推測される。win32k!!NtUserSystemParametersInfo でのスタック:
+{{{
+kd> dd f7b7e48c
+f7b7e48c  f7b7e4a4 8053f648 0000002c 00000014
+f7b7e49c  01a6f67c 00000000 01a6f550 7c94e514
+}}}
+を !SystemParametersInfo() のプロトタイプ
+{{{
+BOOL SystemParametersInfo(
+  UINT uiAction,  // 取得または設定するべきシステムパラメータ
+  UINT uiParam,   // 実施するべき操作によって異なる
+  PVOID pvParam,  // 実施するべき操作によって異なる
+  UINT fWinIni    // ユーザープロファイルの更新オプション
+);
+}}}
+に当てはめると、
+{{{
+uiAction = 0x0000002c(SPI_SETMINIMIZEDMETRICS)
+uiParam = 0x00000014(sizeof(MINIMIZEDMETRICS))
+pvParam = 01a6f67c(MINIMIZEDMETRICS*)
+fWinIni = 0
+}}}
+となることが判る。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-10T18:13:16+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -643,5 +643,30 @@
 bf88fcb9 e90e010000      jmp     win32k!xxxClientAddFontResourceW+0xb3 (bf88fdcc)
 bf88fcbe 8b00            mov     eax,dword ptr [eax]
 bf88fcc0 e952010000      jmp     win32k!xxxClientAddFontResourceW+0xfe (bf88fe17)
 }}}
-
+explorer.exe を再起動すると同じ場所でブレークし、その際のコールスタックは
+{{{
+ChildEBP RetAddr  
+f7b7dd60 bf8911fc win32k!SetMinMetrics+0xeb
+f7b7dd78 bf8911cb win32k!xxxSetAndDrawMinMetrics+0x23
+f7b7dd94 bf891195 win32k!xxxSPISetMinMetrics+0x6a
+f7b7ddac bf81d17e win32k!xxxSetSPIMetrics+0xac
+f7b7e208 bf81e805 win32k!xxxSystemParametersInfo+0xfe2
+f7b7e48c 8053f648 win32k!NtUserSystemParametersInfo+0x390
+f7b7e48c 7c94e514 nt!KiFastCallEntry+0xf8
+01a6f508 77cf8cc3 ntdll!KiFastSystemCallRet
+WARNING: Frame IP not in any known module. Following frames may be wrong.
+01a6f550 587348e1 0x77cf8cc3
+01a6f5f8 5873497c 0x587348e1
+01a6f61c 77cf9f5a 0x5873497c
+01a6f660 010183ce 0x77cf9f5a
+01a6f690 01013f7f 0x10183ce
+01a6f6a8 010185b0 0x1013f7f
+01a6f760 01001b5c 0x10185b0
+01a6f784 77cf8734 0x1001b5c
+01a6f89c 7c94e473 0x77cf8734
+01a6f89c 805016a0 ntdll!KiUserCallbackDispatcher+0x13
+f7b7e764 805990ed nt!KiCallUserMode+0x4
+f7b7e7c0 bf83d6c5 nt!KeUserModeCallback+0x87
+}}}
+となる。この場合と同じパラメータで user32!!SystemParametersInfo を呼べば良いのではないかと推測される。
</pre>]]>
    </content:encoded>
      </item>
    <item rdf:about="http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem">
    <title>NLSKeyProblem</title>
    <link>http://sourceforge.jp/projects/yamy/wiki/NLSKeyProblem</link>
    <dc:identifier>NLSKeyProblem</dc:identifier>
    <dc:date>2009-08-10T18:09:28+09:00</dc:date>
          <description>
      <![CDATA[ (by gimy)
]]>
    </description>
    <content:encoded>
      <![CDATA[<p> (by gimy)</p><pre>@@ -387,15 +387,16 @@
  * エクスプローラのウィンドウが全て消える
  * !TaskbarCreated を処理していないアプリの場合通知領域のアイコンが復活しない
 前者については「ログオン時に以前のフォルダウィンドウを表示する」を有効にしてみたが復活しない。エクスプローラ終了前にその時点で開かれているフォルダウィンドウを記憶しておき、再起動後再表示させることはできるとは思う。
 
-上述のような制限を回避するため、エクスプローラ再起動以外の方法を検討する。試してみたこととしては、
+上述のような制限を回避するため、エクスプローラ再起動以外の方法を検討する。
 
 progman ウィンドウに WM_USERCHANGE を送出したが効果なし。
 
 yamy32.dll を使って Explorer.exe に飛んでくるシェルフックメッセージ(RegisterWindowMessage(_T("SHELLHOOK"))) を調べたところ、!UpdatePerUserSystemParameters()を呼び出す前は、アプリを起動する度に、wParam として HSHELL_WINDOWCREATED 等が来ていたが、!UpdatePerUserSystemParameters()の呼び出し後はそれらが来なくなる。
 
-そこで、yamy32.dll の initialize()で Explorer.exe に !ShellDDEInit()/!RegisterShellHook()/!RegisterShellHookWindow()を実行させたが効果はない。サンプルコードは以下:
+互換シェルである bbLean のソースコードを見ると、!ShellDDEInit()/!RegisterShellHook() といった非公開 API を呼び出している。また、user32.dll には関係ありそうな API !RegisterShellHookWindow()が存在する。
+そこで、yamy32.dll の initialize()で Explorer.exe にこれらの API を実行させてみたが効果はない。サンプルコードは以下:
 {{{
 if (_tcsncmp(g.m_moduleName, _T("Explorer"), sizeof(_T("Explorer"))/sizeof(_TCHAR)) == 0) {
 	HWND hTrayWnd = FindWindow(_T("Shell_TrayWnd"), NULL);
 	if (hTrayWnd != NULL) {
@@ -428,7 +429,219 @@
 逆に、yamy32.dll を使って、Explorer.exe にシェルフックメッセージを無視(return 0;)させて見たが、!UpdatePerUserSystemParameters()を呼んだ場合とは現象が異なり、スタートボタンの上に最小化ウィンドウが現われることがない。
 
 !GetShellWindow()は progman クラスと同じウィンドウ(恐らく Explorer のメインウィンドウ)が返される。!UpdatePerUserSystemParameters()後に!GetShellWindow()を呼んでも正しい値が取れる。一方、Explorer.exe を終了していれば、!GetShellWindow()は NULL を返す。このことから !GetShellWindow()で返されるシェルウィンドウが !UpdatePerUserSystemParameters() でクリアされるわけではなさそう。
 
-カーネル内でのシェルフックの扱いを探るために、 KD で x win32k!*ShellHook* をかけると、win32k!PostShellHookMessages というのが見付かるので、ここに ba e1 すると、
+カーネル内でのシェルフックの扱いを探るために、 KD で x win32k!*ShellHook* をかけると、win32k!PostShellHookMessages というのが見付かるので、ここに ba e1 すると正常時にはウィンドウ操作に際にブレークし、
+{{{
+ChildEBP RetAddr  
+f78b3b08 bf846e0b win32k!PostShellHookMessages ... (A)
+f78b3b24 bf83abc6 win32k!xxxSetTrayWindow+0x83 ... (B)
+f78b3b4c bf8b1fa3 win32k!xxxUpdateTray+0x11e ... (C)
+f78b3b7c bf8223f3 win32k!xxxProcessEventMessage+0x161
+f78b3c94 bf801ea2 win32k!xxxScanSysQueue+0x10fb
+f78b3ce8 bf8036cf win32k!xxxRealInternalGetMessage+0x335
+f78b3d48 8053f648 win32k!NtUserPeekMessage+0x40
+f78b3d48 7c94e514 nt!KiFastCallEntry+0xf8
+0007ff34 7c94d80a ntdll!KiFastSystemCallRet
+0007ffa0 7c956b17 ntdll!ZwQueryInformationProcess+0xc
+00080058 00000000 ntdll!LdrpUpdateLoadCount3+0x68
+}}}
+といったコールスタックが得られる。しかし、!UpdatePerUserSystemParameters()実行後は同じ操作をしてもブレークしない。(A)(B)(C)それぞれに ba e1 してどこまで実行されるのかを調べると、(C)には来るが(B)には到達しないことがわかった。(C)を逆アセンブルすると
+{{{
+win32k!xxxUpdateTray:
+bf83ab05 8bff            mov     edi,edi
+bf83ab07 55              push    ebp
+bf83ab08 8bec            mov     ebp,esp
+bf83ab0a 83ec0c          sub     esp,0Ch
+bf83ab0d 57              push    edi
+bf83ab0e 8b7d08          mov     edi,dword ptr [ebp+8]
+bf83ab11 f6472310        test    byte ptr [edi+23h],10h
+bf83ab15 0f84b1000000    je      win32k!xxxUpdateTray+0x124 (bf83abcc)
+bf83ab1b 8b473c          mov     eax,dword ptr [edi+3Ch]
+bf83ab1e 56              push    esi
+bf83ab1f 8bf7            mov     esi,edi
+bf83ab21 85c0            test    eax,eax
+bf83ab23 75c5            jne     win32k!xxxUpdateTray+0x1e (bf83aaea)
+bf83ab25 8b4608          mov     eax,dword ptr [esi+8]
+bf83ab28 8b4030          mov     eax,dword ptr [eax+30h]
+bf83ab2b 3b05c0c39abf    cmp     eax,dword ptr [win32k!gpqForeground (bf9ac3c0)]
+bf83ab31 0f8594000000    jne     win32k!xxxUpdateTray+0x123 (bf83abcb)
+bf83ab37 a1d8af9abf      mov     eax,dword ptr [win32k!gpsi (bf9aafd8)]
+bf83ab3c f680a006000008  test    byte ptr [eax+6A0h],8
+bf83ab43 0f8482000000    je      win32k!xxxUpdateTray+0x123 (bf83abcb) ...(***)
+bf83ab49 a198b39abf      mov     eax,dword ptr [win32k!gptiCurrent (bf9ab398)]
+bf83ab4e 8b4840          mov     ecx,dword ptr [eax+40h]
+bf83ab51 8b490c          mov     ecx,dword ptr [ecx+0Ch]
+bf83ab54 0b8898000000    or      ecx,dword ptr [eax+98h]
+bf83ab5a f6c508          test    ch,8
+bf83ab5d 750c            jne     win32k!xxxUpdateTray+0x71 (bf83ab6b)
+bf83ab5f 8b460c          mov     eax,dword ptr [esi+0Ch]
+bf83ab62 8b4004          mov     eax,dword ptr [eax+4]
+bf83ab65 83785c00        cmp     dword ptr [eax+5Ch],0
+bf83ab69 7460            je      win32k!xxxUpdateTray+0x123 (bf83abcb)
+bf83ab6b 8b460c          mov     eax,dword ptr [esi+0Ch]
+bf83ab6e 8b4004          mov     eax,dword ptr [eax+4]
+bf83ab71 8b4e34          mov     ecx,dword ptr [esi+34h]
+bf83ab74 3b4808          cmp     ecx,dword ptr [eax+8]
+bf83ab77 7552            jne     win32k!xxxUpdateTray+0x123 (bf83abcb)
+bf83ab79 f6462310        test    byte ptr [esi+23h],10h
+bf83ab7d 744c            je      win32k!xxxUpdateTray+0x123 (bf83abcb)
+bf83ab7f 33c9            xor     ecx,ecx
+bf83ab81 41              inc     ecx
+bf83ab82 f6461902        test    byte ptr [esi+19h],2
+bf83ab86 7457            je      win32k!xxxUpdateTray+0x96 (bf83abdf)
+bf83ab88 f6471902        test    byte ptr [edi+19h],2
+bf83ab8c 7443            je      win32k!xxxUpdateTray+0xd9 (bf83abd1)
+bf83ab8e 57              push    edi
+bf83ab8f e89243fdff      call    win32k!IsTrayWindow (bf80ef26)
+bf83ab94 85c0            test    eax,eax
+bf83ab96 7439            je      win32k!xxxUpdateTray+0xd9 (bf83abd1)
+bf83ab98 8bc7            mov     eax,edi
+bf83ab9a 85c0            test    eax,eax
+bf83ab9c 8b0d98b39abf    mov     ecx,dword ptr [win32k!gptiCurrent (bf9ab398)]
+bf83aba2 8b5128          mov     edx,dword ptr [ecx+28h]
+bf83aba5 8955f4          mov     dword ptr [ebp-0Ch],edx
+bf83aba8 8d55f4          lea     edx,[ebp-0Ch]
+bf83abab 895128          mov     dword ptr [ecx+28h],edx
+bf83abae 8945f8          mov     dword ptr [ebp-8],eax
+bf83abb1 0f8441ffffff    je      win32k!xxxUpdateTray+0x112 (bf83aaf8)
+bf83abb7 ff4004          inc     dword ptr [eax+4]
+bf83abba 8b700c          mov     esi,dword ptr [eax+0Ch]
+bf83abbd 6a00            push    0
+bf83abbf 50              push    eax
+bf83abc0 56              push    esi
+bf83abc1 e8e7c10000      call    win32k!xxxSetTrayWindow (bf846dad)
+bf83abc6 e8c365fcff      call    win32k!ThreadUnlock1 (bf80118e)
+bf83abcb 5e              pop     esi
+bf83abcc 5f              pop     edi
+bf83abcd c9              leave
+bf83abce c20400          ret     4
+bf83abd1 56              push    esi
+bf83abd2 e84f43fdff      call    win32k!IsTrayWindow (bf80ef26)
+bf83abd7 f7d8            neg     eax
+bf83abd9 1bc0            sbb     eax,eax
+bf83abdb 23c6            and     eax,esi
+bf83abdd ebbb            jmp     win32k!xxxUpdateTray+0xf1 (bf83ab9a)
+bf83abdf f6461c80        test    byte ptr [esi+1Ch],80h
+bf83abe3 0f8508ffffff    jne     win32k!xxxUpdateTray+0xe1 (bf83aaf1)
+bf83abe9 f6461840        test    byte ptr [esi+18h],40h
+bf83abed 7526            jne     win32k!xxxUpdateTray+0xe5 (bf83ac15)
+bf83abef 8a4622          mov     al,byte ptr [esi+22h]
+bf83abf2 a80a            test    al,0Ah
+bf83abf4 740a            je      win32k!xxxUpdateTray+0xb3 (bf83ac00)
+bf83abf6 a8c0            test    al,0C0h
+bf83abf8 751b            jne     win32k!xxxUpdateTray+0xe5 (bf83ac15)
+bf83abfa f6462320        test    byte ptr [esi+23h],20h
+bf83abfe 7515            jne     win32k!xxxUpdateTray+0xe5 (bf83ac15)
+bf83ac00 85c9            test    ecx,ecx
+bf83ac02 74c7            je      win32k!xxxUpdateTray+0x123 (bf83abcb)
+bf83ac04 8bb690000000    mov     esi,dword ptr [esi+90h]
+bf83ac0a 85f6            test    esi,esi
+bf83ac0c 74bd            je      win32k!xxxUpdateTray+0x123 (bf83abcb)
+bf83ac0e 33c9            xor     ecx,ecx
+bf83ac10 e96dffffff      jmp     win32k!xxxUpdateTray+0x90 (bf83ab82)
+bf83ac15 56              push    esi
+bf83ac16 e82e300d00      call    win32k!Is31TrayWindow (bf90dc49)
+bf83ac1b ebba            jmp     win32k!xxxUpdateTray+0xeb (bf83abd7)
+}}}
+正常時は上記の(***)で分岐しないが、!UpdatePerUserSystemParameters()呼び出し後はここで分岐するため(B)に到達しない。1つ上の行で参照している[eax+6A0h]を 0x8 に書き換えると、正常な動作(最小化するとタスクバーに入る・アプリを起動するとタスクバーに現われる)をするようになる。
 
+そこで、この[eax+6A0h]に ba w1 を設定し、!UpdatePerUserSystemParameters()を呼び出すと、
+{{{
+ChildEBP RetAddr  
+f79a3b44 bf89973b win32k!SetMinMetrics+0xeb
+f79a3d44 bf8992fc win32k!xxxUpdatePerUserSystemParameters+0x45c
+f79a3d54 8053f648 win32k!NtUserUpdatePerUserSystemParameters+0x13
+f79a3d54 7c94e514 nt!KiFastCallEntry+0xf8
+0182ff5c 804ffb62 ntdll!KiFastSystemCallRet
+0182ff90 00000000 nt!KiDeliverApc+0x124
+}}}
+というコールスタックでブレークし、近辺の逆アセンブルは
+{{{
+win32k!SetMinMetrics:
+bf88fb98 8bff            mov     edi,edi
+bf88fb9a 55              push    ebp
+bf88fb9b 8bec            mov     ebp,esp
+bf88fb9d 83ec14          sub     esp,14h
+bf88fba0 8b450c          mov     eax,dword ptr [ebp+0Ch]
+bf88fba3 85c0            test    eax,eax
+bf88fba5 56              push    esi
+bf88fba6 7549            jne     win32k!SetMinMetrics+0x59 (bf88fbf1)
+bf88fba8 8b7508          mov     esi,dword ptr [ebp+8]
+bf88fbab 689a000000      push    9Ah
+bf88fbb0 6892000000      push    92h
+bf88fbb5 56              push    esi
+bf88fbb6 e845890000      call    win32k!MetricGetID (bf898500)
+bf88fbbb 6a00            push    0
+bf88fbbd 6893000000      push    93h
+bf88fbc2 56              push    esi
+bf88fbc3 8945f0          mov     dword ptr [ebp-10h],eax
+bf88fbc6 e835890000      call    win32k!MetricGetID (bf898500)
+bf88fbcb 6a00            push    0
+bf88fbcd 6894000000      push    94h
+bf88fbd2 56              push    esi
+bf88fbd3 8945f4          mov     dword ptr [ebp-0Ch],eax
+bf88fbd6 e825890000      call    win32k!MetricGetID (bf898500)
+bf88fbdb 6a00            push    0
+bf88fbdd 6896000000      push    96h
+bf88fbe2 56              push    esi
+bf88fbe3 8945f8          mov     dword ptr [ebp-8],eax
+bf88fbe6 e815890000      call    win32k!MetricGetID (bf898500)
+bf88fbeb 8945fc          mov     dword ptr [ebp-4],eax
+bf88fbee 8d45ec          lea     eax,[ebp-14h]
+bf88fbf1 8b5004          mov     edx,dword ptr [eax+4]
+bf88fbf4 85d2            test    edx,edx
+bf88fbf6 0f8e8d000000    jle     win32k!SetMinMetrics+0x60 (bf88fc89)
+bf88fbfc 8b4808          mov     ecx,dword ptr [eax+8]
+bf88fbff 85c9            test    ecx,ecx
+bf88fc01 895004          mov     dword ptr [eax+4],edx
+bf88fc04 7f02            jg      win32k!SetMinMetrics+0x6e (bf88fc08)
+bf88fc06 33c9            xor     ecx,ecx
+bf88fc08 894808          mov     dword ptr [eax+8],ecx
+bf88fc0b 8b480c          mov     ecx,dword ptr [eax+0Ch]
+bf88fc0e 85c9            test    ecx,ecx
+bf88fc10 7f02            jg      win32k!SetMinMetrics+0x7a (bf88fc14)
+bf88fc12 33c9            xor     ecx,ecx
+bf88fc14 8360100f        and     dword ptr [eax+10h],0Fh
+bf88fc18 89480c          mov     dword ptr [eax+0Ch],ecx
+bf88fc1b 8b0dd8af9abf    mov     ecx,dword ptr [win32k!gpsi (bf9aafd8)]
+bf88fc21 8bb1dc050000    mov     esi,dword ptr [ecx+5DCh]
+bf88fc27 8d1472          lea     edx,[edx+esi*2]
+bf88fc2a 8991a4060000    mov     dword ptr [ecx+6A4h],edx
+bf88fc30 8b0dd8af9abf    mov     ecx,dword ptr [win32k!gpsi (bf9aafd8)]
+bf88fc36 8bb13c060000    mov     esi,dword ptr [ecx+63Ch]
+bf88fc3c 8b91e0050000    mov     edx,dword ptr [ecx+5E0h]
+bf88fc42 8d1456          lea     edx,[esi+edx*2]
+bf88fc45 8991a8060000    mov     dword ptr [ecx+6A8h],edx
+bf88fc4b 8b0dd8af9abf    mov     ecx,dword ptr [win32k!gpsi (bf9aafd8)]
+bf88fc51 8b91a4060000    mov     edx,dword ptr [ecx+6A4h]
+bf88fc57 035008          add     edx,dword ptr [eax+8]
+bf88fc5a 5e              pop     esi
+bf88fc5b 89917c060000    mov     dword ptr [ecx+67Ch],edx
+bf88fc61 8b0dd8af9abf    mov     ecx,dword ptr [win32k!gpsi (bf9aafd8)]
+bf88fc67 8b91a8060000    mov     edx,dword ptr [ecx+6A8h]
+bf88fc6d 03500c          add     edx,dword ptr [eax+0Ch]
+bf88fc70 899180060000    mov     dword ptr [ecx+680h],edx
+bf88fc76 8b4010          mov     eax,dword ptr [eax+10h]
+bf88fc79 8b0dd8af9abf    mov     ecx,dword ptr [win32k!gpsi (bf9aafd8)]
+bf88fc7f 8981a0060000    mov     dword ptr [ecx+6A0h],eax <------------------ここでブレーク
+bf88fc85 c9              leave
+bf88fc86 c20800          ret     8
+bf88fc89 33d2            xor     edx,edx
+bf88fc8b e96cffffff      jmp     win32k!SetMinMetrics+0x62 (bf88fbfc)
+bf88fc90 68432a80bf      push    offset win32k!HeavyFreePool (bf802a43)
+bf88fc95 8d85c4fdffff    lea     eax,[ebp-23Ch]
+bf88fc9b 50              push    eax
+bf88fc9c 53              push    ebx
+bf88fc9d e8732cf7ff      call    win32k!PushW32ThreadLock (bf802915)
+bf88fca2 e9e6000000      jmp     win32k!xxxClientAddFontResourceW+0x68 (bf88fd8d)
+bf88fca7 837e0400        cmp     dword ptr [esi+4],0
+bf88fcab 0f8417010000    je      win32k!xxxClientAddFontResourceW+0xaf (bf88fdc8)
+bf88fcb1 8d7b24          lea     edi,[ebx+24h]
+bf88fcb4 6a12            push    12h
+bf88fcb6 59              pop     ecx
+bf88fcb7 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
+bf88fcb9 e90e010000      jmp     win32k!xxxClientAddFontResourceW+0xb3 (bf88fdcc)
+bf88fcbe 8b00            mov     eax,dword ptr [eax]
+bf88fcc0 e952010000      jmp     win32k!xxxClientAddFontResourceW+0xfe (bf88fe17)
+}}}
 
</pre>]]>
    </content:encoded>
      </item>
  </rdf:RDF>

