internal static DiskGeometry GetGeometry(SafeFileHandle handle) { if (handle.IsInvalid) { throw new Win32Exception(6); } var bufPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(DiskGeometry))); try { using (var deviceIoOverlapped = new DeviceIoOverlapped(new ManualResetEvent(false).SafeWaitHandle.DangerousGetHandle())) { int retSize; if (!DeviceIoControl(handle, (int)IOCTL.DiskGetGeometry, IntPtr.Zero, 0, bufPtr, Marshal.SizeOf(typeof(DiskGeometry)), out retSize, deviceIoOverlapped.GlobalOverlapped)) { throw new Win32Exception(Marshal.GetLastWin32Error()); } return((DiskGeometry)Marshal.PtrToStructure(bufPtr, typeof(DiskGeometry))); } } finally { Marshal.FreeHGlobal(bufPtr); } }
public static extern bool GetOverlappedResult( SafeFileHandle hFile, // ファイル、パイプ、通信デバイスのハンドル DeviceIoOverlapped lpOverlapped, // オーバーラップ構造体 out ushort lpNumberOfBytesTransferred, // 転送されたバイト数 bool bWait // 待機オプション );
internal static DiskGeometry GetGeometry(SafeFileHandle handle) { if(handle.IsInvalid) throw new Win32Exception(6); var bufPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(DiskGeometry))); try { using(var deviceIoOverlapped = new DeviceIoOverlapped(new ManualResetEvent(false).SafeWaitHandle.DangerousGetHandle())) { int retSize; if (!DeviceIoControl(handle, (int)IOCTL.DiskGetGeometry, IntPtr.Zero, 0, bufPtr, Marshal.SizeOf(typeof(DiskGeometry)), out retSize, deviceIoOverlapped.GlobalOverlapped)) throw new Win32Exception(Marshal.GetLastWin32Error()); return (DiskGeometry) Marshal.PtrToStructure(bufPtr, typeof(DiskGeometry)); } } finally { Marshal.FreeHGlobal(bufPtr); } }