1

VirtualAlloc の pinvoke 署名で PageAlignedBuffer を返す方法を見つけようとしています。私が抱えている問題は、VirtualFree メソッドがバッファー サイズを知る必要があるため、コンストラクターで提供する必要があるため、既定のコンストラクターを使用できないことです。このため、以下のアプローチを採用し、コンストラクター内から VirtualAlloc を呼び出すだけです。

pinvoke 呼び出しから PageAlignedBuffer を返すことができるように、誰かがこれを回避する方法を知っていますか? そうでない場合、これが問題のない解決策である場合、セキュリティやメモリ リークに関する問題があると思いますか? ありがとう。

[SecurityCritical]
public sealed class PageAlignedBuffer : SafeBuffer
{
    private readonly UIntPtr _bufferSize = UIntPtr.Zero;
    public PageAlignedBuffer(long bufferSize) : base(true)
    {
        _bufferSize = checked ((UIntPtr) bufferSize);
        this.handle = WinAPI.VirtualAlloc(IntPtr.Zero, _bufferSize, AllocationType.RESERVE | AllocationType.COMMIT, MemoryProtection.READWRITE);
    }
    [SecurityCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    protected override bool ReleaseHandle()
    {
        return WinAPI.VirtualFree(this.handle, _bufferSize, FreeType.Release);
    }
}
4

1 に答える 1

1

MSDN に記載されているように、dwSizeを呼び出すときはゼロを渡す必要があると思います。VirtualFreeReleaseHandle

dwFreeType パラメータが MEM_RELEASE の場合、このパラメータは 0 (ゼロ) でなければなりません。この関数は、VirtualAlloc への最初の割り当て呼び出しで予約された領域全体を解放します。

したがって、 を格納する必要はありませんが、特定のリソース タイプを処理するために、派生クラスに実装する必要がある抽象クラスであるため、 から_bufferSizeクラスを派生させる必要があります。このように、あなたはマネージド クラスであり、API にそのインスタンスを返させたり、アンマネージド ポインターをキャストしたりすることはできません。だから、あなたのコードの残りの部分は私には良さそうです。SafeBufferSafeBufferReleaseHandlePageAlignedBufferVirtualAlloc

于 2013-10-06T05:06:41.547 に答える