M>Дано устройство usb mass storage. Ему нужно подавать нестандартные команды, типа зашифровать и т.п. Пока реализовал через spti IOCTL_SCSI_PASS_THROUGH .
M>Уже создавал тут ветку по этому устройству, но тема была другая — как с ним вообще работать. Теперь работать я с ним умею, встали другие вопросы.
M>Вопросы к знающим людям :
M>1) IOCTL_SCSI_PASS_THROUGH не требует права администратора, но CreateFile на букву диска требует. Есть ли вероятность, что на имя типа \PhysicalDrive%x или \\?\storage#removablemedia#7&176630d9&0&rm#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b} (к примеру) CreateFile не понадобятся админские права? Сам попробую проверить в ближ. дни, но ответы специалистом с пояснениями очень не помешали бы.
Модель безопасности NT предусматривает security check'и token vs SD только при открытии хэндла на объект. Когда хэндл получен — он имеет granted access mask и далее с ним можно делать все что в ней указано, независимо от того кто пользуется хэндлом. Так что можно к примеру открыть файл на запись из под админа, и затем передать DuplicateHandle'ом хэндл гостевому процессу и он сможет писать в этот файл пользуясь хэндлом с грантованным правом на запись.
M>2) Если spti все-таки нужны админские права в любом случае и никакие извращения тут не помогут, то на что мне перейти, чтобы не писать драйвер и была более-менее приличная скорость (пару метров в сек. минимум)?
Зачем драйвер? Сервис напишите.
M>3) В windows seven была запущена моя программа (общение через spti) и под правами пользователя вполне успешно пообщались с устройством. Что там такого в семерке произошло?
CreateFile'ом можно было открыть диск под полный доступ из под не админа? Этож п..ц. Такого не может быть.
M>4) Можно ли программно отформатировать диск (например с нашего устройства), не выводя никаких сообщений юзеру? Апишных функций я пока не нашел, есть какая-то из шелла, но она, судя по описанию, вызывает стандартное окно форматирования диска
typedef BOOLEAN (__stdcall *PFMIFSCALLBACK)(
DWORD Command,
DWORD SubAction,
PVOID ActionInfo );
typedef VOID (__stdcall *tFormatEx)( PWCHAR DriveRoot,
DWORD MediaFlag, PWCHAR Format,
PWCHAR Label, BOOL QuickFormat,
DWORD ClusterSize, PFMIFSCALLBACK Callback);
BOOLEAN __stdcall FormatCallback(DWORD Command,
DWORD SubAction,
PVOID ActionInfo )
{
printf("FormatCallback(0x%x, 0x%x)\n", Command, SubAction);
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE dll = ::LoadLibrary(L"fmifs.dll");
if (!dll)
{
printf("fmifs.dll load error %u\n", GetLastError());
return GetLastError();
}
tFormatEx pFormatEx = (tFormatEx)
::GetProcAddress(dll, "FormatEx");
if (!pFormatEx)
{
printf("FormatEx ptr error %u\n", GetLastError());
return GetLastError();
}
if (argc!=5)
{
printf("Usage: formatex drive fs label cluster\n");
return -1;
}
printf("Begin formatting...\n");
pFormatEx(argv[1], 0, argv[2], argv[3], TRUE, _ttoi(argv[4]), FormatCallback);
printf("Complete\n");
return 0;
}