Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为VirtualAlloc制作PInvoke安全手柄_C#_.net_Pinvoke - Fatal编程技术网

C# 如何为VirtualAlloc制作PInvoke安全手柄

C# 如何为VirtualAlloc制作PInvoke安全手柄,c#,.net,pinvoke,C#,.net,Pinvoke,我正在想办法让我的VirtualAlloc pinvoke签名返回PageAlignedBuffer。我遇到的问题是,我不能拥有默认构造函数,因为VirtualFree方法需要知道缓冲区大小,所以我必须在构造函数中提供它。出于这个原因,我采用了下面的方法,只是从构造函数中调用VirtualAlloc 有没有人想办法让我从pinvoke调用返回PageAlignedBuffer?如果不是,这是一个好的解决方案,您认为它有任何安全或内存泄漏问题吗?谢谢 [SecurityCritical] publ

我正在想办法让我的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);
    }
}

我认为在
releasehold
中调用
VirtualFree
时,
dwSize
应该超过零:

如果dwFreeType参数为MEM_RELEASE,则此参数必须为0 (零)。该函数用于释放在中保留的整个区域 对VirtualAlloc的初始分配调用


因此,您不需要存储
\u bufferSize
,但仍然需要从
SafeBuffer
派生类,因为
SafeBuffer
是一个抽象类,它要求您在派生类中实现
releasehold
,以处理特定的资源类型。这样,您的
PageAlignedBuffer
就是一个托管类,您就不能让
VirtualAlloc
API返回它的实例或强制转换指向它的非托管指针。因此,您的其余代码对我来说很好。

我认为当您在
releaseholder
中调用
VirtualFree
时,您应该将
dwSize
的值传递为零:

如果dwFreeType参数为MEM_RELEASE,则此参数必须为0 (零)。该函数用于释放在中保留的整个区域 对VirtualAlloc的初始分配调用

因此,您不需要存储
\u bufferSize
,但仍然需要从
SafeBuffer
派生类,因为
SafeBuffer
是一个抽象类,它要求您在派生类中实现
releasehold
,以处理特定的资源类型。这样,您的
PageAlignedBuffer
就是一个托管类,您就不能让
VirtualAlloc
API返回它的实例或强制转换指向它的非托管指针。所以,我觉得你剩下的代码不错