Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2019, 10:44   #1
riko747
 
Регистрация: 18.02.2019
Сообщений: 5
Вопрос Чтение с диска

Здравствуйте. Пишу утилиту для считывания бинарных данных с файловой системы диска. При запуске нужно указать номер считываемого диска и номер считываемого сектора. Задача - считать данные которые кроются в ячейке бинарного файла, на которую указывает указатель (В моём случае это смещение 510 байт от начала сектора диска). Собственно проблема: переменная типа "DWORD" имеет размер - 4 байта. Нужные мне значения скорее всего типа "long". Поэтому, когда я хочу получить данные с ячейки я соответственно получаю мусорное, или неверное значение. Другими способами как через функцию ReadFile я не знаю как реализовать идею. Прошу помощи. Собственно вот сам код:
Код:
#include "mbr.h"
 
char    *concat(const char *s1, const char *s2)
{
    char *result;
 
    if(!(result = (char *)malloc(strlen(s1) + strlen(s2) + 1)))
        return NULL;
    strcpy(result, s1);
    strcat(result, s2);
    return (result);
}
 
void    ReadSect(const char *dsk, unsigned long sector, int offset)
{
    DWORD   dwRead;   
    HANDLE  hDisk;
    char    *buff;
    int     *ptr;
 
    buff = (char*)malloc(sizeof(char) * 1024);
    dwRead = (long unsigned int)512;
    printf("SIZE OF dwRead %I64i\n", sizeof(dwRead));
    hDisk = CreateFile(dsk, GENERIC_READ, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);
    SetFilePointer(hDisk, sector * 512, 0, FILE_BEGIN);
    ReadFile(hDisk, buff, 512, &dwRead, 0);
    ptr = (int*)(buff + offset);
    printf("OFFSET DATA: %i\n", *ptr);
    CloseHandle(hDisk);
}
 
int     main(int argc, char **argv)
{
    int     sector; 
    char    *dsk;
 
    if (argc == 3)
    {
        sector = atoi(argv[2]);
        dsk = concat("\\\\.\\PhysicalDrive", argv[1]);
        ReadSect(dsk, sector, 510);
    }
    else
        printf("%s\n", "Usage: MBRInfo.exe [Disk Number] [Number of Sector]");
    return (0);
}
riko747 вне форума Ответить с цитированием
Старый 18.02.2019, 10:50   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от riko747 Посмотреть сообщение
Код:
dwRead = (long unsigned int)512;
это что?

https://docs.microsoft.com/en-us/win...leapi-readfile

Цитата:
lpNumberOfBytesRead

A pointer to the variable that receives the number of bytes read when using a synchronous hFile parameter. ReadFile sets this value to zero before doing any work or error checking.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.02.2019, 13:07   #3
riko747
 
Регистрация: 18.02.2019
Сообщений: 5
По умолчанию

Пытался кастовать в другой тип данных
riko747 вне форума Ответить с цитированием
Старый 18.02.2019, 13:19   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что вы пытались кастовать? Вы даже приведенную цитату не осилили. А в мсдн еще круче: перед работой ReadFile записивает в эту переменную 0 и пофиг на ваши 512 инт, 512 лонг инт, 512 звезд...
p51x вне форума Ответить с цитированием
Старый 18.02.2019, 13:20   #5
riko747
 
Регистрация: 18.02.2019
Сообщений: 5
По умолчанию

Извините, если оскорбил вас чем-то. Я всего лишь прошу помощи. Любой. Решить эту задачу мне и самому будет интересно. Мне просто нужно направление, где искать ошибку.
riko747 вне форума Ответить с цитированием
Старый 18.02.2019, 13:28   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. Для начала сформулируйте задачу:
вам надо прочитать определенный физ. сектор или все-таки сектор бинарного файла на диске.
2. На нтфс в многих случаях размер сектора 4 Кб https://support.microsoft.com/en-ca/...-fat-and-exfat
но на деле этот список куда больше http://www.ntfs.com/ntfs_optimization.htm
3. Что-то вы не озаботились правами при попытках прямого чтения диска.
4. И вообще не понятна ваша проблема
Цитата:
Собственно проблема: переменная типа "DWORD" имеет размер - 4 байта. Нужные мне значения скорее всего типа "long".
Какая переменая? dwRead? Она к вашим данным и их типу мало имеет отношения.
p51x вне форума Ответить с цитированием
Старый 18.02.2019, 13:31   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от riko747 Посмотреть сообщение
Прошу помощи.
Прочитайте *внимательно* про параметры функции SetFilePointer
waleri вне форума Ответить с цитированием
Старый 18.02.2019, 13:35   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

...и даже если бы имела, то вы же наоборот ей пытались присвоить long.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 18.02.2019, 14:05   #9
riko747
 
Регистрация: 18.02.2019
Сообщений: 5
По умолчанию

Мне нужно прочитать определённый сектор, для (например) дальнейшего определения типа файловой системы, или чтобы узнать из скольких секторов состоит раздел и т.д. и т.п. Это можно узнать, выведя значение смещения.
riko747 вне форума Ответить с цитированием
Старый 18.02.2019, 14:11   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Тогда стоит начать с IOCTL_DISK_GET_DRIVE_GEOMETRY или IOCTL_DISK_GET_DRIVE_GEOMETRY_EX и не закладываться на 512.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VC++ чтение загрузочной записи диска Mahin Общие вопросы C/C++ 9 05.02.2013 07:27
чтение сектора с диска 16milashka16 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 15.12.2011 10:42
Чтение с локального диска и из WEB mactepmac Общие вопросы Delphi 3 20.07.2011 14:28
Посекторное чтение и запись диска posmotret Qt и кроссплатформенное программирование С/С++ 1 04.07.2011 12:05
Чтение файлов с диска Wolf-alone Общие вопросы C/C++ 1 17.09.2008 10:05