SSブログ

例外コード c0000417 [日記]

先日、こんな報告がありました。

例外 不明なソフトウェア例外(0xc0000417)がアプリケーションの0x0042d637で発生しました。

なんだろう、これ……

Visual Studio のインストールフォルダの中を探った所、次のファイルの中に見つかりました。
MicrosoftSDKs\Windows\v6.0A\Include\ntstatus.h

//
// MessageId: STATUS_INVALID_CRUNTIME_PARAMETER
//
// MessageText:
//
// An invalid parameter was passed to a C runtime function.
//
#define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417L)

「Cのランタイム関数に渡したパラメータが間違ってます」と言うことらしいです。

この定数が使われるところを調べてみたところ、
Visual Studio 2008(?)で導入されたセキュリティ強化版のC言語の関数(CRT)が使っているみたいです。

ちなみに、セキュリティ強化版CRTとは、C言語の標準関数の末尾に "_s" が付いています。
例えば、strcpy_sとかstrcat_sとか。

この手の関数で、引数に問題があるということは、
文字列用の配列のサイズが不足している(バッファオーバーフロー)ということでしょうか。

そんな感じです。

ちなみに、_set_invalid_parameter_handler()を使って、エラーがあった時の挙動を変えられます。

ところで、MicrosoftSDKs\Windows\v5.0\Include\ntstatus.h には記載されていないので、もしかして Vista 専用?


オマケで、エラーの発生箇所のアドレス付近を逆アセンブルしてみました。

0042D62B  XOR EAX,EAX
0042D62D  PUSH EAX
0042D62E  PUSH EAX
0042D62F  PUSH EAX
0042D630  PUSH EAX
0042D631  PUSH EAX
0042D632  CALL 0042D605h
0042D637  ADD ESP,14h
0042D63A  RETN

なんだろうな、これ。
C言語風に書き直すと、こんな感じ。

    func(0, 0, 0, 0, 0);

セキュリティ強化版CRTに関係しそうな関数で、これっぽいものを探してみたところ、該当しそうなものが1つ見つかりました。

_set_invalid_parameter_handler() に指定する関数のプロトタイプは、次のようになっています。

void _invalid_parameter(
   const wchar_t * expression,
   const wchar_t * function, 
   const wchar_t * file, 
   unsigned int line,
   uintptr_t pReserved
);

引数が5つです。
しかも、MSDNによると
『すべてのパラメータの値は、CRT ライブラリのデバッグ バージョンを使用する場合を除いて、NULL になっています』
とのことなので、5つ引数に0を指定して関数呼び出ししていることになります。

本当に、これなのかは不明ですけどね。
もっとも、それが分かったから、どうなんだ、と言う感じですが……。

[飛行機] 今日の一冊
赤ずきんの手には拳銃―ワンス・アポン・ア・クライム

赤ずきんの手には拳銃―ワンス・アポン・ア・クライム

  • 作者: サイモン ブレット
  • 出版社/メーカー: 原書房
  • 発売日: 1999/06
  • メディア: 単行本

タグ:VisualC++ Windows
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。