問題タブ [ntdll]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Visual Studio 2015 で ntdll.dll!RtlpLogHeapFailure() を解決するには?
私は現在、AIプロジェクトに取り組んでいます。最後に並べ替えるには、1 から 8 までの番号が付けられたボードのピースを移動する必要があります (空のスペースには 0 のラベルが付けられます)。しかし、デバッグしようとすると奇妙な問題が発生しました。
指定されたエラー コメントで、CreateNewState() 関数を 2 回目に呼び出すと、デバッガーが停止してポップアップします。
AIProject_Puzzle.exe がブレークポイントをトリガーしました。
このエラーが発生したときに、コール スタックにいくつかの追加情報を表示しようとしました。
ntdll.dll!RtlReportCriticalFailure()
ntdll.dll!RtlpHeapHandleError()
ntdll.dll!RtlpLogHeapFailure()
ntdll.dll!RtlpAllocateHeap()
ntdll.dll!RtlAllocateHeap()
ucrtbased.dll!00007ff9b582c4da()
ucrtbased.dll!
00007ff9b582c27 .dll!00007ff9b582f34f()
ucrtbased.dll!00007ff9b582fdde()
AIProject_Puzzle.exe!CreateNewState(状態 * 親 = 0x000000c05c273520、アクション アクション = ダウン)
ヒープの破損である可能性があることはわかっているので、これを解決するための手がかりが本当に必要です。Visual Studio Community 2015、VisualC++ を使用しています。このエラーは私を病気にしています。この問題を解決する方法を誰か教えてください。
java - EXCEPTION_ACCESS_VIOLATION (0xc0000005)
スタック オーバーフローや他のコミュニティ フォーラムの別のスレッドから解決策を試しましたが、以下の問題の解決策が見つかりませんでした。JDK 1.7 - 64 ビットと JDK 1.6 - 32 ビットの両方がインストールされています。
java - NTDLL.DLL が原因で Windows Server 2012 で JVM がランダムにクラッシュするのはなぜですか?
私の運用サーバーは時々 java.exe サービスをクラッシュさせ、それによって myApplication Server Glassfish 4.1 をクラッシュさせます。これはランダムに発生し、これまでのところ、そのような動作を説明する理由を見つけることができませんでした.
Win Server 2012 イベント ビューアーを確認すると、アプリケーション エラーは NTDLL.DLL との競合によるものであると表示されます。
以下に、これらのクラッシュのいずれかの後に収集されたダンプを投稿します。
誰もそれを解決する方法を知っていますか?
java - Java EXCEPTION_ACCESS_VIOLATION - 厳密には JVM の問題ですか? 私の側には何もありませんか?
このメッセージは思ったほど長くありません - 最後に長いログ レポートを添付しただけです
こんにちは、みんな、
Java で実装された実験的なクローラーを実行しています。最近、36 時間の操作の後、JVM がクラッシュし、例外アクセス違反ログ ファイルが発行されました。私はこのファイルについて多くのことを読みましたが、それでも私には少し不可解です。生成されたログ ファイル内の関連する「スタック」バージョンは次のとおりです。
ご覧のとおり、少なくともこのログ ファイルからわかるように、エラーは一部の Java コードではなく、ntdll ライブラリで発生し、命令の実行が jvm 自体で例外に達しました [編集: またはその逆でしょうか? ntdllで終わった?]。これを「まあ... JVMとウィンドウを再インストールすると、おそらくうまくいくだろう」と言って却下したくはありませんが(間違いなくそうしますが)、何かできることがあるかどうかを確認してください。それ。私が述べた明らかなもの以外に、適用できるいくつかの既知の問題または修正。問題は、このエラーが 36 時間以上経過した後に発生したため、再現が非常に難しいことです。
また、私は呼び出していると言う必要があります
約 8 秒ごとにメモリがクリアされていることを確認します。とにかくそれが問題なら.\
グラフィックライブラリは使用していません。
JNI コードは使用していません。
読んでくれて、おそらく助けてくれてありがとう、
アミール。
添付 - 非常に長いスレッドの詳細を除いた、ほぼ完全なログ ファイル (hs_err_pid10544.log):
c# - XmlDocument.load のエラーにより、アプリケーションの終了時に ntdll.dll エラーが発生する
だから私は xmldocument.load 関数MSND Linkに問題があります。具体的には、コード内では問題なく動作しますが、プログラムを閉じると ntdll.dll でエラーが発生します。
ただし、作成中のプログラムからこの関数を削除して個別に実行すると、エラーなく動作します。また、プログラムの残りの部分をダミー入力で実行すると、エラーなしで実行および終了します。
明確にするために、これは Windows フォーム アプリケーションとして実行されており、これらの関数は私がまとめている Google API ライブラリから呼び出されます。
このエラー メッセージを解決するにはどうすればよいですか?
プログラムに問題が発生しているようには見えないので、プログラムの終了後にエラーメッセージが表示されないようにする方法も受け入れます。明らかに、私は問題を隠蔽するよりも問題を修正したいと考えています。
編集: 2016 年 4 月 18 日 プログラムの最初のアルファ テスト ビルドの 1 つを作成しました。WIX を使用してインストーラーを作成してインストールした後、Visual Studio の外部からプログラムを実行すると、エラーはスローされません。非常に奇妙ですが、ビジュアルスタジオ内からまだ動作しています。
c - ネイティブ ntdll からのレジストリ エントリ アクセス
ネイティブ C++ プログラムからアクセスできる HKLM レジストリ ハイブを教えてくれるドキュメントはありますか。BootExecute を使用して実行し、reg エントリの読み取り/書き込みにアクセスする C プログラムを作成しています。\Registry\Machine\System\ControlSet001\Services で正常に実行できましたが、\Registry\Machine\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce または \Registry\Machine\Software\Microsoft\Windows にアクセスしようとしている場合\CurrentVersion\RunOnce
それは失敗します。OS の起動中にアクセスできるすべてのレジストリを知るのに役立つドキュメントまたは情報はありますか?
c++ - Windows ネイティブ API を使用して PE リソースにアクセスする方法は?
埋め込みリソースを含むWindows ネイティブ アプリケーションがあり、ネイティブ APIを使用してそれらにアクセスしたいと考えています。リソースを処理するネイティブ関数 ( FindResource / LoadResourceに似たもの) はありますか? または、それらを抽出するために独自の PE リーダーを作成する必要がありますか?
redirect - Windows 7 x64 で、system32 ではなくローカル ディレクトリから ntdll.dll をロードする方法はありますか?
カスタムプロセスの状態を保存し、停止した時点から復元するアプリケーションに取り組んでいます。
現在、次の問題があります。システムが再起動すると、システム モジュールのすべてのベース アドレスがランダム化されます ( ntdll.dll
、kernelbase.dll
などkernel32.dll
)。OS は Windows 7 x64 Enterprise です。再起動後にアプリケーションを復元しようとすると、明らかにクラッシュします (ただし、再起動前の復元ポイントからは正常に機能していました)。これには2つの解決策があります:
- アプリケーションに読み込まれるときにシステム モジュールのアドレスを静的にする
- アプリケーション内のターゲット モジュールへのすべての参照にパッチを適用します (スタック上の関数のアドレス、ヒープに保存される可能性のあるアドレスなど)。
明らかに、2番目の方法は困難です。完全なアプリケーション分析を行い、コードをデータと区別し、システム モジュールへの参照から単純な整数である可能性があるデータを区別します...したがって、最初の方法を選択しました。
仮想メモリにモジュールをロードするとき、OS は最初に物理メモリにそのような名前のモジュールが既に存在するかどうかを確認します。存在する場合は、単にこのモジュールを仮想アドレス空間にマップします。この場合、 -from の場合、モジュールは最初の場所からロードされntdll.dll
ますC:\Windows\System32\ntdll.dll
。このモジュールをアプリケーション ディレクトリにコピーし、ASLR フラグを無効にし、イメージ ベースに何らかの値をパッチしても、このモジュールはシステム ディレクトリから読み込まれます。何らかのリダイレクト方法が必要です。
MSDNから、次のことがわかります (セクション「デスクトップ アプリケーションの検索順序」 )。
デスクトップ アプリケーションは、フル パスを指定するか、 DLL リダイレクトを使用するか、マニフェストを使用して、DLL のロード元の場所を制御できます。これらの方法のいずれも使用されていない場合、システムは、このセクションで説明されているように、ロード時に DLL を検索します。
したがって、目的を達成するには少なくとも 2 つの方法があります。
DLL リダイレクトに関するページには、次のように表示されます。
既知の DLL はリダイレクトできません。既知の DLL の一覧については、レジストリ キーHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsを参照してください。システムは、Windows ファイル保護を使用して、サービス パックなどのオペレーティング システムの更新による場合を除いて、これらのようなシステム DLL が更新または削除されないようにします。
リダイレクトしたいモジュールは既知の DLL であるため、この亜種は適用できません。
マニフェストが残っています。それらの使用に関する優れた記事があります。この記事の著者は、元の DLL を置き換えるスタブ DLL を作成し ( user32.dll
)、この置き換えられた DLL をロードするアプリケーションを作成します。要点は、この DLL は、アプリケーションの開始時ではなく、インポートされた関数を検索するときにロードされるということですntdll.dll
。
より具体的には、「Windows Internals, Sixth Edition」の p.11 を参照してください。359 では、プロセス作成の詳細が説明されています。そこには7つの段階があります:
- パラメータとフラグの変換と検証
- 実行するイメージを開く
- Windows Executive Process オブジェクトの作成
- 初期スレッドとそのスタックおよびコンテキストの作成
- Windows サブシステム固有の初期化後の実行
- 初期スレッドの実行開始
- 新しいプロセスのコンテキストでプロセスの初期化を実行する
ここでの最も重要なポイント:
のマッピングは
ntdll.dll
ステージ 3 で発生します。ステージ 5 の開始時に、以下を読みました (強調は私のものです):
この時点で、Kernel32.dll は Windows サブシステムにメッセージを送信して、 マニフェスト ファイル、DLL リダイレクト パス、および新しいプロセスのプロセス外実行。
これは、ntdll.dll
リダイレクトが発生する前にロードされることを意味します。リダイレクトのトピックについては SO に関する多くの質問がありますが、それらはすべてLoadLibrary
、アプリケーションでリダイレクトが発生する可能性がある場合に、インポートされた関数の検索中に、または を介して明示的にロードされる DLL に関するものです。
ただし、ntdll.dll
いずれにしても非常に早い段階でアプリケーションに読み込まれます。
これまでに収集したすべての情報を使用して、たとえば、kernel32.dll
アプリケーションのディレクトリでアプリケーションを検索することができました (この段落のリンクを使用)。しかし、検索をリダイレクトできませんでしたntdll.dll
。
ユーザーモードからはまったく可能ですか?
PS ASLR をグローバルに無効にする方法があります。この投稿を参照してください。ただし、これは非常に失礼な方法です。 のようなアプリケーションInternet Explorer
はAdobe Reader
機能せず、OS 全体が脆弱性にさらされます。
c++ - NtQueryMutant への呼び出しでの STATUS_ACCESS_DENIED
免責事項:
質問と以下のコードが存在する唯一の理由は、私のアプリケーションで使用されている外部コンポーネントであり、少なくとも近い将来には置き換えることができません。このコンポーネントのロジックは、アプリケーションからの WinAPI 呼び出しをインターセプトし、これらの呼び出しに基づいてさまざまなタスクを実行します。
コンポーネントが行うことの 1 つは、アプリケーション内で初期化された各スレッドのミューテックスを作成することです。ただし、ミューテックスを閉じないため、ハンドル リークが発生します。
したがって、リークを防ぐために、またコンポーネントのソース コードにアクセスできないため、厄介な回避策を考案し、難解な API を使用する必要があります。
免責事項の終了
アプリケーションでミューテックスの状態を確認しようとしています。チェックする各オブジェクトの状態を変更せずにこれを行うには、ntdll.dllNtQueryMutant
のメソッドを使用する必要があります。
こことここの例に基づいて、これを実現するために次のコードを書きました。
ここstatus
で受け取るのは常に-1073741790 (0xFFFF FFFF C000 0022)です。これは、負の数であることを除いて、STATUS_ACCESS_DENIEDとまったく同じように見えます。
NtQuerySystemInformation
以前のコードではとNtQueryObject
問題なく両方を使用していたため、これは非常に奇妙です。
追加の詳細:私の OS は Windows 7 SP1 です。クエリを実行しようとしているミューテックスは、クエリを実行しているプロセスに属しています。