2016-08-04

How to use Microsoft IME's private mode on not IE/Edige

Windows 10 Anniversary updateに含まれるMicrosoft IMEの新機能でInternet ExplorerやEdgeを利用している場合にプライベートブラウジングモードに連動してIMEもプライベートモードにできるという機能が入ってる。ブラウザベンダーで働くブラウザ開発者してはこの機能を是非つけたいと思ったのだけど、どうもAPIが公開されていないということなので調べた。Nyaruruさんも軽く調査してたけど、その続き編みたいなものです。

どうもこんな感じのコールスタックでプライベートモードを見に来る。

ChildEBP RetAddr
0591d22c 6fab49e1 imjptip!PrivateDetector::PrivateDetector
0591d270 6fad9a58 imjptip!CTipFnPrivateModeManager::CTipFnPrivateModeManager+0x7e
0591d2a8 6fac9a16 imjptip!CTipFnPrivateModeManager::CreateInstance+0x35
0591d34c 6f63d614 imjptip!CTipProfileJPN::InitializeContextEditor+0x2556
0591d38c 6f62bb95 imetip!CTipContextEditor::Initialize+0x74
0591d3c4 6f62b55a imetip!CTipContextEditorMgr::InitContextEditor+0x53
0591d420 6f661404 imetip!CTipContextEditorMgr::OnProfileMgrEvent+0x44
0591d45c 6f6230ac imetip!CTipContextEditorMgr::_OnProfileMgrEvent+0x44
0591d478 6f623b54 imetip!Tiputil::CTipProfileMgrEventSink::OnProfileActivated+0x5c
0591d4c4 6f623c3d imetip!CTipProfileMgr::CallOnProfileActivated+0xc4
0591d4e0 6f6239b4 imetip!CTipProfileMgr::ActivateProfileProc+0x80
0591d554 6f6591e6 imetip!CTipProfileMgr::OnActivated+0x124
0591d568 6f61c795 imetip!Tiputil::TextInputProcessorActivateSink::OnActivated+0x61
0591d5a8 6f61ca02 imetip!CTextInputProcessor::CallOnActivated+0x45
0591d5d4 6f61d43f imetip!CTextInputProcessor::ActivateProc+0x6c
0591d608 769048f9 imetip!CTextInputProcessor::ActivateEx+0x4f
0591d63c 7691db53 MSCTF!CTip::Activate+0x63

このPrivateDetectorというクラスでInternet ExplorerとEdge用に専用コードが存在してる。FirefoxはUWPではないので、Internet Explorerを見ると、Internet Explorerの時だけ (判定にIERTUTIL.DLLのIEConfiguration_GetDWORDを利用)、IERTUTIL.DLLに存在する特別な関数 (LCIEIsCurrentProcessInPrivate) を呼び出して、それの値でプライベートブラウジングモードかどうかを判別してるぽい。

まぁIERTUTIL.DLLの関数ってエクスポート名前を公開してないのでMAKEINTRESOURCEか何かで無理やり関数エントリを取ってきて、これをフックしてしまえば他のブラウザでもプライベートモードが使えるんじゃないかと。

ただ、IMEベンダが同じことしたくてもできないってのが本当にダメなAPI設計だなと思う。

追記 (8/6)

なお実際にテスト実装してみたところ、LCIEIsCurrentProcessInPrivateのフックだけでプライベートモードとかの切り替えできた。

2016-07-19

ARMのIPビジネス

自分で理解している範囲でARM IPビジネスについて書いておく

ARM命令セット

ARM自体は数年周期で自身の命令セットにいろいろ追加してきてる。ARMv7-aと言っても、Cortex-A8世代からCortex-A15世代でいくつか拡張を持ってて、例えば割り算命令なんてのはCortex-A15世代で実装されたもの。

これもライセンスされていて、ARMが作った命令セットを実装した互換CPUというものを作ることが可能。AppleのAシリーズやQualcommのハイエンドチップらへん (最近ではSnapdragon 820) は自身で設計している。最近はNVIDIA (Nexus 9で採用されたもの) やSamsungやAMD (K12?) も自身で設計してる。


ARMコア

互換CPUということではなくて、ARMが設計したCPUデザインをライセンスしてもらう方法もある。ARM採用のSoCを作ってる場合の大体の会社はこれ。QualcommはSnapdragon 820のように自身で設計している場合もあるけど、ミッドレンジ・ローエンドのSoCの場合は、ARMデザインのコアを利用してSoc提供してる。今時のスマフォで使うようなミッドレンジだとCortex-A12とかCortex-A53とか使ってるし、組み込みとかのローエンドだとA5とかA7とかA9とかかな?

そのため各SoCでのCPUのパフォーマンスの違いはクロック数やリビジョンくらいしかないけど、CPUのデザインを作ることないので、参入しやすいが、物理層の実装はやらないといけない。

なお、命令セットによってはオプションだったりするので、Cortex-A53採用したといっても暗号化エクステンションが入ってない実装とかも作ることができる。事実Cortex-A9の時代にNVIDIAがNEON (SIMD命令セット) が実装されていないSoCを提供した話は黒歴史としてみんな覚えている話。


物理設計

ARMのセミナーに行くとわかるとは思うが、最近のARMはシリコン設計まで起こしたデザインも持っている。このハードマクロ実装だと2GHz目標で持っていけるとか。物理層の実装までライセンスがあるのが面白いところ。


なお、ルネサスやNXP (元フリースケール) のように自社で独自IPを持っている会社もARMのライセンスの元でARMのCPUを採用したSoCを提供してて、最近はこっちが主流だったりする。市場競争力的にはインテルがモデム内蔵のatomなSoCを止めたところなので、ちょうどARMの独占って感じになりそうなので、ソフトバンクが買収するタイミングとしては抜群なのだけど、買ってどうするんだろってところだね。

2016-06-10

自分用async / await functionsメモ

Firefox / SpiderMonkey

Bug 1185106 - Implement async functions (ES7 proposal)

もともとインターンがオーナーだったけど、araiさんが直してる

Safari / JavaScript Core

Bug 156147 - [JSC] implement async functions proposal

IgaliaCaitlinが書いた。でConstさんがReviwer

Chrome / V8

Issue 4483 - V8 - Feature Request: Support async/await functions

InitialコードはIgaliaのCaitlinが書いた。でも今はGoogle自身で直してる。