Hola, espero esto te sirva y para la parte del espacio libre busca sobre la función GetFreeSpace.
Código Delphi
[-]
var
drive:Char;
tipo:Integer;
begin
for drive:= 'A' to 'Z' do
begin
tipo := GetDriveType(PChar(drive+':\'));
if tipo=DRIVE_FIXED then
ListBox1.Items.Add(drive+':\');
end;
end;
Saluditos