![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
Как удалить файл в С++ , не используя ф-цию remove() из стандартной Сишной либы <stdio.h> ?
|
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Это сообщение отредактировал(а) Dem_max - 28.6.2012, 18:26 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
Dem_max, ога
а еще можно: - специфичными OS ф-циями, аля DeleteFile() из WinAPI , или unlink из *nix - посмотреть, как remove был сам имплементирован из stdio - asm ( в целом, относится и к первым двум пунктам ) На АСМ так можно
Хотя, это попса на АСМ, многие понимают, почему PS Dem_max, хотя знаешь... не, не покатит system() из stdlib , надо совсем без Сишных ф-ций Кстати, под Win, если вы компилили программу MS компилером, то в любом случае remove() будет вызывать NtDeleteFile() из Native API в конце, что происходит используя GCC или др., не знаю Это сообщение отредактировал(а) magesi - 28.6.2012, 21:05 |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
А вообще!
Я могу продебагить remove() до системного вызова ( 0x2e или sysenter инструкции ) внутрях ntdll!NtDeleteFile() Если посмотреть, kernel сущность NtDeleteFile() , надо бы раздобыть kernel debugger Короче ntdll.dll!NtDeleteFile() вызывается при remove() на Винде после MS компилера в программе Единственная часть уровеня АСМ ф-ции remove() - это всякие SYSCALL/SYSENTER инструкции, которые зависимы от ОС, и у каждой свои, но это конечно уже далеко, как от Си, так и от Си++ Но это я так по Винде немного покопался, в *nix unlink() копать надо будет Для любитлей boost можно так выпендриться:
Правда, это вызывает в Boost либо тот же remove() из stdio , либо какой-нибудь SYSCALL/SYSENTER сразу без вызова ф-ции stdio или точно также имплементирована, как remove() с вызовом NtDeleteFile() сразу Это сообщение отредактировал(а) magesi - 28.6.2012, 22:20 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
POSIX, не POSIX все равно все к syscall сводится а всякие POSIX/не-POSIX вызовы, это не более, чем формат/способ вызова определенного syscall на определенной OS и не более Добавлено @ 22:50 Но вообще, если еще глубже копнуть, то это зависит от возможностей для работы, которые предоставляют в первую очередь железки, а потом уж разработчики ОС выбирают, что использовать. К примеру, они могут тот же syscall создать ( т.е. как его имплементируют ) испульзуя page faults. Т.е. пишится параметры в специальную области памяти, и как из kernel перехватывает доступ к этому... Это сообщение отредактировал(а) magesi - 29.6.2012, 02:33 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Как я понял, вы задумали удалить файл, минуя операционку? В таком случае, опускаться до уровня железок не нужно. Нужно до уровня форматов. Примерная схема действий: 1. Выяснить формат. Возможных форматов вагон и целая тележка: FAT12, FAT16, FAT32, NTFS*, в никсах: ext2, ext3, ext4, XFS, JFS, ReiserFS и еще с десяток ) и это только самые распространенные. 2. Изучить этот формат (кстати информация есть далеко не по всем форматам, например мелкомягкие не публикуют офиц. инфу по NTFS. Есть правда стороняя информация, но она добыта методом тыка и хака, а потому ненадежна, и возможно не поддерживает новые версии) 3. Получить права доступа к диску на низком уровне. 4.Затереть нужный байтик, в нужном секторе. (используя информацию добытую в 2 пункте) |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
минуя операционку из операционки в целом, уже "да" Это сообщение отредактировал(а) magesi - 29.6.2012, 02:35 |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: нет Всего: 14 |
Как то странно рассуждаете
имеем прога на С --> libc --> системные либы -- > драйвера устройств -- > железо Что бы удалить незаметно для ОС файлик нужно минуя всю эту цепочку "договорится" с железом Для этого нужно всего то 3 пункта выполнить 1) Root 2) Знание FS на которой хотим удалить файлик 3) Свой драйверок для работы с HD -------------------- |
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Если цель в том, чтобы OS не сообщила кому-нибудь, что файл - удален, то, по-моему, нужно заюзать драйвер FS и никому не говорить, что вы удалили файлик. Удаление через железо - плохая идея. Можно легко убить всю FS. А в таблицах FS OS, которые в памяти, файл в итоге может остаться.
Это сообщение отредактировал(а) Randajad - 29.6.2012, 12:47 |
|||
|
||||
| magesi |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 20.5.2012 Репутация: -4 Всего: -4 |
||||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Гм. Можно взять соседний файл с этого же устройства (с нужными правами доступа), сделать ему move на наше имя, а потом обратное move, восстанавливая ему первоначальное имя...
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |