Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> про жесткий диск 
:(
    Опции темы
banich
Дата 29.10.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Допустим, что из MBR жесткого диска я узнал, что LBA-адрес первого extended раздела равен X. По идее если я cделаю так:

fd=open("/dev/hda",O_RDONLY))
lseek(fd,X,0);

то попаду в нулевой сектор этого расширенного раздела, где должна располагаться его собственная таблица разделов. 

почему-то этого не происходит, может я всё совсем не так делаю? Помогите плз

PS вообще задание заключается в том, чтобы подсчитать количество всех primary, extended и logical разделов на диске...
PM MAIL ICQ   Вверх
MAKCim
Дата 29.10.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



banich
LBA адрес побайтно считается?
По-моему поблочно

Это сообщение отредактировал(а) MAKCim - 29.10.2006, 22:15


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
banich
Дата 29.10.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



спасибо большое!

Это сообщение отредактировал(а) banich - 1.11.2006, 00:20
PM MAIL ICQ   Вверх
banich
Дата 1.11.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Все по той же задаче:
чтобы разобраться, я почитал вот эту статью http://www.opennet.ru/base/dev/hdd_struct.txt.html, в которой даже приведена готовая программа.
Вот результат ее работы на моем компьютере:

Num   Bootable  Start              Total                 Id         Type
1        *               63                 34812792         0x07    HPFS/NTFS
2                         34812855     61432560         0x07    HPFS/NTFS
3                         96245415     216331290       0x0F    Win Ext'd (LBA)
5                         171204768   141371937       0x07    HPFS/NTFS

А вот что пишет fdisk:

Устр-во Загр     Начало       Конец            Блоки          Id     Система
/dev/hda1   *          63          34812854    17406396      7     HPFS/NTFS
/dev/hda2        34812855    96245414    30716280       7     HPFS/NTFS
/dev/hda3        96245415   312576704   108165645      f     W95 расшир. (LBA)
/dev/hda5       171204768   312576704    70685968+   7     HPFS/NTFS
/dev/hda6        96245541   114671969     9213214+    83    Linux
/dev/hda7       114672033   115700129      514048+    83    Linux
/dev/hda8       115700193   117804644     1052226      82    Linux своп / Solaris
/dev/hda9       117804708   171204704    26699998+  83     Linux

Скорее всего, я как-то не так пытаюсь сослаться на второй extended раздел, используя данные из таблицы первого. В статье сказано, что нужно брать адрес 1-го логического раздела от начала винча + размер этого лог диска
Скажите пожалуйста, как сделать правильно... 

PM MAIL ICQ   Вверх
MAKCim
Дата 1.11.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Скорее всего, я как-то не так пытаюсь сослаться на второй extended раздел, используя данные из таблицы первого.

Что за второй extended? Я тут только 1 вижу
Если у тебя есть адрес extended раздела - не вижу проблемы получить все остальное
Приведи свой код


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
banich
Дата 2.11.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Код

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/types.h>

#define SIGNATURE 0xAA55
#define DEVICE "/dev/hda"

#define PT_SIZE 0x10

    struct systypes {
        __u8 part_type;
        __u8 *part_name;
    };

    struct systypes i386_sys_types[] = {
        {0x00, "Empty"},
        {0x01, "FAT12"},
        {0x04, "FAT16 <32M"},
        {0x05, "Extended"},
        {0x06, "FAT16"},
        {0x0b, "FAT32"},
        {0x0c, "FAT32 (LBA)"},
        {0x0e, "FAT16 (LBA)"},
        {0x0f, "Win Ext'd (LBA)"},
        {0x82, "Linux swap"},
        {0x83, "Linux"},
        {0x85, "Linux extended"},
        {0x07, "HPFS/NTFS"}
    };


#define PART_NUM (sizeof(i386_sys_types) / sizeof(i386_sys_types[0]))

int hard;    
 __u8 mbr[512];    

#define MAX_PART 20

    struct pt_struct {
        __u8 bootable;
        __u8 start_part[3];
        __u8 type_part;
        __u8 end_part[3];
        __u32 sect_before;
        __u32 sect_total;
    } pt_t[MAX_PART];

    int main()
    {
        int i = 0;
        __u64 seek;

        hard = open(DEVICE, O_RDONLY);
        if(hard < 0) {
            perror("open");
            exit(-1);
        }
    
        read_main_ptable();

        if(check_sign() < 0) {
            printf("Not valid signature!\n");
            exit(-1);
        }

        for(; i < 4; i++) {
            if((pt_t[i].type_part == 0xF) || \
        (pt_t[i].type_part == 0x5) || \
        (pt_t[i].type_part == 0x0C)) {
            seek = (__u64)pt_t[i].sect_before * 512;
            read_ext_ptable(seek);
            break;
            }
        }

        pt_info();
        return 0;
    }

    int check_sign()
    {
        __u16 sign = 0;

        memcpy((void *)&sign, (void *)(mbr + 0x1FE), 2);

        printf("Сигнатура - 0x%X\n", sign);

        if(sign != SIGNATURE) return -1;
        return 0;
    }

    void read_main_ptable()
    {
        if(read(hard, mbr, 512) < 0) {
            perror("read");
            close(hard);
            exit(-1);
        }

        memset((void *)pt_t, 0, (PT_SIZE * 4));
        memcpy((void *)pt_t, mbr + 0x1BE, (PT_SIZE * 4));

        return;
    }

    void read_ext_ptable(__u64 seek)
    {
        int num = 4;
           
        __u8 smbr[512];

        for(;;num++) {

            memset((void *)smbr, 0, 512);
            pread64(hard, smbr, 512, seek);

            memset((void *)&pt_t[num], 0, PT_SIZE * 2);
            memcpy((void *)&pt_t[num], smbr + 0x1BE, PT_SIZE * 2);

            pt_t[num].sect_before += (seek / 512);
     
            if(!(pt_t[num + 1].type_part)) break;
        
            seek = ((__u64)(pt_t[num].sect_before + pt_t[num].sect_total)) * 512;
        }
        return;
    }

    void pt_info()
    {
        int i, n;
     
        printf("\nNum\tBootable\tStart\tTotal\t\tId\tType\n");

        for(i = 0; i < MAX_PART; i++) {

            if(!pt_t[i].type_part) {
        if(i < 4) continue;
        else break;
            }

            printf("%d\t", i + 1);

            if(pt_t[i].bootable == 0x80) printf("*\t");
            else printf("\t");

            printf("%12u\t", pt_t[i].sect_before);
            printf("%8u\t", pt_t[i].sect_total);
            printf("0x%.2X\t", pt_t[i].type_part);

            for(n = 0; n < PART_NUM; n++) {
         if(pt_t[i].type_part == i386_sys_types[n].part_type) {
                 printf("%s\n", i386_sys_types[n].part_name);
                 break;
         }
            }
            if(n == PART_NUM) printf("unknown type\n");
        }
        return;
    }

скорее всего что-то не так с функции read_ext_ptable()
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.