#define let void

#define str_eq(a, b) ( !strcmp (a, b) )
#define ENUMEA_GET_ALL_ATTRS ((ULONG) -1)
#define FIL_SETEASFROMLIST 2

// ─── Сбрасывает расширенный атрибут файла ───

let DiscardEA (PCHAR File_name, PCHAR Attr_name)
{
  // Узнаём число и названия атрибутов.
  PGEA2LIST Descriptions = NULL; ULONG Descriptions_size = 4096;

  DosAllocMem ((PPVOID) &Descriptions, Descriptions_size, PAG_ALLOCATE);

  ULONG Counter = ENUMEA_GET_ALL_ATTRS;

  DosEnumAttribute (ENUMEA_REFTYPE_PATH, File_name, 1,
                    Descriptions, Descriptions_size, &Counter, ENUMEA_LEVEL_NO_VALUE);

  if (Counter) 
  {
    INT Name_length = strlen (Attr_name);

    // Структуры имеют разную длину, поэтому выполняем поиск строки.
    BYTE Success = 0; PBYTE Byte = (PBYTE) Descriptions;

    INT Limit = Descriptions_size - Name_length - 1;

    for (INT Cntr = 0; Cntr < Limit; Cntr ++)
    {
      if (str_eq (&Byte[Cntr], Attr_name)) { Success = 1; break; }
    }

    // Если название найдено:
    if (Success) 
    {
      PGEA2LIST InputData = NULL; PFEA2LIST OutputData = NULL; LONG Data_size = 16384;

      // Узнаём значение.
      DosAllocMem ((PPVOID) &InputData, Data_size, PAG_ALLOCATE);
      DosAllocMem ((PPVOID) &OutputData, Data_size, PAG_ALLOCATE);

      {
        bzero (InputData, Data_size);
        strcpy (InputData->list[0].szName, Attr_name);
        InputData->list[0].cbName = (BYTE) Name_length;
        InputData->cbList = sizeof (GEA2LIST) + Name_length + 1;

        bzero (OutputData, Data_size);
        OutputData->cbList = Data_size;
      }

      // Получаем значение.
      {
        EAOP2 Reference = { InputData, OutputData, 0 };

        DosQueryPathInfo (File_name, FIL_QUERYEASFROMLIST, &Reference, sizeof (Reference));
      }

      // Если оно было получено:
      {
        if (OutputData->cbList) 
        {
          // Делаем длину значения равной нулю.
          OutputData->list[0].cbValue = 0;

          // Сохраняем атрибут.
          {
            EAOP2 Reference = { InputData, OutputData, 0 };

            DosSetPathInfo (File_name, FIL_SETEASFROMLIST, &Reference, sizeof (Reference), 0);
          }
        }
      }

      DosFreeMem (InputData);
      DosFreeMem (OutputData);
    }
    else
    {
      ;
    }
  }
  else
  {
    ;
  }

;

  DosFreeMem (Descriptions);
}