C言語 C++ Windows プログラム コンパイル

MinGw/gcc の場合

C 言語で書かれたソースファイル src.c を用意する

gcc src.c -mwindows -o src.exe

src.exe が完成。

リソースを埋め込む場合
  • C 言語で書かれたソースファイル src.c を用意する
  • リソーススクリプトで書かれたソースファイル src.rc を用意する
windres src.rc src.o
gcc src.c src.o -mwindows -o src.exe

リソースが埋め込まれた src.exe が完成。

Watcom C/C++ Compiler の場合

C 言語で書かれたソースファイル src.c を用意する

wcl386 -l=nt_win src.c

src.exe が完成。

リソースを埋め込む場合
  • 上記の手順で出来上がった src.exe を用意する
  • リソーススクリプトで書かれたソースファイル src.rc を用意する
wrc src.rc

リソースが埋め込まれた src.exe が完成。

上記コンパイルで使用するソースファイルの組み合わせの例

src.c

#include <windows.h>
int WINAPI WinMain(HINSTANCE hito, HINSTANCE neko, LPSTR inu, int nezumi){
	MessageBox(NULL, inu, "コマンドライン引数", 0);
	return 0;
}

src.rc

aikon ICON "src.ico"

src.ico
任意の Windows アイコン形式のファイル

アセンブラ

Masm32

ソースから実行ファイルを作成するには

Masm32 の文法に則った foo.asm を作成する
以下のコマンドで foo.asm から foo.obj が生成される

ml /c /coff /Cp foo.asm

以下のコマンドで foo.obj から foo.exe が生成される
32 bit GUI アプリケーションの場合

link /subsystem:windows foo.obj

32 bit CUI(コンソール)アプリケーションの場合

link /subsystem:console foo.obj

NASM

ソースから実行ファイルを作成するには

NASM の文法に則った foo.asm を作成する
以下のコマンドで foo.asm から foo.com が生成される

nasm foo.asm -o foo.com
何もしない 16 bit MS-DOS アプリケーション

NASM 文法に則ったソース

mov ah, 0x4c
mov al, 0x00
int 0x21

レジスタ ah と al にそれぞれ 0x4c と 0x00 を格納し、 int 0x21 して、 MS-DOS にこのアプリケーションが終了したことを通知している
ah に 0x4c が 終了
al の 0x00 は正常に終了したことのしるし
int 0x21 で MS-DOS に通知

このソースから実行ファイルを作成すると、中身は

B4 4C B0 00 CD 21

こうなっている

B4 mov ah,
4C 0x4C
B0 mov al,
00 0x00
CD int
21 0x21

それぞれ 1 対 1 で対応している

アセンブル

NASM に同梱している ndisasm.exe を使う

ndisasm foo.exe > foo.txt

バイナリと命令が 1 対 1 で書かれたテキストファイルが出来上がる
ただし、データセクションも命令として変換されてしまうため、プログラムの流れを忠実に記述しているものではないが、 16 進数のどのデータがどの命令や数値と対応しているのかを知るための辞書(ニーモニック表)代わりとなる

16 bit アプリケーションの実行

Windows XP で 16 bit アプリケーションを実行するには、 cmd.exe 内で一度 command.com を実行する
そうすると、 16 bit モードに切り替わる
すぐに exit する
16 bit モードが継続している
この状態で、 16 bit アプリケーションを実行する

タスクトレイのツールチップが隠れる問題

Windows XP Professional で、タスクトレイのアイコンにカーソルを重ねると、ツールチップが表示される。

それが何かの原因でタスクバーの後ろに表示されてしまい、いわゆる、ツールチップが隠れる、という現象が起こる。

これには完全な解決方法がある。

すなわち、タスクバーの右クリックメニューにある「タスクバーを固定する」をオンにしたあと、レジストリエディタを開き、

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

の中の DWORD 値 LockTaskBar を 0x00000001 にする。
必要に応じて、コンピュータを再起動する。

これは本来、「タスクバーを固定する」の設定を変更可能にするかどうかを決定するためのレジストリの値であるが、これを設定することによって、ツールチップが隠れる現象が再現しなくなる。

より簡単な方法は、コマンドプロンプト

mmc.exe gpedit.msc

と入力し、グループ ポリシー を起動する。

  • ローカル コンピュータ ポリシー
    • ユーザーの構成
      • 管理用テンプレート
        • タスクバー と [スタート] メニュー

の中の、 タスクバーをロックする の値を 有効 にする。

Beep : ASCII 0x07 : beep.sys

cmd.exe で echo と入力したあと Ctrl+G キーを押すと

echo ^G

このように表示される。
ここで Enter キーを押して実行すると、ビープ音が鳴る。

Ctrl+G で入力した情報の実体は、 ASCII コードの 0x07 である。
これは、刻印文字ではない。 BEL である。ベルは、 Windows では Beep に相当する。

WindowsBeepBeep.sys である。
これは、ドライバである。
Beep ドライバはサービスとして読み込まれている。
サービス名は beep である。

sc stop beep

を実行すると、 beep サービスが停止、 beep.sys がアンロードされ、ビープ音が鳴らなくなる。

sc start beep

とすれば、再び beep.sys がロードされ、ビープ音が鳴るようになる。

sc qc beep

で、 beep サービスの設定状態が表示される。

sc config beep start= disabled

で、 beepWindows 起動時に読み込まないようにすることができる。
beep サービスの START_TYPE の初期値は、 SYSTEM_START である。

sc config beep start= system

でその初期値に戻すことができる。

sc queryex beep

で現在の beep 稼動状態 (STATE) を表示することができる。

ローカル セキュリティ ポリシー の設定を初期化する

Windows XP には、ローカル セキュリティ ポリシー がある。

ポリシーの設定を編集すると、不具合が起きることがある。
たとえば、 Guest アカウントでログインしようとすると、 SAS Window が出て、 winlogon.exe でエラーが起きた、というようなことを警告メッセージボックスで報告されるような現象だ。


ローカル セキュリティ ポリシー の設定を初期化を実行するには、コマンドプロンプト

secedit /configure /db 適当なファイル名 /cfg %SystemRoot%\inf\defltwk.inf /areas SECURITYPOLICY

と入力して実行する。

このプログラムの実行プロセスの流れは、

  1. /configure が、セキュリティ設定を変更する、という意味
  2. /db で指定したファイル名のファイルが新規作成される
  3. /cfg で指定した defltwk.inf ファイルが読み込まれる
  4. /areas で指定した領域が defltwk.inf から抽出され、データベースとして構築される。それが、/db のファイルに出力される
  5. /db のファイルのデータベースが実際の領域(ここではローカルセキュリティポリシー)に適用される

secedit.exe を引数なしで実行すると、「セキュリティの構成タスクを自動化する」についての HTML ヘルプが現れる。
この中に Secedit コマンドについての説明がある。

このほか、 /areas FILESTORE もある。これは、 NTFS の各フォルダ・ファイルのプロパティのセキュリティタブにある「アクセス許可」を、すべての Windows システムフォルダ・ファイル に対して初期化を適用するものだ。

また、 /areas SERVICES は、サービスの自動・手動・無効などの設定をデフォルトに戻す。

ポートを指定して Ping するようなもの

Microsoft のサイトから無償ダウンロードできる CUI ツール PortQry を使うと、指定した IP アドレスへ、ポートを指定して TCPUDP のクエリを送信することができる。

portqry -n www.xxx.yyy -e 80 -p TCP

として実行すると、 www.xxx.yyy の 80 番ポートに対して TCP クエリを送信する。ポートが開いているなら LISTENING と表示される。

portqry -n www.xxx.yyy -e 443 -p BOTH

のようにすると、 443 番ポートに対して TCP/UDP 両方のクエリを送信する。

Wireshark のフィルタ 2 種

Wireshark 1.2.1 の Capture Filter は、パケットをキャプチャする際に、どれをキャプチャして、どれをキャプチャしないかを取捨選択するためのフィルター。

たとえば、「ブロードキャストされた ARP パケットを受けとりたくない」場合、

文法は、 not ( arp and ether dst ff:ff:ff:ff:ff:ff ) のようにする。

一方、 Display Filter の文法は、 not ( arp and eth.dst == ff:ff:ff:ff:ff:ff ) のようにする。