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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2009, 22:50   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Прямой доступ к физическому устройству.

Приветствую.
Есть код уже, я уже и о драйверах думал, вообщем вот вопрос.
Существует (ну для примера у меня на ПК это \\.\M USB Flash Drive, виден на ПК, вообщем все ок. Хочу открыть его как физический диск, и записать например во второй сектор (у меня он 512 байт) Hello World! ну это так для разминки. Что странно, что WinHex нормальн опишет, почему не ясно. У меня система Windows XP SP3.

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

#define GOUT(s) { wprintf(L"%s", s); getchar(); return 0; }

int main()
{
	DWORD returned;
	char buf[255];
	
	HANDLE hDevice = CreateFile(L"\\\\.\\M:", GENERIC_READ | GENERIC_WRITE, 
		FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
		FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, NULL);

	if(!hDevice)
	{
		GOUT(L"Cannot open drive.");
	}

	if(!DeviceIoControl(hDevice, FSCTL_LOCK_VOLUME, NULL, NULL, NULL, NULL, &returned, NULL))
	{
		CloseHandle(hDevice);
		GOUT(L"Cannot lock volume.");
	}

	if(SetFilePointer(hDevice, 512, NULL, FILE_BEGIN) != 512)
	{
		CloseHandle(hDevice);
		GOUT(L"Cannot set file pointer.");
	}

	strcpy_s(buf, sizeof(buf), "Hello World!");
	if(!WriteFile(hDevice, buf, strlen(buf), &returned, NULL))
	{
		CloseHandle(hDevice);
		GOUT(L"Cannot write the data.");
	}

	DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME, NULL, NULL, NULL, NULL, &returned, NULL);
	CloseHandle(hDevice);

	printf("The data was written\nPress any key...");
	getchar();
	return 0;
}
Все выполняется успешно, кроме WriteFile. Ах да, возращает ERROR_INVALID_PARAMETER

Извеняюсь. Проблема решена. Решение заключается в том, что писать за раз только по размеру сектора (в моем случае 512 байт за раз)

Последний раз редактировалось BOBAH13; 16.09.2009 в 22:59.
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение обьекта по прямой Wi1D Помощь студентам 1 16.05.2009 21:21
Программка на С++ о прямой адресации `Fleur Фриланс 1 12.12.2008 20:35
Как можно обратиться к устройству, которое подключено через USB порт Mikhail Bakurov Общие вопросы Delphi 8 17.11.2008 20:42
Пересечение прямой и круга CoGnaC Паскаль, Turbo Pascal, PascalABC.NET 8 11.03.2008 17:01
Анимация прямой NecroSlider Помощь студентам 3 23.04.2007 13:31