Статическое исследование вспомогательных файлов и технологий§
Исследована папка 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, если сохранился, существенно упростит восстановление правил и безопасное редактирование.