Ejemplo n.º 1
0
        [System.Security.SecurityCritical]  // auto-generated
        private static unsafe ulong MemFreeAfterAddress(void * address, ulong size)
        {
            if (size >= TopOfMemory)
                return 0;

            ulong largestFreeRegion = 0;
            Win32Native.MEMORY_BASIC_INFORMATION memInfo = new Win32Native.MEMORY_BASIC_INFORMATION();
            UIntPtr sizeOfMemInfo = (UIntPtr) Marshal.SizeOf(memInfo);
            
            while (((ulong)address) + size < TopOfMemory) {
                UIntPtr r = Win32Native.VirtualQuery(address, ref memInfo, sizeOfMemInfo);
                if (r == UIntPtr.Zero)
                    __Error.WinIOError();

                ulong regionSize = memInfo.RegionSize.ToUInt64();
                if (memInfo.State == Win32Native.MEM_FREE) {
                    if (regionSize >= size)
                        return regionSize;
                    else
                        largestFreeRegion = Math.Max(largestFreeRegion, regionSize);
                }
                address = (void *) ((ulong) address + regionSize);
            }
            return largestFreeRegion;
        }
 private static unsafe ulong MemFreeAfterAddress(void* address, ulong size)
 {
     if (size >= TopOfMemory)
     {
         return 0L;
     }
     ulong num = 0L;
     Win32Native.MEMORY_BASIC_INFORMATION structure = new Win32Native.MEMORY_BASIC_INFORMATION();
     IntPtr sizeOfBuffer = (IntPtr) Marshal.SizeOf(structure);
     while ((((ulong) address) + size) < TopOfMemory)
     {
         if (Win32Native.VirtualQuery(address, ref structure, sizeOfBuffer) == IntPtr.Zero)
         {
             __Error.WinIOError();
         }
         ulong num2 = structure.RegionSize.ToUInt64();
         if (structure.State == 0x10000)
         {
             if (num2 >= size)
             {
                 return num2;
             }
             num = Math.Max(num, num2);
         }
         address = (void*) (((ulong) address) + num2);
     }
     return num;
 }