Дискета или флешка?

Тема в разделе "WASM.WIN32", создана пользователем diamond, 24 ноя 2007.

  1. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Как по букве диска узнать, соответствует он дискете или флешке, причём не "хрюкая" дисководом (в случае, если это дискета)? GetDriveType в обоих случаях возвращает DRIVE_REMOVABLE. Для каких-нибудь попыток DeviceIoControl нужно сначала открыть устройство \\.\X:, а это уже обращение к носителю (а также это не будет работать под 9x - в принципе, это не критично, но хотелось бы для 9x тоже работающий метод).
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    GetDiskFreeSpace как вариант.
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Кстати, разве биос позволяет поставить дисковод не на А или В?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    twgt
    GetDiskFreeSpace как вариант
    Захрюкает, а если не обернуть SetErrorMode(SEM_FAILCRITICALERRORS), то и окошко вылезет.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    посмотреть ссылку в каталоге объектов. Все диски - символьные ссылки.
    У флешки обычно это будет вида
    \??\F: ссылается у меня на \Device\Harddisk1\DP(1)0-0+17
    Делается через QueryDosDevice

    Сетевые диски обычн задаются в \Sessions\X\DosDevices\Y: => \Device\LanmanRedirector\......

    Короче я когда то писал получение списка флешек и составления бинарной маски (аналогично GetLogicalDrives):
    Код (Text):
    1. BOOLEAN StringCheckMask( LPSTR input, LPSTR mask )
    2. {
    3.     int inlen = lstrlen(input);
    4.  
    5.     if( inlen < lstrlen(mask) )
    6.         return FALSE;
    7.  
    8.     for( int i=0; i<inlen; i++ )
    9.     {
    10.         if( !( (mask[i] == input[i]) || (mask[i] == '?') ) )
    11.             return FALSE;
    12.     }
    13.  
    14.     return TRUE;
    15. }
    16.  
    17. ULONG RemoveableDrives = 0;
    18.  
    19. VOID ConstructRemoveableDisksList( )
    20. {
    21.     static char removeable_media_mask[] = "\\Device\\Harddisk?\\DP(?)?-?+??";
    22.     char drive[] = "A:";
    23.     ULONG LogicalDrives = GetLogicalDrives( );
    24.  
    25.     for( ; drive[0]<='Z'; drive[0]++ )
    26.     {
    27.         if( LogicalDrives & (1 << (drive[0]-'A')) )
    28.         {
    29.             char buff[1024];
    30.             QueryDosDevice( drive, buff, 1024 );
    31.  
    32.             if( StringCheckMask( buff, removeable_media_mask ) )
    33.             {
    34.                 RemoveableDrives |= (1 << (drive[0]-'A'));
    35.             }
    36.         }
    37.     }
    38. }
     
  6. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    вместо дисковода на A или B может быть флешка.
     
  7. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    twgt
    Берём 8 USB-дисководов... Мне продолжать?
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Great: спасибо
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    CyberManiac
    я не продвинутый и не думаю даже о существовании usb-дисководов :)
    я правда думал о старых шлейфовых приводах.
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    twgt, даже древних дисководов может быть целых три. У меня в старом компьютере что-то было в настройках BIOS на эту тему.
     
  11. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Оказалось, что под XP это работает, а под Vista - уже нет. В Vista флешки тоже раскрываются в \Device\HarddiskVolumeN. Ещё варианты?
     
  12. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Хм... можно проверять начало строки на соответствие \Device\Harddisk, а от жёсткого диска отличать с помощью GetDriveType. Но неужели explorer и стандартный диалог GetOpenFileName извращаются через QueryDosDevice?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну посмотри в иде как оно реализовано там, хз.. либа, отвечающая за собственно шелл - это вроде shell32 и browseui.
    открывай последнюю в иде и посмотри как она список дисков получает. хотя бы по импорту можно, наверное, догадаться.
     
  14. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    О! Нашёл.
    http://support.microsoft.com/kb/115828
    http://support.microsoft.com/kb/163920