Re: USB Mass Storage без прав админа
От: ononim  
Дата: 05.01.10 16:23
Оценка:
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;
}
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.