public static int GetBytesPerSector(SafeFileHandle hDevice) { long size; DISK_GEOMETRY diskGeometry = GetDiskGeometryAndSize(hDevice, out size); return((int)diskGeometry.BytesPerSector); }
public static DISK_GEOMETRY GetDiskGeometryAndSize(SafeFileHandle hDevice, out long diskSize) { if (Environment.OSVersion.Version >= new Version(5, 1, 0, 0)) { // XP and upward DISK_GEOMETRY_EX diskGeometryEx = GetDiskGeometryEx(hDevice); diskSize = diskGeometryEx.DiskSize; return(diskGeometryEx.Geometry); } else { // Windows 2000 DISK_GEOMETRY diskGeometry = GetDiskGeometry(hDevice); diskSize = GetPartitionSize(hDevice); return(diskGeometry); } }
/// <summary> /// Supported on Windows 2000 /// </summary> public static DISK_GEOMETRY GetDiskGeometry(SafeFileHandle hDevice) { uint dummy; DISK_GEOMETRY diskGeometry = new DISK_GEOMETRY(); IntPtr lpOutBuffer = Marshal.AllocHGlobal(Marshal.SizeOf(diskGeometry)); Marshal.StructureToPtr(diskGeometry, lpOutBuffer, false); bool success = DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY, IntPtr.Zero, 0, lpOutBuffer, (uint)Marshal.SizeOf(typeof(DISK_GEOMETRY)), out dummy, IntPtr.Zero); diskGeometry = (DISK_GEOMETRY)Marshal.PtrToStructure(lpOutBuffer, typeof(DISK_GEOMETRY)); Marshal.FreeHGlobal(lpOutBuffer); if (!success) { throw new IOException("Unable to retrieve disk geometry"); } return(diskGeometry); }
private void PopulateDiskInfo() { bool releaseHandle; SafeFileHandle handle = PhysicalDiskHandlePool.ObtainHandle(m_physicalDiskIndex, FileAccess.Read, ShareMode.ReadWrite, out releaseHandle); if (!handle.IsInvalid) { if (!PhysicalDiskControl.IsMediaAccesible(handle)) { throw new DeviceNotReadyException(); } DISK_GEOMETRY diskGeometry = PhysicalDiskControl.GetDiskGeometryAndSize(handle, out m_size); if (releaseHandle) { PhysicalDiskHandlePool.ReleaseHandle(m_physicalDiskIndex); } m_bytesPerSector = (int)diskGeometry.BytesPerSector; // CHS: m_cylinders = diskGeometry.Cylinders; m_tracksPerCylinder = (int)diskGeometry.TracksPerCylinder; m_sectorsPerTrack = (int)diskGeometry.SectorsPerTrack; } else { // we always release invalid handle PhysicalDiskHandlePool.ReleaseHandle(m_physicalDiskIndex); // get error code and throw int errorCode = Marshal.GetLastWin32Error(); string message = String.Format("Failed to access disk {0}.", m_physicalDiskIndex); if (errorCode == (int)Win32Error.ERROR_FILE_NOT_FOUND) { throw new DriveNotFoundException(message); } else { IOExceptionHelper.ThrowIOError(errorCode, message); } } }