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);
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); }
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); } }