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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2012, 14:57   #11
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Код:
hfile = CreateFile("\\\\.\\PHYSICALDRIVE4",
			                GENERIC_READ,
					FILE_SHARE_READ|FILE_SHARE_WRITE,
							NULL,
							OPEN_EXISTING,
							FILE_FLAG_NO_BUFFERING|FILE_FLAG_WRITE_THROUGH,
							NULL);//открытие файла

		if (hfile == INVALID_HANDLE_VALUE) {
			cout<<"INVALID_HANDLE_VALUE  "<< GetLastError()<<" \n";
			return 1;
		}
				
	
		if( !DeviceIoControl(
					hfile,
					FSCTL_LOCK_VOLUME, 
                                        NULL, 
                                        0, 
                                        NULL, 
                                        0, 
                                        &cbReturned, 
                                        NULL ) )
			{
				printf(  "Failed to lock the volume %s with error %ld\n", p_disk, GetLastError() );
				return 1;
			}
			else 
			{
				printf( "Locked %s\n" , p_disk ); 
				
			}
//======================================================

			if( !DeviceIoControl(
						hfile,
						FSCTL_DISMOUNT_VOLUME, 
                                                NULL, 
                                                0, 
                                                NULL, 
                                                0, 
                                                &cbReturned, 
                                                NULL ) )
			{
				printf(  "Failed to dismount the volume %s with error %ld\n", p_disk, GetLastError() );
				return 1;
			}
			else 
			{
				printf( "Dismounted %s\n" , p_disk ); 
			}
			CloseHandle(hfile); //
                        // Разве после закрытия система не делает попытки разблокировки?

	
//====================================================
		
	hfile = CreateFile("\\\\.\\PHYSICALDRIVE4",
			                GENERIC_READ | GENERIC_WRITE, //Здесь уже с флагом GENERIC_WRITE
					FILE_SHARE_READ | FILE_SHARE_WRITE,
					NULL,
					OPEN_EXISTING,
					NULL,
					NULL);

	if (hfile == INVALID_HANDLE_VALUE) {
			cout<<"INVALID_HANDLE_VALUE ..."<<GetLastError()<<"\n"; // Здесь опять получаем ошибку доступа - 5
			return 1;  
		}


	

	return 0;


Опять тот же вопрос: "Где ошибка?"
И как получить от системы "Добро" на запись?
Asdprom вне форума Ответить с цитированием
Старый 08.03.2012, 15:17   #12
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Странно, что не дает сразу открыть том с GENERIC_WRITE.
Вот у меня также win7, запуск студии из-под админа, открывает любой том.
Точно ли под админом?
EUGY вне форума Ответить с цитированием
Старый 08.03.2012, 15:51   #13
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Да, студию запускаю из - под Администратора.
Скомпилированный файл тоже .
Asdprom вне форума Ответить с цитированием
Старый 08.03.2012, 16:40   #14
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Хм. админу явно прав не хватает.
Проверь, отключи UAC, перезагрузись, том должен даже под юзером открыться.
EUGY вне форума Ответить с цитированием
Старый 09.03.2012, 10:45   #15
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Вопрос тот же. Где ошибка?
Переустановил ОС. Затыкается в том же месте - ошибка доступа 5.
Скомпилированный код пробовал запустить под ХР.
Там код ошибки 21 - устройство не готово.

Повторю: задача стоит прямая запись сектора на диск.
Asdprom вне форума Ответить с цитированием
Старый 09.03.2012, 21:05   #16
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Не верю
Код:
BOOL IsRunAdmin()
{
	PSID pAdminGroup = NULL;
	SID_IDENTIFIER_AUTHORITY NtA = SECURITY_NT_AUTHORITY;
	AllocateAndInitializeSid(&NtA, 2, SECURITY_BUILTIN_DOMAIN_RID,	DOMAIN_ALIAS_RID_ADMINS,0, 0, 0, 0, 0, 0, &pAdminGroup);
	BOOL bret = FALSE;
	CheckTokenMembership(NULL, pAdminGroup, &bret);
	FreeSid(pAdminGroup);
	return bret;
}
Код:
MessageBox(NULL, IsRunAdmin() ? "admin" : "user", "IsRunAdmin ", 1);
// CreateFile....

Последний раз редактировалось EUGY; 09.03.2012 в 21:09.
EUGY вне форума Ответить с цитированием
Старый 11.03.2012, 14:55   #17
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Пишет, что админ. Но доступа нет, опять вылезает ошибка 5.
Попутно использую программу DiskExplorer for FAT (DiskExpl.exe). Она без всяких проблем читает\пишет на диск в любой сектор.
Что еще может быть?
Asdprom вне форума Ответить с цитированием
Старый 11.03.2012, 15:04   #18
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Давай методом тыка:
CreateFile("\\\\.\\C:"... По букве тома?

Буква может быть отозвана
CreateFile("\\\\.\\HardDiskVolumeX" ...

Последний раз редактировалось EUGY; 11.03.2012 в 15:11.
EUGY вне форума Ответить с цитированием
Старый 12.03.2012, 15:33   #19
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Нет, не по букве. Но, в общем, все равно, хоть по букве, хоть без.
Повторю исходные данные:
ОС: - Windows 7 без SP1.
Права: - под администратором.
Диск: - на сегодня это флешка с разрушенной ФС, отсутствие которой, согласно писаниям в MSDN, должно позволять свободно писать\читать сектора.

Примечание:
а) на XP все работает
б) вспомогательная программа DiskExplorer здесь, под Win7, тоже работает без замечаний.

Ошибка доступа 5 вылезает после отработки ф-ии CreateFile c флагом GENERIC_WRITE.
C флагом только GENERIC_READ все работает.

Устройство блокируется и размонтируется. Насколько оправдана операция "отзыва буквы" не знаю.
Asdprom вне форума Ответить с цитированием
Старый 12.03.2012, 15:50   #20
Asdprom
Форумчанин
 
Регистрация: 05.02.2011
Сообщений: 119
По умолчанию

Все защитники, брандмауэры и файрволлы отключены. UAC - выключен.
Asdprom вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает код? Bogusgl Microsoft Office Excel 20 10.08.2010 11:14
Почему не работает данный код? C# byte916 Помощь студентам 4 11.12.2009 21:19
кто знает почему не работает код andRR Общие вопросы C/C++ 6 14.06.2009 22:24
Почему не работает код? Kashp Общие вопросы Delphi 3 09.08.2007 17:33