質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

Heap32ListFirstが値を返さない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 980

Alpha_1968

score 10

前提・実現したいこと

C# でHeapListを作成したい。

発生している問題・エラーメッセジ

Heap32ListFirstが値を返さない

該当のソースコード

public static Process GetProcessId(string processName){
//System.Diagnostics.Process[] 
ps =System.Diagnostics.Process.GetProcessesByName(processName);
return ps[0];
}

public struct HEAPLIST32
{
public uint dwSize;
public uint th32ProcessID;
public uint th32HeapID;
public uint dwFlags;
}

public const uint TH32CS_SNAPHEAPLIST = 0x00000001;
public const uint TH32CS_SNAPMODULE = 0x00000008;


[DllImport("kernel32.dll", SetLastError = true)]
 internal static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processid);
[DllImport("kernel32.dll")]
        internal static extern bool Heap32ListFirst(IntPtr hSnapshot, ref HEAPLIST32 lphl);

//Main
void getHeapList(){
process = GetProcessId("XXXXX.XXX/*(任意のプロセス名)*/");

IntPtr hModule= CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE, (uint)process.Id);

HEAPLIST32 heaplist = new HEAPLIST32();
heaplist.dwSize = (uint)Marshal.SizeOf(heaplist);

 bool r = Heap32ListFirst(hModule, ref heaplist);
}


r == false Error...
ここでエラーが発生しています。
hModuleは値が戻ってきているので動いていると考えられる。(エラーの場合は-1が戻る)

}

疑問

基本構造は、サンプルを利用したものですが、64bitで動作するのかの情報がほとんどなく、TH32CS_SNAPMODULE を追加してみましたが、同じくエラーが帰ってきます。

補足情報(言語/FW/ツール等のバージョンなど)

Windows10
64bit
C#
64bit アプリとしてBuild

よろしくお願いします。

追記

AnyCpuでBuildすると成功しました。
x64の場合 エラーコード24が出ているようです。

追記

C++のサンプルではDwordのサイズが可変します。

C#の場合uintで宣言した場合、自動的にサイズが切り替わらないので、この部分を考える必要がありました
具体的には、構造体のほうを以下のようにすることで動くようになりました
public struct HEAPLIST32
{
public UInt64 dwSize;
public UInt32 th32ProcessID;
public UInt64 th32HeapID;
public UInt32 dwFlags;
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

C++のサンプルではDWORDのサイズが可変します。

C#
uintで宣言した場合、自動的にサイズが切り替わらないので、この部分を考える必要がありました 
具体的には、構造体のほうを以下のようにすることで動くようになりました 

public struct HEAPLIST32 
{ 
public UInt64 dwSize; 
public UInt64 th32ProcessID; 
public UInt64 th32HeapID; 
public UInt64 dwFlags; 
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/12 14:34

    問題は解決されたようですが、Windows環境C++におけるDWORDは常に32bit幅固定です。

    https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms683449.aspx と照らすと、HEAPLIST32構造体の定義に致命的な問題があります。64bitバイナリでは構造体のサイズは「SIZE_T(64)+DWORD(32)+ULONG_PTR(64)+dwFlags(32)」となります。

    キャンセル

  • 2016/09/13 07:13

    アドバイスありがとうございます。
    ご指摘のように、構造体のサイズを変更しました。
    変更した状態でも正しく動作しました。
    おそらくですが、Marshal.SizeOf(heaplist)が32になっていないとサイズエラーがおきるようです。(32bit環境では16)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る