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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2011, 16:48   #1
imholynx
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 10
По умолчанию Чтение файла транзакции NTFS

Здравствуйте, задание - вывести содержимое файла транзакции тома NTFS($logfile). Есть ли какие-нибудь задокументированные средства для его считывания или придется считывать напрямую с диска? Если так, то каким образом расшифровать написанное в $LogFile?(документация)
Если не сложно, помогите ссылками на код, который поможет в написании программы.
Язык - C++

Последний раз редактировалось imholynx; 17.07.2011 в 17:02.
imholynx вне форума Ответить с цитированием
Старый 17.07.2011, 17:06   #2
imholynx
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 10
По умолчанию

Проблема в том, что я не знаю с чего начать
imholynx вне форума Ответить с цитированием
Старый 17.07.2011, 22:03   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

CreateFile поможет. Может работать с устроуствами, потоками файловыми, и т.д. С Си ничем не могу помочь, использую Delphi.
Alter вне форума Ответить с цитированием
Старый 18.07.2011, 00:32   #4
imholynx
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 10
По умолчанию

Да, спасибо, считать файл смог, но никак не найду внутреннее строение. Какого типа информация должна в нём хранится?
Я представляю, что-то вроде:
Название файла Дата изменения Вид изменения(создание/удаление/)
imholynx вне форума Ответить с цитированием
Старый 18.07.2011, 00:47   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,821
По умолчанию

Цитата:
но никак не найду внутреннее строение
Вы прикидываетесь? В своем первом посте кликнете на документация
p51x вне форума Ответить с цитированием
Старый 18.07.2011, 01:09   #6
imholynx
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы прикидываетесь? В своем первом посте кликнете на документация
и в документации найдем кучу вопросиков, и комментариев автора в духе "а это известно только самому Билу Гейтсу"

По существу, читал google перевод этой страницы и не нашёл,например, в каком атрибуте хранится информация о действии с файлом(создание/удаление)
imholynx вне форума Ответить с цитированием
Старый 18.07.2011, 07:10   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,821
По умолчанию

Цитата:
а это известно только самому Билу Гейтсу
А что вы хотели? НТФС не открытый стандарт.... ищите по форумам ОСДЕВ
p51x вне форума Ответить с цитированием
Старый 24.08.2011, 19:43   #8
imholynx
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 10
По умолчанию

Снова занялся программой, нашел код, где программист считывает атрибуты MFT зоны, решил с ней поиграть и поэкспериментировать,но не проходит первый while.
Код:
#include "stdafx.h"
#include <atlbase.h>
#include <windows.h>
#include <stdio.h>
#include <winioctl.h> // Windows NT IOCTL коды
#include <malloc.h>


#pragma pack(1)

//Здесь были описаны необходимые структуры

#pragma pack()
byte buf[512];
byte buf_FileRec[1024];

int _tmain(int argc, _TCHAR* argv[])
{
	// открываем логический диск
	HANDLE hDisk = ::CreateFile (_T("\\\\.\\D:"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);


	// Проверяем успешно ли закончилась попытка открытия логического диска
	if (hDisk != NULL && hDisk != INVALID_HANDLE_VALUE)
	{
		BYTE buffer [512];
		DWORD dwRead;
		DWORD dwBytesWrite; 
		LONG BeginMFTSector;
		// Читаем первый сектор раздела
		BOOL res = ::ReadFile (hDisk, buffer, 512, &dwRead, NULL);
		// Извлекаем из считанного сектора блок параметров BIOS
		BPB_NTFS sbpbntfs;
		memcpy(&sbpbntfs, buffer + 11, 73);
		// Определяем сектор начала MFT
		BeginMFTSector = sbpbntfs.bSecPerClust * sbpbntfs.FirstMFT;
		// Позиционируемся на начало MFT
		DWORD dwPtrLow = SetFilePointer (hDisk, 512*(BeginMFTSector+16) /*3080601600*/, NULL, FILE_BEGIN);
		// Читаем блок из MFT
		ReadFile(hDisk, buf_FileRec, 1024, &dwRead, NULL);
		// Извлекаем из считанного заголовок файловой записи
		FileRecordHeader fHeader;
		memcpy(&fHeader, buf_FileRec, sizeof(fHeader));
		DWORD OffsetFileRec = 0;

		while(strncmp(fHeader.ID, "FILE", 4) == 0)
		{
			printf("%s\n",fHeader.ID);
			// Читаем из MFT файловую запись
			ReadFile(hDisk, buf_FileRec, 1024, &dwRead, NULL);
			// Извлекаем из считанного заголовок файловой записи
			FileRecordHeader fHeader;
			memcpy(&fHeader, buf_FileRec, sizeof(fHeader));
			// Извлекаем из считанного заголовок атрибута
			StandartAttribHeader stattrHeader;
			WORD attrOffset;
			attrOffset = fHeader.AttribBegOffset;
			memcpy(&stattrHeader, buf_FileRec + attrOffset, sizeof(StandartAttribHeader));
			// Пока не прочли все атрибуты
			while(stattrHeader.ID != fHeader.AttribMaxID - 1)
			{
				// Извлекаем из считанного заголовок очередного атрибута
				attrOffset = attrOffset + stattrHeader.Length;
				memcpy(&stattrHeader, buf_FileRec + attrOffset, sizeof(StandartAttribHeader));
				// Если последний атрибут, выходим из цикла
				if(stattrHeader.Type == 0xffffffff) break;
				switch(stattrHeader.Type)
				{
				case 0x30: // Если тип атрибута имя
					{
						FileNameAttrCont fNameAttr;
						// Извлекаем из считаного содержание атрибута имя
						memcpy(&fNameAttr , buf_FileRec + attrOffset + 24 +
							stattrHeader.ContentOffset, sizeof(FileNameAttrCont ));
						// Если длина имени больше нуля, выводим имя на экран
						if(fNameAttr. LengthName > 0)
						{
							char MultiByteStr[30]; int dj = 0;
							for(int di = 0; di < fNameAttr.LengthName * 2; di = di+2)
							{
								MultiByteStr[dj] = fNameAttr.FileName[di]; dj++;
							}
							MultiByteStr[dj] = '\0';
							printf("%s\n",MultiByteStr);
						}
						break;
					}
				}
			}
			// Определяем смещение следующей файловой записи
			OffsetFileRec = OffsetFileRec + 1024;
			// Позиционируемся на файловую запись
			dwPtrLow = SetFilePointer (hDisk, 512*(BeginMFTSector+32) + OffsetFileRec, NULL,FILE_BEGIN);
		} 

	}
	else printf("Error handle");
	// Закрываем дескриптор
	CloseHandle(hDisk);
	DWORD dwError = ::GetLastError();

	return 0;
}
Подскажите, где ошибка?
imholynx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ручной поиск файла в Ntfs hard-t Windows 1 18.12.2010 19:21
Список кластеров файла (NTFS, Ext3, Ext4) Codogenerator Помощь студентам 4 18.12.2010 19:19
транзакции пауэрлифтинг БД в Delphi 0 27.05.2010 02:24
Транзакции и try nikmay Общие вопросы Delphi 1 30.07.2009 21:13
Вывод атрибутов файла в NTFS un07 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 27.02.2008 19:47