CCCPaste
import ctypes
import string

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

GetLogicalDrives = kernel32.GetLogicalDrives
GetLogicalDrives.restype = ctypes.c_ulong # Dword

GetVolumeInformation = kernel32.GetVolumeInformationW
GetVolumeInformation.argtypes = [
    ctypes.c_wchar_p,  
    ctypes.c_wchar_p,  
    ctypes.c_ulong,    
    ctypes.POINTER(ctypes.c_ulong), 
    ctypes.POINTER(ctypes.c_ulong), 
    ctypes.POINTER(ctypes.c_ulong), 
    ctypes.c_wchar_p,  
    ctypes.c_ulong     
]
GetVolumeInformation.restype = ctypes.c_int 

GetDiskFreeSpace = kernel32.GetDiskFreeSpaceW
GetDiskFreeSpace.argtypes = [
    ctypes.c_wchar_p,  
    ctypes.POINTER(ctypes.c_ulong),  
    ctypes.POINTER(ctypes.c_ulong),  
    ctypes.POINTER(ctypes.c_ulong),  
    ctypes.POINTER(ctypes.c_ulong)   
]
GetDiskFreeSpace.restype = ctypes.c_int # BOOL

def get_drive_info():
    drive_mask = GetLogicalDrives()
    
    print("\n")
    print("╔" + "═" * 63 + "╗")
    print("║     ИНФОРМАЦИЯ О ЛОГИЧЕСКИХ ДИСКАХ КОМПЬЮТЕРА" + " " * 17 + "║")
    print("╚" + "═" * 63 + "╝")
    
    for i, drive_letter in enumerate(string.ascii_uppercase):
        if (drive_mask >> i) & 1:
            root_path = f"{drive_letter}:\\"
            print(f">> Том: {root_path}")

            volume_name_size = 256
            volume_name = ctypes.create_unicode_buffer(volume_name_size)
            serial_number = ctypes.c_ulong()
            max_component_len = ctypes.c_ulong()
            file_system_flags = ctypes.c_ulong()
            file_system_name_size = 256
            file_system_name = ctypes.create_unicode_buffer(file_system_name_size)

            success_vi = GetVolumeInformation(
                root_path,
                volume_name,
                volume_name_size,
                ctypes.byref(serial_number),
                ctypes.byref(max_component_len),
                ctypes.byref(file_system_flags),
                file_system_name,
                file_system_name_size
            )

            if success_vi:
                print(f"  - Имя тома: {volume_name.value}")
                print(f"  - Файловая система: {file_system_name.value}")
                print(f"  - Серийный номер: {serial_number.value:X}")
                print(f"  - Макс. длина компонента: {max_component_len.value} символов")
            else:
                print(f"  - !! Не удалось получить информацию о томе (Код ошибки: {ctypes.get_last_error()}) !!")
            
            sectors_per_cluster = ctypes.c_ulong()
            bytes_per_sector = ctypes.c_ulong()
            free_clusters = ctypes.c_ulong()
            total_clusters = ctypes.c_ulong()

            success_dfs = GetDiskFreeSpace(
                root_path,
                ctypes.byref(sectors_per_cluster),
                ctypes.byref(bytes_per_sector),
                ctypes.byref(free_clusters),
                ctypes.byref(total_clusters)
            )

            if success_dfs:
                bytes_per_cluster = sectors_per_cluster.value * bytes_per_sector.value
                total_space_bytes = total_clusters.value * bytes_per_cluster
                free_space_bytes = free_clusters.value * bytes_per_cluster
                
                def format_bytes(bytes_value):
                    KB = 1024
                    MB = KB * 1024
                    GB = MB * 1024
                    TB = GB * 1024
                    
                    if bytes_value >= TB:
                        return f"{bytes_value / TB:.2f} ТБ"
                    elif bytes_value >= GB:
                        return f"{bytes_value / GB:.2f} ГБ"
                    elif bytes_value >= MB:
                        return f"{bytes_value / MB:.2f} МБ"
                    elif bytes_value >= KB:
                        return f"{bytes_value / KB:.2f} КБ"
                    else:
                        return f"{bytes_value} байт"

                print("  - Статистика дискового пространства:")
                print(f"    - Размер кластера: {format_bytes(bytes_per_cluster)}")
                print(f"    - Общее место: {format_bytes(total_space_bytes)}")
                print(f"    - Свободное место: {format_bytes(free_space_bytes)}")
                print(f"    - Кластеры (Общее/Свободное): {total_clusters.value} / {free_clusters.value}")
            else:
                print(f"  - !! Не удалось получить статистику дискового пространства (Код ошибки: {ctypes.get_last_error()}) !!")
            
            print("-" * 30)

if __name__ == "__main__":
    try:
        get_drive_info()
        print()
        input("Нажмите Enter для выхода...")
    except Exception as e:
        print(f"Критическая ошибка: {e}")
        import traceback
        traceback.print_exc()
        input("Нажмите Enter для выхода...")