C# 如何为VirtualAlloc制作PInvoke安全手柄
我正在想办法让我的VirtualAlloc pinvoke签名返回PageAlignedBuffer。我遇到的问题是,我不能拥有默认构造函数,因为VirtualFree方法需要知道缓冲区大小,所以我必须在构造函数中提供它。出于这个原因,我采用了下面的方法,只是从构造函数中调用VirtualAlloc 有没有人想办法让我从pinvoke调用返回PageAlignedBuffer?如果不是,这是一个好的解决方案,您认为它有任何安全或内存泄漏问题吗?谢谢C# 如何为VirtualAlloc制作PInvoke安全手柄,c#,.net,pinvoke,C#,.net,Pinvoke,我正在想办法让我的VirtualAlloc pinvoke签名返回PageAlignedBuffer。我遇到的问题是,我不能拥有默认构造函数,因为VirtualFree方法需要知道缓冲区大小,所以我必须在构造函数中提供它。出于这个原因,我采用了下面的方法,只是从构造函数中调用VirtualAlloc 有没有人想办法让我从pinvoke调用返回PageAlignedBuffer?如果不是,这是一个好的解决方案,您认为它有任何安全或内存泄漏问题吗?谢谢 [SecurityCritical] publ
[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返回它的实例或强制转换指向它的非托管指针。所以,我觉得你剩下的代码不错