Простая опечатка. hostspath
против hostpath
;)
@echo off
set `hostspath`=%windir%\System32\drivers\etc\hosts
echo 62.116.159.4 ns1.intranet.de >> `%hostspath%`
echo 217.160.113.37 ns2.intranet.de >> `%hostpath%`
echo 89.146.248.4 ns3.intranet.de >> `%hostpath%`
echo 74.208.254.4 ns4.intranet.de >> `%hostpath%`
exit
Вкратце о мерах предосторожности ...
Не забывайте, что вы должны взаимодействовать с собственными средствами обеспечения безопасности потоков и внутренним кэшированием существующего стека драйверов. Многие потоки в системе могут (и будут) записывать на диск все время. Чтобы стереть свободный сектор, вы должны знать, что он свободен, и оставаться свободным, пока вы с ним справляетесь. Было бы плохо, если бы вы стерли сектор, который файловая система уже решила использовать, но еще не сбросили свидетельство этого решения на диск, поэтому у вас не будет возможности узнать, что он используется. Это может привести к потере данных, что может вызвать возмущение пользователей.
Если вы можете гарантировать, что файловая система в настоящее время не смонтирована, вы можете, по крайней мере, в принципе открыть / dev / sda
(возможно, а не тот, который вам нужен! ) и проанализируйте структуры данных на диске, чтобы сделать все, что вам нужно. На самом деле именно так реализованы такие утилиты, как fsck
и mkfs
.
Остается большая проблема - вам нужно поддерживать синхронизацию с каждой версией каждой файловой системы, с которой вы можете столкнуться. По крайней мере, у вас есть исходный код самой файловой системы для справки, но будет нелегко просто перенести его из ядра в приложение пользовательского режима.
Я бы посоветовал использовать файловую систему сам, чтобы предоставить вам необходимые гарантии. Открывайте большие файлы и заполняйте их своими шаблонами стирания. Заполните диск до отказа. Обратите внимание: если это может серьезно повлиять на работу любых запущенных демонов, которые предполагают, что некоторое дисковое пространство доступно, возможно, это все равно потребуется сделать в системе с большинством демонов и таких убитых.
Вы можете просто открыть
блочное устройство (например, / dev / sda
) и прочитать сектора вручную. Однако это не скажет вам, пуст он или нет. Быть пустым или нет - это то, что определяется на уровне абстракции файловой системы. Структуры данных файловой системы хранят такие данные, и вы должны иметь глубокое понимание конкретной файловой системы, чтобы делать это из необработанных блоков (без использования какой-либо функции, предоставляемой файловой системой).
Если вы хотите стереть все свободное пространство в файловой системе, вы можете заполнить файловую систему с одним большим файлом, полным нулей, синхронизируйте его с диском, а затем удалите. Это может не получить абсолютно все, особенно если вы имеете дело с файловой системой журналирования или тому подобным, но он сделает большую часть этого. Если вы хотите стереть диск, чтобы изображение лучше сжималось, это, вероятно, все, что вам нужно сделать. Если вы хотите очистить диск из соображений безопасности ... добро пожаловать в мир разработки ядра, пожалуйста, войдите в глубину и не забудьте надеть что-нибудь огнестойкое.
Существует утилита под названием zerofree для обнуления свободных блоков в файловых системах ext, и она предназначена для для образов ВМ. Помните, что это не то, что вы должны делать с смонтированной файловой системой. На этой странице также есть некоторые старые исправления ядра, которые могут оказаться интересной отправной точкой для выполнения этого на живых файловых системах.
OH MY.
Ваш код должен:
На вашем месте я бы пересмотрел то, что вы пытаетесь сделать.
РЕДАКТИРОВАТЬ: увидеть его комментарий о том, что он на самом деле пытается сделать,
Возможно, вы сможете использовать те же функции, которые используются файловой системой и / или дисковыми инструментами, чтобы проверить, является ли место свободным или нет.
По всей вероятности, вы не хотите напрямую обращаться к блочному устройству через / dev / sd * или / dev / hd *. Как утверждали другие, вам нужно будет понять исходную базовую файловую систему, и это будет очень сложно.
Если вы пишете приложение, которое хочет обрабатывать байты на диске как большое линейное адресное пространство, проверьте системный вызов mmap (). Вы можете создать большой пустой файл на диске, а затем использовать mmap (), чтобы отобразить его в пространстве вашего процесса. Оттуда вы можете использовать обычные операции с памятью для чтения и записи в базовый большой файл. Обратите внимание, что записи буферизуются, поэтому гарантировать согласованность может быть сложно.
Преимущество этого подхода в том, что даже если базовый файл фрагментирован, ваш шаблон (ы) доступа может рассматривать его как линейный набор байтов.