Page 1 of 1

?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Wed Sep 23, 2009 4:47 pm
by Gargo
сабж

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Wed Sep 23, 2009 4:55 pm
by Mario
Microsoft Extensible Firmware Initiative FAT32 File System Specification
/kernel/trunk/fs/fat12.inc Diamond'а в заголовок забыли написать...

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Wed Sep 23, 2009 7:43 pm
by Gargo
пасиб конечно, но первый документ у меня уже есть, а второй - я повешусь разбирать 2700 строк, а тем более когда Tasm там показывает кучу ошибок

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Wed Sep 23, 2009 8:07 pm
by Mario
Тогда ищи где-нибудь книгу Кулаков В. "Программирование дисковых подсистем", хотя я заказал по почте в свое время.

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Fri Sep 25, 2009 12:43 pm
by Ghost
вечером если не забуду - вышлю, курсовик такой по управлению ресурсов делали.

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Fri Oct 02, 2009 7:42 pm
by Gargo
Подскажите плиз, что не так в программе. Fat считывается, но если записать на чистый диск файл, то видны лишние FF вначале, а в дальнейшем вообще неправильные числа отображает

Code: Select all

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <dos.h>
//#include "sysp.h"

char *buf, *fat;

int getN(char *buf, unsigned byte1, unsigned size)
{
  int r = 0;
  for(int i = byte1 + size - 1; i >= byte1; i--)
  {
    r *=256;
    r += buf[i];
  }
  return r;
}

void readSect(char *buf, unsigned sect1, unsigned num)
{
  REGS rs;
  SREGS ss;
  rs.x.dx = sect1;
  rs.x.cx = num;
  rs.x.bx = FP_OFF(buf);
  rs.x.ax &= 0;//Number of drive
  ss.ds = FP_SEG(buf);
  int86x(0x25, &rs, &rs, &ss);
}

  unsigned int wSectSize, wResSects, fatSect, wFatSects, bFatCnt, RootSect,
  wRootEntries, bClustSects, DataSect;

unsigned int nextCluster(int k)
{
  unsigned int start = k * 3 / 2, r = 0;
  r = fat[start];
  start++;
  r += (unsigned int)fat[start] * 256;
  if(k % 2 == 0)
    return (r & 0xFFF);
  else
    return (r >> 4);
}

int main()
{
  char c;
  clrscr();
  buf = (char *)calloc(512, 1);
  readSect(buf, 0, 1);

  wSectSize = getN(buf, 0xB, 2);
  fatSect = wResSects = getN(buf, 0xE, 2);
  wFatSects = getN(buf, 0x16, 2);
  bFatCnt = getN(buf, 0x10, 1);
  RootSect = fatSect + wFatSects * bFatCnt;
  wRootEntries = getN(buf, 0x11, 2);
  bClustSects = getN(buf, 0xD, 1);
  DataSect = RootSect + wRootEntries * 32 / wSectSize;

  printf("wFatSects = %d\n", wFatSects);
  printf("Reserved = %d\nFAT begin = %d\nFATSize = %d\nFATCount = %d\n",
  wResSects, fatSect, wFatSects, bFatCnt);
  printf("RootSector = %d\nRootSize = %d\nSector Size = %d\n",
  RootSect, wRootEntries, wSectSize);
  free(buf);
  fat = (char *)calloc(sizeof(char), wFatSects * wSectSize);
  readSect(fat, fatSect, wFatSects * bClustSects);

  for(unsigned int i = 0; i < wFatSects * wSectSize * 2 / 3; i++)
  {
    unsigned int r = nextCluster(i);
    if(i % 20 == 0)
    {
      clrscr();
      printf("Cluster   | Value \n");
    }
    printf("%-9X        %-9X\n", i, r);
    if(i % 20 == 19)
    {
      c = getch();
      if(c == 'q')
        return 0;
    }
  }/**/
  free(fat);
  scanf("%c", c);
  return 0;
}

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Fri Oct 02, 2009 7:54 pm
by diamond
В FAT кластеры нумеруются, начиная с 2.

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Sat Oct 03, 2009 12:42 pm
by Gargo
не догоняю, может дело в железе, потому что одна и та же программа на домашнем пк выдает нормальные цифры, на ноутах глюки... И там и там использую Vfdwin, т.к. привода нету.
выводит таблицу FAT: EF0, FEF, 3, 4, 5, 6, 7, FF8, 9, FFA, B, FFC, D, FFE, F, 10, 11, 12, 13, 14, 15, 16, 17, 8, 19, A, 1B, C, 1D, E, 1F

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Sat Oct 03, 2009 9:18 pm
by Mario
Gargo wrote:И там и там использую Vfdwin, т.к. привода нету.
Если я правильно понял, то ты пытаешся осуществить низкоуровневый доступ. Причем используя не совсем надежные методы. Может стоит попробовать такой вариант - работаем с файлом образа (например kolibri.img) загруженный в память, чтобы исключить всякие технически накладки. А уже затем можно прикручивать работу с железом. Т.е. поделить код на драйвер железки и драйвер файловой системы, и сначала отладить драйвер файловой системы.

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Sun Oct 04, 2009 10:35 am
by Gargo
Вообще, это касается не только колибри и выбирать можно только язык программирования. Работать с образом дискеты - уже не то, попробую еще тогда написать на чистом асме

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Sun Oct 04, 2009 12:09 pm
by Mario
Mario wrote:например kolibri.img
Gargo wrote:Вообще, это касается не только колибри
Слово например написал не просто так. Я понял что к Колибри отношения не имеет (еще со второго поста в теме), однако если так принципиально, то возьми образ загрузочной дискеты MS-DOS, спасательной дискеты Win98. В общем не принципиально какой образ.
Gargo wrote:Работать с образом дискеты - уже не то
Почему? ИМХО логично отладить код обрабатывающие данные, а потом уже отлаживать ту часть, которая отвечает за работу с оборудованием. Все же отладить две вещи последовательно проще, чем отладить две вещи параллельно.

Re: ?считать таблицу Fat12 и считать по ней какой-нибудь файл

Posted: Sun Oct 04, 2009 2:08 pm
by Gargo
Mario wrote:
Gargo wrote:Работать с образом дискеты - уже не то
Почему? ИМХО логично отладить код обрабатывающие данные, а потом уже отлаживать ту часть, которая отвечает за работу с оборудованием. Все же отладить две вещи последовательно проще, чем отладить две вещи параллельно.
это ты скажи тому, кто выдавал задание