Почему затирается часть массива в Си?
void get_disks(char * allDisks[])
{
  char buf[128];
  ...
  for (char *s = buf; *s; s += strlen(s) + 1)
  {
      ...
      allDisks[i] = s;
      ...
      allDisks[7] = "ABC";
      allDisks[8] = "DEF";
  }
}
После прохождения массива функцией get_files список дисков исчезает, но "ABC" и "DEF" остаются.
Подскажите, почему так происходит, куда теряются первые строки и как исправить?
Так происходит потому что ты кладёшь в allDisks указатели на стековый массив buf, который разрушается после выхода из функции get_disks. А строчки "ABC" и "DEF" -- константные строчки, существуют всё время выполнения программы.
Исправить можно, например, выделив память для строчек, которые записываются в allDisks:void get_disks(char * allDisks[])
{
  char buf[128];
  int i = 0;

  GetLogicalDriveStringsA(sizeof(buf), buf);
  for (char *s = buf; *s; s += strlen(s) + 1)
  {
    if (GetDriveTypeA(s) == 2 || GetDriveTypeA(s) == 3)
    {
      allDisks[i] = strdup(s);
      ++i;

      allDisks[7] = "ABC";
      allDisks[8] = "DEF";
    }
  }
}
allDisks[i] = s;
здесь вы присваиваете переменной указатель на кусок памяти находящейся в переменнойchar buf[128];
,а эта переменная является локальной автоматической в функции, и после выхода этот кусок памяти переиспользуется программой.
Как исправить: здесьallDisks[i] = s;
создавать копию строки. Или использовать статический буфер. Точнее не подскажу, давно не работал с Си.