При маршалинге из неуправляемой памяти в управляемую память " Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена. " Ошибки являются хорошим признаком того, соответствующие разрешения для доступа к ячейке памяти, указанной в данной ячейке указателя.
Это определения, используемые для проверки правильности вашего кода:
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
IntPtr lpInBuffer, uint nInBufferSize,
IntPtr lpOutBuffer, uint nOutBufferSize,
out uint lpBytesReturned, IntPtr lpOverlapped);
(другой код опущен)
IntPtr Handle = CreateFile("\\\\.\\PhysicalDrive0", (EFileAccess)0, EFileShare.Read | EFileShare.Write, IntPtr.Zero, ECreationDisposition.OpenExisting, (EFileAttributes)0, IntPtr.Zero);
var geom = new DiskGeometry();
var geomp = Marshal.AllocHGlobal(Marshal.SizeOf(geom));
uint returnedBytes = 0;
Marshal.StructureToPtr(geom, geomp, false);
if (!DeviceIoControl(Handle, (uint)IOCTL_DISK_GET_DRIVE_GEOMETRY, IntPtr.Zero, 0, geomp,
(uint)Marshal.SizeOf(typeof(DiskGeometry)),
out returnedBytes,
IntPtr.Zero))
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
return;
}
var ob = (DiskGeometry)Marshal.PtrToStructure(geomp, typeof(DiskGeometry));