misc.log

日常茶飯事とお仕事と

Windowsアプリが32bitか64bitか判定する方法

Windowsで動く、実行形式のファイル、拡張子が「.exe」になっている、いわゆる「アプリ」ですが、アプリが作られた際の方式(アーキテクチャ)の違いにより、32bitアプリや64bitアプリといった種類が存在します。しかし、Windows Explorerで見ても、デスクトップなどのアイコンを見ても、それが32bitか64bitかは判断できません。

ここでは、アプリ自体の中身を調べて32bitか64bitかを判断する方法の一例を紹介します。なお、詳しいツールの使い方などについての説明は行いません。ある程度、プログラム開発やシステム開発などに携わってIT系の知識がある人を前提とさせていただきます。

バイナリーエディタでPEヘッダーを見る

実行形式ファイル(以下EXEファイルと略記)をバイナリーエディタで確認すると、ファイルの冒頭、アドレスにして「0x100~0x200」のあたりに、「50 45」で始まるブロックがあります。ASCII表示だと「P E」となるこの部分、ファイルの特徴等について記述されたPEヘッダー*1と呼ばれるエリアです。この「P E」のすぐうしろを見てください。この部分が下記のどちらかで、32bit、64bitの判定が可能です。

  • 4C 01 …… 32bitアプリケーション
  • 64 86 …… 64bitアプリケーション
64bitアプリケーション「Diablo IV」のPEヘッダー部分

(無理矢理)テキストエディターで見る

バイナリーエディターを使った方法を紹介しましたが、少々無理矢理ではあるものの、テキストエディターを使っても同様の事ができます。下図は、32bitアプリケーションである「Excel.exe」を、Windows標準のメモ帳で開いてみたところです。上の方に「PE」という文字があり、その後ろに「L」と書かれています。この部分の文字で、以下のように判別が可能です。

  • 「PE・・L」…… 32bitアプリケーション
  • 「PE・・d」…… 64bitアプリケーション
32bitアプリケーション「Excel」をメモ帳で開いたところ

冒頭に書いたDiablo IVの場合と同じように、バイナリーエディターで見た様子は下記の通り。右の「Decoded Text」のところが「PE・・L」になっているのが分かるかと思います。

32bitアプリケーション「Excel」をバイナリーエディターで開いたところ

判別に使っている情報の正体

この判別に使っている「PE」という文字に連なる「4C 01」や「64 86」といった情報の正体ですが、WindowsのEXEファイルに含まれる「PEヘッダー」と呼ばれる情報のうち「IMAGE_FILE_MACHINE」と呼ばれる、EXEファイルが動くコンピューターの種類を指定する情報です。これはマイクロソフトによってルールが定められており、今巷に出回っているIntelAMDといったメーカーのCPU以外にも、様々なCPUで動くコンピューターに対応できるよう、いろんな種類が定義されています。以下に一例を示します。

IMAGE_FILE定数の種類(抜粋)
  • IMAGE_FILE_MACHINE_I386インテル/AMD 32bit CPU用) …… 0x014C
  • IMAGE_FILE_MACHINE_AMND64(インテル/AMD 64bit CPU用)…… 0x8664
  • IMAGE_FILE_MACHINE_ARM(ARM製CPU用)…… 0x01C0
  • IMAGE_FILE_MACHINE_POWERPC(古いApple社CPU用)…… 0x01F0
  • IMAGE_FILE_MACHINE_R4000(MIPS R4000用)…… 0x0166

詳しくは、下記サイトに列挙されています。
learn.microsoft.com

上記の「IMAGE_FILE_MACHINE_I386」の値「014C」を見て、冒頭に書いた『32bitならば「4C 01」』と違うじゃないかと思われるかもしれません。これは、コンピューターの中にはデータの上位桁と下位桁を交換して保持する「リトルエンディアン」と呼ばれる方式のものがあるためです。Windowsなどが動いている、市販のパソコンで使われるインテルAMD社のCPUは、このリトルエンディアン方式を採用しており、データを書き込んだり取り扱ったりする際に1バイト(16進数ならば2桁分)ずつ、上下を入れ替えて保存します。そのため、Windowsなどで使われているEXEファイルの中身も、値を保存する部分についは上下が逆転した形で保存されており、マイクロソフトのルールでは「01 4C」であっても、実際のファイルの中身は「4C 01」になっています。

参考情報

Win32 API IMAGE_FILE_HEADER構造体

ファイル情報を取得するAPIで扱う構造体の定義情報です。この中のメンバー「Machine」の内容が、前述の「IMAGE_FILE_MACHINE……」になります。
learn.microsoft.com

IMAGE_FILE_MACHINEイメージファイルマシン定数

learn.microsoft.com

アーキテクチャ判別ツール(HEROUSE PE Header Reader)

こういうツールを作って下さっている方もいらっしゃいます。お手軽に調べるならこういうものを使うのも手です。
www.vector.co.jp

*1:PE: Portable Executable の略

PowerShellでテキストファイルの改行コードLFをCRLFに変更する

仕事で、改行コードにLFが使われたShift-JISテキストファイルの改行コードを、全てCR+LFに置き換える処理をササッと作る必要が出てきました。それも処理を記述するのは「バッチファイルの中」ww。やり方はいろいろあるとおもいますが、なるべく変更作業を大きくしたくなかったので、PowerShellの「Get-Content」が、ファイル読み込み時に改行コードLFであっても改行として読み込むことと、「Set-Content」が出力ファイルの改行コードをCRLFにすることを利用して、「Get→Set」でファイルを読み書きする過程で改行コード変換をさせることにしました。

バッチファイルからPowerShellのコマンドを呼ぶ方法も色々あると思いますが、なるべく行数を減らしたかったのでこれで行きました。下記は改行を入れていますが、1行に続けて書けます。

powershell -NoProfile -ExecutionPolicy Unrestricted 
-Command "& {Get-Content %FILENAME% | Set-Content -Encoding oem %FILENAME%TMP; 
Remove-Item %FILENAME%; 
Rename-Item %FILENAME%TMP %FILENAME%}"

Set-Contentの引数に「-Encoding oem」を付けているのは、PowerShellのコマンドが無指定だとUTF-8(BOM付き)のファイルを出してしまうからです。この引数を付けることで、出力ファイルの文字コードを「動作プラットフォームの標準文字コード(日本語版WindowsであればShift-JIS)」で出力されます。

末尾のRemoveとRenameは、出力ファイルを元のファイル名に戻すためです(元のファイルを消し、テンポラリーとして作ったファイルを元のファイル名にリネームする)。

Google AdSenseにシンガポールの税務情報を登録する

昨年末12月に、利用しているGoogleアフィリエイトシステム、AdSenseの支払情報ページに「シンガポールの税務情報を入力してください」と表示され、税務署に書類を申請したところまでは下記の記事に書きました。

2024年1月19日更新。無事、申請が承認されました。

www.backyrd.net

居住者証明書受領

2023年12月26日に申請書を郵送して、本日2024年1月9日に郵便で証明書が送られてきました。

届いた証明書

資料は、ScanSnapの標準画質でスキャンし、PDFにしたものを用意しました。

税務情報の登録

Google AdSenseの支払ページにまだ警告が出たままなので、そこから「税務情報の管理」ページに飛びます。「シンガポール」の欄にボタンがあるので、「税務情報の追加」を押します。

警告メッセージが表示されるので「フォームを開始する」を押します。

いくつか入力/選択欄が表示されるので、下図のように指定します。

業種は、個人の場合は「個人の運営者」。日本にいる「普通の人」であれば「シンガポールに恒久的施設を所有していますか?→いいえ」「シンガポールの物品サービス税に登録されていますか?→いいえ」「課税免除対象となっていますか?→はい」を選択します。

入力ページの下の方にうつり、下図のように選択し、入手した居住者証明証の画像、または文書データファイルをアップロードします。ここでは、ScanSnapの標準画質スキャンで作ったPDFファイルを、A4サイズそのまま(上段の証明書交付申請書部分も含めて)アップロードしました。

ここまで入力を済ませたら、ページ一番下の「送信」を押します。しばらく待たされるかもしれませんが、完了すると画面が切り替わります。

申請状況の確認

最初のページに画面が切り替わると下図のようになります。申請資料に不備等があれば受理されるはずですが……これでしばらく待ってみます。


承認(7営業日後)

1月9日に資料を提出し、1月18日(7営業日後)にAdSenseの画面で申請状況が「承認」に切り替わりました。無事、完了したようです。