2017-07-19 4 views
-2

特定のWindows 7 64ビットマシンでは、ntdll.dllとkernel32.dllからいくつかのシステム関数を解決できません:GlobalMemoryStatusEx、GetProcessMemoryInfo、NtQuerySystemInformation。それは任意のWindowsのバージョンを実行している他のPCの何千もの魔法のように動作している間ntdllとkernel32からいくつかの関数を解決できない

typedef void (WINAPI *PFN_GLOBAL_MEMORY_STATUS_EX) (MEMORYSTATUSEX *lpBuffer); 

PFN_GLOBAL_MEMORY_STATUS_EX pfnGlobalMemoryStatusEx = 
    (PFN_GLOBAL_MEMORY_STATUS_EX)QLibrary::resolve("Kernel32.dll","GlobalMemoryStatusEx"); 
if(!pfnGlobalMemoryStatusEx) 
    qWarning() << "GlobalMemoryStatusEx failed -" << ::GetLastError(); 

上記のコードは、エラー127 = ERROR_PROC_NOT_FOUNDを返します。

私は実際にこれらの機能が実際にはが不足していると疑っています。です。世界で何種類のものがブロックのものでしたか?

途中でQt/MinGWアプリです。

+0

あなたは私たちに[mcve]を提供できますか? –

+0

明らかにこの特定のマシンで何かが間違っています。不可能な一般的な答えを得る。この特定のマシンでのみデバッグ(またはテスト)する必要があります。もちろん、デバッグの最善の方法です。不可能な場合は 'GetProcAddress'または' LdrGetProcedureAddress'を試してみるか、ビューの結果を直接解析してPEをエクスポートしてください。またはこの機械を忘れる。何千ものPCのうちの1台で常に何かが間違っていることがあります – RbMm

答えて

0

あなたはあなた自身をチェックし、結果を投稿する適切な手順に従わなかったので、完全な答えを与えるのは難しいです。しかし、私はそれが私のやりたいことをあなたに歩いていくための最善の試みを与えるでしょう:

私は本当にこれらの機能が実際には不足していることを本当に疑っています。

実際に確認しましたか?マシンにアクセスできる場合は、PE Studio(無料)などのPE解析プログラムをダウンロードし、システムのWindows \ System32ディレクトリに移動します。ここで、NtDll.dllとkernel32.dllをデスクトップにコピーします。最後に、コピーしたバージョンをPE Studioにドラッグし、左側のナビゲーションペインの[エクスポート]セクションをクリックします。

あなたが欠落していることを確認してください。それらをアルファベット順に並べ替えると簡単になります。

機能がある場合は、シンボル解決や再配置に別の問題があることを意味します。ほとんどの場合、PE Ldr関数の@RbMmはコメントに記述されています。あなたはWinDbgを使ってこれを理解することができます。まず、Windows Debugging Toolsをインストールします(WDK全体をインストールしますが、ツールを除くすべてのチェックボックスをオフにします)。次に、Windowsのキーを押し、グローバルフラグまたは "gflags"を入力して、 "Global Flags"アプリケーションを開きます。最後に、グローバルフラグの "イメージファイル"タブに移動し、利用可能な唯一のテキストボックスをクリックします。 Tabキーを押して更新し、アプリケーション名をに表示してください。Show Loader Snapsをクリックし、Apply/OKを押します。最後に、WinDbgを開き、それを使ってプログラムをデバッグすると、ローダーが行うすべてのものが吐き出されます。おそらく2万行のローダーコードが欲しいと思いますが、何が起こっているのか、また何が起こっているのかを見ることができます。

マシンにアクセスできない場合は、同じWindowsビルドのVMを使用して問題を再現するか、少なくとも検討する必要があります。あるいは、クラッシュダンプをこの機械。

関連する問題