DeviceIOControlLib.Wrapper.DiskDeviceWrapper.DiskGetDriveGeometryEx C# (CSharp) Method

DiskGetDriveGeometryEx() public method

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365171(v=vs.85).aspx
public DiskGetDriveGeometryEx ( ) : DISK_GEOMETRY_EX
return DeviceIOControlLib.Objects.Disk.DISK_GEOMETRY_EX
        public DISK_GEOMETRY_EX DiskGetDriveGeometryEx()
        {
            byte[] data = DeviceIoControlHelper.InvokeIoControlUnknownSize(Handle, IOControlCode.DiskGetDriveGeometryEx, 256);

            DISK_GEOMETRY_EX res;

            using (UnmanagedMemory mem = new UnmanagedMemory(data))
            {
                res.Geometry = mem.Handle.ToStructure<DISK_GEOMETRY>();
                res.DiskSize = BitConverter.ToInt64(data, (int)MarshalHelper.SizeOf<DISK_GEOMETRY>());

                IntPtr tmpPtr = new IntPtr(mem.Handle.ToInt64() + MarshalHelper.SizeOf<DISK_GEOMETRY>() + sizeof(long));
                res.PartitionInformation = tmpPtr.ToStructure<DISK_PARTITION_INFO>();

                tmpPtr = new IntPtr(tmpPtr.ToInt64() + res.PartitionInformation.SizeOfPartitionInfo);
                res.DiskInt13Info = tmpPtr.ToStructure<DISK_EX_INT13_INFO>();
            }

            return res;
        }

Usage Example

Example #1
0
        private static void ExampleDiskIO()
        {
            const string drive = @"\\.\PhysicalDrive0";

            Console.WriteLine(@"## Exmaple on {0} ##", drive);
            SafeFileHandle hddHandle = CreateFile(drive, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);

            if (hddHandle.IsInvalid)
            {
                int lastError = Marshal.GetLastWin32Error();

                Console.WriteLine(@"!! Invalid {0}; Error ({1}): {2}", drive, lastError, new Win32Exception(lastError).Message);
                Console.WriteLine();
                return;
            }

            using (DiskDeviceWrapper diskIo = new DiskDeviceWrapper(hddHandle, true))
            {
                DISK_GEOMETRY_EX info = diskIo.DiskGetDriveGeometryEx();

                Console.WriteLine("Sector size: " + info.Geometry.BytesPerSector);

                switch (info.PartitionInformation.PartitionStyle)
                {
                    case PartitionStyle.PARTITION_STYLE_MBR:
                        Console.WriteLine("MBR Id: " + info.PartitionInformation.MbrSignature);
                        break;
                    case PartitionStyle.PARTITION_STYLE_GPT:
                        Console.WriteLine("GPT GUID: " + info.PartitionInformation.GptGuidId);
                        break;
                }

                PARTITION_INFORMATION_EX partitionInfo = diskIo.DiskGetPartitionInfoEx();

                Console.WriteLine("Partition style: " + partitionInfo.PartitionStyle);
            }

            Console.WriteLine();
        }