Windows Vistaの/ 7上の低レベルのC ++アプリケーションのクラッシュXP互換モードで実行しない限り、
-
24-09-2019 - |
質問
私は、低レベルを持っている(の本当にの低レベルのように、それは基本的にすべてのIOCTL呼び出しと列挙APIのいくつかの呼び出しです)クライアントのマシン上のWindows Vista / 7上で散発的にクラッシュしています。残念ながら、私は、任意のクラッシュダンプを調達することができていないが、1人の有用なユーザーがXP互換モードでプログラムを実行しても問題が解決していること。
の言及をしました それがUACの問題ではありませんので、はアプリケーションが常に(それは管理者の承認を必要とする別のプログラムから起動されます)、完全な管理者権限で起動されます。私は、任意の非推奨APIを使用していないと私はその後、接続されているすべてのデバイスについてのいくつかのより多くの低レベルの情報を取得するためにIOCTLコマンドを使用して、列挙ディスクへの呼び出しを発行しています私はなど、任意のレジストリハックに頼っていませんよ。
何がXP互換モードではどうなりますか?自分のアプリケーションに、またはそれ以外の場合は、Windowsの注入を何ビスタ/ 7上でクラッシュからその防止それでそれをサンドボックスのでしょうか?私はもともとそれがXP互換モードで正常に動作することを告げられる前に(私は複製したり、問題を追跡しようとするから私の髪を引っ張ってきましたが)ヒープの破損が疑われていた。
缶の誰もが、私はこの問題に対処しようとすることを検討すべきであることをXP互換モードでは回避されるだろう任意の潜在的な問題を示唆しますか?ありがとう!
EDITます:
は、おそらく非常に重要ですもう一つは、言及する:私は、WIN32 APIを介して露出させない特定の機能で取得するために、ユーザ空間からDDK /カーネル関数を呼んでいる。
私はZwReadFile、ZwCreateFile、ZwWriteFile、RtlInitUnicodeString、ZwQueryVolumeInformationFile、ZwDeviceIoControlFile、ZwSetInformationFile、ZwCloseを使用しています。
私は呼んでいるのIOCTLがIOCTL_DISK_GET_PARTITION_INFO_EX、IOCTL_STORAGE_GET_DEVICE_NUMBER、IOCTL_DISK_GET_LENGTH_INFO、およびIOCTL_DISK_GET_DRIVE_LAYOUT_EXが含まれます。
解決
これは非常に奇妙ですが、私はFileFsVolumeInformationにFsInformationClassセットでZwQueryVolumeInformationFileを呼んでいた。
私は最初の正常(sizeof(FILE_FS_VOLUME_INFORMATION) + sizeof(TCHAR)*FILE_FS_VOLUME_INFORMATION->VolumeLabelLength)
に超過の次に、割り当てられたFILE_FS_VOLUME_INFORMATIONのバッファに渡されていた。
はその後、私はと呼ばれます
FILE_FS_VOLUME_INFORMATION->VolumeLabel[FILE_FS_VOLUME_INFORMATION->VolumeLabelLength/2] = _T('\0');
とは唯一のいくつかのマシン上でのこれは、メモリの破損につながるます。
にかかわらず、割り当て超過の大きさの(でも余分なフル256個の文字を割り当ててみました!)、これは確実にヒープ破損につながるのさえのFILE_FS_VOLUME_INFORMATIONバッファとしてvector<unsigned char>
を使用しているときます。
カーネルはサイズに関わらず破損が生じた何らかの形でバッファに書き込み保護のいくつかの並べ替えを置くようです。第2のバッファに第VolumeLableLengthバイトのコピー、次にはポスト係属_T('\0')
は、問題を解決しました。わからない、なぜWindowsは、それがの後にのFILE_FS_VOLUME_INFORMATION構造体を格納した場合は、のI のまたはの読み取り専用パラメータとして割り当てられ、渡されたというバッファを作っていましたか/ (これはをの文字列で終了!はずです)、単に、私はそれだけで起こるので、クレイジーですトリックを....でし合格したことを、バッファ内のデータを変更しない(一貫して100%の再現性)特定のマシンでます。
いずれにせよ!:問題*あーを解決*
他のヒント
XPからVistaに低レベルのドライバーの中に多くの変更がありました。私はあなたがそれに影響されるIOCTLを使用している疑います。