Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

カテゴリー: 未分類 | 1件のコメント

Windows Live Messangerのインストールエラー

Windows Live Messangerをインストールしようとしてエラーになりました。エラー番号などは出ませんでした。プロキシの設定を変更して直りました。Windows Liveのインストーラから本体をダウンロードするのですが、プロキシの設定が違うとダウンロードできないため、エラーになるようです。

インストーラが見ているプロキシはIEの設定ではなく、proxycfgというコマンドで設定します。これはWindows Updateも同じです。そのためproxycfgの設定を変更するときは一旦Windows Update Automatic Updates Service(wuauserv)を止める必要があります。proxycfgをIEの設定に合わせるにはコマンドプロンプトで以下のように入力します。

net stop wuauserv
proxycfg -u
net start wuauserv

プロキシの設定が変わったときにこれを行わないと、Windows Updateも正常動作しなくなります。

カテゴリー: コンピュータとインターネット | コメントをどうぞ

[ARM] Windows Mobileクロス開発

Windows Mobileアプリケーションをクロス開発するためクロスコンパイラを準備しました。Interix用の手順はpmgrで追加パッケージにしました。ただしCeGCCそのものではないため問題があります。(後述)

  • pmgr (arm-wince-pe-20081019.tar.gz)

実はパッケージ自体は3ヶ月くらい前にx64のクロスコンパイラと同時にできていたのですが、問題があったため公開していませんでした。

binutilsやgccにパッチを当てずにどこまで出来るか確認したかったため、CeGCCのパッチを当てずにオリジナルを使用しています。CeGCCからはヘッダとライブラリだけを持って来ていますが、CRTが使えません。(後述)

ソースをCeGCCのSVNから取得すれば良いというのは分かっていたのですが、Windows Mobile開発の必要に迫られていなかったため放置していました。しかしARMの実験にはこのままでも使えるようなので、とりあえず公開することにしました。

あくまでARMの実験用で、実用には不向きです。いずれCeGCCにきちんと対応したものを作り直す予定です。

使い方、制約など

以下のような問題があります。

  1. CeGCCのCRTが使えません。gccからリンクするとcrt0.oが見付からないというエラーになります。そのためエントリーポイントを自前で定義します。
  2. マクロが足りません。CeGCCのWin32APIのヘッダを使用するには-DARMオプションが必要です。CEのAPIはW系(Unicode)だけなので-DUNICODEオプションも必要です。
  3. シンボルの扱いがCeGCCとは異なります。そのままではDLLにリンクできないため-fno-leading-underscoreオプションが必要です。

これらの問題を回避して使う方法は以下の通りです。

次のソースをtest.cとして用意します。

#include <windows.h>

void winmain()
{
    MessageBox(0, L"HELLO", L"WORLD", MB_OK);
}

以下のようにするとtest.exeが出力されます。WILLCOM 03での動作を確認しました。

% arm-wince-pe-gcc -o test.exe -e winmain -DUNICODE -DARM -fno-leading-underscore test.c -nostdlib -lcoredll

正直、これでは既存のアプリケーションをコンパイルするのは厳しいです。やはりCeGCCでないと実用にはならないようです。

カテゴリー: ARM | コメントをどうぞ

[Interix] PHPのlibtool

InterixでPHPのパッケージを作成しました。以下に追加パッケージとして置いておきます。今回からパッケージのファイル名にバージョンと作成日を入れることにしました。

libtoolでハマったので参考までに書いておきます。

libtool

libxml2をインストールします。ライブラリのパスが標準外のため、xml2-config –libsでrpath(-Wl,-R)を返すように細工しておきます。

% xml2-config --libs
-L/opt/pmgr/lib -Wl,-R/opt/pmgr/lib -lxml2 -lpthread -lm

PHPをconfigureします。

./configure --prefix=/opt/pmgr

libxml2が見付からないとエラーになったので、libxml2の場所を指示します。

./configure --prefix=/opt/pmgr --with-libxml-dir=/opt/pmgr

configureは成功しますが、コンパイル中にL_ctermidが見付からないとエラーになります。Interixでは_ALL_SOURCEマクロを付けないとlibcが制限されてしまいます。そのためconfigureをやり直します。Interixではよくあることです。

CFLAGS=-D_ALL_SOURCE ./configure --prefix=/opt/pmgr --with-libxml-dir=/opt/pmgr

これでコンパイルは通りました。しかしphpが起動しません。

php: error in loading shared libraries
libxml2.so.2: cannot open shared object file: No such file or directory

先ほどxml2-configに付け足したrpathの指定が効いていないようです。libtoolが共有ライブラリを認識しないため、gccにrpathを渡していないようです。libtool周りの問題はconfig.subとconfig.guessを差し替えれば直ることが多いのですが、phpではうまくいきません。

configureを見ると、OS別に分岐する箇所があって、それがlibtoolに反映されていました。そのためInterixの処理を付け足しました。これでようやくphpが起動するようになりました。パッチは冒頭のパッケージに入れてありますので、具体的な修正内容はそちらを参照してください。

カテゴリー: Interix | コメントをどうぞ

[Interix] Windows x64のクロスコンパイラ

gccでWindows x64の開発ができるようになりました。PE32+関連はbinutils-2.18やgcc-4.3に取り込まれているため、パッチなどは特に必要ないようです。

32bitのInterixから使用するクロスコンパイラのパッケージを作ってみました。(注:64bit SUAのセルフコンパイラではありません)

これでPE32+やx64バイナリの調査・実験が便利になりそうです。

カテゴリー: Interix | コメントをどうぞ

PartitionRW

【注意】以下の情報の安全性は一切保証できません。ご利用は自己責任でお願いします。

以前作成したパーティション読み込みツール(関連日記)と、先日作成したハードディスク情報取得ツール(関連日記)を組み合わせて、パーティション読み書きツールを作成しました。荒削りのため素材としてソースのみを公開しています。

モーターの動作が不安定で不良セクタもあるハードディスクから、可能な限りデータを取り出すために作成しました。モーターが止まっても何日か放置すると動き出したりするので、場所を指定して部分的に読み取る必要がありました。どうにか必要なデータを取り出すことができました。

カテゴリー: プログラミング | コメントをどうぞ

Partition Viewer

Windows XP以降でパーティションのマウント先やARC名などを表示するツールをC#で作成しました。以下にソースを置いておきます。

マウント先をkernel32.dll内の以下の関数で取得しています。ドライブやパーティションの情報は NT Object Manager から取得しているため、FindFirstVolume()等のWin32APIは使用していません。

P/Invokeで呼び出している部分を抜粋します。

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool GetVolumePathNamesForVolumeName(
    string lpszVolumeName,
    char[] lpszVolumePathNames,
    int cchBuferLength,
    out int lpcchReturnLength);

public static string[] GetVolumePathNames(string volume)
{
    int len;
    GetVolumePathNamesForVolumeName(volume, null, 0, out len);

    var buf = new char[len];
    if (!GetVolumePathNamesForVolumeName(volume, buf, buf.Length, out len))
        return null;

    var list = new List<string>();
    foreach (string s in new string(buf).Split(''))
        if (!string.IsNullOrEmpty(s)) list.Add(s);
    return list.ToArray();
}

ボリューム名(例: "\?Volume{GUID}")を渡すとマウント先が返って来ます。

このAPIを使わずにWindows 2000にも対応させるにはやや複雑な手順が必要です。得られる情報が逆のため、集計して抽出することになります。

  1. 調べるドライブのボリューム名をGetVolumeNameForVolumeMountPoint()で取得する。
  2. ボリューム内のマウントポイントをFindFirstVolumeMountPoint()で取得する。このAPIで取得したパスにはドライブ名が含まれていないので付加する。
  3. マウントポイントにマウントされているボリュームの名前をGetVolumeNameForVolumeMountPoint()で取得する。
  4. 1~3の手順をすべてのドライブに対して行い、目的のボリュームのマウント先を抽出する。

今回はWindows 2000に対応していない.NET Framework 3.5を使用しているため、APIでの対応も見送りました。

カテゴリー: プログラミング | コメントをどうぞ

Object Viewer

Windowsカーネル内でデバイスなどはNT Object Managerによって管理されています。WinObjというアプリケーションで表示することができます。C#で似たようなものを作ってみました。以下にソースを置いておきます。

カーネルオブジェクトを取得には、ntdll.dll内の以下の関数を使用します。

オブジェクトはファイルとして開くことができます。ファイル名の対応は以下の通りです。ただし.NETのライブラリ(System.IO.FileStream等)では使えないため、Win32API(CreateFile等)を使用する必要があります。

  • GLOBAL??* → \.*
    [例] GLOBAL??C: → \.C:
  • その他: * → \?GLOBALROOT*
    [例] DeviceHarddiskVolume1 → \?GLOBALROOTDeviceHarddiskVolume1

オブジェクトやシンボリックリンクを取得する部分の抜粋です。

private KernelObject[] GetObjects()
{
    if (!IsDirectory) return null;

    var list = new List<KernelObject>();
    SafeFileHandle h;
    var attr = new OBJECT_ATTRIBUTES(FullName, 0);
    var st = NtOpenDirectoryObject(
        out h, ACCESS_MASK.DIRECTORY_QUERY, ref attr);
    if (st < 0) return null;

    var bufsz = 1024;
    var buf = Marshal.AllocHGlobal(bufsz);
    uint context = 0, len;
    for (; ; )
    {
        st = NtQueryDirectoryObject(h, buf, bufsz,
            true, context == 0, ref context, out len);
        if (st < 0) break;

        var odi = (OBJECT_DIRECTORY_INFORMATION)
            Marshal.PtrToStructure(buf, typeof(OBJECT_DIRECTORY_INFORMATION));
        list.Add(new KernelObject(this, odi));
    }
    Marshal.FreeHGlobal(buf);
    h.Dispose();

    var ret = list.ToArray();
    Array.Sort(ret, (a, b) => a.Name.CompareTo(b.Name));
    return ret;
}

private string GetLink()
{
    if (!IsSymbolicLink) return null;

    SafeFileHandle h;
    var attr = new OBJECT_ATTRIBUTES(FullName, 0);
    var st = NtOpenSymbolicLinkObject(
        out h, ACCESS_MASK.GENERIC_READ, ref attr);
    if (st < 0) return null;

    int len;
    var buf = new UNICODE_STRING(new string(' ', 512));
    st = NtQuerySymbolicLinkObject(h, ref buf, out len);

    h.Dispose();
    if (st < 0) return null;
    return buf.ToString();
}

P/Invokeの定義は長くなるため省略します。ソースを参照してください。

カテゴリー: プログラミング | コメントをどうぞ

Windows Live Writerのプラグイン

Windows Live WriterでLLPのソースを挿入するためのプラグインを作りました。自分以外の人には使い道がないと思いますが、プラグイン作成の参考になるかもしれないので、ソースコードを置いておきます。

生成されるHTMLはCSSを使わない決め打ちのため、汎用性は低いです。

見本

struct Test
{
  int x, y;

  function Show()
  {
    printfln("x = %d, y = %d", x, y);
  }
}

Test t = { 1, 2 };
t.Show();
カテゴリー: プログラミング | コメントをどうぞ

富士通ノートパソコン

富士通のノートパソコン(Vista)でマウスのホイールをクリックすると虫眼鏡が出て、アプリケーション本来の機能が使えなくて困りました。プレインストールされているSetPointというソフトをアンインストールすると出なくなりました。

検索すると同様の質問が出てきますが、回答者が富士通の環境を持っていないと分からない事情のため、原因究明が難航しているようです。そのためこの記事を書きました。

富士通のサポート情報は以下の通りです。

カテゴリー: コンピュータとインターネット | コメントをどうぞ