Исследование системы составления расписания

Статическое исследование вспомогательных файлов и технологий§

Исследована папка DB/1_sem_2026_2027. Исходные файлы только читались. Reorder.EXE не запускался. Выводы разделены на непосредственно установленные факты и интерпретации. Этот материал дополняет разбор таблиц .DB и скриншотов, а не заменяет его.

1. Устройство набора файлов§

В папке семестра 65 файлов: 19 .DB, 19 .PX, шесть пар вторичных индексов .XG0/.YG0 или .XG1/.YG1, пять .dat, пять .sch, по одному .FAM, .TV, .VAL, .INI и .EXE. Еще два файла блокировки, PARADOX.LCK и PDOXUSRS.LCK, находятся на уровень выше, непосредственно в DB/. Итого в предоставленной папке DB и ее папке семестра — 67 файлов.

Это характерный набор файлов табличной БД Paradox. Здесь один .DB соответствует одной таблице, а не всей базе целиком. Первичные и вторичные индексы лежат отдельно. Дополнительные расширения имеют стандартные роли:

Расширение Роль Значение для веб-интерфейса
.DB Записи и описание полей одной таблицы Основной источник данных
.PX Первичный индекс Может помочь чтению и контролю ключей, не является отдельным справочником
.XGN, .YGN Парные файлы составного вторичного индекса Обслуживают поиск/сортировку старого приложения
.FAM Перечень связанных файлов семейства таблицы Метаданные окружения
.TV Настройки табличного представления Оформление/просмотр в среде Paradox
.VAL Проверки допустимости значений Метаданные правил, их нужно учитывать при восстановлении схемы

Назначение расширений подтверждает руководство Corel WordPerfect Office 2002, раздел Paradox 10, печатная страница 748. Там эти дополнительные файлы отнесены к автоматически создаваемым файлам таблицы, которые не следует редактировать напрямую. Конкретное содержание предоставленных файлов разобрано ниже.

2. .dat и .sch: обменные текстовые таблицы§

Пять пар имеют одинаковое базовое имя: chairs, groups, rooms, subjects, teachers. .dat содержит записи фиксированной ширины; .sch задает поля, длину и начальное смещение. Это схема текстового драйвера семейства BDE. Синтаксис в самих файлах однозначен: [groups], Filetype=Fixed, Field1=GroupName,Char,08,00,00. Здесь .sch — описание структуры текстовой таблицы, а не файл готового расписания.

Каждая строка состоит из полей, дополненных пробелами, и отдельных полей-разделителей Bar1, Bar2 и т. д., содержащих |. Все поля описаны как Char, даже числа. Заканчиваются строки байтами CRLF, весь файл — историческим DOS-маркером EOF 0x1A. Этот последний байт не является записью.

Проверена каждая строка каждого файла: длины совпадают со схемами, все разделители находятся на ожидаемых позициях.

Файл Размер, байт Записей без EOF Ширина записи без CRLF Содержание
chairs.dat 3 389 44 75 Кафедры и привязка к факультету
groups.dat 9 049 348 24 Название группы, курс, факультет, число студентов и подгрупп
rooms.dat 4 811 185 24 Название аудитории, вместимость, тип
subjects.dat 123 691 1 995 60 Полное и короткое название дисциплины, условное обозначение
teachers.dat 69 332 779 87 Кафедра, имя преподавателя, степень, звание, должность

Точные поля обменных форматов§

В скобках указаны смещение от нуля и длина в байтах. Разделители BarN опущены в списках содержательных полей, но сохранены в машинном отчете.

Схема Поля
chairs.sch ChairNo (0, 6), ChairName (7, 60), FacultyID (68, 6)
groups.sch GroupName (0, 8), Grade (9, 1), FacultyName (11, 6), NStudents (18, 2), NSubgroups (21, 2)
rooms.sch RoomName (0, 16), RoomCap (17, 4), RoomType (22, 1)
subjects.sch SubjectName (0, 40), SubjectSymbol (41, 1), ShortName (43, 16)
teachers.sch ChairNo (0, 6), TeacherName (7, 40), TeacherDegree (48, 12), TeacherTitle (61, 12), TeacherPosition (74, 12)

Схемы показывают исторические ограничения именно этих форматов: имя группы ограничено восемью байтами, дисциплины — сорока, преподавателя — сорока; факультет группы задается текстом, а не внутренним FacultyNo. Нельзя автоматически считать эти ограничения полным описанием полей бинарной .DB.

Обнаруженная потеря кириллицы§

Во всех пяти .dat отсутствуют байты >= 128. Файлы целиком ASCII. В местах русских названий непосредственно записаны символы # (байт 0x23). Например, начало groups.dat: 4041 |1|## |23|3 |; начало teachers.dat содержит ####### #.#. вместо фамилии и инициалов.

Файл Число байтов #
chairs.dat 1 037
groups.dat 1 650
rooms.dat 236
subjects.dat 64 090
teachers.dat 11 539

Это не эффект неверно выбранной кодировки при просмотре. Переключение между CP1251, CP866 и UTF-8 не восстановит исходные слова, потому что букв в файлах уже нет. Причина замены по одному снимку неизвестна: возможны ошибка экспорта, настройка драйвера или иное преобразование. Считать ее намеренным обезличиванием тоже нельзя без подтверждения.

.dat подходят для изучения обменного формата, но не для построения полного современного каталога названий. Для веб-навигации следует извлекать текст из .DB и отдельно сравнить состав записей: совпадение базовых имен не доказывает актуальность текстовой выгрузки. В .dat также отсутствует значительная часть внутренних идентификаторов и связей. Использовать их как готовую резервную копию всех данных нельзя.

3. Служебные файлы§

DBDWORK.INI, 2 байта§

Содержит только 0D 0A, то есть пустую строку. Никаких параметров соединения, пути базы, настройки семестра или учетных данных здесь нет. По характерному имени это может быть файл рабочего каталога Database Desktop, однако содержимое не позволяет доказать, кем он создан.

LOAD.FAM, 240 байт§

Бинарный файл семейства таблицы. Найдены ASCII-строки:

  • CLASSES.TV со смещения 0x96;
  • PHI\SCHEDUNI\CLASSES.TV со смещения 0xA1.

Это ссылки на вспомогательное представление CLASSES, хотя физическое имя самого файла — LOAD.FAM. Такие следы согласуются с копированием/переименованием файлов в истории базы. Точная последовательность операций неизвестна. Файл не является дополнительной таблицей учебной нагрузки. По нему нельзя заключать, что в текущей папке должен существовать LOAD.DB или что он был утрачен.

LOAD.TV, 2 096 байт§

Начинается строкой Borland Standard File. Со смещения 0x22 обнаруживается :WORK:CLASSES.DB, то есть ссылка на таблицу через исторический псевдоним рабочего каталога. Внутри перечислены поля ClassNo, PlanNo, PlanType, EachWeek, OddWeek, DayNo, TimeNo; присутствуют настройки Arial, N(Integer),S- и N(True/False),LT(True)1.

Это подтверждает роль настроек табличного представления: в нем сохранены названия колонок и параметры отображения. Перечень отражает схему на момент создания представления и может отличаться от нынешней Classes.DB. Его нельзя использовать как более авторитетное описание актуальных колонок, чем собственный заголовок таблицы. Файл не содержит самостоятельного набора расписанных занятий.

Groups.VAL, 349 байт§

Файл проверок значений. В бинарном содержимом со смещения 0xCB записан старый путь:

C:\pev\Spora\Schedwin\multi_xml\ngau\new\resttemp.DB

Со смещения 0x11A перечислены поля: GroupNo, GroupName, FacultyNo, NSubgroups, NStudents, StreamNo, CourseNo.

Путь дает сведения о происхождении служебных метаданных и внутреннем имени Schedwin, но не доказывает, что сейчас существует такой каталог или что программа запускается из него. Байтовая структура правил .VAL в этом исследовании не декодировалась. Поэтому обязательность полей, диапазоны, правила lookup и ссылочной целостности нужно устанавливать отдельно; перечисленные имена сами по себе их не раскрывают.

.PX, .XG0/.YG0, .XG1/.YG1§

Регистронезависимая сверка имен показала 18 пар .DB + .PX, одну таблицу ClassesInf.DB без одноименного .PX и один LOAD.PX без LOAD.DB. У ClassesInf.DB в заголовке не объявлен первичный ключ, поэтому отсутствие первичного индекса согласуется с ее структурой. LOAD.PX относится к отдельному историческому семейству вместе с LOAD.TV и LOAD.FAM; одинокий индекс не доказывает потерю таблицы. .PX здесь являются индексами Paradox; ошибочные догадки утилит распознавания формата по короткой сигнатуре не делают их изображениями.

Парные вторичные индексы представлены для STREAMS, TEACHERS, GROUPS, GRPPLAN и двумя парами для Classes. Они расшифрованы отдельно в research/indexes-analysis.md; все шесть наборов индексных значений сопоставлены с текущими .DB.

DB/PARADOX.LCK и DB/PDOXUSRS.LCK§

Эти файлы существуют во внешнем каталоге DB/, а не внутри 1_sem_2026_2027. Они относятся к протоколу блокировок и совместного доступа Paradox/BDE. В .LCK хранятся сведения о блокировках каталога/таблиц; сетевой координационный файл PDOXUSRS.NET — отдельный файл, который в переданном наборе не найден. Назначение подтверждает архивная документация Borland на сайте Embarcadero: BDE and Database Desktop Locking Protocol.

Файл Размер Установленное содержимое
DB/PARADOX.LCK 110 байт Заголовок 23 00 00 02, строка a newer file format со смещения 0x0C; остальная часть преимущественно нулевая
DB/PDOXUSRS.LCK 21 504 байта Такой же начальный заголовок, строка E:\LOCK\ со смещения 0x6E, далее имена таблиц и бинарные служебные структуры

В PDOXUSRS.LCK со смещения 0x40C через 20 байт идут имена: PARADOX, PLAN, CLASSES, ROOMS, COURSES, STREAMS, CLASSE~1, CHAIRS, FACULTY, GROUPS, SUBJECTS, PLANITEM, GRPPLAN, TEACHERS, TIMES, ROOMRSTR, TCHRRSTR. CLASSE~1 — короткое имя DOS; однозначно сопоставлять его конкретному длинному имени без карты имен файлов нельзя.

Строка E:\LOCK\ согласуется с сохраненной ссылкой на каталог сетевой координации. Это значение из исторического снимка, а не проверенный действующий путь. Локально сохраненное в DFM утилиты значение C:\ может меняться при запуске и не обязано совпадать с ним. Подробности роли каталога объясняет официальное описание TSession.NetFileDir.

Наличие .LCK в копии не доказывает, что приложение сейчас запущено, что база повреждена или что именно эти блокировки активны. Список открытых пользователей и актуальное владение блокировками не декодировались; для этого требуется исходное работающее окружение. Удаление или изменение .LCK в исследовании не выполнялось. Для веб-просмотрщика это служебные файлы, не источник расписания.

4. Reorder.EXE: что удалось выяснить без запуска§

Формат и технология§

Файл размером 622 592 байта — 32-разрядное графическое приложение Windows x86. Заголовок: MZ, смещение PE-заголовка 0x100, сигнатура PE\0\0, Machine = 0x014C, OptionalHeader.Magic = 0x010B, Subsystem = 2, восемь секций. Значения интерпретированы по официальной спецификации Microsoft PE/COFF.

Внутри непосредственно обнаружены:

Доказательство Смещение в файле Вывод
SOFTWARE\Borland\Delphi\RTL 0x2280 Среда выполнения Delphi
Portions Copyright (c) 1983,99 Borland 0x2FF3 Встроенные библиотеки Borland
TForm, TNotebook, TSpeedButton, TBitBtn RTTI и ресурсы Графический интерфейс VCL
TDataSet, TTable, TQuery, TDatabase, TBDEDataSet RTTI и ресурсы Компоненты доступа к БД семейства Delphi/BDE
idapi32.DLL, Software\Borland\Database Engine 0x823B6, 0x8241A Зависимость от Borland Database Engine
TDatabase.DriverName = STANDARD DFM формы MainForm Локальный стандартный драйвер BDE
TTable.TableName = CLASSES.DB, другие .DB DFM формы MainForm Доступ к таблицам предоставленного приложения

Совокупность признаков уверенно указывает на Delphi/VCL/BDE; наиболее вероятный язык исходников — Object Pascal. Точный релиз компилятора не установлен. VCL также использовалась C++Builder, поэтому одна строка TForm сама по себе не была бы достаточным доказательством языка. Сведения о технологии основного приложения пока опираются на общий формат данных, внешний вид и эту связанную утилиту: сам основной исполняемый файл в исследуемой папке отсутствует.

В COFF указан timestamp 708992537, который формально соответствует 1992-06-19T22:22:17Z. Он не годится для датировки реальной сборки: этому противоречит присутствующая строка copyright 1999 и признаки Delphi. Дату разработки приложения по этому полю не утверждаем.

Восстановленные формы§

Из секции ресурсов разобраны три бинарных DFM-потока с сигнатурой TPF0:

Форма Смещение начала потока Назначение
TLoginDialog / LoginDialog 0x95D44 Стандартная форма входа в БД
TMainForm / MainForm 0x961B8 Основная форма утилиты
TPasswordDialog / PasswordDialog 0x97A28 Стандартная форма работы с паролями

Наличие библиотечных диалогов входа и пароля не доказывает наличие пользовательских ролей, авторизации сотрудников или защиты конкретной базы паролем. Такие ресурсы могли быть скомпонованы вместе с библиотеками.

Заголовок основной формы — «Перестановка групп». В ней есть стартовая страница с кнопками «Группы» и «Аудитории», страница со списком TListBox с MultiSelect = True, кнопки вверх/вниз и «Сохранить». Извлечены имена обработчиков: FormCreate, GroupsButtonClick, RoomsButtonClick, ListBoxClick, UpButtonClick, DownButtonClick, SaveButtonClick.

Это позволяет обоснованно отнести утилиту к изменению порядка групп и аудиторий. Возможность выделения нескольких элементов и управление стрелками прямо видны в форме. Точный алгоритм сохранения, устойчивость к сбоям и соответствие поведению основной программы без выполнения или полноценной дизассемблировки не проверялись.

Какие таблицы затрагивает утилита§

Компонент Файл Сохраненные в форме поля
ClassesTable CLASSES.DB GroupNo, RoomNo
GrpPlanTable GRPPLAN.DB GroupNo, Subgroup, PlanNo
GroupsTable GROUPS.DB GroupNo, GroupName, FacultyNo, NSubgroups, NStudents, StreamNo, CourseNo
RoomsTable ROOMS.DB RoomNo, RoomName, RoomCap, RoomSpec, RoomType, RoomMemo, ChairNo
RoomRestrictTable ROOMRSTR.DB RoomNo, Week, DayNo, TimeNo, Reason

Все используют DatabaseName = ScheduniDB, SessionName = Session_1. Есть отдельный компонент TQuery. В DFM TSession.NetFileDir сохранено C:\, а в коде обнаружена строка netpath. Это признаки настраиваемого окружения BDE; значение в ресурсе может заменяться программой при запуске.

Наличие одновременно справочников и ссылающихся на них полей расписания позволяет предположить, что перестановка сопровождается перенумерацией ключей и обновлением связей, а не только изменением визуального порядка. Это интерпретация, не доказанный результат выполнения. Дополнительно в EXE по смещению 0x806F8 присутствует SQL-строка delete from Rooms. Следовательно, утилиту нельзя использовать как нейтральный просмотрщик или автоматически запускать на единственном экземпляре базы: ее назначение включает запись. Предоставленную копию мы не запускали и не изменяли.

5. Выводы для небольшого веб-интерфейса§

Предпочтительная архитектура навигатора: читать .DB в отдельный нормализованный снимок JSON/SQLite, а веб-странице давать UTF-8 и привычные таблицы/фильтры. На первом этапе это чтение и проверка, без обратной записи в старые файлы. Подключение браузера напрямую к Paradox невозможно стандартным способом: нужен конвертер или серверный слой.

Это позволяет показывать сведения независимо от установки BDE, сохраняя исходники для сравнения. Для чтения бинарных таблиц не следует подменять данные содержимым .dat: в нем уже утеряна кириллица. .TV и .FAM можно описать в файловом навигаторе как служебные, а не отображать как обычные бизнес-таблицы.

Если понадобится настоящий редактор, сначала нужно установить ключи, отношения, правила .VAL, индексные поля и семантику полей расписания. Пример Reorder.EXE показывает, почему визуально простое перемещение группы может требовать изменений в нескольких таблицах. Возможны два направления: отдельный Windows-посредник, который пишет через совместимый BDE и оригинальные правила; либо перенос данных и функционала в современную БД с новым редактором. Выбор требует проверки основного приложения и сценариев сохранения.

Embarcadero официально помечает BDE как устаревшую технологию без развития, поддержки Unicode и нативной 64-битной версии. Это причина не делать BDE основой нового веб-сервиса; отдельный старый 32-битный мост для совместимости — другой сценарий. Источник: Using BDE Index — RAD Studio. Это утверждение о технологии, а не результат проверки совместимости конкретного EXE с Windows 10/11.

6. Воспроизводимость и границы§

  • research/inspect_auxiliary.py — скрипт стандартной библиотеки Python: читает .dat/.sch, проверяет длины/разделители и извлекает DFM из известных смещений конкретного Reorder.EXE. Не загружает EXE как программу.
  • research/auxiliary-evidence.json — SHA-256 исследованного EXE, полностью разобранные свойства трех форм, поля и результаты проверки пяти текстовых таблиц. Бинарные картинки кнопок заменены длиной и SHA-256.
  • Все смещения в этом документе относятся к текущему файлу Reorder.EXE; для другой версии требуется повторное исследование.
  • Работа основного планировщика, транзакции, скрытые бизнес-правила, реальное использование паролей и обработчики кнопок динамически не проверялись. Исторические абсолютные пути и timestamp не принимаются за актуальные настройки.

Для дальнейшей проверки полезны основной .exe и его папка установки, сведения из окна «О программе», пример успешного открытия этой копии в Windows, а также ожидаемые сценарии изменения расписания. Исходный код Delphi, если сохранился, существенно упростит восстановление правил и безопасное редактирование.