Где находится отметка времени в файле?Хотите изменить его с помощью сборки - PullRequest
0 голосов
/ 25 июня 2019

Двадцать лет назад, когда я проходил сборочный курс, профессор раздавал раздаточный материал, в котором было указание, где находится отметка времени файла. С этой информацией я смог изменить метку времени файлов. Двадцать лет спустя это знание и раздаточный материал исчезли. Не могу вспомнить, какую систему Windows я использовал, может быть, XP?

Теперь я хотел бы изменить отметку времени для нескольких файлов (я использую Windows 10). Я искал в сети и нашел несколько утилит и других способов сделать это, но не сборку. Я не могу найти информацию о том, как изменить метку времени в сборке. Кто-нибудь может помочь? Где отметка времени в файле?

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

Где находится отметка времени в файле?

Это не в данных файла. Именно в метаданных файловая система ассоциируется с файлом. Например, для файловых систем FAT это находится в записи каталога файла (структура на диске, которая содержит имя файла, его размер, где находится первый кластер данных файла на диске и т. Д.). Чтобы быть более конкретным, люди должны точно знать, какая это файловая система.

Чтобы изменить метку времени в сборке, вам нужно знать, какую метку времени вы хотите изменить (для большинства "Unix-подобных" систем есть три метки времени - время создания, время доступа и время модификации) и, возможно, как вы хотите изменить отметку времени (установка времени доступа или времени изменения на «сейчас» может быть сделано путем доступа / изменения данных файла); и в какой среде будет работать ваш код.

Например:

a) если ваш код выполняется на компьютере 80x86 с доступом к службам BIOS, вам потребуется написать собственный код для обработки любого разбиения на устройстве, а также прочитать и проанализировать структуры файловой системы (записи каталога, так далее); использование сервисов BIOS для чтения / записи сырых секторов диска.

b) если ваш код работает на голом сервере ARM с доступом к сервисам UEFI, то вам нужно будет написать собственный код для чтения и анализа структур файловой системы (записей каталогов и т. Д.); использование сервисов UEFI для чтения / записи необработанных секторов тома.

в) если вы работаете в среде, похожей на Linux (включая WSL в Windows), вы, вероятно, в конечном итоге либо будете использовать функции в общей библиотеке (open(), read(), write(), если Вы хотите установить время доступа и / или время модификации на «сейчас»); функция в разделяемой библиотеке (utimes(), если вы хотите изменить время модификации или время доступа на что-либо, отличное от «сейчас»); или, может быть, вообще не в состоянии это сделать (если вы хотите изменить время создания на что-то иное, чем «сейчас»).

d) если вы работаете в среде, подобной Windows (включая Wine в ОС на базе Linux), вы, вероятно, в конечном итоге либо будете использовать функции в динамически связанной библиотеке (open(), read(), write(), если вы хотите установить время доступа и / или время модификации на «сейчас»); или одна функция в динамически связанной библиотеке (SetFileTime(), если вы хотите изменить время создания, время изменения или время доступа).

e) если вы работаете на процессоре MIPS, встроенном в Ethernet-маршрутизатор, и хотите использовать сеть для изменения временных меток файла на «общей папке Windows» удаленного компьютера, то вам, вероятно, потребуется изучить много о том, как управлять оборудованием маршрутизатора (как отправлять / получать данные с использованием портов Ethernet), а также много о протоколах SMB и CIFS; и вы, вероятно, не сможете ничего сделать, кроме как изменить время доступа к файлу или время изменения на «сейчас».

2 голосов
/ 25 июня 2019

В раздаточном материале, который вы получили, могли содержаться сведения о том, как получить метку времени для данного файла, как это хранится в структуре каталогов файловой системы (FAT).Я предполагаю, что вам это не нужно.

Кроме этого, вы хотите использовать API, предоставляемый Windows, чтобы получить дескриптор файла, а затем изменить его временную метку.

Если вы хотите хорошую отправную точку, посмотрите на SIB: Small is Beautiful стартовый набор ;Вы можете [скачать его ZIP-архив напрямую] [SIPzip].Это законченное 32-разрядное приложение для Windows, написанное на ассемблере.

Сборка не особо особенная: вы можете написать минимальную программу на C, которая делает то, что вам нужно, а затем проверить вывод ее списка сборки, чтобы понять, что для этого нужно.напишите такую ​​сборку, и затем вы можете повторить ее с нуля в сборке.

В Windows низкоуровневым API-интерфейсом пользователя является полудокументированный ntdll.dll .Ваше крошечное приложение будет ссылаться на эту dll (и, возможно, kernel32.dll) и вызывать ее функции для выполнения желаемых манипуляций.Эти вызовы представляют собой тонкую оболочку для файлового API в режиме ядра, так что это максимально близко к ядру, которое вы получаете без написания фактического кода драйвера.

API, которые вам нужны, это NtOpenFile дляоткройте файл, NtQueryInformationFile и NtSetInformationFile с FileBasicInformation типом информационного класса и FILE_BASIC_INFORMATION структурой и, наконец,NtClose для освобождения дескриптора.

Это структура FILE_BASIC_INFORMATION, которая содержит штампы файлов, которые вы хотите изменить.

Так каквы делаете вещи на очень низком уровне, удобство библиотеки времени выполнения C не будет доступно, если вы не будете связываться с ней и использовать ее явно.Поэтому лучше начать с C, заставить его работать, а затем начать уменьшать его на пути к сборке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...