Windows上のBAARD

曖昧な反応は、MicrosoftがWindowsの新しいバージョンと他の人のプログラムとの互換性を確保するためにどれだけ努力しているかについてのRaymond Chenによって引き起こされました。

逆のケースも知られています。Microsoftが、WindowsとMS-DOSの「信頼できない」クローンとの非互換性を意図的に求めたときです。 博士の問題から Dobb's Journal 、1993年9月:

Windows AARD検出コード


Windows 3.1のベータテストに参加し、DR-DOSがコンピューターにインストールされている場合、おそらく次のような異常なエラーメッセージが表示されます。
致命的ではないエラーが検出されました:エラー#2726
 Windows 3.1ベータサポートにお問い合わせください
 ENTERを押して終了するか、Cを押して続行します

これは「致命的ではないエラー」であり、Cキーを押すとWindowsが起動し続けますが、「デフォルト」アクションは起動をキャンセルすることです。
すでに疑わしい:エラーが致命的ではなく、Windowsがそれにもかかわらず動作できる場合、なぜユーザーに報告するのですか?

このメッセージは、Windows 3.1のいくつかのプレリリース版のWIN.COMSETUP.EXEHIMEM.SYSSMARTDRV.EXEおよびMSD.EXEによって発行されました。
Windows 3.1の最終バージョンには、このメッセージを表示するコードがまだ含まれています。 このコードは「オフ」ですが、 WIN.COM 1バイトを「オン」に変更するだけです。

この投稿で最も興味深いのは、Novell DOS 7のベータ版を含むDR-DOSのすべてのバージョンで表示されますが、MS-DOSまたはPC-DOSのいずれでも表示されないことです。 このメッセージは何について報告していますか?

たぶんこれは事故ですか?

マイクロソフトのライバルは、悪の帝国がプログラムを故意に混乱させていることをしばしば嘆きます。 実際、Microsoftは通常、競合他社のプログラムでエラーが発生した場合でも、下位互換性をサポートするために前例のない努力をしています。

MicrosoftがWindowsをDR-DOSで動作させないことを主張している人は誰でも、事実を指摘できます。Windows3.1 Advanced ModeはDR-DOSで正常に動作します。 はい、標準モードは機能しませんが、NovellはこれがDR-DOSのバグによるものであることを確認しています。

Novell DOSの別のバグが原因で、奇妙なエラーメッセージが表示されると考えられます。 N社のプログラムのバグを「意図的に互換性のない」Mとして偽装しようとしたのはこれが初めてではありません。

デバッグ保護

メッセージの原因を見つける最初のステップは、 WIN.COMコードを分析することです。 すぐに障害物のコースに遭遇します: WIN.COMの対応するフラグメントWIN.COM XOR暗号化され、自己修正され、意図的に台無しにされ、さらに、ステップバイステップの実行から保護するためのトリックが詰め込まれています:たとえば、 INT 1,2,3デバッグ割り込みベクトルを存在しないアドレスに設定します。 最新のデバッガーには影響しません(私はNu-MegaのSoft-ICEを使用しました)が、研究自体を複雑にしようとする試みは、ケースがクリーンでないことをすでに示しています。

コードの主要部分は暗号化されているという事実にもかかわらず、Microsoftの著作権のある行は暗号化されないままであり、「AARD」と「RSAA」の2、3行はおそらくプログラマーのイニシャルです。

(著者は推測した:AARD-この「防衛」を実現したアーロン・レイノルズのイニシャル。)

チェックの文字列

基本的に、暗号化されたコードは、オペレーティングシステムが正規のMS / PC-DOSであるかどうかを確認します。 (このコードはMS-DOSに依存しない製品であるWindowsの一部ですが!)文書化されていない機能と内部DOS構造のさまざまな側面がテストされています。 たとえば、AARDコードはSysVarsポインターをチェックして、初期化されていることを確認します。 興味深いことに、 SysVars構造SysVars高品質のDOSクローンに実装されていますが、DR-DOS 5/6バージョンはHIMEM.SYS内から検証に合格しません。このドライバーは、内部DR-DOS構造の初期化が完了する前にロードされます。

以下は、さらに複雑なテストです。 最初に、コードはネットワークリダイレクタが実行されているかどうかを確認します。 開始された場合、AARDは、現在のコードページの小文字と大文字のテーブルが同じセグメントにあるかどうかを確認します。 リダイレクタが実行されていない場合、AARDは最初のファイルコントロールユニット(FCB)がオフセット0にあることを確認します。

これらのテストはMS-DOSのすべてのバージョンに合格しますが、DR-DOSの1つのバージョンには合格しません。

厳しい守護者

言語情報はネットワークリダイレクタと何の関係がありますか? Windowsでは、資本テーブルがどのセグメントにあり、どのオフセットでFCBにあるのですか? これらの「間違い」とは何ですか?

実際、大文字化セグメントはWindowsのどこでも使用されていません。AARDコードは、これら5つの無関係なプログラムの動作とは関係ありません。 WindowsがDOSの内部構造を分析し、特定の機能が実装されているかどうかを確認するためにそのバージョンを決定すれば理解できます。 しかし、 WIN.COMも、AARDコードを含む他のプログラムも、チェック結果を使用しません。彼らが行うことは、DOSの「外来」バージョンのユーザーを意味のないエラーメッセージと混同することだけです。

間違いなく「意図的な非互換性」のように見えます。 「エラー」が致命的ではなく、Windowsが引き続き正常に動作している場合、エラーは何ですか? ユーザーが間違ったバージョンのDOSを選択していますか?

MS-DOSでレターテーブルとFCBへのポインターを変更して、同じデータを指すようにしましたが、異なるペア(セグメント:オフセット)を使用しました。 Windowsとすべてのプログラムは、何も起こらなかったかのように機能し続けました。 唯一の変更点は、起動時にAARDメッセージを受信し始めたことです。
AARDは、バイト単位の絶対的なMS-DOS互換性のテストであることがわかりました。

発見したことをマイクロソフトに報告し、上級従業員から「DR-DOSを気にしません... [Novell]は100%の互換性を主張していますが、DR-DOSにはバグがたくさんあります。 DR-DOSユーザーがWindowsで問題を抱えている場合、Novellにそれを理解させてください。
しかし、どうやら、彼らはDR-DOSを気にかけている-彼らはそのような洗練されたチェックを実装し、さらにそれを注意深く混乱させたからだ。

マイクロソフトは、ドキュメント化されていないインターフェイスを使用して製品間の通信を行うのは初めてではありません。 たとえば、DR-DOSを含むDOSクローンは、MS-DOS 3.31などの古いバージョンのMS-DOSになりすまして、Windowsがアドバンストモードで実行されるようにする必要があります。 これは、 DOSMGRドライバーが、 WIN386.EXEまだ復号化されていないMS-DOS 5/6との通信に文書化されていないプロトコルを使用しているためです。 クローンがDOSの最新バージョンとして提示された場合、Windowsはサポートされていないプロトコルを使用してクローンと通信しようとします。
しかし、文書化されていないインターフェースから意図的に混乱し暗号化されたインターフェースへの移行は、これまでにない競争のテクノロジーです。



Windowsの父親であるBill GatesとBrad Silverbergのビザに対するAARD-codeの著者の答えは、非常に濁っていて水っぽいです。 要するに、Windows開発者は、テスト時にDOSクローンに関する多くの問題を発見し、すべての非互換性の検出と回避に余分な労力を費やすことはせず、MS-DOSではなくWindowsの起動時に単にメッセージを表示しました。 ご自身の責任で続行してください。」

アーロンは、MicrosoftがDOSの他のバージョンのWindowsをサポートするべきであるという仮定に怒りさえしています。「彼らは私たちの開発を引き裂いているので、長年生きてきました。 彼らのために彼らの工芸品をデバッグすることもできませんでした。」

ベータテストの時点で、メッセージをより曖昧にし、ユーザーがコンピュータにメッセージが表示されたことをユーザーが報告することを忘れないように、理解できないエラーの言及を含めることが決定されました。
また、ベータオーガナイザーにとって、MS-DOSで動作する(Windowsで実際のバグを報告する)ユーザーとDOSクローンで動作するユーザーを知ることが重要でした(おそらく、Windowsではなく、これらのクローンのバグを観察してください)。
その後、コードは暗号化されたため、Novellはそれを把握してWindowsのベータテストの終了前に通過するバージョンのDR-DOSをリリースする時間がありませんでした。これにより、テストオーガナイザーと結果が混同されます。

ベータテストの後、リリース前にプロジェクト管理が計画を変更し、最後にDOSの「認証」が完全に削除されました。 念のため、既存のコードはそのままにしておきました。変更量が少ないほど、別の場所で何かを誤って折りたたむ可能性が低くなります。



「バリケードの反対側にある」珍しい思い出がラリー・オスターマンを導きます

AARDコードを混乱させた理由はわかりません。 これはばかげていると思います。 しかし、DOS認証の考え方には絶対に同意すると言わざるを得ません。 Windows開発者は、文書化されていないOS構造を含め、システムのすべてのコーナーを所有することにしました。 彼らはそれらを見つける方法を知っていた、彼らは彼らのサイズを知っていた、そして彼らはこれらの内部構造を自分のもので置き換えることを一瞬ためらいませんでした。 言うまでもなく、MS-DOS開発者の観点から見ると、Windowsサポートは悪夢でした。

1つの例:Windowsの起動時に、SFTのサイズが増加しました-MS-DOSファイルの内部テーブル(これはconfig.sys FILES=行が設定するテーブルと同じです)。 同時に20を超えるファイルを開くことができるようにするには、それを増やす必要がありました。20のファイルを開くことができないマルチタスクOSを想像してください。 しかし、このために、文書化されていない呼び出しを持つWindowsプログラマーは、「興味深い」MS-DOS構造へのポインターを受け取り、既知のオフセットを追加し、システムSFTを独自のものに置き換えました。

MS-DOS 4.0で作業していて、Windowsのサポートを提供する必要があったとき、Windowsが見つけたい場所にポインタを置いておくのは難しくありませんでした。 問題は、MS-DOS 4.0では、SFTがMS-DOS 3.1よりも2バイト多かったということでした。 WindowsがSFTを置き換えることができるように、 WIN.COMの開始を認識するコードをDOSブートローダーに追加しました。 そのコードで、古いSFTのサイズに等しいオペランドを持つMOV命令を見つけます。 そして、メモリ内で直接、このオペランドを新しいSFTサイズに置き換えます。
そのとおりです。Windowsのコードを即座に修正して、引き続き機能するようにしなければなりませんでした。

これで、WindowsがDOSクローンで実行したくない理由がわかりました。 文書化されていない構造でホストしたという事実に加えて、彼女はシステム関数の特定の実装の機能を積極的に使用しました。 リエントラントなものとそうでないもの。 互換性のないDOSで何が起こるか想像してください:原因不明のフリーズからディスク上のデータ破損まで。

WindowsがMS-DOSの内部で微妙な脳神経外科手術を行ったことを考えると、彼女が最初にしたことは、患者が入れ替わっていないことを確認することでした。

Source: https://habr.com/ru/post/J103757/


All Articles