Страницы

Поиск по вопросам

Показаны сообщения с ярлыком диск. Показать все сообщения
Показаны сообщения с ярлыком диск. Показать все сообщения

среда, 12 февраля 2020 г.

Примонтировать раздел в readonly-режиме

#linux #linux_mint #диск #монтирование


При попыткие примонтировать раздел через интерфейс проводника получаю ошибку


  Не удалось присоединить Data E
  
  Error mounting /dev/sda9 at /media/qwertiy/Data E: Command-line `mount -t "ntfs"
-o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" "/dev/sda9"
"/media/qwertiy/Data E"' exited with non-zero exit status 14: The disk contains an
unclean file system (0, 0).
  Metadata kept in Windows cache, refused to mount.
  Failed to mount '/dev/sda9': Operation not permitted
  The NTFS partition is in an unsafe state. Please resume and shutdown
  Windows fully (no hibernation or fast restarting), or mount the volume
  read-only with the 'ro' mount option.


Пытаюсь выполнить в командной строке (добавил -o ro) в команду из сообщения выше

sudo mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177"
-o ro "/dev/sda9" "/media/qwertiy/Data E"


но получаю ошибку


  fuse: failed to access mountpoint /media/qwertiy/Data E: Нет такого файла или каталога


Что я делаю не так?
Как примонтировать диск для чтения без перезагрузки в винду?
    


Ответы

Ответ 1



Надо попробовать НЕ монтировать в /mnt и /media - эти каталоги используются (в той же бубунте больше media) для временного монтирования внешних накопителей. В более старых версиях была схема /media/метка-тома-или-его-uuid. Сейчас /media/$USER/метка-тома-или-его-uuid. Все подкаталоги создаются и удаляются ОС автоматом. Создавать папки там - чревато вероятными конфликтами имён и ugo. Ещё в старых мануалах за 2007-2009е говорилось, что лучше не надо. 99,9% сработает такой вариант: godmode: sudo -i Создаём принудительно будущую точку монтирования: mkdir -p /windows/e Монтируем раздел на чтение\запись: ntfs-3g /dev/sda9 /windows/e Если надо только смотреть, то как-то так: ntfs-3g -o ro /dev/sda9 /windows/e Если надо монтировать при старте системы - вот так работает на ubuntu 12.04, 14.04, 16.04. Строка добавляется в /etc/fstab: UUID=0B0525B62F08257C /windows/F ntfs-3g users,locale=ru_RU.UTF-8,nobootwait 0 0 UUID узнаётся через sudo blkid

Ответ 2



uhelper=udisks2 Т.е. изначально монтируете раздел не вы, а udisks2, обычно вызванный из файлового менеджера. Он и создаёт директории в /media, а при ошибке или при размонтировании - удаляет. При попытке монтировать самостоятельно командой mount точка монтирования должна уже существовать. mount созданием директорий не занимается. Удалять директорию при необходимости после работы - тоже уже ваша задача будет.

пятница, 31 января 2020 г.

После diskpart clean флэшка не отображается в списке дисков

#windows #диск #diskpart


Я отформатировал флэш-накопитель при помощи команды clean из утилиты diskpart. Теперь
флэшка пуста, но она не отображается в окне "Компьютер" в списке дисков. Совсем. Компьютер
реагирует на её подключение, но новых дисков не появляется.

Что нужно сделать, чтобы накопитель появился в этом списке и вообще функционировал
как самая обычная флэшка?
    


Ответы

Ответ 1



Возвращайтесь в diskpart, выберите этот же диск и выполните следующее так же, как выполнили на нём clean: create partition primary А что это было? Каждый диск можно разбить на некоторое число разделов, на каждом из которых будет своя файловая система. Изначально, скорее всего, на вашей флэшке был один раздел на всю ширь диска. Командой clean вы его уничтожили. Поскольку форматировать (т. е. создавать файловую систему) можно только в рамках раздела, Проводник с этой флэшкой сделать ничего не сможет, пока вы не создадите там раздел. У команды create partition primary есть некоторые параметры, но они все необязательны, при их отсутствии утилита попытается создать раздел максимально возможного размера от самого начала диска. В следующий раз, если будете стирать флэшку, отформатируйте её из контекстного меню Проводника. Вы забрались глубже, чем требовалось. Кстати, после создания раздела диск как раз надо будет отформатировать, поскольку файловой системы там не будет.

четверг, 9 января 2020 г.

Запись и чтение Сектора диска С++

#cpp #windows #диск


Хочу записывать и читать информацию прямиком из сектора диска а не из файла. На С++.
Приложите пример по максимуму простой. Или ссылку дайте. Посекторное чтение и запись
я полагаю даст мне возможность делать полные посекторные копии нескольких ОС и разделов
сразу. Также делать защиту программ от взлома.

вот финальный код ширения основан на ответе.Чтение первого сектора первого диска.


#include 
#include 
#include 
using namespace std;

int win_error()
{
    cout<<"error"<


Ответы

Ответ 1



В принципе, если не хотеть странного вроде небуферизованного ввода/вывода, то там все так же, как и для файлов. Диски открываются все той же функцией CreateFile, но для dwShareMode надо обязательно указывать (FILE_SHARE_READ | FILE_SHARE_WRITE), а в dwCreationDisposition должно (естественно) стоять OPEN_EXISTING. В качестве имени должно стоять, например, для физического диска "\\.\PhysicalDrive0", а для логического - "\\.\C:". А дальше все так же, как и для файла - читаем ReadFile, пишем WriteFile, закрываем CloseHandle. В описании CreateFile все это подробно расписано, и если вы действительно будете это делать, читать MSDN вам скорее всего все равно придется. Имейте только ввиду, что начиная с Висты доступ к диску требует поднятия привилегий (elevation). То есть программу нужно 1) запустить с учетки администратора, 2) в манифесте должно стоять требования административных привилегий, и 3) при каждом запуске юзер должен подтверждать, что да, он действительно хочет запустить эту опасную программу (которая у вас, вероятно, даже не подписана сертификатом). Без этого CreateFile будет просто возвращать ошибку ERROR_ACCESS_DENIED. UPD: С утра набросал крохотную демонстрашку, она читает самый первый сектор диска С: (писать туда не стал, но тоже можно:). Исключение win_error только замените на какую-нибудь свою обработку. HANDLE hDisk = ::CreateFile(L"\\\\.\\C:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDisk == INVALID_HANDLE_VALUE) throw win_error(); BYTE buf[512]; DWORD dwRead; if (!::ReadFile(hDisk, buf, sizeof(buf), &dwRead, NULL) || dwRead != sizeof(buf)) throw win_error(); ::CloseHandle(hDisk); Как уже было сказано, запускать надо командой "Run as Administrator" иначе CreateFile вернет ошибку.

вторник, 31 декабря 2019 г.

Как в Linux клонировать диск в диск другого размера

#linux #hdd #диск #ssd #клонирование


Имеем Linux - Fedora 22,
HDD - на котором установлена система, 
требуется переехать на SDD который в два раза меньшего размера, но данных на HDD
мало, поэтому влезут.
Оба диска подключены к компьютеру.
Вопрос: как клонировать диск? Желательно средствами GNU Linux.

Уточнения:
1. CD/DVD - нет.
2. gparted - не работает с активным системным разделом.
3. Куда tar архив размещать? в /dev/null ? два диска всего.
4. Диски разного размера!  
    


Ответы

Ответ 1



Все можно сделать, главное аккуратно. Нужны следующие вещи: livecd диск или лучше флешка. Можно другого совместимого дистрибутива, к примеру ubuntu. оба диска должны быть подключены к компу. Процедура переноса. загрузится с live открыть gparted или любую другую любимую утилиту для разбивки диска. разбить ssd как нужно (home, root, swap и дальше по предпочтениям), отформатировать монтируем новые диски и старые. Рекомендую сделать в /mount папку old (для старого диска) и new (для нового). копируем данные. Так как это линукс, то можно с помощью cp, главное сохранить права. К примеру home cp -a /mount/old/home/ /mount/new/home. аналогично копируется корень. Но тут есть особеность - не все нужно копировать. к примеру, папку tmp не нужно (хотя ничего плохого не будет). Если в папка /mount/old/proc и /mount/old/sys что то будет внутри - это копировать не нужно (содержимое этих папок система создает сама). не забываем о boot разделе. если имена устройств поменялись (к примеру, home это был /dev/sda*1*, а стал /dev/sdb*4* - тут важна цифра, а не буква), то открываем файл /mount/new/etc/fstab и правим по феншую. осталось последнее - перенести загрузочную запись. Вначале копируем старый dd if=/dev/sdX of=/path/to/mbr_file.img bs=512 count=1, а потом переносим на новый. Так как мы не хотим потереть таблицу разделов, то нужно не все скопировать. dd if=/path/to/mbr_file.img of=/dev/sdX bs=446 count=1. Все, можно выключать, поставить диски по местам, поправить в биосе загрузочное устройство и пробовать. Что делать, если ничего не завелось? Старый диск скорее всего не поврежден. Так что им можно будет загрузиться. Плюс есть флешка. Можно восстановить. Но если честно, то я переносил немного по другому. Все как выше, разбил диск, скопировал home раздел, потом вытянул старый диск, и загрузился с флешки. И начал установку как обычно. В процессе установки главное не отформатировать home раздел (хотя потом все равно можно скопировать). Так как home раздел есть, то сохранятся все настройки программ. Потом только возможно нужно будет доустановить недостающие программы.

Ответ 2



Очень рекомендую присмотреться к проекту Clonezilla. Умеет копировать как линуксовые, так и виндовые разделы. Грузится с флэшки, болванки, сети, умеет работать в режиме сервера и раздавать образ через мультикаст. Запускается в режиме мастера, на русский переведено подавляющее большинство диалогов. Да, может понадобиться тем же gparted live ужать разделы до размеров влезающих на ssd, но остальные dd и cp -r там не нужны. Есть режим копирования с железки на железку, можно сначала в образ, а потом из образа.

пятница, 27 декабря 2019 г.

Примонтировать архив как диск

#windows #архивация #диск #монтирование #поиск_программ


Хочу примонтировать архив (желательно 7z, но можно другой хороший) как виртуальный
диск в Windows. При этом должны выполняться следующие условия:


Считаем, что есть пустой архив. Когда именно он создастся - не важно.
Этот архив монтируется как виртуальный диск.
На этот диск будет записан ровно один файл.
Сжатие должно происходить непосредственно при записи.
Запись будет последовательной (но НЕ realtime).
Ожидаемый объём записываемого от 100 ГБ до 500 ГБ.
Ожидаемый объём архива в 500 раз меньше объёма записываемого файла.
На дисках не достаточно свободного места, чтобы вместить несжатый файл.
Желательно, чтобы последовательное считывание после записи тоже было возможно.


Записываться будет несжатое avi, причём обязательно под Windows.

С помощью каких программ такое можно осуществить?

Замечу, что 7zip умеет делать потоковую архивацию. Например, следующей командой можно
упаковать выводимый текст в архив cmd.7z под именем (файла) help.txt (ключ -si):

cmd /? | "C:\Program Files (x86)\7-Zip\7z.exe" a -sihelp.txt cmd.7z


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

PS: Этот вопрос на английском.
    


Ответы

Ответ 1



Можно попробовать использовать WebDAV. Windows умеет монтировать WebDAV-папки как сетевые диски. Начать можно с вот такого сервера (код на C#), который эмулирует пустой диск, ожидая пока ему не передадут файл: using System; using System.Globalization; using System.IO; using System.Net; using System.Xml.Linq; namespace HttpPipe { static class Program { static readonly Uri ListenUri = new Uri("http://localhost/share/"); static void Main(string[] args) { CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("en-US"); var listener = new HttpListener { Prefixes = { $"{ListenUri.Scheme}://*:{ListenUri.Port}{ListenUri.PathAndQuery}" }, }; listener.Start(); bool processing = false; try { while (true) { processing = false; var ctx = listener.GetContext(); processing = true; try { var uri = ctx.Request.Url; Console.Error.WriteLine($"{ctx.Request.HttpMethod} {uri} {ctx.Request.ContentType} {ctx.Request.ContentLength64}"); var root = new Uri(uri, ListenUri.PathAndQuery); if (uri + "/" == root.ToString()) uri = root; uri = uri.MakeRelativeUri(root); if (uri.IsAbsoluteUri || uri.ToString().StartsWith("..")) throw new Exception("Неправильный URI: " + uri); if (ProcessContext(ctx, uri.ToString())) break; } finally { ctx.Response.Close(); } } } catch (Exception ex) when (processing) { Console.Error.WriteLine("ERROR: " + ex); } catch (Exception) { } listener.Stop(); } static readonly XNamespace DAV = "DAV:"; private static bool ProcessContext(HttpListenerContext ctx, string uri) { ctx.Response.SendChunked = false; switch (ctx.Request.HttpMethod) { case "OPTIONS": ctx.Response.SetStatus(HttpStatusCode.OK); ctx.Response.AddHeader("DAV", "1"); break; case "PROPFIND": if (uri != "") { ctx.Response.SetStatus(HttpStatusCode.NotFound); } else { var prop = new XElement(DAV + "prop"); prop.SetElementValue(DAV + "creationdate", DateTime.UtcNow.ToString("s") + "Z"); prop.SetElementValue(DAV + "getlastmodified", DateTime.UtcNow.ToString("R")); prop.SetElementValue(DAV + "displayname", "share"); prop.Add(new XElement(DAV + "resourcetype", new XElement(DAV + "collection"))); var response = new XElement(DAV + "response"); response.SetElementValue(DAV + "href", ListenUri.PathAndQuery); response.Add(new XElement(DAV + "propstat", new XElement(DAV + "status", "HTTP/1.1 200 OK"), prop)); ctx.Response.StatusCode = 207; ctx.Response.StatusDescription = "Multi Status"; ctx.Response.Send(new XElement(DAV + "multistatus", new XAttribute(XNamespace.Xmlns + "d", DAV), response)); } break; case "PUT": if (ctx.Request.ContentLength64 > 0) { foreach (string header in ctx.Request.Headers) { Console.Error.WriteLine($" {header}: {ctx.Request.Headers[header]}"); } using (var output = Console.OpenStandardOutput()) { ctx.Request.InputStream.CopyTo(output); } ctx.Response.SetStatus(HttpStatusCode.NoContent); return true; } ctx.Response.SetStatus(HttpStatusCode.NoContent); return false; default: ctx.Response.SetStatus(HttpStatusCode.NotImplemented); break; } return false; } static void SetStatus(this HttpListenerResponse resp, HttpStatusCode status) { resp.StatusCode = (int)status; resp.StatusDescription = status.ToString(); } static void Send(this HttpListenerResponse resp, XElement content) { var ms = new MemoryStream(); content.Save(ms); ms.Position = 0; resp.ContentType = "application/xml; charset=utf-8"; resp.ContentLength64 = ms.Length; ms.CopyTo(resp.OutputStream); } } } Когда приходит файл - он выводит его содержимое в стандартный вывод и завершает работу. Полезные ссылки: RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV) WebDAV-API Яндекс-Диска - тут есть ценные примеры

среда, 25 декабря 2019 г.

CD-R. Как снять ограничение “только на запись”?

#диск #внешние_устройства


Имеется диск CD-R. Можно ли перезаписать на него файлы. То есть удалить существующие
и записать новые?

Про то, что CD-R одноразовый знаю, но может все таки есть способ, может как то снять
это ограничение "только на запись"?
    


Ответы

Ответ 1



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

пятница, 13 декабря 2019 г.

Как узнать точный размер физического диска?

#windows #диск


Как узнать размер физического диска (не раздела!) в Windows 7 с точностью до байта?

Управление компьютером -> Управление дисками показывает значение в ГБ.
    


Ответы

Ответ 1



Воспользуйтесь встроенной программой "Сведения о системе". Пуск - Выполнить - msinfo32 Раздел "Компоненты - Запоминающие устройства - Диски"

Ответ 2



Не нашёл как сделать это через powershell или wmic, но есть windows-версия пакета S.M.A.R.T. Monitoring Tools. Синтаксис такой же, как и в linux, т.е. для первого жёсткого диска надо ввести smartctl --all /dev/sda.. Останется только отпарсить строку User Capacity.

суббота, 20 апреля 2019 г.

Примонтировать раздел в readonly-режиме

При попыткие примонтировать раздел через интерфейс проводника получаю ошибку
Не удалось присоединить Data E Error mounting /dev/sda9 at /media/qwertiy/Data E: Command-line `mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" "/dev/sda9" "/media/qwertiy/Data E"' exited with non-zero exit status 14: The disk contains an unclean file system (0, 0). Metadata kept in Windows cache, refused to mount. Failed to mount '/dev/sda9': Operation not permitted The NTFS partition is in an unsafe state. Please resume and shutdown Windows fully (no hibernation or fast restarting), or mount the volume read-only with the 'ro' mount option.
Пытаюсь выполнить в командной строке (добавил -o ro) в команду из сообщения выше
sudo mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" -o ro "/dev/sda9" "/media/qwertiy/Data E"
но получаю ошибку
fuse: failed to access mountpoint /media/qwertiy/Data E: Нет такого файла или каталога
Что я делаю не так? Как примонтировать диск для чтения без перезагрузки в винду?


Ответ

Надо попробовать НЕ монтировать в /mnt и /media - эти каталоги используются (в той же бубунте больше media) для временного монтирования внешних накопителей. В более старых версиях была схема /media/метка-тома-или-его-uuid. Сейчас /media/$USER/метка-тома-или-его-uuid. Все подкаталоги создаются и удаляются ОС автоматом. Создавать папки там - чревато вероятными конфликтами имён и ugo. Ещё в старых мануалах за 2007-2009е говорилось, что лучше не надо. 99,9% сработает такой вариант:
godmode:
sudo -i
Создаём принудительно будущую точку монтирования:
mkdir -p /windows/e
Монтируем раздел на чтение\запись:
ntfs-3g /dev/sda9 /windows/e
Если надо только смотреть, то как-то так:
ntfs-3g -o ro /dev/sda9 /windows/e
Если надо монтировать при старте системы - вот так работает на ubuntu 12.04, 14.04, 16.04. Строка добавляется в /etc/fstab
UUID=0B0525B62F08257C /windows/F ntfs-3g users,locale=ru_RU.UTF-8,nobootwait 0 0
UUID узнаётся через sudo blkid

пятница, 12 апреля 2019 г.

Как в Linux клонировать диск в диск другого размера

Имеем Linux - Fedora 22, HDD - на котором установлена система, требуется переехать на SDD который в два раза меньшего размера, но данных на HDD мало, поэтому влезут. Оба диска подключены к компьютеру. Вопрос: как клонировать диск? Желательно средствами GNU Linux.
Уточнения: 1. CD/DVD - нет. 2. gparted - не работает с активным системным разделом. 3. Куда tar архив размещать? в /dev/null ? два диска всего. 4. Диски разного размера!


Ответ

Все можно сделать, главное аккуратно. Нужны следующие вещи:
livecd диск или лучше флешка. Можно другого совместимого дистрибутива, к примеру ubuntu. оба диска должны быть подключены к компу.
Процедура переноса.
загрузится с live открыть gparted или любую другую любимую утилиту для разбивки диска. разбить ssd как нужно (home, root, swap и дальше по предпочтениям), отформатировать монтируем новые диски и старые. Рекомендую сделать в /mount папку old (для старого диска) и new (для нового). копируем данные. Так как это линукс, то можно с помощью cp, главное сохранить права. К примеру home cp -a /mount/old/home/ /mount/new/home аналогично копируется корень. Но тут есть особеность - не все нужно копировать. к примеру, папку tmp не нужно (хотя ничего плохого не будет). Если в папка /mount/old/proc и /mount/old/sys что то будет внутри - это копировать не нужно (содержимое этих папок система создает сама). не забываем о boot разделе. если имена устройств поменялись (к примеру, home это был /dev/sda*1*, а стал /dev/sdb*4* - тут важна цифра, а не буква), то открываем файл /mount/new/etc/fstab и правим по феншую. осталось последнее - перенести загрузочную запись. Вначале копируем старый dd if=/dev/sdX of=/path/to/mbr_file.img bs=512 count=1, а потом переносим на новый. Так как мы не хотим потереть таблицу разделов, то нужно не все скопировать. dd if=/path/to/mbr_file.img of=/dev/sdX bs=446 count=1
Все, можно выключать, поставить диски по местам, поправить в биосе загрузочное устройство и пробовать.
Что делать, если ничего не завелось?
Старый диск скорее всего не поврежден. Так что им можно будет загрузиться. Плюс есть флешка. Можно восстановить.
Но если честно, то я переносил немного по другому. Все как выше, разбил диск, скопировал home раздел, потом вытянул старый диск, и загрузился с флешки. И начал установку как обычно. В процессе установки главное не отформатировать home раздел (хотя потом все равно можно скопировать). Так как home раздел есть, то сохранятся все настройки программ. Потом только возможно нужно будет доустановить недостающие программы.

среда, 3 апреля 2019 г.

После diskpart clean флэшка не отображается в списке дисков

Я отформатировал флэш-накопитель при помощи команды clean из утилиты diskpart. Теперь флэшка пуста, но она не отображается в окне "Компьютер" в списке дисков. Совсем. Компьютер реагирует на её подключение, но новых дисков не появляется.
Что нужно сделать, чтобы накопитель появился в этом списке и вообще функционировал как самая обычная флэшка?


Ответ

Возвращайтесь в diskpart, выберите этот же диск и выполните следующее так же, как выполнили на нём clean
create partition primary

А что это было?
Каждый диск можно разбить на некоторое число разделов, на каждом из которых будет своя файловая система. Изначально, скорее всего, на вашей флэшке был один раздел на всю ширь диска. Командой clean вы его уничтожили.
Поскольку форматировать (т. е. создавать файловую систему) можно только в рамках раздела, Проводник с этой флэшкой сделать ничего не сможет, пока вы не создадите там раздел.
У команды create partition primary есть некоторые параметры, но они все необязательны, при их отсутствии утилита попытается создать раздел максимально возможного размера от самого начала диска.
В следующий раз, если будете стирать флэшку, отформатируйте её из контекстного меню Проводника. Вы забрались глубже, чем требовалось. Кстати, после создания раздела диск как раз надо будет отформатировать, поскольку файловой системы там не будет.

пятница, 15 февраля 2019 г.

Запись и чтение Сектора диска С++

Хочу записывать и читать информацию прямиком из сектора диска а не из файла. На С++. Приложите пример по максимуму простой. Или ссылку дайте. Посекторное чтение и запись я полагаю даст мне возможность делать полные посекторные копии нескольких ОС и разделов сразу. Также делать защиту программ от взлома.
вот финальный код ширения основан на ответе.Чтение первого сектора первого диска.
#include #include #include using namespace std;
int win_error() { cout<<"error"<int main() {
HANDLE hDisk = ::CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDisk == INVALID_HANDLE_VALUE) throw win_error();
BYTE buf[512]; DWORD dwRead; if (!::ReadFile(hDisk, buf, sizeof(buf), &dwRead, NULL) || dwRead != sizeof(buf)) throw win_error(); ::CloseHandle(hDisk);
ofstream out("1.txt"); for(int i = 0; i<512;i++) { char f[3]; itoa(buf[i],f,16); out<'; cout<Визуалку надо от имени админа запускать, проект создавать не консольный а пустой enemy. Буду благодарен если кто то ещё покажет как позицию чтение установить. и записывать в заданную позицию, можно в 32 сектор писать для примера, там никогда ничего важного нет. Благодарен всем участникам.


Ответ

В принципе, если не хотеть странного вроде небуферизованного ввода/вывода, то там все так же, как и для файлов. Диски открываются все той же функцией CreateFile, но для dwShareMode надо обязательно указывать (FILE_SHARE_READ | FILE_SHARE_WRITE), а в dwCreationDisposition должно (естественно) стоять OPEN_EXISTING. В качестве имени должно стоять, например, для физического диска "\\.\PhysicalDrive0", а для логического - "\\.\C:". А дальше все так же, как и для файла - читаем ReadFile, пишем WriteFile, закрываем CloseHandle.
В описании CreateFile все это подробно расписано, и если вы действительно будете это делать, читать MSDN вам скорее всего все равно придется. Имейте только ввиду, что начиная с Висты доступ к диску требует поднятия привилегий (elevation). То есть программу нужно 1) запустить с учетки администратора, 2) в манифесте должно стоять требования административных привилегий, и 3) при каждом запуске юзер должен подтверждать, что да, он действительно хочет запустить эту опасную программу (которая у вас, вероятно, даже не подписана сертификатом). Без этого CreateFile будет просто возвращать ошибку ERROR_ACCESS_DENIED.
UPD: С утра набросал крохотную демонстрашку, она читает самый первый сектор диска С: (писать туда не стал, но тоже можно:). Исключение win_error только замените на какую-нибудь свою обработку.
HANDLE hDisk = ::CreateFile(L"\\\\.\\C:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDisk == INVALID_HANDLE_VALUE) throw win_error();
BYTE buf[512]; DWORD dwRead; if (!::ReadFile(hDisk, buf, sizeof(buf), &dwRead, NULL) || dwRead != sizeof(buf)) throw win_error(); ::CloseHandle(hDisk);
Как уже было сказано, запускать надо командой "Run as Administrator" иначе CreateFile вернет ошибку.

четверг, 29 ноября 2018 г.

CD-R. Как снять ограничение “только на запись”?

Имеется диск CD-R. Можно ли перезаписать на него файлы. То есть удалить существующие и записать новые?
Про то, что CD-R одноразовый знаю, но может все таки есть способ, может как то снять это ограничение "только на запись"?


Ответ

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

четверг, 8 ноября 2018 г.

Как узнать точный размер физического диска?

Как узнать размер физического диска (не раздела!) в Windows 7 с точностью до байта?
Управление компьютером -> Управление дисками показывает значение в ГБ.


Ответ

Воспользуйтесь встроенной программой "Сведения о системе". Пуск - Выполнить - msinfo32 Раздел "Компоненты - Запоминающие устройства - Диски"