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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2012, 12:00   #21
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

В общем вроде во всем разобрался и как дальше считать байты как че от куда получить, остался один вопрос без, которого я боюсь не то получу:

Есть две формы CreateFile:

"\\\\.\\PhisycalDriveN"

"\\\\.\\X:"

В чем в них разница? Знаю что первая дает вроде указатель на физический диск, а вторая на раздел диска! У меня задание: прочитать системные структуры данных BR, резервную копию BR,BF_BPB, FSInfo, для одного логического диска(дошел до этой фразы и подумал что логический как раз и есть раздел диск, но все же продолжу вопрос), потом мне понадобится прочитать байты с FAT информацию о FAT извлечь, в общем Получал при помощи функции DeviceIoControl геометрию диска и раздела (использовал для этого флешку по заданию, раздел естественно один) получил разную информацию.. Какую форму мне надо использовать в итоге чтобы всю информацию найти какая требуется?
Andersen1313 вне форума Ответить с цитированием
Старый 01.08.2012, 12:08   #22
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Вот у меня имеется такая схема она будет действительна для раздела диска("\\\\.\\C:")?

Andersen1313 вне форума Ответить с цитированием
Старый 01.08.2012, 13:15   #23
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Нашел код в котором определяются необходимые переменные для работы дальше:

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

int main()
{
    using namespace std;

    // Дескриптор файлового устройства (раздела диска).
	HANDLE partition = INVALID_HANDLE_VALUE;
    // Сведения о разделе.
    PARTITION_INFORMATION partitionInfo = {0};
    // Сведения о геометрии диска, на котором расположен раздел.
    DISK_GEOMETRY diskGeometry = {0};

    // Дескриптор файла для сохранения образа раздела.
    HANDLE file = INVALID_HANDLE_VALUE;

    // Буфер для чтения.
    BYTE* buffer = NULL;
    // Размер буфера.
    DWORD bufferSize = 0;

    // Количество возвращенных байт.
    DWORD bytesReturned = 0;
    // Количество записанных байт.
    DWORD bytesWritten = 0;

    // Результат выполнения.
    BOOL result = FALSE;

Я пытаюсь определить переменную diskGeometry вот так(нужно написать на Buider, не на С++):


Код:
//---------------------------------------------------------------------------

#include <vcl.h>

#include <windows.h>

#pragma hdrstop

#include "MainUnit.h"


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------


using namespace std;

void __fastcall TMainForm::DriveComboBox1DriveSelect(TObject *Sender)
{
	DISK_GEOMETRY diskGeometry = {0};

	String DriveOpen="\\\\.\\"+DriveComboBox1->Items->Strings[DriveComboBox1->ItemIndex];
	DriveOpen.Insert('\0',7);
	HANDLE hFile=CreateFileW(DriveOpen.c_str(),GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
	if (hFile==INVALID_HANDLE_VALUE)
	{
		int err = GetLastError();
		ShowMessage("Ошибка #" + IntToStr(err) + ": Не удалось открыть диск!");
		CloseHandle(hFile);
		return;
	}
	CloseHandle(hFile);
}
//---------------------------------------------------------------------------
Но компилятор выдает ошибку:
Цитата:
[BCC32 Error] MainUnit.cpp(29): E2451 Undefined symbol 'DISK_GEOMETRY'
Понимаю, что взять код на С++ и вставить в функцию обработчик на Builder это не одно и тоже, но я не знаю в чем здесь ошибка
Andersen1313 вне форума Ответить с цитированием
Старый 01.08.2012, 13:36   #24
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Объявил структуру DISK_GEOMETRY как:

Код:
typedef struct _DISK_GEOMETRY
	{
		LARGE_INTEGER Cylinders; // Количество цилиндров
		DWORD MediaType;
		DWORD TracksPerCylinder; // Количество дорожек на цилиндр
		DWORD SectorsPerTrack;  // Количество секторов на дорожку
		DWORD BytesPerSector;
	} DISK_GEOMETRY;
И все заработало! Только у меня вопрос почему в первом отрезке кода без этого объявления заработала программа, а у меня на builder нет, я вроде все заголовочники объявил
Andersen1313 вне форума Ответить с цитированием
Старый 01.08.2012, 15:35   #25
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

У меня возникли вопросы в строчках какие я выделил в коде красным, вопросы:
1) SetFilePointer(hFile,StrToInt(Edit1->Text),NULL,FILE_BEGIN); - если в Edit1-> Text будет 1 то указатель сместится на 1 байт? или сектор? (hFile - хэндел раздела диска) Например: у меня в Edit1->Text хранится 1, это значит что я должен буду в следующем действие считать 1 сектор как правильно сместить указатель в hFile?
2) result = ReadFile(hFile, buffer, bufferSize, &bytesReturned, 0); - эта функция может из хэндла на раздел диска считывать только кратное кол-во байт сектору? пробовал считать 1 байт не получилось..
3) StringGrid1->Cells[i,j]=buffer[i*j+j]; - Как мне по байтово запихать сектор считанный из из раздела диска. Например: мы считали 1ый сектор из раздела в buffer(см. вопрос 1), сектор содержит 512 байт, следовательно я должен заполнить 512 ячеек..

Вроде все понимаю как должно работать, примерно знаю какие, как функции что получают, но чет ни чего дельного получить не могу..

Привожу код того что сделал:

Код:
//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "MainUnit.h"
#define IOCTL_DISK_GET_DRIVE_GEOMETRY 0x70000

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
#include <iostream>
#include <windows.h>

using namespace std;

void __fastcall TMainForm::DriveComboBox1DriveSelect(TObject *Sender)
{

    typedef struct _DISK_GEOMETRY
	{
		LARGE_INTEGER Cylinders; // Количество цилиндров
		DWORD MediaType;
		DWORD TracksPerCylinder; // Количество дорожек на цилиндр
		DWORD SectorsPerTrack;  // Количество секторов на дорожку
		DWORD BytesPerSector;
	} DISK_GEOMETRY;

	DISK_GEOMETRY diskGeometry;

	DWORD bytesReturned=0;

	BYTE *buffer=NULL;

	DWORD bufferSize;

	BOOL result = 0;

	String DriveOpen="\\\\.\\"+DriveComboBox1->Items->Strings[DriveComboBox1->ItemIndex];
	DriveOpen.Insert('\0',7);
	HANDLE hFile=CreateFileW(DriveOpen.c_str(),GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
	if (hFile==INVALID_HANDLE_VALUE)
	{
		int err = GetLastError();
		ShowMessage("Ошибка #" + IntToStr(err) + ": Не удалось открыть диск!");
		CloseHandle(hFile);
		return;
	}

	DeviceIoControl(hFile,IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,&diskGeometry,sizeof (DISK_GEOMETRY),&bytesReturned,(LPOVERLAPPED)NULL);

	StringGrid1->RowCount=diskGeometry.BytesPerSector/16+1;

	bufferSize=diskGeometry.BytesPerSector;

	buffer = new BYTE[bufferSize];
	SetFilePointer(hFile,StrToInt(Edit1->Text),NULL,FILE_BEGIN);//ВОТ ЭТА СТРОЧКА
	result = ReadFile(hFile, buffer, bufferSize, &bytesReturned, 0);//ВОТ ЭТА СТРОЧКА
	if (!result)
	{
		int err = GetLastError();
		ShowMessage("Ошибка #" + IntToStr(err));
		delete[] buffer;
		CloseHandle(hFile);
		return;
	}
	cout << buffer;
	system("pause");
	for (int i = 1; i < StringGrid1->RowCount; i++)
		for (int j = 1; j < StringGrid1->ColCount; j++)
			{

				StringGrid1->Cells[i,j]=buffer[i*j+j];//ВОТ ЭТА СТРОЧКА
			}

	CloseHandle(hFile);
}
//---------------------------------------------------------------------------
Andersen1313 вне форума Ответить с цитированием
Старый 01.08.2012, 16:50   #26
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

тут посмотри
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 01.08.2012, 20:26   #27
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

В общем у меня все вроде правильно работает я считал в переменную BYTE *buffer нужных мне 512 байт.. но я не знаю как мне эти 512 байт вывести в 512 ячеек компонента StringGrid в этом компоненте требует UnicodeString, а в указателе хранятся unsigned char *... как мне преобразовать из unsigned char * в UnicodeString? Да еще надо так чтобы содержимое отображалось в 16ти ричной системе счисления.. но я пока даже вообще вывести из указателя ни че не могу.. в той статье идет просто запись в другой файл
Andersen1313 вне форума Ответить с цитированием
Старый 02.08.2012, 14:30   #28
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
но я пока даже вообще вывести из указателя ни че не могу..
тогда нужно обратиться к учебнику по Си.

Цитата:
как мне преобразовать из unsigned char * в UnicodeString
MultiByteToWideChar или mbstowcs или в типе String есть конструктор с аргументом char*

Цитата:
16ти ричной системе счисления..
IntToHex или

Код:
std::string IntToHex(const int i) 
{
    std::ostringstream ost;
    ost << std::hex << i;
    return ost.str();
}
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 02.08.2012 в 14:50.
Krok27 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Builder чтение из файла через пробел reeskblg Помощь студентам 2 14.12.2011 18:20
Секторы и кластеры. worp Свободное общение 4 14.09.2011 23:28
Битые кластеры hon Компьютерное железо 7 03.08.2011 00:32
С++ Builder - Чтение файла :( Davlet M Помощь студентам 7 27.08.2009 23:53
Чтение данных из файла Excel в C++Builder Max2114 C++ Builder 6 15.01.2009 11:32