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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2012, 08:53   #1
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
Восклицание FAT, секторы, кластеры чтение и работа со всем этим через C++ Builder

Стоит задача написать программу извлекающую секторы диска, информацию о FAT и саму FAT.
Создаю одну тему под таким обширным названием, чтобы писать все вопросы какие возникнут.

И так первая же проблема:

Как бы не писал в функции CreateFile первый параметр: "\\\\.\\PhysicalDrive1", "\\\\.\\C:", hFile выдает INVALID_HANDLE_VALUE. Подставлял разные буквы цифры, даже так писал "\\\\.\\PhysicalDriveC:".

Где я ошибся?!

Код:
HANDLE hFile=CreateFile("\\\\.\\PhysicalDrive1",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if (hFile==INVALID_HANDLE_VALUE)
		ShowMessage("Error");
P.S. Попутный вопрос нашел описание для этой функции в статье для Delphi и там было написано:
Цитата:
Проще всего это делать в Windows 2000/XP (с правами администратора, конечно). Работа с жестким диском в этих операционных системах производится путем открытия диска как файла с помощью функции CreateFile и указания диска или раздела по схеме Device Namespace (открывается физический диск - '\.PHYSICALDRIVE<n>'), полученный хэндл в дальнейшем используется для работы с диском с помощью функций ReadFile, WriteFile и DeviceIoControl.
Не значит ли это, что сколько я не бейся на Windows 7 я не получу нужного результата? (вышеприведенный код придется запускать на XP, так что исправления нужны под XP, программу так же проверял на XP там такая же ошибка)
Andersen1313 вне форума Ответить с цитированием
Старый 31.07.2012, 09:12   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Я открывал так:
Код:
CreateFile("\\\\.\\С:", GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 31.07.2012, 09:20   #3
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

Чему должен равняться hFile? я как понимаю какому нибудь числу, но не FFFFFFFF?

У вас не остался работающий код где вы использовали эту функцию как написали? Я пишу так же как вы написали и у меня выдает hFile=INVALID_HANDLE_VALUE
Andersen1313 вне форума Ответить с цитированием
Старый 31.07.2012, 09:28   #4
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
AnsiString str ("\\\\.\\" + Arg2);
	HANDLE hVolume = CreateFile(str.c_str(), GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
	if(hVolume == INVALID_HANDLE_VALUE)
	{
				  return FLASH_BLOCK_FAULT;
	}
Правда, открывал из службы, под системной учетной записью, щас попробуем с админом разобраться.
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 31.07.2012 в 09:32.
Krok27 вне форума Ответить с цитированием
Старый 31.07.2012, 09:30   #5
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

и у вас hVolume не равнялся после этого FFFFFFF???
Andersen1313 вне форума Ответить с цитированием
Старый 31.07.2012, 09:40   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Код:
int _tmain(int argc, _TCHAR* argv[])
{

	HANDLE H = CreateFileW(L"\\\\.\\PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
	if(H == INVALID_HANDLE_VALUE)
	{
		  DWORD err = GetLastError();
		  std::cout << "Не удалось открыть диск!" << std::endl;
                  return 1;



	}
	CloseHandle(H);
	std::cin.get();
	std::cin.ignore();
	return 0;
}
Открыл диск С:

Код:
HANDLE H = CreateFileW(L"\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
Не удается открыть. "Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.".
Знающий не говорит, говорящий не знает (С) Лао Цзы

Последний раз редактировалось Krok27; 31.07.2012 в 09:59.
Krok27 вне форума Ответить с цитированием
Старый 31.07.2012, 09:56   #7
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию

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

Получилась глупейшая ошибка, проверил код через GetLastError(), увидел что код ошибки 5, залез в справку Отказано в доступе и тут меня осенило надо было Builder было запустить от имени администратора, почему то в Windows 7 даже будучи администратором компьютера пока явно не запустишь приложение от имени администратора оно не будет работать как таковое!

Но это мне не помогло, т.к. вылезла новая ошибка, GetLastError() показал ошибку №32, тут я просто добавил закрытие HANDLE.. видимо где то как то открылось и теперь висело не закрытое
Andersen1313 вне форума Ответить с цитированием
Старый 31.07.2012, 10:10   #8
Andersen1313
Пользователь
 
Регистрация: 26.05.2010
Сообщений: 68
По умолчанию НОВЫЙ вопрос!!!

Код:
hFile=CreateFile("\\\\.\\PhysicalDrive1",...
Номер диска в этом выражении как определить?

Мне нужно выбрать диска через компонент DriveComboBox и используя данные из него вызвать функцию.. Я нашел в этом компоненте, где буква диска отображается, но надо запускать по цифре.

Как мне получить необходимую мне цифру по известной букве цифра? или из DriveComboBox можно как то вытащить сразу цифру?
Andersen1313 вне форума Ответить с цитированием
Старый 31.07.2012, 10:10   #9
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
почему то в Windows 7 даже будучи администратором компьютера пока явно не запустишь приложение от имени администратора оно не будет работать как таковое!
Потому что в Win7 такая система безопасности. Все программы, без явного указания на то, запускаются с ограниченной учеткой. Можно программно добавить кнопку для запуска с правами админа, как, например, в Диспетчере задач Win7.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 31.07.2012, 10:18   #10
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

По букве удалось открыть все диски, в том числе флешки, внешние и CD-ROMы, кроме системного.
Код:
HANDLE H = CreateFileW(L"\\\\.\\D:", GENERIC_READ, FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
Знающий не говорит, говорящий не знает (С) Лао Цзы
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