Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/179: Рейтинг темы: голосов - 179, средняя оценка - 4.60
2 / 2 / 2
Регистрация: 14.11.2010
Сообщений: 62

С++ чтение секторов диска

27.02.2011, 22:36. Показов 35686. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как по очереди прочитать все сектора на диске?
по идее должна использоваться функция ReadFile(hDevice, buf, 512, &dwBytesRead, NULL); но где подставить номер сектора или как перебрать все?

и как из функции DeviceIoControl вытащить количество секторов

вот сам код до которого додумался, но далее буксую на месте, надеюсь на подсказку)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main()
{
    HANDLE hDevice;               // handle to the drive to be examined
    DISK_GEOMETRY pdg;           // геометрическая структура дискового устройства
    BOOL bResult;                 // флажок общих результатов
    DWORD junk;                   // сбрасываем результаты
 
    byte buf[512];              //БУФФеР
    DWORD dwBytesRead;
 
 
 
    hDevice = CreateFile("\\\\.\\D:",  // открываемое устройство
                    0,                // нет доступа к устройству
                    FILE_SHARE_READ | // режим совместного использования
                    FILE_SHARE_WRITE, 
                    NULL,             // атрибуты безопасности по умолчанию
                    OPEN_EXISTING,    // расположение
                    0,                // атрибуты файла
                    NULL);            // не копировать атрибуты файла
 
    
    if (hDevice != INVALID_HANDLE_VALUE)
    {
 
 
        bResult = DeviceIoControl(hDevice,  // запрошенное устройство
                IOCTL_DISK_GET_DRIVE_GEOMETRY,  // выполняемая операция
                NULL, 0, // буфера ввода нет
                &pdg, sizeof(pdg),     // буфер вывода
                &junk,                 // # возвращено байтов
                (LPOVERLAPPED) NULL);   // синхронизация ввода/вывода (I/O)
 
 
 
 
        ReadFile(hDevice, buf, 512, &dwBytesRead, NULL); 
 
        CloseHandle(hDevice);
    }
    else cout << "Error Open " << endl;
 
    cin.get();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.02.2011, 22:36
Ответы с готовыми решениями:

Чтение секторов жёсткого в DOS
Добрый вечер! Проблема заключается именно в том, что программа должна работать под DOS, и ей не важно что есть на диске и какая там...

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

Ремап секторов диска с AF
Понадобилось сделать ремап на своём винче, много бэдов и блоков с чтением &gt;600 ms (даже один с 56к ms!) Решил сделать через викторию, но,...

31
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
02.03.2011, 20:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от partos1 Посмотреть сообщение
да с флешки на флешку
цикл do while если функцию writefile убрать читает без проблем
при добавление writefile на первом такте работы валетает
А так же читать вторую флешку пробовали? Нормально читается? А флешки больше 2 ГБ?
Сейчас поробую создать диски > 2 ГБ может в этом проблема.

Добавлено через 21 минуту
На виртуальной машине у меня все работает на дисках 9 ГБ. Флешек, к сожалению, сейчас нет под рукой, чтоб проверить, все ребенок перетерял. На физическом жестком диске тоже нет возможности потестить.
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 19
02.03.2011, 20:20
какая у вас OS ?
Direct access to the disk or to a volume is restricted. For more information, see "Changes to the file system and to the storage stack to restrict direct disk access and direct volume access in Windows Vista and in Windows Server 2008" in the Help and Support Knowledge Base at http://support.microsoft.com/kb/942448
0
2 / 2 / 2
Регистрация: 14.11.2010
Сообщений: 62
02.03.2011, 20:24  [ТС]
Цитата Сообщение от bigredcat Посмотреть сообщение
А так же читать вторую флешку пробовали? Нормально читается? А флешки больше 2 ГБ?
Сейчас поробую создать диски > 2 ГБ может в этом проблема.
пробовал их менять местами тот же результат, проблема видно в коде
обе флешки micro sd на 2 гига

Добавлено через 2 минуты
Цитата Сообщение от barmaley2005 Посмотреть сообщение
какая у вас OS ?
Direct access to the disk or to a volume is restricted. For more information, see "Changes to the file system and to the storage stack to restrict direct disk access and direct volume access in Windows Vista and in Windows Server 2008" in the Help and Support Knowledge Base at http://support.microsoft.com/kb/942448

windows 7
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 19
02.03.2011, 21:22
так как семерка наследует ядро этих систем то думаю эти правила и к ней относятся,
у вас глохнет на месте где вы пытаетесь открыть доступ к диску на запись о чем сказано в базе MS цитирую
A file system can write to a volume handle only if the following conditions are true:
Condition 1: The sectors that are being written to are boot sectors.

Note This condition exists to support programs such as antivirus programs, Setup programs, and other programs that have to update the startup code of the system volume. The system volume cannot be locked.
Condition 2: The sectors that are being written to reside outside the file system space.

Note The region between the end of the file system space and the end of the volume space is not under the control of the file system. Therefore, there is no reason to require the volume to be locked to write to it.
Condition 3: The volume has been locked implicitly by requesting exclusive write access.
Condition 4: The volume has been locked explicitly by requesting a lock request or an unmount request.
Condition 5: The write request has a SL_FORCE_DIRECT_WRITE flag that indicates that Condition 2 must be bypassed.
Добавлено через 48 минут
у меня не 7 стоит, но заблокировать диск и получить эсклюзивный доступ я смог по доке из MSDN

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    HANDLE hdd = CreateFileW(L"\\\\.\\D:",GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL , OPEN_EXISTING, 0, NULL);
    if (hdd == INVALID_HANDLE_VALUE)
    {
        printWinErr();
        return 0;
    }
 
    DWORD bRet;
 
             /*пробуем получить эсклюзивный доступ по мягкому, если нет не каких открытых файлов то получаем true */
 
    if (!DeviceIoControl(hdd, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &bRet, NULL))
    {
/*
нет не получили, скорее всего получили ошибке 5 - Access Denied
*/
        printWinErr();
/*
тогда форсируем операцию принудительно всем программам отключается доступ к диску
*/
        if (!DeviceIoControl(hdd, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &bRet, NULL))
        {
            printWinErr();
            return 0;
        }
    }
теперь у хэндла hdd нужно изменить доступ на запись :P
проверить то что ваша программа получила эсклюзивный доступ к диску, во время трасировке после FSCTL_DISMOUNT_VOLUME попробуйте обратится к диску из винды
1
2 / 2 / 2
Регистрация: 14.11.2010
Сообщений: 62
02.03.2011, 21:24  [ТС]
Вы были правы проблема оказалась в ОС
решение довольно таки простое
FILE_SHARE_READ | FILE_SHARE_WRITE, и FILE_ATTRIBUTE_NORMAL,
достаточно заменить на 0


ps Спасибо Вам огромное за помощь
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
02.03.2011, 22:13
Да, я и не обратил внимания, что вы поменяли эти флаги
Я же вам в #12 отписался, что заменить надо только CREATE_ALWAYS.
Цитата Сообщение от bigredcat Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
// Создание файла для сохранения  пишем.
file = CreateFile("\\\\.\\F:",
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS, // <-- так нельзя, нужно OPEN_EXISTING
    0,
    NULL);
А вы совместный доступ, причем даже на запись, предоставили. Вы же пишете посекторно в раздел и если программа какая-нибудь тоже захочет записать данные, может получиться каша
0
2 / 2 / 2
Регистрация: 14.11.2010
Сообщений: 62
03.03.2011, 21:58  [ТС]
Цитата Сообщение от bigredcat Посмотреть сообщение
Да, я и не обратил внимания, что вы поменяли эти флаги
Я же вам в #12 отписался, что заменить надо только CREATE_ALWAYS.

А вы совместный доступ, причем даже на запись, предоставили. Вы же пишете посекторно в раздел и если программа какая-нибудь тоже захочет записать данные, может получиться каша
менял, как Вы и рекомендовали но программка заработала после подстановки 0

Добавлено через 23 часа 37 минут
что бы сделать динамическим название диков
как вводить название дисков
C++
1
2
3
4
5
6
7
8
9
10
HANDLE diskwrite, diskread;
cin <<diskwrite <<endl;
cin <<diskwrite <<endl;
file = CreateFile("\\\\.\\"+diskwrite+":",
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS, // <-- так нельзя, нужно OPEN_EXISTING
    0,
    NULL);
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 19
03.03.2011, 22:57
C++
1
2
3
4
5
6
7
8
9
char  buffer[200];
sprintf_s( buffer, sizeof(buffer), "\\\\.\\%s:", diskwrite );
file = CreateFile(buffer,
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS, // <-- так нельзя, нужно OPEN_EXISTING
    0,
    NULL);
0
2 / 2 / 2
Регистрация: 14.11.2010
Сообщений: 62
03.03.2011, 23:24  [ТС]
Цитата Сообщение от barmaley2005 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
char  buffer[200];
sprintf_s( buffer, sizeof(buffer), "\\\\.\\%s:", diskwrite );
file = CreateFile(buffer,
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS, // <-- так нельзя, нужно OPEN_EXISTING
    0,
    NULL);
не могли бы Вы чуть пояснить...
обьявляем массив затем выводим его, а сам ввод информации
cin <<buffer<<endl;
я правильно понимаю?
0
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
04.03.2011, 05:42
Цитата Сообщение от partos1 Посмотреть сообщение
что бы сделать динамическим название диков
как вводить название дисков
Пример задания имен разделов через командную строку

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void UsageMessage()
{
    std::cout << "Wrong parameter(s)\n\n";
    std::cout << "Usage:\n    program.exe X Y\n\nWhere:\n    X - source partition name\n    Y - destination partition name\n\n";
    system("PAUSE");
}
 
int main(int argc, char* argv[])
{
...
    // Имя раздела-источника.
    char srcPart[] = "\\\\.\\ :"; // Перед двоеточием пробел
    // Имя раздела-приемника.
    char dstPart[] = "\\\\.\\ :";
 
    // Проверка аргументов командной строки.
    if ((argc != 3) ||
        (argv[1][0] == argv[2][0]) ||
        // Эту проверку можно и по другому сделать
        ((argv[1][0] < 65 || argv[1][0] > 90) && (argv[1][0] < 97 || argv[1][0] > 122)) ||
        ((argv[2][0] < 65 || argv[1][0] > 90) && (argv[2][0] < 97 || argv[1][0] > 122)))
    {
        UsageMessage();
        return 1;
    }
 
    // Формирование имен разделов.
    srcPart[4] = argv[1][0];
    dstPart[4] = argv[2][0];
 
    srcPartHandle = CreateFileA(srcPart, ...
    dstPartHandle = CreateFileA(dstPart, ...
0
7 / 7 / 1
Регистрация: 02.03.2011
Сообщений: 19
04.03.2011, 08:06
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    char diskwrite[2] = {0};
 
    do
    {
        std::cout << "Enter drive letter : ";
        std::cin >> diskwrite[0];
        _strupr_s(diskwrite,sizeof(diskwrite));
    } while (diskwrite[0] < 'A' || diskwrite[0] > 'Z');
 
    char  buffer[200];
    sprintf_s( buffer, sizeof(buffer), "\\\\.\\%s:", diskwrite );
 
    std::cout << buffer << std::endl;
 
    system("pause");
Output:
Enter drive letter : D
\\.\D:
Для продолжения нажмите любую клавишу . . .
1
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
04.03.2011, 10:52
Цитата Сообщение от barmaley2005 Посмотреть сообщение
C++
1
2
    char  buffer[200];
    sprintf_s( buffer, sizeof(buffer), "\\\\.\\%s:", diskwrite );
так, наверное, проще
C++
1
2
    char  buffer[2][7] = {"\\\\.\\ :", "\\\\.\\ :"};
    buffer[0][4] = diskwrite[0]; buffer[1][4] = diskwrite[1];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.03.2011, 10:52

Чтение секторов с CD
Как и многие программеры-извращенцы,решил написать свою ОС в учебных целях. Т.к. нынче флоппиков мало, сразу перешел к чтению секторов с...

Найти количество кластеров и секторов диска
Как найти количество кластеров и секторов локального диска? И возможно ли обойтись без WinApi?

Количество секторов, кластеров и серийник диска
необходимо определить кол-во секторов, кластеров, байт в кластере и серийник диска перерыл функции из серии &quot; DriveInfo HardDisk =...

У свежекупленного диска много секторов с задержкой
Здравствуйте! В связи с проблемами с HDD (https://www.cyberforum.ru/hdd/thread1935738.html) купил новый. Toshiba P300 1 TB. Установил на...

Чтение секторов на диске
Подскажите, как в приложении Win32 прочитать на дискете сектор с заданным цилидром головкой и поверхностью. Не через CreateFile! ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru