|
2008/03/12(Wed) 01:37:59 編集(投稿者)
> が、例示されたアドレス 0x0175000 はかなりアドレスが若いので、.NET ではごく小規模なアプリケーションでもメモリがマップされていて、読み取りエラーを起こすのは困難なようです。 先の発言は、例示されたアドレスやアンマネージコード・マネージコード関係なしに、メモリアクセス保護違反は.NET FrameworkのAccessViolationに変換されるのではないかという意図です。 細かい原理等まで追ったわけではないので、私の目に見えてない要素が働いているかもしれませんが…。 (もちろん、完全なフォローがされるわけではないとみられるので、起こす術はあるかもしれません)
パターン1:Marshal.Copy ※IntPtr.ZeroでArgumentNullExceptionを投げるので1にする。 byte[] buffer = new byte[100]; Marshal.Copy(buffer, 0, new IntPtr(1), 100);
System.AccessViolationException: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 場所 System.Runtime.InteropServices.Marshal.CopyToNative(Object source, Int32 startIndex, IntPtr destination, Int32 length) 場所 WindowsApplication1.Form1.Form1_Load(Object sender, EventArgs e)
パターン2:CopyMemory [DllImport("kernel32.dll")] private static extern void CopyMemory(IntPtr destination, IntPtr source, int size); private void Form1_Load(object sender, EventArgs e) { IntPtr test = Marshal.AllocHGlobal(100); CopyMemory(IntPtr.Zero, test, 100); Marshal.FreeHGlobal(test); }
System.AccessViolationException: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 場所 WindowsApplication1.Form1.CopyMemory(IntPtr destination, IntPtr source, Int32 size) 場所 WindowsApplication1.Form1.Form1_Load(Object sender, EventArgs e)
.NET Frameworkの例外ダイアログ(継続 or 終了)が出てしまうので、質問者が意図しているダイアログにはたどり着かないのではないかと考えています。
|