С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236

Сканирование физического диска

09.02.2019, 02:33. Показов 2571. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть задача просканировать физический диск.На моей машине стоит ssd,OC Windows 7 x64
Для начала написал программку, считывающую первые 100 байт с харда, но и это не заработало.Запускал от имени администратора.Не отрабатывает функция ReadFile.
Вот код:
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
#include <stdio.h>
#include <windows.h>
 
int main()
{
    char buffer[100] = {0};
    DWORD read;
    HANDLE handle = CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (handle == INVALID_HANDLE_VALUE)
    {
        printf("%s", "Error CreateFile\n");
    }
    else
    {
        printf("%s", "OK\n");
    }
    ReadFile(handle, buffer, 100, &read, NULL);
    if (read > 0)
    {
        printf("%s", buffer);
    }
    else
    {
        printf("%s", "Error ReadFile\n");
    }
    getc(stdin);
    return 0;
}
Что я сделал неправильно?Никогда этим раньше не занимался, поэтому не ругайте, если что-то не так
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.02.2019, 02:33
Ответы с готовыми решениями:

Определение физического размера файла
Здравствуйте! У меня есть одна проблема, которая заключается в том, что функция GetCommpressedFileSize, насколько мне известно, должна...

Определение физического расположения файла на диске
Для начала, мне не даётся использование DeviceIoControl. Говорит, что hFile неверный, хотя он не NULL. С какими атрибутами открывать? ...

Загруженность физического диска 100%
Добрый день у меня загруженность физического диска 100% при этом программы запускаются долго и пролагивают игры. Хотя раньше они не...

14
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.02.2019, 11:23
Цитата Сообщение от GreyCat Посмотреть сообщение
Что я сделал неправильно?
1. Программу нужно запускать от имени администратора;
2. FILE_SHARE_WRITE | FILE_SHARE_READ;
3. Читать нужно блоками кратными размеру секторов на диске.
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
09.02.2019, 15:44  [ТС]
А откуда начинается чтение?С самого начала? Мне нужно прочитать метафайл $MFT
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.02.2019, 16:48
Цитата Сообщение от GreyCat Посмотреть сообщение
А откуда начинается чтение?
С начала диска.
Цитата Сообщение от GreyCat Посмотреть сообщение
Мне нужно прочитать метафайл $MFT
Не знаю, никогда этим не занимался. Возможно, если ты отправишь FSCTL_ENUM_USN_DATA...

Добавлено через 2 минуты
Но лучше всего начать с изучения файловой системы NTFS.
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
09.02.2019, 16:56  [ТС]
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
#include <stdio.h>
#include <windows.h>
 
int main()
{
    char buffer[4096] = {0};
    DWORD read;
    HANDLE handle = CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (handle == INVALID_HANDLE_VALUE)
    {
        printf("%s", "Error CreateFile\n");
    }
    else
    {
        printf("%s", "OK\n");
    }
    ReadFile(handle, buffer, 4096, &read, NULL);
    if (read > 0)
    {
        printf("%s", buffer);
    }
    else
    {
        printf("%s", "Error ReadFile\n");
    }
    getc(stdin);
    return 0;
}
Теперь ошибки не выдает, успешно читает 4096 байт, но буфер как был заполнен нулями так и остался.

Добавлено через 3 минуты
Если поменять устройство на \\.\PhysicalDrive1 , то читает только это:
Code
1
3└О╨╝
Здесь явно не 4096 байт
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.02.2019, 16:57
Цитата Сообщение от GreyCat Посмотреть сообщение
но буфер как был заполнен нулями так и остался
Лично у меня твой пример отработал без проблем, буфер заполняется всяким хламом.
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
09.02.2019, 16:58  [ТС]
\\.\PhysicalDrive2 так же как 1 \\.\PhysicalDrive0, а \\.\PhysicalDrive3 и более вообще не открывается, потому что скорее всего их не существует.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
09.02.2019, 17:02
Цитата Сообщение от GreyCat Посмотреть сообщение
успешно читает 4096 байт, но буфер как был заполнен нулями так и остался
Может там и находятся нули? Заполни буфер единицами и прочитай опять
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
09.02.2019, 23:00  [ТС]
Цитата Сообщение от nonedark2008 Посмотреть сообщение
Лично у меня твой пример отработал без проблем, буфер заполняется всяким хламом.
Может быть потому, что у меня на компе много разделов(linux параллельно с виндой стоит, всего 7 разделов)?

Добавлено через 5 часов 57 минут
Все отлично. Просто printf выводил до первого нуля
0
Заблокирован
09.02.2019, 23:56
GreyCat, их нет.
Занимался этим.
Просто так физический диск, на котором установлена система, сканировать нельзя.
Потом
C++
1
FILE_SHARE_READ
писать Вам ничего не нужно,
C++
1
FILE_SHARE_WRITE
убираете,
потом
Диск сканируют весь, целиком. Но нет такого буфера, равного размеру диска, а поэтому берут буфер 256кб и считывают по очереди куски диска по 256кб
http://vsokovikov.narod.ru/New... ointer.htm
http://vsokovikov.narod.ru/New... nother.htm
SetFilePointer() используют для перемещения указателя на место начала чтения, разберетесь походу
потом
C++
1
2
LPSTR Buffer;
Buffer= (LPSTR)GlobalAlloc(GPTR, 256*1024 + 1);
иначе с буфером будут проблемы
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
10.02.2019, 01:48
Цитата Сообщение от VsdMax Посмотреть сообщение
FILE_SHARE_WRITE убираете
Его нельзя убирать:
When opening a volume or floppy disk, the dwShareMode parameter must have the FILE_SHARE_WRITE flag.
0
Заблокирован
10.02.2019, 02:12
nonedark2008, у меня с FILE_SHARE_READ без записи нормально работает
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
10.02.2019, 02:15
VsdMax, эти флаги нужны не для для того, чтобы твоя программа могла что-либо читать или писать при низкоуровневом доступе к диску, а для того, чтобы это могли делать другие.
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
10.02.2019, 04:30  [ТС]
Цитата Сообщение от VsdMax Посмотреть сообщение
SetFilePointer() используют для перемещения указателя на место начала чтения, разберетесь походу
потом
C++Выделить код
1
2
LPSTR Buffer;
Buffer= (LPSTR)GlobalAlloc(GPTR, 256*1024 + 1);
иначе с буфером будут проблемы
Зачем выделять глобальную динамическую память?
Выделяю так:
C++
1
char *buffer =(char*) malloc(PIECE);
и все нормально, проходил так весь жесткий диск.

Добавлено через 1 минуту
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
#include <stdio.h>
#include <windows.h>
 
#define PIECE 2048*512
int main()
{
    //FILE *f = fopen("123", "w");
    int count = 1;
    long long readsum = 0;
    char *buffer =(char*) malloc(PIECE);
    DWORD read = 1;
    HANDLE handle = CreateFile("\\\\.\\PhysicalDrive1",GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (handle == INVALID_HANDLE_VALUE)
    {
        printf("%s", "Error CreateFile\n");
        return -1;
    }
    else
    {
        printf("%s", "OK\n");
    }
 
 
        while(read > 0)
        {
            ReadFile(handle, buffer, PIECE, &read, NULL);
            readsum+=read;
 
 
            if (readsum%(1024*1024*1024) == 0)
            {
                //printf("%d\n",buff);
                printf("%lu\n",readsum/(1024*1024*1024));
            }
            if (strstr(buffer, "hello"))
            {
                printf("\n\n\n\n\n%d---%d---\n\n\n\n\n\n%s",readsum, count ,buffer);
                count++;
            }
 
        }
        printf("%s", "OK\n");
 
    getc(stdin);
    return 0;
}
Добавлено через 20 минут
Сейчас задача научиться работать с $MFT. Почитал статью
Цитата Сообщение от nonedark2008 Посмотреть сообщение
ся. Возможно, если ты отправишь FSCTL_ENUM_USN_DATA...
Мне не совсем понятна эта технология
"Enumerates the update sequence number (USN) data between two specified boundaries to obtain master file table (MFT) records."
Во первых что такое update sequence number (USN)?
Во вторых откуда я возьму эти границы between two specified boundaries?
0
120 / 4 / 1
Регистрация: 15.06.2016
Сообщений: 236
11.02.2019, 02:13  [ТС]
Есть ли в $MFT ссылки на данные в жестком диске?Если нет, то где эта информация?

Добавлено через 4 минуты
В структуре USN_RECORD я не нашел такого пункта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2019, 02:13
Помогаю со студенческими работами здесь

Загрузка физического диска на 100%
Диспетчер задач пишет, что физические диски загружены на 100%, сам он не отображает что грузит диски... Нагрузки на процессор сильной нет...

VMware: использование физического диска-флешки
Вопрос: как? Внешний USB-диск использовать получается, а флешку - нет(на ней нормальная установленная рабочая система). В...

Как скопировать систему с физического диска на виртуальную машину?
Имеется винчестер с ОС Linux Debian 6 и всякими нужными штуками, но компьютер в котором этот винчестер стоял более недоступен. Можно ли...

При отключении второго физического жесткого диска не загружается система?
Есть жесткий диск №1 с Windows 8.1, и физический диск №2 с данными. При отключении диска №2, ОС не загружается (синий экран).. Через...

Сканирование поверхности диска под ХР
Господа, подскажите плз. Есть ли в Windows XP стандартная процедура сканирования поверхности диска, типа scandisk. Хочу флопик глянуть. ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru