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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2009, 22:44   #1
DOLBY
Форумчанин
 
Аватар для DOLBY
 
Регистрация: 12.12.2007
Сообщений: 121
По умолчанию mft read

Ув. Форумчане. Есть такая задача - прочитать содержимое mft ntfs диска.
Файл "\\.\C:" открывается нормально, но что делать дальше?
Заранее спасибо.
Код:
#include <windows.h>
#include <stdio.h>

int main()
{
	HANDLE hFile;
	LPCSTR fileName = "\\\\.\\C:";
	
	hFile = CreateFile(fileName, 
	
		GENERIC_READ, 
		FILE_SHARE_READ | FILE_SHARE_WRITE, 
		NULL, 
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL);

	if (hFile != INVALID_HANDLE_VALUE)
	{

		printf("File was open\n");
		system("pause");
		return 0;
	}
	else
	{
		printf("Could not open file (error %d)\n", GetLastError());
		system("pause");
		return 1;
	
	}
}
Компьютеры - вещь слишком сложная, чтобы работать в принципе. Поэтому то, что они работают хоть как-то, уже чудо.
DOLBY вне форума Ответить с цитированием
Старый 24.09.2009, 23:33   #2
DOLBY
Форумчанин
 
Аватар для DOLBY
 
Регистрация: 12.12.2007
Сообщений: 121
По умолчанию

Ну что, никто не сталкивался с подобной ситуацией?
Компьютеры - вещь слишком сложная, чтобы работать в принципе. Поэтому то, что они работают хоть как-то, уже чудо.
DOLBY вне форума Ответить с цитированием
Старый 25.09.2009, 00:15   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Ну, наверно, читать дальше надо посредством ReadFile. Ну и не забывать закрывать его за собой посредством CloseFile
pu4koff вне форума Ответить с цитированием
Старый 25.09.2009, 03:57   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вот тебе в твой код добавка, чтобы получить первый сектор MFT. Дальше сам разбирайся.
Код:
	BYTE Buffer[512];
	DWORD Readed;
	ReadFile(hFile, Buffer, 512, &Readed, NULL);

	int ClusterSize = *(WORD*)(Buffer+11) * Buffer[13];
	int Pos = *(DWORD*)(Buffer+48) * ClusterSize;

	SetFilePointer(hFile, Pos, NULL, FILE_BEGIN);
	ReadFile(hFile, Buffer, 512, &Readed, NULL);
Black Fregat вне форума Ответить с цитированием
Старый 25.09.2009, 15:46   #5
DOLBY
Форумчанин
 
Аватар для DOLBY
 
Регистрация: 12.12.2007
Сообщений: 121
По умолчанию

Вот немного изменил код, нашёл пару статей по структуре ntfs, вроде разобрался. Одного не могу понять... Почему на диске "C" MFTPos равен -1073741824? Он вообще может быть отрицательный?
И подскажите пожалуйста какую-нибудь программку, которая читает mft, для сравнения.

Код:
#include <windows.h>
#include <stdio.h>

int main()
{
	int drive='C';
	HANDLE h;
	char fileName[] = "\\\\.\\C:";

	printf("Drive letter: ");
	scanf_s("%c", &drive);
	fileName[4]=drive;
	system("cls");
	
	h = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (h != INVALID_HANDLE_VALUE)
	{
		printf("File \"%s\" was opened\n\n", fileName);

		BYTE buf[512];
		DWORD BytesRead;
		ReadFile(h, buf, 512, &BytesRead, NULL);

		DWORD MFTStartCluster=*(DWORD*)(buf+48);
		WORD BytesPerSector=*(WORD*)(buf+11);
		BYTE SectorsPerCluster=*(BYTE*)(buf+13);

		int ClusterSize = BytesPerSector * SectorsPerCluster;
		int MFTPos = MFTStartCluster * ClusterSize;
		printf("%d\n%d\n", ClusterSize, MFTPos);

		system("pause");
		CloseHandle(h);
		return 0;
	}
	else
	{
		printf("Could not open file \"%s\" (error %d)\n",  fileName, GetLastError());
		system("pause");
		return 1;
	
	}
}
Компьютеры - вещь слишком сложная, чтобы работать в принципе. Поэтому то, что они работают хоть как-то, уже чудо.

Последний раз редактировалось DOLBY; 26.09.2009 в 11:43.
DOLBY вне форума Ответить с цитированием
Старый 27.09.2009, 16:46   #6
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от DOLBY Посмотреть сообщение
Почему на диске "C" MFTPos равен -1073741824? Он вообще может быть отрицательный?
Во-первых, он, безусловно, unsigned.

Во-вторых, возможно, переполняется, это вполне вероятно. Используй 64-байтные числа + старшие разряды в SetFilePointer через 3-й параметр.

И в-третьих, давно бы уже руками на виндовом калькуляторе посчитал произведение трех чисел - все стало бы ясно
Black Fregat вне форума Ответить с цитированием
Старый 27.09.2009, 19:34   #7
DOLBY
Форумчанин
 
Аватар для DOLBY
 
Регистрация: 12.12.2007
Сообщений: 121
По умолчанию

Спасибо, я уже разобрался. Просто надо было сначала поковырять, а потом сюда писать.
Компьютеры - вещь слишком сложная, чтобы работать в принципе. Поэтому то, что они работают хоть как-то, уже чудо.
DOLBY вне форума Ответить с цитированием
Старый 21.03.2010, 19:06   #8
P1lot
Новичок
Джуниор
 
Регистрация: 21.03.2010
Сообщений: 1
По умолчанию

Если можно, объясните, пожалуйста, для меня как дальше разобрать таблицу MFT. Я получаю доступ к диску, смещение считаеся правильно, далее я читаю 512 байт... и что с ними делать??? Объясните пожалуйста, или хотя бы посоветуйте где почитать, нужно написать такую программу... Даже специально зарегистрировался здесь, в надежде на Вашу помощь. Спасибо!
P1lot вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
the cursor is read only Veroonya SQL, базы данных 2 19.03.2009 17:55
ADODataSet: cannot modify a read-only dataset cvetochek Помощь студентам 2 29.10.2007 14:49