ラベル Windows の投稿を表示しています。 すべての投稿を表示
ラベル Windows の投稿を表示しています。 すべての投稿を表示

2018年5月27日

WindowsのIMEにおけるセキュリティ


TSF (Text Services Framework) で実装された IME は COM (Component Object Model) の DLL として実装されるので、その IME を有効にするとアプリケーションのプロセスにロードされて動作します。つまり、アプリケーションと同じプロセス空間に存在していることになります。

このため、サンドボックスによるセキュリティ上の制約は、アプリケーションに対してだけでなく IME に対しても同様に適用されます。

IME がファイル、レジストリ、プロセス間通信などを用いて設定内容や辞書を読み書きする際には、こうしたサンドボックスの外側に存在するオブジェクトに対して、許可が得られるような適切なセキュリティの設定がなされる必要があります。

一口にサンドボックスといっても様々な種類がありますが、基本的には Windows が持つセキュリティ機構を使用したものとなっています。@ITの記事が非常に参考になりますのでリンクを貼っておきます。

アクセス制御リストACL - @IT
http://www.atmarkit.co.jp/ait/articles/1407/17/news130.html

Windowsのアクセス制御リストACLとは? - @IT
http://www.atmarkit.co.jp/ait/articles/0601/21/news011.html

オブジェクトを識別するSIDとは? - @IT
http://www.atmarkit.co.jp/ait/articles/0306/28/news004.html

(追記)
Windowsのセキュリティ設定を記述するSDDL文字列とは? - @IT
http://www.atmarkit.co.jp/ait/articles/0603/25/news016.html

Windows における主要なサンドボックス毎に、制限されたプロセス内の IME がアクセスできるようにする方法について述べます。


Mandatory Integrity Control


Windows Vista で導入されたアクセス制御です。必須整合性コントロールと訳されます。

Mandatory Integrity Control
https://msdn.microsoft.com/en-us/library/windows/desktop/bb648648(v=vs.85).aspx

いくつかのレベルが用意され、下位のレベルから上位のレベルへのアクセスを制限する機能を持ちます。また、制限の内容としては、書き込み拒否 / 読み込み拒否 / 実行拒否があります。

以下のようなソフトウェアで利用されています。
  • Internet Exploere 7 以降 (詳細設定で保護モードを有効にしたとき)
  • Adobe Reader X 以降
  • Firefox 4.0 以降で動作する Flash Player 11.3 以降

これらのソフトウェアでは、整合性レベル「低」のプロセスとして動作しており、書き込み拒否の制限となっています。つまり、整合性レベル「低」より高いレベルのオブジェクトには書き込みできない、ということになります。読み込みのみであれば、整合性レベルの設定は不要です。SDDL としては次のような記述で SACL として表現されます。

S:(ML;;NW;;;LW)
また、sddl.h では次のように定義されています。

//
// SDDL Ace types
//
#define SDDL_MANDATORY_LABEL                TEXT("ML")  // Integrity label

//
// SDDL Rights
//
#define SDDL_NO_WRITE_UP                    TEXT("NW")
#define SDDL_NO_READ_UP                     TEXT("NR")
#define SDDL_NO_EXECUTE_UP                  TEXT("NX")

//
// Integrity Labels
//
#define SDDL_ML_LOW                         TEXT("LW")      // Low mandatory level
#define SDDL_ML_MEDIUM                      TEXT("ME")      // Medium mandatory level
#define SDDL_ML_MEDIUM_PLUS                 TEXT("MP")      // Medium Plus mandatory level
#define SDDL_ML_HIGH                        TEXT("HI")      // High mandatory level
#define SDDL_ML_SYSTEM                      TEXT("SI")      // System mandatory level


AppContainer


Windows 8 で導入されたアクセス制御です。

AppContainer Isolation
https://msdn.microsoft.com/en-us/library/windows/desktop/mt595898(v=vs.85).aspx

以下のようなソフトウェアで使用されています。
  • Windows ストアアプリ
  • ユニバーサル Windows プラットフォームアプリ (UWP アプリ)
  • Internet Explorer 10 以降 (詳細設定で「拡張保護モードを有効にする」をチェックしたとき)
  • Adobe Acrobat Reader DC 15.023.20053 以降 (環境設定で「AppContainer (ベータ版) で実行」をチェックしたとき)

sddl.h で次のように定義されている SID を SDDL に記述することになります。

//
// SDDL User aliases
//
#define SDDL_ALL_APP_PACKAGES               TEXT("AC")      // All applications running in an app package 


Restricted Token


アクセストークンを制限します。以下のようなソフトウェアで使用されています。
  • Adobe Reader X 以降
  • Firefox 4.0 以降で動作する Flash Player 11.3 以降

これらのソフトウェアでは、Restricted Token による権限チェックと、前述の整合性レベル、およびジョブオブジェクトから成るサンドボックスとなっています。Acrobat Reader DC では、ベータ版の機能としてですが AppContainer も使用可能となり、何でもありか?という状況になっています。

詳しく知りたい方は、Microsoft および Adobe のサイトを参照してください。

Restricted Token - Windows Dev Center
https://msdn.microsoft.com/en-us/library/windows/desktop/aa379316(v=vs.85).aspx

Job Objects - Windows Dev Center
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684161(v=vs.85).aspx

Inside Adobe Reader Protected Mode – Part 1 – Design
http://blogs.adobe.com/security/2010/10/inside-adobe-reader-protected-mode-part-1-design.html

Inside Adobe Reader Protected Mode – Part 2 – The Sandbox Process
http://blogs.adobe.com/security/2010/10/inside-adobe-reader-protected-mode-part-2-the-sandbox-process.html

Inside Adobe Reader Protected Mode – Part 3 – Broker Process, Policies, and Inter-Process Communication
http://blogs.adobe.com/security/2010/11/inside-adobe-reader-protected-mode-part-3-broker-process-policies-and-inter-process-communication.html

Inside Adobe Reader Protected Mode – Part 4 – The Challenge of Sandboxing
http://blogs.adobe.com/security/2010/11/inside-adobe-reader-protected-mode-part-4-the-challenge-of-sandboxing.html

Flash Player Sandboxing is Coming to Firefox
http://blogs.adobe.com/security/2012/02/flash-player-sandboxing-is-coming-to-firefox.html

15.023.20053 Planned update, January 10, 2017 - Release Notes for Acrobat DC Products
https://www.adobe.com/devnet-docs/acrobatetk/tools/ReleaseNotesDC/continuous/dccontinuousjanuary2017.html

sddl.h で次のように定義されている SID と、Restricted Token によって無効化させたくない SID を SDDL に記述することになります。

#define SDDL_RESTRICTED_CODE                TEXT("RC")      // Restricted code

ジョブオブジェクトについては、現状では前述のソフトウェアにおいてはファイルの読み書きの制約を受けていないので特にすることはありません。


まとめ

では、サンドボックス外の名前付きパイプにアクセス許可を付加する方法について見てみましょう。ビルドする際は、advapi32.lib をリンクしてください。

#include <windows.h>
#include <sddl.h>
#include <aclapi.h>

int main() {
  PSECURITY_DESCRIPTOR pSecurityDescriptor;

  ConvertStringSecurityDescriptorToSecurityDescriptorW(
    L"D:(A;;GA;;;AC)(A;;GA;;;RC)(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;BU)S:(ML;;NW;;;LW)",
    SDDL_REVISION_1, &pSecurityDescriptor, NULL);

  SECURITY_ATTRIBUTES sa = {sizeof(sa), pSecurityDescriptor, FALSE};

  HANDLE hPipe = CreateNamedPipeW(
    L"\\\\.\\pipe\\SamplePipe",
    PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
    1, 256, 256, 0, &sa);

  LocalFree(pSecurityDescriptor);

  // ... Use named pipe.

  CloseHandle(hPipe);

  return 0;
}

次に、ファイルにアクセス許可を付与する方法を見てみましょう。

#include <windows.h>
#include <sddl.h>
#include <aclapi.h>

int main() {
  PSECURITY_DESCRIPTOR pSecurityDescriptor;

  ConvertStringSecurityDescriptorToSecurityDescriptorW(
    L"D:(A;;FA;;;AC)(A;;FA;;;RC)(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;BU)S:(ML;;NW;;;LW)",
    SDDL_REVISION_1, &pSecurityDescriptor, NULL);

  BOOL bDaclPresent = FALSE;
  PACL pDacl = NULL;
  BOOL bDaclDefaulted = FALSE;

  GetSecurityDescriptorDacl(
    pSecurityDescriptor, &bDaclPresent, &pDacl, &bDaclDefaulted);

  SetNamedSecurityInfoW(
    L"SampleFile.txt",
    SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
    NULL, NULL, pDacl, NULL);

  BOOL bSaclPresent = FALSE;
  PACL pSacl = NULL;
  BOOL bSaclDefaulted = FALSE;

  GetSecurityDescriptorSacl(
      pSecurityDescriptor,
      &bSaclPresent, &pSacl, &bSaclDefaulted);

  SetNamedSecurityInfoW(
    L"SampleFile.txt",
    SE_FILE_OBJECT, LABEL_SECURITY_INFORMATION,
    NULL, NULL, NULL, pSacl);

  LocalFree(pSecurityDescriptor);

  return 0;
}

こうして出力されたファイルのプロパティは次の画像にようになります。Low Mandatory Level で、エントリに "ALL APPLICATION PACKAGES" と "RESTRICTED" があることが分かります。ちなみにこの画像のうち継承されたエントリは無効にしてしまってもOKです。




上記のサンプルコードではフルアクセス可能な設定になっていますが、実際は設計に応じて適切な ACL としてください。

2016年10月15日

Universal CRT in Wix Bootstrapper (3)

Universal CRT を含めた WiX の Bootstrapperwxs ファイルのサンプルです。

今回は、DownloadUrl 属性を使ってみました。インストール時に自動的にダウンロードされます。

Universal CRT は VC++再配布パッケージに含まれているので、そのサンプルも貼っておきます。

注意点ですが、MsuPackage / ExePackage タグの Name 属性と同じ名前のファイルが ブートストラップの exe と同じディレクトリに存在していると、DownloadUrl 属性の URL からダウンロードされずにローカルのファイルが使われてしまいます。

こんな感じでビルドしてください。

> "%WIX%bin\candle.exe" xxx.wxs -nologo -out "xxx.wixobj" -ext WixBalExtension -ext WixUtilExtension
> "%WIX%bin\light.exe" "xxx.wixobj" -nologo -out "xxx.exe" -ext WixBalExtension -ext WixUtilExtension

【参考】

ExePackage Element
http://wixtoolset.org/documentation/manual/v3/xsd/wix/exepackage.html

MsuPackage Element
http://wixtoolset.org/documentation/manual/v3/xsd/wix/msupackage.html

RemotePayload Element
http://wixtoolset.org/documentation/manual/v3/xsd/wix/remotepayload.html

Download Microsoft Visual C++ 2015 Redistributable Update 3 from Official Microsoft Download Center
https://www.microsoft.com/en-us/download/details.aspx?id=53840

Update for Universal C Runtime in Windows
https://support.microsoft.com/en-us/kb/2999226






2016年7月9日

オンラインストレージとCorvusSKK


CorvusSKKの設定ファイルや個人辞書は、"%AppData%\CorvusSKK" ディレクトリに保存されます。

次の記事を参考に、自動的にオンラインストレージへバックアップするためのコマンドプロンプトでの設定方法をまとめてみました。

Windows の CorvusSKK で Azik + Google 日本語入力の変換を利用。設定ファイルはクラウドへ保存。

Tech TIPS:Windowsのシンボリックリンクとジャンクションとハードリンクの違い


私はOneDriveで確認しましたが、Google Drive、Dropboxなどでも同様の設定で使えると思います。

ここでは、オンラインストレージソフトが管理するディレクトリを仮に "C:\OnlineStorage\CorvusSKK" としています。適宜環境に合わせて変更してください。

  1. 辞書管理プロセスを終了します。
  2. > taskkill /im imcrvmgr.exe
  3. %AppData%\CorvusSKK ディレクトリをオンラインストレージソフトが管理するディレクトリにコピーします。
  4. > xcopy /ei "%AppData%\CorvusSKK" "C:\OnlineStorage\CorvusSKK"
  5. %AppData%\CorvusSKK ディレクトリを削除します。
  6. > rd /s /q "%AppData%\CorvusSKK"
  7. オンラインストレージソフトが管理するディレクトリへのシンボリックリンク %AppData%\CorvusSKK を作成します。(要管理者権限)
  8. > mklink /d "%AppData%\CorvusSKK" "C:\OnlineStorage\CorvusSKK"
    追記 : ジャンクションでも良いようです。こちらであれば管理者権限は不要です。
    > mklink /j "%AppData%\CorvusSKK" "C:\OnlineStorage\CorvusSKK"
  9. 辞書管理プロセスを再開します。
  10. > "%SystemRoot%\System32\IME\IMCRVSKK\imcrvmgr.exe"

ちなみに、複数のPCやユーザーで、ローカルおよびリモートの同じディレクトリを使ってしまうとお互いに上書きしあってしまいますので注意してください。

オンラインストレージサービスの規約や使い方をよく確認してご利用ください。

2016年4月20日

Disable Light Bulb

Visual Studio 2015 Update 2 の C++ のプロジェクトですが、緑の下線と共に電球が表示されて、関数定義が無いとのメッセージが表示されることがあります。




これ、Visual Studio 2015 の新機能だそうで、light bulb (電球?)と呼ぶそうです。

Perform quick actions with light bulbs
https://msdn.microsoft.com/en-us/library/dn872466.aspx

しかし、まだあまり賢くないようなので無効にしました。

Option → Text Editor → C/C++ → Advanced → Refactoring → Disable Create Declaration/Definition Light Bulbs を、False から True に変更します。




 警告が消えました。


2016年4月11日

Universal CRT in Wix Bootstrapper (2)

前回、Universal CRTを含めたWiXのBootstrapperwxsファイルを作ってみましたが、インストール条件が長ったらしくなってしまいました。
そこで、ucrtbase.dllファイルのチェックをSystem32ディレクトリに限定し、MsuPackage要素にDetectCondition属性を使ってみました。
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
  xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
  xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <Bundle Name="Example Product" Version="1.2.3.4" Manufacturer="John Doe"
    Copyright="© 2016 John Doe" AboutUrl="https://example.com/"
    UpgradeCode="01234567-89AB-CDEF-0123-456789ABCDEF" Condition="VersionNT &gt;= v5.1">

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <bal:WixStandardBootstrapperApplication
        LicenseFile="license.rtf" ShowVersion="yes" SuppressOptionsUI="yes" />
    </BootstrapperApplicationRef>

    <!-- v6.0 Service Pack 2 -->
    <bal:Condition Message="This application requires Service Pack 2 for Windows Vista / Server 2008.">
      (VersionNT &lt;&gt; v6.0) OR (VersionNT = v6.0 AND ServicePackLevel &gt;= 2)
    </bal:Condition>

    <!-- v6.1 Service Pack 1 -->
    <bal:Condition Message="This application requires Service Pack 1 for Windows 7 / Server 2008 R2.">
      (VersionNT &lt;&gt; v6.1) OR (VersionNT = v6.1 AND ServicePackLevel &gt;= 1)
    </bal:Condition>

    <!-- v6.3 KB2919355 -->
    <util:FileSearch Id="HAL.DLL" Path="[WindowsFolder]System32\hal.dll"
      Result="version" Variable="NT603HALVER" Condition="VersionNT = v6.3" />
    <bal:Condition Message="This application requires S14 Update (KB2919355) for Windows 8.1 / Server 2012 R2.">
      (VersionNT &lt;&gt; v6.3) OR (VersionNT = v6.3 AND NT603HALVER &gt; v6.3.9600.16500)
    </bal:Condition>

    <!-- ucrtbase.dll version -->
    <util:FileSearch Id="UCRTBASE.DLL" Path="[WindowsFolder]System32\ucrtbase.dll"
      Result="version" Variable="UCRTBASEVER" />
    <!-- universal crt version -->
    <Variable Name="UCRTVER" Type="version" Value="10.0.10586.0" />

    <Chain>

      <!-- Windows Vista / Windows Server 2008 (x86) -->
      <MsuPackage Name="Windows6.0-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows6.0-KB3118401-x86.msu" InstallCondition="VersionNT = v6.0 AND NOT VersionNT64"
        DetectCondition="VersionNT = v6.0 AND NOT VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows Vista / Windows Server 2008 (x64) -->
      <MsuPackage Name="Windows6.0-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows6.0-KB3118401-x64.msu" InstallCondition="VersionNT = v6.0 AND VersionNT64"
        DetectCondition="VersionNT = v6.0 AND VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows 7 (x86) -->
      <MsuPackage Name="Windows6.1-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows6.1-KB3118401-x86.msu" InstallCondition="VersionNT = v6.1 AND NOT VersionNT64"
        DetectCondition="VersionNT = v6.1 AND NOT VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows 7 / Windows Server 2008 R2 (x64) -->
      <MsuPackage Name="Windows6.1-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows6.1-KB3118401-x64.msu" InstallCondition="VersionNT = v6.1 AND VersionNT64"
        DetectCondition="VersionNT = v6.1 AND VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows 8 (x86) -->
      <MsuPackage Name="Windows8-RT-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows8-RT-KB3118401-x86.msu" InstallCondition="VersionNT = v6.2 AND NOT VersionNT64"
        DetectCondition="VersionNT = v6.2 AND NOT VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows 8 / Windows Server 2012 (x64) -->
      <MsuPackage Name="Windows8-RT-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows8-RT-KB3118401-x64.msu" InstallCondition="VersionNT = v6.2 AND VersionNT64"
        DetectCondition="VersionNT = v6.2 AND VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows 8.1 (x86) -->
      <MsuPackage Name="Windows8.1-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows8.1-KB3118401-x86.msu" InstallCondition="VersionNT = v6.3 AND NOT VersionNT64"
        DetectCondition="VersionNT = v6.3 AND NOT VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- Windows 8.1 / Windows Server 2012 R2 (x64) -->
      <MsuPackage Name="Windows8.1-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Cache="no" Compressed="yes" Permanent="yes"
        SourceFile="Windows8.1-KB3118401-x64.msu" InstallCondition="VersionNT = v6.3 AND VersionNT64"
        DetectCondition="VersionNT = v6.3 AND VersionNT64 AND UCRTBASEVER &gt;= UCRTVER" />

      <!-- x64 modules -->
      <MsiPackage Id="X64" DisplayName="x64 modules" ForcePerMachine="yes" Compressed="yes"
        SourceFile="x64.msi" InstallCondition="VersionNT64" />

      <!-- x86 modules -->
      <MsiPackage Id="X86" DisplayName="x86 modules" ForcePerMachine="yes" Compressed="yes"
        SourceFile="x86.msi" After="X64" />

    </Chain>

  </Bundle>

</Wix>

ちょっとすっきり。

2016年3月23日

Universal CRT in WiX Bootstrapper


Visual Studio 2013 の Visual C++ の各種ライブラリを配布するには以下の方法があります。
  1. スタティックリンクでビルドする
  2. マージモジュールを使用する (Microsoft_VC120_CRT_x86.msm, Microsoft_VC120_CRT_x64.msm など)
  3. Visual C++ 再頒布可能パッケージをインストールする (vcredist_x86.exe, vcredist_x64.exe)
  4. インストーラーにDLLを同梱する (msvr120.dll, msvcp120.dll など)
Visual Studio 2015 の Visual C++ では Universal CRT が導入された影響で配布方法に若干の変更が入っています。

Introducing the Universal CRT | Visual C++ Team Blog
https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/

既に解説されている方々がおられるのでいくつかリンクしておきます。

VC++2015製のアプリを配る際のランタイムDLLの扱い | イグトランスの頭の中
http://dev.activebasic.com/egtra/2015/08/30/831/

Visual C++ 14 (VS2015RC)のランタイムをインストールする | espresso3389の日記
http://espresso3389.hatenablog.com/entry/2015/05/08/033946



上記1番のスタティックリンクと3番の再配布可能パッケージについては、まあ従来通りですね。

上記4番のDLL同梱では、"%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\redist" ディレクトリ内のファイル (vcruntime140.dll, msvcp140.dll など) に加えて、"%ProgramFiles(x86)%\Windows Kits\10\Redist" ディレクトリ内のファイル (ucrtbase.dll, api-ms-win-core-******.dll, api-ms-win-crt-******.dll) を同梱します。

上記2番のマージモジュールでは、従来のマージモジュールに加えて以下の Universal CRT の msu ファイルをインストーラーに含めてインストールするために、WiX であれば Bootstrapper にしてしまうのが良さそうです。再頒布可能パッケージと同じような方法ですね。

Windows 10 Universal C Runtime (KB2999226) (10.0.10240)
https://www.microsoft.com/ja-JP/download/details.aspx?id=48234
https://support.microsoft.com/en-us/kb/2999226

Windows 10 Universal C Runtime (KB3118401) (10.0.10586)
https://www.microsoft.com/ja-JP/download/details.aspx?id=50410
https://support.microsoft.com/en-us/kb/3118401

msu ファイルには現在2つのバージョンがあるのですが、Windows Update で降ってくるのはKB3118401、Visual Studio 2015 Update 1 の Visual C++ 再頒布可能パッケージに含まれているのはKB2999226になっています。どちらでも使えそうなのですが、とりあえず新しいKB3118401のほうを 使ってみます。

Visual Studio 2015 Update 1 の Visual C++ 再頒布可能パッケージ
https://www.microsoft.com/ja-jp/download/details.aspx?id=49984

XP 用の msu ファイルが見当たらないですが、XP 用の Universal CRT はマージモジュール (Microsoft_VC140_CRT_x86.msm, Microsoft_VC140_CRT_x64.msm) に含まれているようです。

で、msu ファイルを含めた Bootstrapper をさっくりと作ってみました。msu ファイルのシステム要件のチェックも入れつつ、インストール済みかどうかも一応チェックしています。msi ファイルについてはマージモジュールを含んだものとします。所々枠からはみ出してしまっていますがご容赦を。

追記 : 下記のwxsを書き直しました。
Universal CRT in Wix Bootstrapper (2)


TestUCRT.wxs

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
  xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
  xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <Bundle Name="program name" Version="1.0.0.0" Manufacturer="author name"
    UpgradeCode="12345678-9012-3456-7890-123456789012"
    Condition="VersionNT &gt;= v5.1" >

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <bal:WixStandardBootstrapperApplication
        LicenseFile="license.rtf" SuppressOptionsUI="yes" />
    </BootstrapperApplicationRef>

    <!-- v6.0 Service Pack 2 -->
    <bal:Condition Message="This application requires Service Pack 2 for Windows Vista / Server 2008.">
      (VersionNT &lt;&gt; v6.0) OR ((VersionNT = v6.0) AND (ServicePackLevel &gt;= 2))
    </bal:Condition>

    <!-- v6.1 Service Pack 1 -->
    <bal:Condition Message="This application requires Service Pack 1 for Windows 7 / Server 2008 R2.">
      (VersionNT &lt;&gt; v6.1) OR ((VersionNT = v6.1) AND (ServicePackLevel &gt;= 1))
    </bal:Condition>

    <!-- v6.3 KB2919355 -->
    <util:FileSearch Id="HAL.DLL" Path="[WindowsFolder]System32\hal.dll"
      Result="version" Variable="NT603HALVER" Condition="VersionNT = v6.3" />
    <bal:Condition Message="This application requires S14 Update (KB2919355) for Windows 8.1 / Server 2012 R2.">
      (VersionNT &lt;&gt; v6.3) OR ((VersionNT = v6.3) AND (NT603HALVER &gt; v6.3.9600.16500))
    </bal:Condition>

    <!-- installed ucrtbase.dll version -->
    <util:FileSearch Id="UCRTBASE.DLL_SYS" Path="[WindowsFolder]System32\ucrtbase.dll"
      Result="version" Variable="UCRTVERSYS" />
    <util:FileSearch Id="UCRTBASE.DLL_X86" Path="[WindowsFolder]SysWOW64\ucrtbase.dll"
      Result="version" Variable="UCRTVERX86" Condition="VersionNT64" />
    <!-- KB3118401 ucrtbase.dll version -->
    <Variable Name="UCRTVER" Type="version" Value="10.0.10586.9" />

    <Chain>

      <!-- Windows Vista / Windows Server 2008 (x86) -->
      <MsuPackage Name="Windows6.0-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows6.0-KB3118401-x86.msu"
        InstallCondition="(VersionNT = v6.0) AND (NOT VersionNT64) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER))" />

      <!-- Windows Vista / Windows Server 2008 (x64) -->
      <MsuPackage Name="Windows6.0-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows6.0-KB3118401-x64.msu"
        InstallCondition="(VersionNT64 = v6.0) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER) OR (NOT UCRTVERX86) OR (UCRTVERX86 &lt; UCRTVER))" />

      <!-- Windows 7 (x86) -->
      <MsuPackage Name="Windows6.1-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows6.1-KB3118401-x86.msu"
        InstallCondition="(VersionNT = v6.1) AND (NOT VersionNT64) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER))" />

      <!-- Windows 7 / Windows Server 2008 R2 (x64) -->
      <MsuPackage Name="Windows6.1-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows6.1-KB3118401-x64.msu"
        InstallCondition="(VersionNT64 = v6.1) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER) OR (NOT UCRTVERX86) OR (UCRTVERX86 &lt; UCRTVER))" />

      <!-- Windows 8 (x86) -->
      <MsuPackage Name="Windows8-RT-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows8-RT-KB3118401-x86.msu"
        InstallCondition="(VersionNT = v6.2) AND (NOT VersionNT64) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER))" />

      <!-- Windows 8 / Windows Server 2012 (x64) -->
      <MsuPackage Name="Windows8-RT-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows8-RT-KB3118401-x64.msu"
        InstallCondition="(VersionNT64 = v6.2) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER) OR (NOT UCRTVERX86) OR (UCRTVERX86 &lt; UCRTVER))" />

      <!-- Windows 8.1 (x86) -->
      <MsuPackage Name="Windows8.1-KB3118401-x86.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows8.1-KB3118401-x86.msu"
        InstallCondition="(VersionNT = v6.3) AND (NOT VersionNT64) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER))" />

      <!-- Windows 8.1 / Windows Server 2012 R2 (x64) -->
      <MsuPackage Name="Windows8.1-KB3118401-x64.msu"
        DisplayName="Universal CRT" KB="KB3118401" Permanent="yes" Cache="no"
        SourceFile="Windows8.1-KB3118401-x64.msu"
        InstallCondition="(VersionNT64 = v6.3) AND ((NOT UCRTVERSYS) OR (UCRTVERSYS &lt; UCRTVER) OR (NOT UCRTVERX86) OR (UCRTVERX86 &lt; UCRTVER))" />

      <!-- x64 modules -->
      <MsiPackage Id="X64" DisplayName="x64 modules" ForcePerMachine="yes"
        Compressed="yes" SourceFile="x64.msi" InstallCondition="VersionNT64" />

      <!-- x86 modules -->
      <MsiPackage Id="X86" DisplayName="x86 modules" ForcePerMachine="yes"
        Compressed="yes" SourceFile="x86.msi" />

    </Chain>
  </Bundle>
</Wix>

で、ビルトはこんな感じで。
> candle.exe TestUCRT.wxs -out TestUCRT.wixobj -ext WixBalExtension -ext WixUtilExtension
> light.exe TestUCRT.wixobj -out TestUCRT.exe -ext WixBalExtension -ext WixUtilExtension

msu ファイルの替わりにExePackageタグを使って再配布可能パッケージを入れてもいいのですが、再配布パッケージに含まれる msu ファイルが VC_redist.x86.exe と VC_redist.x64.exe とで重複してしまうので、x86とx64両方のバイナリをインストールする必要がある場合はファイルサイズがその分大きくなってしまうのが難点ですね。
再配布パッケージの内容物は次のコマンドで展開することで確認できます。
> dark.exe VC_redist.x86.exe -x x86
> dark.exe VC_redist.x64.exe -x x64

2015年1月11日

SKKの個人辞書

あけましておめでとうございます。

SKK風の入力方式には様々な実装があり、それぞれの実装毎で個人辞書が管理されています。
色んな環境を使用する人にとって、どの実装でも共通の個人辞書を使えないか、という考えが浮ぶのは自然なことかと思います。

そこで、SKK辞書サーバーを拡張して辞書検索のみならず辞書登録も可能なサーバーがあればいいのでは、という発想もまた自然なことだと思います。そのような機能を持ったサーバーで現在公開されているものは存在しないようですが、GoogleDriveやDropboxのAPIを使ったりできたら非常に面白いかな、と個人的には思ったりしています。

さて、SKKの個人辞書はEUC-JPやUTF-8などのプレーンテキストなので、ユーザーにとって適当なタイミングで取り込んだりしたほうが柔軟性があって良いのもまたしかりです。

以前 .skk-jisyo を自動的に取り込めないかという要望が寄せられたことがありました。 そこで回答したcveuc.exemeskkdicw.exeを使って.skk-jisyoをCorvusSKKの個人辞書に取り込むバッチファイルを一部改変したものを以下に記述します。

----- ここから -----

pushd %~dp0

@rem サーバープロセスを終了
taskkill /im imcrvmgr.exe


@rem .skk-jisyoをUTF-16(LE)に変換 (.skk-jisyoがEUC-JIS-2004かEUC-JPの場合)
cveuc.exe -e -W "%USERPROFILE%\.skk-jisyo" skk-jisyo-utf16.txt

@rem .skk-jisyoをUTF-16(LE)に変換 (.skk-jisyoがUTF-8の場合)
@rem cveuc.exe -u -W "%USERPROFILE%\.skk-jisyo" skk-jisyo-utf16.txt


@rem ユーザー辞書とマージ (.skk-jisyoを優先する場合)
meskkdicw.exe skk-jisyo-utf16.txt + "%AppData%\CorvusSKK\userdict.txt" skk-jisyo-utf16-new.txt
meskkdicw.exe -O skk-jisyo-utf16.txt + "%AppData%\CorvusSKK\userdict.txt" skk-jisyo-utf16-new.txt

@rem ユーザー辞書とマージ (CorvusSKKのuserdict.txtを優先する場合)
@rem meskkdicw.exe "%AppData%\CorvusSKK\userdict.txt" + skk-jisyo-utf16.txt skk-jisyo-utf16-new.txt
@rem meskkdicw.exe -O "%AppData%\CorvusSKK\userdict.txt" + skk-jisyo-utf16.txt skk-jisyo-utf16-new.txt


@rem マージしたユーザー辞書をコピー
copy /y skk-jisyo-utf16-new.txt "%AppData%\CorvusSKK\userdict.txt"

@rem 一時ファイルを削除
del skk-jisyo-utf16.txt
del skk-jisyo-utf16-new.txt

@rem サーバープロセスを起動
start "" "%SystemRoot%\System32\IME\IMCRVSKK\imcrvmgr.exe"

popd

----- ここまで -----


昨年はSKK-JISYO.lispをコミットさせてもらったりしたので、今年はddskk本体でも何か貢献できればと思っています。ddskk本体の開発環境がSKK OpenLabのCVSからGitHubに移行し、EmacsのパッケージシステムであるMELPAに登録されたりと、オラなんだかわくわくしてきたぞ状態の今日この頃です。

2014年10月19日

IME開発者向けリンク集

CorvusSKKというDDSKKの入力方式を用いたWindowsで動くIMEを開発しております。
DOS、Windowsの世界では過去に様々なFEP、IMEが存在していましたが、現在のWindowsにおいては選択肢がちょっと少ないのでは?ということで、これからIMEを作ってみたい方向けに有益かと思われるリンクをまとめてみました。



Text Services Framework (TSF) 実装例

  • ソースコードが公開されているもの
    • CorvusSKK
      • 手前味噌ですみません。
    • tsf-tutcode
      • CorvusSKKをフォークして頂きました。漢字直接入力機能が追加されています。
    • tsf-vim
      • vi風な操作をIMEとして実装されたもの
    • Mozc
      • Google日本語入力のオープンソース版。辞書はそれに劣るようですが、Mac、Linux、Android、ChromeOSでも動くそうです。
  • ソースコードが公開されていないもの
    • SKK日本語入力FEP (SKKFEP)
      • SKKの操作性をベースに革新的な機能が盛り沢山なIMEです。一度はまると抜け出せなくなります。
    • Google日本語入力
      • あのGoogleがIMEを作った!と衝撃が走ったのは記憶に新しいところ。Windows 7まではIMM32実装が、Windows 8以降でTSF実装が使用されます。
    • MS-IME
      • Windowsに標準で組み込まれています。リンクはMS-IME2010のものですが、OfficeのライセンスがあればXP、Vista、7で使用可能です。
    • ATOK
      • 賢い変換が可能だそうです。個人的には試用版を少し触れた程度なので
    • Baidu IME
      •  検索エンジンのサービスを開発運用しているとIMEも作っちゃおうぜみたいになるのでしょうか。
    • WinAnthy
      • Anthyの移植版
    • Social IME
      • インターネット経由でかな漢字変換を行うユーザー参加型のIME。以前ソースコードが公開されていたみたいなのですが現在では見付かりませんでした。

 

Text Services Framework (TSF) 全般


WindowsにおけるIMEは、notepad.exeやexplorer.exeなどのプロセスにIMEのDLLがロードされた状態で動きます。IMEのDLLはプロセス側と同等のアクセス制限が課されるため、ファイルアクセスやプロセス間通信を行うときにそれを考慮しなければなりません。

セキュリティ全般


Internat Explorer

Windows Vista 以降の Internet Explorer の保護モードについて

AppContainer

Windows 8 以降のAppContainerについて


Adobe Sandbox

Adobe Acrobat/Reader X以降、Firefox 4.0以降で動くAdobe Flash Player 11.3以降で有効となるサンドボックスについて



 ざっとこんなところでしょうか。