Ejemplo n.º 1
0
 public static extern Boolean DeviceIoControl(
     SafeFileHandle hDevice,
     uint dwIoControlCode,
     ref STORAGE_PROPERTY_QUERY InBuffer,
     int nInBufferSize,
     ref STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR OutBuffer,
     int nOutBufferSize,
     ref int pBytesReturned,
     IntPtr lpOverlapped);
Ejemplo n.º 2
0
        public StorageAccessAlignment GetAlignment(SafeHandle hDevice)
        {
            StorageAccessAlignment alignment = new StorageAccessAlignment();

            SafeAllocHandle <STORAGE_PROPERTY_QUERY> storagePropertyQueryPtr          = null;
            SafeAllocHandle <STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR> storageAlignmentPtr = null;

            try {
                STORAGE_PROPERTY_QUERY storagePropertyQuery = new STORAGE_PROPERTY_QUERY {
                    PropertyId = (uint)STORAGE_PROPERTY_ID.StorageAccessAlignmentProperty,
                    QueryType  = (uint)STORAGE_QUERY_TYPE.PropertyStandardQuery
                };
                storagePropertyQueryPtr = new SafeAllocHandle <STORAGE_PROPERTY_QUERY>(storagePropertyQuery);
                storageAlignmentPtr     = new SafeAllocHandle <STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR>();
                bool success = DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
                                               storagePropertyQueryPtr, storagePropertyQueryPtr.SizeOf,
                                               storageAlignmentPtr, storageAlignmentPtr.SizeOf,
                                               out uint bytesReturns, IntPtr.Zero);
                if (!success || bytesReturns == 0)
                {
                    // Windows XP returns success, byte bytesReturns == 0.
                    m_Win32Error = Marshal.GetLastWin32Error();
                    return(null);
                }

                STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR storageAlignment = storageAlignmentPtr.ToStructure();
                alignment.BytesPerCacheLine             = (int)storageAlignment.BytesPerCacheLine;
                alignment.BytesOffsetForCacheAlignment  = (int)storageAlignment.BytesOffsetForCacheAlignment;
                alignment.BytesPerLogicalSector         = (int)storageAlignment.BytesPerLogicalSector;
                alignment.BytesPerPhysicalSector        = (int)storageAlignment.BytesPerPhysicalSector;
                alignment.BytesOffsetForSectorAlignment = (int)storageAlignment.BytesOffsetForSectorAlignment;
            } finally {
                if (storagePropertyQueryPtr != null)
                {
                    storagePropertyQueryPtr.Close();
                }
                if (storageAlignmentPtr != null)
                {
                    storageAlignmentPtr.Close();
                }
            }

            return(alignment);
        }
Ejemplo n.º 3
0
        public UInt32 GetPhysicalSectors(string drive)
        {
            short FILE_ATTRIBUTE_NORMAL = 0x80;
            short INVALID_HANDLE_VALUE  = -1;
            uint  GENERIC_READ          = 0x80000000;
            uint  GENERIC_WRITE         = 0x40000000;
            uint  CREATE_NEW            = 1;
            uint  CREATE_ALWAYS         = 2;
            uint  OPEN_EXISTING         = 3;

            SafeFileHandle handleValue = CreateFile(drive, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

            if (handleValue.IsInvalid)
            {
                //Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                return(0);
            }
            uint IOCTL_STORAGE_QUERY_PROPERTY   = 0x002d1400;
            STORAGE_PROPERTY_QUERY storageQuery = new STORAGE_PROPERTY_QUERY();

            storageQuery.PropertyId = STORAGE_PROPERTY_QUERY.STORAGE_PROPERTY_ID.StorageAccessAlignmentProperty;
            storageQuery.QueryType  = STORAGE_PROPERTY_QUERY.STORAGE_QUERY_TYPE.PropertyStandardQuery;
            STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR diskAlignment = new STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR();

            Int32 read = 0;

            if (DeviceIoControl(handleValue, IOCTL_STORAGE_QUERY_PROPERTY, ref storageQuery, Marshal.SizeOf(storageQuery), ref diskAlignment, Marshal.SizeOf(diskAlignment), ref read, IntPtr.Zero))
            {
                handleValue.Close();
                return(diskAlignment.BytesPerPhysicalSector);
            }
            else
            {
                handleValue.Close();
                return(0);
            }
        }