Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
1

Точка монтирования USB диска SetupAPI

30.10.2013, 16:59. Показов 8309. Ответов 38
Метки нет (Все метки)

Вообщем есть DeviceID которое получено через SetupAPI с помощью :
1.
C++
1
2
3
4
5
6
7
8
9
10
11
hDevInfo = SetupDiGetClassDevs(
                   guid,
                    NULL, // Enumerator
                    NULL,
                    DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
 
 
    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
    {
......SPDRP_FRIENDLYNAME...извлечение DeviceInstanceID....
}
в итоге я получил DeviceID в виде USBSTOR#Disk&Ven_JetFlash&Prod_TS4GJFV30&Rev_8.07#OCJOK3DI&0 #{53f56307-b6bf-11d0-94f2-00a0c91efb8b} потом преобразовал в USBSTOR\Disk&Ven_JetFlash&Prod_TS4GJFV30&Rev_8.07\OCJOK3DI&0 .

2.
Далее я смог получить с помощью этого http://msdn.microsoft.com/en-u... s.85).aspx
в итоге получаю что-то вроде
C++
1
2
3
4
Found a device:
 \Device\HarddiskVolume2
Volume name: \\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\
Paths:  C:\
дак вот теперь как связать пункт 1 и пункт 2? Знаю как сделать через WMI_ классы но слишком это объемно не хочется тащить за программой эти функции. Как можно решить вопрос через SetupAPI?
Скорее всего камень предкновения это Volume name: \\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\ но неясно как куда и зачем)))
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2013, 16:59
Ответы с готовыми решениями:

Перехват события монтирования диска
Как можно перехватить событие монтирования диска, в частности, после вставления флешки в USB-порт?...

Точка монтирования
Объясните пожалуйста. Например, у меня 2 диска по 1 разделу в каждом. /dev/sda, /dev/sdb. Если...

Получение буквы диска через SetupApi
Всем привет! Мне необходимо получить букву, которую ОС присваивает USB-накопителю. Так я получаю...

Работа с эндпоинтами устройств USB и setupapi
Как читать и записывать данные в эндпоинты EP0in, EP0out, EPi in, EPi out устройств USB , как...

38
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.10.2013, 01:48 2
Цитата Сообщение от mdvalex Посмотреть сообщение
Вообщем есть DeviceID которое получено через SetupAPI с помощью :

SPDRP_FRIENDLYNAME...извлечение DeviceInstanceID
Friendly name и device instance id - это разные вещи. Второе нужно получать с помощью
функции SetupDiGetDeviceInstanceId: http://msdn.microsoft.com/en-u... s.85).aspx

Цитата Сообщение от mdvalex Посмотреть сообщение
дак вот теперь как связать пункт 1 и пункт 2?
Никак, скорее всего. Здесь нужно использовать не device instance id, а символьную ссылку на
дисковое устройство (SetupDiGetDeviceInterfaceDetail -> DevicePath). Ну а потом можно
запросить у mount manager-а список точек монтирования и найти среди них эту ссылку.
Для этого служит запрос IOCTL_MOUNTMGR_QUERY_POINTS.
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
31.10.2013, 10:44  [ТС] 3
О том как я получаю DeviceInstanceID и FrendlyName и прочие атрибуты вот скрипт, ну здесь как мы видим он по GUID ищет но я также переделал эту функцию чтоб он по DeviceInstanceID искал т.е. структуре

C++
1
2
3
4
5
 hDevInfo = SetupDiGetClassDevs(
                    NULL,
                    device_id, // Enumerator
                    NULL,
                    DIGCF_ALLCLASESS | DIGCF_INTERFACEDEVICE);
я передаю device_id = USBSTOR\Pid_****&Vid_****\serialnumber ну т.е я заведомо уже знаю что этот девайс это USBSTOR

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
 #pragma comment(lib, "setupapi.lib")
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
 
 
 
void print_property
(
    __in HDEVINFO        hDevInfo,
    __in SP_DEVINFO_DATA DeviceInfoData,
    __in PCWSTR          Label,
    __in DWORD           Property
)
{
    DWORD  DataT;
    LPTSTR buffer     = NULL;
    DWORD  buffersize = 0;
    
    //
    // Call function with null to begin with, 
    // then use the returned buffer size (doubled)
    // to Alloc the buffer. Keep calling until
    // success or an unknown failure.
    //
    //  Double the returned buffersize to correct
    //  for underlying legacy CM functions that 
    //  return an incorrect buffersize value on 
    //  DBCS/MBCS systems.
    // 
    while (!SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                Property,
                &DataT,
                (PBYTE)buffer,
                buffersize,
                &buffersize))
    {
        if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
        {
            // Change the buffer size.
            if (buffer)
            {
                LocalFree(buffer);
            }
            // Double the size to avoid problems on 
            // W2k MBCS systems per KB 888609. 
            buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);
        }
        else
        {
            break;
        }
    }
    
    wprintf(L"%s %s\n",Label, buffer);
    
    if (buffer)
    {
        LocalFree(buffer);
    }
}
 
 
 
int setupdi_version(const GUID* guid)
{
 
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;
 
    // Create a HDEVINFO with all present devices.
    hDevInfo = SetupDiGetClassDevs(
                   guid,
                    NULL, // Enumerator
                    NULL,
                    DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
    
    if (INVALID_HANDLE_VALUE == hDevInfo)
    {
        // Insert error handling here.
        return 1;
    }
    
    // Enumerate through all devices in Set.
 
    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
 
    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
    {
        LPTSTR buffer     = NULL;
        DWORD  buffersize = 0;
 
        print_property(hDevInfo, DeviceInfoData, L"Friendly name :", SPDRP_FRIENDLYNAME);
 
        while (!SetupDiGetDeviceInstanceId(
                    hDevInfo, 
                    &DeviceInfoData, 
                    buffer, 
                    buffersize, 
                    &buffersize))
        {
            if (buffer)
            {
               LocalFree(buffer);
            }
                
            if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
            {
                // Change the buffer size.
                // Double the size to avoid problems on
                // W2k MBCS systems per KB 888609.
                buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);
            }
            else
            {
                wprintf(L"error: could not get device instance id (0x%x)\n", GetLastError());
                break;
            }
        }
 
        if (buffer)
        {
            wprintf(L"\tDeviceInstanceId : %s\n", buffer);
        }
 
        print_property(hDevInfo, DeviceInfoData, L"\tClass :", SPDRP_CLASS);
        print_property(hDevInfo, DeviceInfoData, L"\tClass GUID :", SPDRP_CLASSGUID);
    }
    
    
    if (NO_ERROR != GetLastError() && ERROR_NO_MORE_ITEMS != GetLastError())
    {
        // Insert error handling here.
        return 1;
    }
    
    //  Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
    
    return 0;
}
 
int main() {
    static const GUID GUID_DEVINTERFACE_LIST = { 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } };
    setupdi_version(&GUID_DEVINTERFACE_LIST);
    return 0;
}
В каком месте мне запрашивать ? как я понял это делается через DeviceIoControl ? http://msdn.microsoft.com/en-u... s.85).aspx
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.10.2013, 11:08 4
Можно примерно так:

Запросить через SetupDiGetClassDevs все устройства с devinterface == disk.
Перечислить их с помощью SetupDiEnumDeviceInterfaces, получить для каждого устройства
символьную ссылку - SetupDiGetDeviceInterfaceDetails. Дальше нужно открыть mount manager
(через CreateFile, используя имя "\\.\MountPointManager") и запросить у него все точки
монтирования, для этого есть IOCTL_MOUNTMGR_QUERY_POINTS.
Запрос возвращает структуру MOUNTMGR_MOUNT_POINTS, которая содержит заполненный
массив структур MOUNTMGR_MOUNT_POINT с именами нужных объектов.
В каждом элементе будет символьная ссылка (типа "\\?\usbstor#vid_pid&serial" и т.д.), потом
имя устройства ("\Device\HarddiskVolume3", например) и ID (например, "\DosDevices\E:").

Ну а далее - проход по массиву структур с поиском символьной ссылки, полученной
через Setup API. Если есть совпадение - вытаскиваем из структуры ID (см. выше), вытаскиваем
из нее букву диска.

Здесь есть свои тонкости, но думаю, разберетесь.

Кстати, если кто-нибудь знает способ проще и без ограничений (например, поддержка всей
линейки Windows от XP до 8.1, работа без прав админа и т.д.), буду очень благодарен.

Кстати, вот топик из MSDN на связанную тему, может будет полезным:

I/O Control Codes Sent by Mount Manager Clients
http://msdn.microsoft.com/en-u... s.85).aspx
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
31.10.2013, 11:39  [ТС] 5
Вот нашел такой код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <windows.h>
#include <C:\WinDDK\7600.16385.1\inc\ddk\mountmgr.h>
#include <tchar.h>
#include <stdio.h>
 
#pragma comment(lib, "Crypt32.lib")
 
int main()
{
    TCHAR chDrive = 'N', szUniqueId[128];
    TCHAR szDeviceName[7] = _T("\\\\.\\");
    HANDLE hDevice, hMountMgr; 
    BYTE byBuffer[1024];
    PMOUNTDEV_NAME pMountDevName;
    DWORD cbBytesReturned, dwInBuffer, dwOutBuffer, ccb;
    PMOUNTMGR_MOUNT_POINT pMountPoint;
    BOOL bSuccess;
    PBYTE pbyInBuffer, pbyOutBuffer;
    LPTSTR pszLogicalDrives, pszDriveRoot;
 
    // MOUNTMGR_DOS_DEVICE_NAME is defined as L"\\\\.\\MountPointManager"
    hMountMgr = CreateFile (MOUNTMGR_DOS_DEVICE_NAME,
                            0, FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL, OPEN_EXISTING, 0, NULL);
    if (hMountMgr == INVALID_HANDLE_VALUE)
        return 1;
 
    cbBytesReturned = GetLogicalDriveStrings (0, NULL);
    pszLogicalDrives = (LPTSTR) LocalAlloc (LMEM_ZEROINIT,
                                            cbBytesReturned*sizeof(TCHAR));
    cbBytesReturned = GetLogicalDriveStrings (cbBytesReturned,
                                                pszLogicalDrives);
    for (pszDriveRoot = pszLogicalDrives; *pszDriveRoot != TEXT('\0');
            pszDriveRoot += lstrlen(pszDriveRoot) + 1) {
 
        szDeviceName[4] = pszDriveRoot[0];
        szDeviceName[5] = _T(':');
        szDeviceName[6] = _T('\0');
        //lstrcpy (&szDeviceName[4], TEXT("\\??\\USBSTOR\\DISK&VEN_SANDISK&PROD_CRUZER&REV_8.01\\1740030578903736&0"));
 
        hDevice = CreateFile (szDeviceName, 0,
                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                NULL, OPEN_EXISTING, 0, NULL);
        if (hDevice == INVALID_HANDLE_VALUE)
            return 1;
 
        bSuccess = DeviceIoControl (hDevice,
                                    IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, 
                                    NULL, 0,
                                    (LPVOID)byBuffer, sizeof(byBuffer),
                                    &cbBytesReturned,
                                    (LPOVERLAPPED) NULL);
        pMountDevName = (PMOUNTDEV_NAME) byBuffer;
        _tprintf (TEXT("\n%.*ls\n"), pMountDevName->NameLength/sizeof(WCHAR),
                                        pMountDevName->Name);
        bSuccess = CloseHandle (hDevice);
 
        dwInBuffer = pMountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT);
        pbyInBuffer = (PBYTE) LocalAlloc (LMEM_ZEROINIT, dwInBuffer);
        pMountPoint = (PMOUNTMGR_MOUNT_POINT) pbyInBuffer;
        pMountPoint->DeviceNameLength = pMountDevName->NameLength;
        pMountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
        CopyMemory (pbyInBuffer + sizeof(MOUNTMGR_MOUNT_POINT),
                    pMountDevName->Name, pMountDevName->NameLength);
 
        dwOutBuffer = 1024 + sizeof(MOUNTMGR_MOUNT_POINTS);
        pbyOutBuffer = (PBYTE) LocalAlloc (LMEM_ZEROINIT, dwOutBuffer);
        bSuccess = DeviceIoControl (hMountMgr,
                                    IOCTL_MOUNTMGR_QUERY_POINTS, 
                                    pbyInBuffer, dwInBuffer,
                                    (LPVOID)pbyOutBuffer, dwOutBuffer,
                                    &cbBytesReturned,
                                    (LPOVERLAPPED) NULL);
        if (bSuccess) {
            ULONG i;
            PMOUNTMGR_MOUNT_POINTS pMountPoints = (PMOUNTMGR_MOUNT_POINTS) pbyOutBuffer;
            for (i=0; i<pMountPoints->NumberOfMountPoints; i++) {
                _tprintf (TEXT("#%i:\n"), i);
                _tprintf (TEXT("    Device=%.*ls\n"),
                        pMountPoints->MountPoints[i].DeviceNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].DeviceNameOffset);
                _tprintf (TEXT("    SymbolicLink=%.*ls\n"),
                        pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset);
                ccb = sizeof(szUniqueId)/sizeof(szUniqueId[0]);
 
                if (CryptBinaryToString (pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset,
                                        pMountPoints->MountPoints[i].UniqueIdLength,
                                        CRYPT_STRING_BASE64, 
                                        szUniqueId, &ccb))
                    _tprintf (TEXT("    UniqueId=%s\n"), szUniqueId);
                else
                    _tprintf (TEXT("    UniqueId=%.*ls\n"),
                            pMountPoints->MountPoints[i].UniqueIdLength/sizeof(WCHAR),
                            pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset);
            }
        }
        pbyInBuffer = (PBYTE) LocalFree (pbyInBuffer);
        pbyOutBuffer = (PBYTE) LocalFree (pbyOutBuffer);
    }
    pszLogicalDrives = (LPTSTR) LocalFree (pszLogicalDrives);
    bSuccess = CloseHandle (hMountMgr);
 
    return 0;
}
http://stackoverflow.com/quest... ery-points

Только не ясно что за <mountmgr.h>

Вроде это то что мне нужно

Добавлено через 6 минут
Да и кстати можно ли как-нибудь мониторить телефоны фотоапараты? они же не создают никакого раздела единственное что я понял что они относятся к классу GUID - Image но туда относятся и например сканеры может у вас был опыт работы с этими девайсами?
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.10.2013, 12:25 6
Цитата Сообщение от mdvalex Посмотреть сообщение
Только не ясно что за <mountmgr.h>
Заголовок из поставки Windows Driver Kit. В Windows SDK/Visual C++ его нет.

Цитата Сообщение от mdvalex Посмотреть сообщение
Да и кстати можно ли как-нибудь мониторить телефоны фотоапараты? они же не создают никакого раздела единственное что я понял что они относятся к классу GUID - Image но туда относятся и например сканеры может у вас был опыт работы с этими девайсами?
Мониторить все можно. Класс "Imaging devices", например.
А они еще и как съемные носители определяются...
В общем, нужно смотреть конкретно по задаче.

У меня, например, был USB-модем, который определялся как CD-ROM.
Да-да, это производитель решил таким вот оригинальным способом сделать,
чтобы работал автозапуск.
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
31.10.2013, 18:42  [ТС] 7
Цитата Сообщение от Убежденный Посмотреть сообщение
Заголовок из поставки Windows Driver Kit. В Windows SDK/Visual C++ его нет.
Т е используя "mount manager" придется за собой тащить DDK? Тогда не лучше ли к WMI_ обращаться в таком случае?

А по поводу устройств портативных они какнибудь в системе отражаются кроме как Видео камера там например, для них какой-то раздел монитируется? ибо буквенным разделом они не обладают это уж точно...
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.10.2013, 18:47 8
Цитата Сообщение от mdvalex Посмотреть сообщение
Т е используя "mount manager" придется за собой тащить DDK?
Ну почему сразу тащить ?
Сделать копи-паст нужных объявлений из этого заголовка и все.
Их там штук пять получится, наверное, от силы.

Цитата Сообщение от mdvalex Посмотреть сообщение
А по поводу устройств портативных они какнибудь в системе отражаются кроме как Видео камера там например, для них какой-то раздел монитируется? ибо буквенным разделом они не обладают это уж точно.
Очень по-разному бывает. Все зависит от модели устройства, от прошивки и т.д.
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
31.10.2013, 19:01  [ТС] 9
Цитата Сообщение от Убежденный Посмотреть сообщение
Ну почему сразу тащить ?
Сделать копи-паст нужных объявлений из этого заголовка и все.
Их там штук пять получится, наверное, от силы.
http://www.cs.colorado.edu/~ma... mountmgr.h но ведь получается там тоже есть include т е тащить всю иерархию или можно обойтись одним mountmgr.h?

Цитата Сообщение от Убежденный Посмотреть сообщение
Очень по-разному бывает. Все зависит от модели устройства, от прошивки и т.д.
Значит сделать что-то универсальное практически невозможно для всех этих устройств... Проще их запретить. Запретив просто GUID класс "Imaging Devices" ибо насколько я понял из эксперементов эти устройства лезут именно туда

Опять же как быть с флешками которые определяются как CD-ROM? Ведь на них тоже можно кидать данные, у меня правда только МТС-модем был и определялся как CD-ROM при этом в нем еще слот MicroSD был
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.10.2013, 19:22 10
Цитата Сообщение от mdvalex Посмотреть сообщение
но ведь получается там тоже есть include т е тащить всю иерархию или можно обойтись одним mountmgr.h?
Хм, странно.
У меня установлен WDK 7600.1, там mountmgr.h весит 11 КБ
(здесь всего 4) и в нем нет никаких инклудов.

Цитата Сообщение от mdvalex Посмотреть сообщение
Значит сделать что-то универсальное практически невозможно для всех этих устройств... Проще их запретить. Запретив просто GUID класс "Imaging Devices" ибо насколько я понял из эксперементов эти устройства лезут именно туда
У этих устройств есть одна общая деталь - они все подключаются через USB.
Но в чем конечная цель всех этих манипуляций ?
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
31.10.2013, 20:08  [ТС] 11
Цитата Сообщение от Убежденный Посмотреть сообщение
Хм, странно.
У меня установлен WDK 7600.1, там mountmgr.h весит 11 КБ
(здесь всего 4) и в нем нет никаких инклудов.
Можно тогда ваш mountmgr.h в студию а то у меня почему-то не ставится DriverKit не нравится ему что я с виндой работаю на виртуальной машине

Цитата Сообщение от Убежденный Посмотреть сообщение
У этих устройств есть одна общая деталь - они все подключаются через USB.
Но в чем конечная цель всех этих манипуляций ?
Вообщем-то для начала требуется просто вести мониторинг за всеми устройствами которые подключаются к компьютеру в файл. Допустим
1) комп запускается в него уже вставлены USB-Flash, iPhone, Цифроваякамера (все через USB) я идентифицирую эти устройства и отслаю в лог как УЖЕ подключенные списком в виде:
DeviceID: USB\VID_PID_\Serial FriendlyName: blablabla EnumerateName: USB
В пункте первом прибегаю сначала к выводу по GUID всех USB-устройств а потом только MassStorage применяя GUID логических дисков (куда входит и IDE/SATA) но с условием if(EnumerateName = USB)
Это все на событии WM_CREATE
PS от сюда в дальнейшем отфильтрую класс принтеров, HID-устройств ибо в них нет смысла.

2) В комп вставляется флешка, приходит событие WM_DEVICECHANGE подписавшись на сообщения BROADCAST я получаю DiviceInstanceID который пихаю в SetupAPI и извлекаю как в первом случае такую-же информацию об устройстве пишу в лог:
Add DeviceID:USB\VID_PID_\Serial FriendlyName: blablabla EnumerateName: USB

Т е в конечном итоге каждой ветви моей программы у меня есть DeviceID и информация о том что за устройство USBSTOR или не USBSTOR. Дальше требуется что если это USBSTOR тогда определить для него букву созданного раздела C: или E:... дальше установка на эту папку (раздел) подписки на события изменения там структуры для начала хотябы чтобы было ясно идет запись или удаление.

Для флешек и прочих устройств которые создают логические разделы все решаемо как я понял и думаю смогу это осилить и реализовать, постепенно. Но вот что делать с этими устройствами цифровыми (камеры телефоны) ну и флешками которые монтируются как образ это остается загадкой. Либо как вариант их вообще запретить принцип:
Устройство вставляется и оно присуще к классу Image просто брать его и запрещать программно естественно.
Также остается вопрос с CD-DVD образами а точнее флешками которые монтируются под их вид
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.10.2013, 20:48 12
Цитата Сообщение от mdvalex Посмотреть сообщение
Можно тогда ваш mountmgr.h в студию
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
/*++
 
Copyright (c) 1997-1999  Microsoft Corporation
 
Module Name:
 
    mountmgr.h
 
Abstract:
 
    This file defines the external mount point interface for administering
    mount points.
 
Revision History:
 
--*/
 
#ifndef _MOUNTMGR_
#define _MOUNTMGR_
 
#if _MSC_VER > 1000
#pragma once
#endif
 
#ifndef FAR
#define FAR
#endif
 
#if (NTDDI_VERSION >= NTDDI_WIN2K)
 
#define MOUNTMGR_DEVICE_NAME                        L"\\Device\\MountPointManager"
#define MOUNTMGR_DOS_DEVICE_NAME                    L"\\\\.\\MountPointManager"
 
#define MOUNTMGRCONTROLTYPE                         0x0000006D // 'm'
#define MOUNTDEVCONTROLTYPE                         0x0000004D // 'M'
 
//
// These are the IOCTLs supported by the mount point manager.
//
 
#define IOCTL_MOUNTMGR_CREATE_POINT                 CTL_CODE(MOUNTMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_DELETE_POINTS                CTL_CODE(MOUNTMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_QUERY_POINTS                 CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY         CTL_CODE(MOUNTMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER            CTL_CODE(MOUNTMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS          CTL_CODE(MOUNTMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED   CTL_CODE(MOUNTMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED   CTL_CODE(MOUNTMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_CHANGE_NOTIFY                CTL_CODE(MOUNTMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE      CTL_CODE(MOUNTMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES    CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION  CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)
 
//
// Input structure for IOCTL_MOUNTMGR_CREATE_POINT.
//
 
typedef struct _MOUNTMGR_CREATE_POINT_INPUT {
    USHORT  SymbolicLinkNameOffset;
    USHORT  SymbolicLinkNameLength;
    USHORT  DeviceNameOffset;
    USHORT  DeviceNameLength;
} MOUNTMGR_CREATE_POINT_INPUT, *PMOUNTMGR_CREATE_POINT_INPUT;
 
//
// Input structure for IOCTL_MOUNTMGR_DELETE_POINTS,
// IOCTL_MOUNTMGR_QUERY_POINTS, and IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY.
//
 
typedef struct _MOUNTMGR_MOUNT_POINT {
    ULONG   SymbolicLinkNameOffset;
    USHORT  SymbolicLinkNameLength;
    ULONG   UniqueIdOffset;
    USHORT  UniqueIdLength;
    ULONG   DeviceNameOffset;
    USHORT  DeviceNameLength;
} MOUNTMGR_MOUNT_POINT, *PMOUNTMGR_MOUNT_POINT;
 
//
// Output structure for IOCTL_MOUNTMGR_DELETE_POINTS,
// IOCTL_MOUNTMGR_QUERY_POINTS, and IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY.
//
 
typedef struct _MOUNTMGR_MOUNT_POINTS {
    ULONG                   Size;
    ULONG                   NumberOfMountPoints;
    MOUNTMGR_MOUNT_POINT    MountPoints[1];
} MOUNTMGR_MOUNT_POINTS, *PMOUNTMGR_MOUNT_POINTS;
 
//
// Input structure for IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER.
//
 
typedef struct _MOUNTMGR_DRIVE_LETTER_TARGET {
    USHORT  DeviceNameLength;
    WCHAR   DeviceName[1];
} MOUNTMGR_DRIVE_LETTER_TARGET, *PMOUNTMGR_DRIVE_LETTER_TARGET;
 
//
// Output structure for IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER.
//
 
typedef struct _MOUNTMGR_DRIVE_LETTER_INFORMATION {
    BOOLEAN DriveLetterWasAssigned;
    UCHAR   CurrentDriveLetter;
} MOUNTMGR_DRIVE_LETTER_INFORMATION, *PMOUNTMGR_DRIVE_LETTER_INFORMATION;
 
//
// Input structure for IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED and
// IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED.
//
 
typedef struct _MOUNTMGR_VOLUME_MOUNT_POINT {
    USHORT  SourceVolumeNameOffset;
    USHORT  SourceVolumeNameLength;
    USHORT  TargetVolumeNameOffset;
    USHORT  TargetVolumeNameLength;
} MOUNTMGR_VOLUME_MOUNT_POINT, *PMOUNTMGR_VOLUME_MOUNT_POINT;
 
//
// Input structure for IOCTL_MOUNTMGR_CHANGE_NOTIFY.
// Output structure for IOCTL_MOUNTMGR_CHANGE_NOTIFY.
//
 
typedef struct _MOUNTMGR_CHANGE_NOTIFY_INFO {
    ULONG   EpicNumber;
} MOUNTMGR_CHANGE_NOTIFY_INFO, *PMOUNTMGR_CHANGE_NOTIFY_INFO;
 
//
// Input structure for IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE,
// IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION,
// IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH, and
// IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS.
//
 
typedef struct _MOUNTMGR_TARGET_NAME {
    USHORT  DeviceNameLength;
    WCHAR   DeviceName[1];
} MOUNTMGR_TARGET_NAME, *PMOUNTMGR_TARGET_NAME;
 
//
// Macro that defines what a "drive letter" mount point is.  This macro can
// be used to scan the result from QUERY_POINTS to discover which mount points
// are find "drive letter" mount points.
//
 
#define MOUNTMGR_IS_DRIVE_LETTER(s) (   \
    (s)->Length == 28 &&                \
    (s)->Buffer[0] == '\\' &&           \
    (s)->Buffer[1] == 'D' &&            \
    (s)->Buffer[2] == 'o' &&            \
    (s)->Buffer[3] == 's' &&            \
    (s)->Buffer[4] == 'D' &&            \
    (s)->Buffer[5] == 'e' &&            \
    (s)->Buffer[6] == 'v' &&            \
    (s)->Buffer[7] == 'i' &&            \
    (s)->Buffer[8] == 'c' &&            \
    (s)->Buffer[9] == 'e' &&            \
    (s)->Buffer[10] == 's' &&           \
    (s)->Buffer[11] == '\\' &&          \
    (s)->Buffer[12] >= 'A' &&           \
    (s)->Buffer[12] <= 'Z' &&           \
    (s)->Buffer[13] == ':')
 
//
// Macro that defines what a "volume name" mount point is.  This macro can
// be used to scan the result from QUERY_POINTS to discover which mount points
// are "volume name" mount points.
//
 
#define MOUNTMGR_IS_VOLUME_NAME(s) (                                          \
     ((s)->Length == 96 || ((s)->Length == 98 && (s)->Buffer[48] == '\\')) && \
     (s)->Buffer[0] == '\\' &&                                                \
     ((s)->Buffer[1] == '?' || (s)->Buffer[1] == '\\') &&                     \
     (s)->Buffer[2] == '?' &&                                                 \
     (s)->Buffer[3] == '\\' &&                                                \
     (s)->Buffer[4] == 'V' &&                                                 \
     (s)->Buffer[5] == 'o' &&                                                 \
     (s)->Buffer[6] == 'l' &&                                                 \
     (s)->Buffer[7] == 'u' &&                                                 \
     (s)->Buffer[8] == 'm' &&                                                 \
     (s)->Buffer[9] == 'e' &&                                                 \
     (s)->Buffer[10] == '{' &&                                                \
     (s)->Buffer[19] == '-' &&                                                \
     (s)->Buffer[24] == '-' &&                                                \
     (s)->Buffer[29] == '-' &&                                                \
     (s)->Buffer[34] == '-' &&                                                \
     (s)->Buffer[47] == '}'                                                   \
    )
 
//
// The following IOCTL is supported by mounted devices.
//
 
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME    CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
//
// Output structure for IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.
//
 
typedef struct _MOUNTDEV_NAME {
    USHORT  NameLength;
    WCHAR   Name[1];
} MOUNTDEV_NAME, *PMOUNTDEV_NAME;
 
//
// Devices that wish to be mounted should report this GUID in
// IoRegisterDeviceInterface.
//
 
#ifdef DEFINE_GUID
 
DEFINE_GUID(MOUNTDEV_MOUNTED_DEVICE_GUID, 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
 
#endif
 
 
#endif  // NTDDI_VERSION >= NTDDI_WIN2K
 
#if (NTDDI_VERSION >= NTDDI_WINXP)
 
#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH        CTL_CODE(MOUNTMGRCONTROLTYPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS       CTL_CODE(MOUNTMGRCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
//
// Output structure for IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH and
// IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS.
//
 
typedef struct _MOUNTMGR_VOLUME_PATHS {
    ULONG   MultiSzLength;
    WCHAR   MultiSz[1];
} MOUNTMGR_VOLUME_PATHS, *PMOUNTMGR_VOLUME_PATHS;
 
 
#define MOUNTMGR_IS_DOS_VOLUME_NAME(s) (    \
     MOUNTMGR_IS_VOLUME_NAME(s) &&          \
     (s)->Length == 96 &&                   \
     (s)->Buffer[1] == '\\'                 \
    )
 
#define MOUNTMGR_IS_DOS_VOLUME_NAME_WB(s) ( \
     MOUNTMGR_IS_VOLUME_NAME(s) &&          \
     (s)->Length == 98 &&                   \
     (s)->Buffer[1] == '\\'                 \
    )
 
#define MOUNTMGR_IS_NT_VOLUME_NAME(s) (     \
     MOUNTMGR_IS_VOLUME_NAME(s) &&          \
     (s)->Length == 96 &&                   \
     (s)->Buffer[1] == '?'                  \
    )
 
#define MOUNTMGR_IS_NT_VOLUME_NAME_WB(s) (  \
     MOUNTMGR_IS_VOLUME_NAME(s) &&          \
     (s)->Length == 98 &&                   \
     (s)->Buffer[1] == '?'                  \
    )
 
#endif  // NTDDI_VERSION >= NTDDI_WINXP
 
#if (NTDDI_VERSION >= NTDDI_WS03)
 
#define IOCTL_MOUNTMGR_SCRUB_REGISTRY               CTL_CODE(MOUNTMGRCONTROLTYPE, 14, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_QUERY_AUTO_MOUNT             CTL_CODE(MOUNTMGRCONTROLTYPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTMGR_SET_AUTO_MOUNT               CTL_CODE(MOUNTMGRCONTROLTYPE, 16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
 
//
// Input / Output structure for querying / setting the auto-mount setting
//
 
typedef enum _MOUNTMGR_AUTO_MOUNT_STATE {
        Disabled = 0,
        Enabled
        } MOUNTMGR_AUTO_MOUNT_STATE;
 
typedef struct _MOUNTMGR_QUERY_AUTO_MOUNT {
    MOUNTMGR_AUTO_MOUNT_STATE   CurrentState;
    } MOUNTMGR_QUERY_AUTO_MOUNT, *PMOUNTMGR_QUERY_AUTO_MOUNT;
 
typedef struct _MOUNTMGR_SET_AUTO_MOUNT {
    MOUNTMGR_AUTO_MOUNT_STATE   NewState;
    } MOUNTMGR_SET_AUTO_MOUNT, *PMOUNTMGR_SET_AUTO_MOUNT;
 
#endif  // NTDDI_VERSION >= NTDDI_WS03
 
#if (NTDDI_VERSION >= NTDDI_WIN7)
 
#define IOCTL_MOUNTMGR_BOOT_DL_ASSIGNMENT               CTL_CODE(MOUNTMGRCONTROLTYPE, 17, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_TRACELOG_CACHE                   CTL_CODE(MOUNTMGRCONTROLTYPE, 18, METHOD_BUFFERED, FILE_READ_ACCESS)
 
#endif  // NTDDI_VERSION >= NTDDI_WIN7
 
#endif  // _MOUNTMGR_
1
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
06.11.2013, 17:54  [ТС] 13
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно примерно так:

Запросить через SetupDiGetClassDevs все устройства с devinterface == disk.
Перечислить их с помощью SetupDiEnumDeviceInterfaces, получить для каждого устройства
символьную ссылку - SetupDiGetDeviceInterfaceDetails. Дальше нужно открыть mount manager
(через CreateFile, используя имя "\\.\MountPointManager") и запросить у него все точки
монтирования, для этого есть IOCTL_MOUNTMGR_QUERY_POINTS.
Запрос возвращает структуру MOUNTMGR_MOUNT_POINTS, которая содержит заполненный
массив структур MOUNTMGR_MOUNT_POINT с именами нужных объектов.
В каждом элементе будет символьная ссылка (типа "\\?\usbstor#vid_pid&serial" и т.д.), потом
имя устройства ("\Device\HarddiskVolume3", например) и ID (например, "\DosDevices\E:").

Ну а далее - проход по массиву структур с поиском символьной ссылки, полученной
через Setup API. Если есть совпадение - вытаскиваем из структуры ID (см. выше), вытаскиваем
из нее букву диска.

Здесь есть свои тонкости, но думаю, разберетесь.

Кстати, если кто-нибудь знает способ проще и без ограничений (например, поддержка всей
линейки Windows от XP до 8.1, работа без прав админа и т.д.), буду очень благодарен.

Кстати, вот топик из MSDN на связанную тему, может будет полезным:

I/O Control Codes Sent by Mount Manager Clients
http://msdn.microsoft.com/en-u... s.85).aspx

Вообщем-то частично вы были правы, но вот не задача в Windows 7 все проходит замечательно можно сравнивать
но на ХР почему-то выводит RemoveableMedia что делать ?

Там на скрине плохо видно вывод из под Windows XP вот он
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
 
C:\Documents and Settings\Пользователь>C:\win_1.exe
 
\Device\HarddiskVolume1
#0:
    Device=\Device\HarddiskVolume1
    SymbolicLink=\??\Volume{7e8b4a24-10f0-11e3-b445-806d6172696f}
    UniqueId=BMoEygB+AAAAAAAA
 
#1:
    Device=\Device\HarddiskVolume1
    SymbolicLink=\DosDevices\C:
    UniqueId=BMoEygB+AAAAAAAA
 
 
\Device\CdRom0
#0:
    Device=\Device\CdRom0
    SymbolicLink=\??\Volume{aa852342-10f9-11e3-8c2a-806d6172696f}
    UniqueId=\??\IDE#CdRomHL-DT-ST_DVDRAM_GSA-H44N________________RB01____#304b3
63635383447303720372020202020202020#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
#1:
    Device=\Device\CdRom0
    SymbolicLink=\DosDevices\D:
    UniqueId=\??\IDE#CdRomHL-DT-ST_DVDRAM_GSA-H44N________________RB01____#304b3
63635383447303720372020202020202020#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
 
\Device\Harddisk1\DP(1)0-0+d
#0:
    Device=\Device\Harddisk1\DP(1)0-0+d
    SymbolicLink=\DosDevices\E:
    UniqueId=\??\STORAGE#RemovableMedia#8&1c1fa76d&0&RM#{53f5630d-b6bf-11d0-94f2
-00a0c91efb8b}
#1:
    Device=\Device\Harddisk1\DP(1)0-0+d
    SymbolicLink=\??\Volume{be1a0e42-3b1b-11e3-8c73-20cf308e6b3a}
    UniqueId=\??\STORAGE#RemovableMedia#8&1c1fa76d&0&RM#{53f5630d-b6bf-11d0-94f2
-00a0c91efb8b}
 
C:\Documents and Settings\Пользователь>
Миниатюры
Точка монтирования USB диска SetupAPI   Точка монтирования USB диска SetupAPI  
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
06.11.2013, 18:15  [ТС] 14
Ясно то что USBSTOR\RemovableMedia это "ребенок" USBSTOR(а USBSTOR это родитель USBSTOR\RemovableMedia) но как продвинуться по иерархии ?
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.11.2013, 18:49 15
Цитата Сообщение от mdvalex Посмотреть сообщение
но вот не задача в Windows 7 все проходит замечательно можно сравнивать
но на ХР почему-то выводит RemoveableMedia что делать ?
А в чем, собственно, проблема ?
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
06.11.2013, 18:58  [ТС] 16
Цитата Сообщение от Убежденный Посмотреть сообщение
А в чем, собственно, проблема ?
Проблема в их стыковке в Windows XP. Т е у меня получается надо состыковать
\??\STORAGE#RemovableMedia#8&1c1fa76d&0&RM#{53f5630d-b6bf-11d0-94f2
-00a0c91efb8b}


и

\??\USBSTOR#disk&ven_jetflash&prod_ts4gjfv30&rev_8.0#serialn umber#{guid}

PS нашел структуру CM_Get_Child но она работает в Windows XP а в Windows 7 нет.
0
Ушел с форума
Эксперт С++
16434 / 7398 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.11.2013, 19:04 17
Вы можете объяснить подробно, откуда на XP получаются эти две строки и
почему их нужно состыковывать ? Я пока не до конца "врубился".
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
06.11.2013, 19:12  [ТС] 18
Цитата Сообщение от Убежденный Посмотреть сообщение
Вы можете объяснить подробно, откуда на XP получаются эти две строки и
почему их нужно состыковывать ? Я пока не до конца "врубился".
Вообщем с помощью кода

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 #pragma comment(lib, "setupapi.lib")
#include <windows.h>
#include "mountmgr.h"
#include <tchar.h>
#include <stdio.h>
#pragma comment(lib, "Crypt32.lib")
 
int main()
{
    TCHAR chDrive = 'N', szUniqueId[128];
    TCHAR szDeviceName[7] = _T("\\\\.\\");
    HANDLE hDevice, hMountMgr; 
    BYTE byBuffer[1024];
    PMOUNTDEV_NAME pMountDevName;
    DWORD cbBytesReturned, dwInBuffer, dwOutBuffer, ccb;
    PMOUNTMGR_MOUNT_POINT pMountPoint;
    BOOL bSuccess;
    PBYTE pbyInBuffer, pbyOutBuffer;
    LPTSTR pszLogicalDrives, pszDriveRoot;
 
    // MOUNTMGR_DOS_DEVICE_NAME is defined as L"\\\\.\\MountPointManager"
    hMountMgr = CreateFile (MOUNTMGR_DOS_DEVICE_NAME,
                            0, FILE_SHARE_READ | FILE_SHARE_WRITE,
                            NULL, OPEN_EXISTING, 0, NULL);
    if (hMountMgr == INVALID_HANDLE_VALUE)
        return 1;
 
    cbBytesReturned = GetLogicalDriveStrings (0, NULL);
    pszLogicalDrives = (LPTSTR) LocalAlloc (LMEM_ZEROINIT,
                                            cbBytesReturned*sizeof(TCHAR));
    cbBytesReturned = GetLogicalDriveStrings (cbBytesReturned,
                                                pszLogicalDrives);
    for (pszDriveRoot = pszLogicalDrives; *pszDriveRoot != TEXT('\0');
            pszDriveRoot += lstrlen(pszDriveRoot) + 1) {
 
        szDeviceName[4] = pszDriveRoot[0];
        szDeviceName[5] = _T(':');
        szDeviceName[6] = _T('\0');
        //lstrcpy (&szDeviceName[4], TEXT("\\??\\USBSTOR\\DISK&VEN_SANDISK&PROD_CRUZER&REV_8.01\\1740030578903736&0"));
 
        hDevice = CreateFile (szDeviceName, 0,
                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                NULL, OPEN_EXISTING, 0, NULL);
        if (hDevice == INVALID_HANDLE_VALUE)
            return 1;
 
        bSuccess = DeviceIoControl (hDevice,
                                    IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, 
                                    NULL, 0,
                                    (LPVOID)byBuffer, sizeof(byBuffer),
                                    &cbBytesReturned,
                                    (LPOVERLAPPED) NULL);
        pMountDevName = (PMOUNTDEV_NAME) byBuffer;
        _tprintf (TEXT("\n%.*ls\n"), pMountDevName->NameLength/sizeof(WCHAR),
                                        pMountDevName->Name);
        bSuccess = CloseHandle (hDevice);
 
        dwInBuffer = pMountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT);
        pbyInBuffer = (PBYTE) LocalAlloc (LMEM_ZEROINIT, dwInBuffer);
        pMountPoint = (PMOUNTMGR_MOUNT_POINT) pbyInBuffer;
        pMountPoint->DeviceNameLength = pMountDevName->NameLength;
        pMountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT);
        CopyMemory (pbyInBuffer + sizeof(MOUNTMGR_MOUNT_POINT),
                    pMountDevName->Name, pMountDevName->NameLength);
 
        dwOutBuffer = 1024 + sizeof(MOUNTMGR_MOUNT_POINTS);
        pbyOutBuffer = (PBYTE) LocalAlloc (LMEM_ZEROINIT, dwOutBuffer);
        bSuccess = DeviceIoControl (hMountMgr,
                                    IOCTL_MOUNTMGR_QUERY_POINTS, 
                                    pbyInBuffer, dwInBuffer,
                                    (LPVOID)pbyOutBuffer, dwOutBuffer,
                                    &cbBytesReturned,
                                    (LPOVERLAPPED) NULL);
        if (bSuccess) {
            ULONG i;
            PMOUNTMGR_MOUNT_POINTS pMountPoints = (PMOUNTMGR_MOUNT_POINTS) pbyOutBuffer;
            for (i=0; i<pMountPoints->NumberOfMountPoints; i++) {
                _tprintf (TEXT("#%i:\n"), i);
                _tprintf (TEXT("    Device=%.*ls\n"),
                        pMountPoints->MountPoints[i].DeviceNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].DeviceNameOffset);
                _tprintf (TEXT("    SymbolicLink=%.*ls\n"),
                        pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset);
                ccb = sizeof(szUniqueId)/sizeof(szUniqueId[0]);
 
                if (CryptBinaryToString (pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset,
                                        pMountPoints->MountPoints[i].UniqueIdLength,
                                        CRYPT_STRING_BASE64, 
                                        szUniqueId, &ccb))
                    _tprintf (TEXT("    UniqueId=%s\n"), szUniqueId);
                else
                    _tprintf (TEXT("    UniqueId=%.*ls\n"),
                            pMountPoints->MountPoints[i].UniqueIdLength/sizeof(WCHAR),
                            pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset);
            }
        }
        pbyInBuffer = (PBYTE) LocalFree (pbyInBuffer);
        pbyOutBuffer = (PBYTE) LocalFree (pbyOutBuffer);
    }
    pszLogicalDrives = (LPTSTR) LocalFree (pszLogicalDrives);
    bSuccess = CloseHandle (hMountMgr);
 
    return 0;
}
Я получаю следующее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
 
C:\Documents and Settings\Пользователь>C:\win_1.exe
 
\Device\HarddiskVolume1
#0:
    Device=\Device\HarddiskVolume1
    SymbolicLink=\??\Volume{7e8b4a24-10f0-11e3-b445-806d6172696f}
    UniqueId=BMoEygB+AAAAAAAA
 
#1:
    Device=\Device\HarddiskVolume1
    SymbolicLink=\DosDevices\C:
    UniqueId=BMoEygB+AAAAAAAA
 
 
\Device\CdRom0
#0:
    Device=\Device\CdRom0
    SymbolicLink=\??\Volume{aa852342-10f9-11e3-8c2a-806d6172696f}
    UniqueId=\??\IDE#CdRomHL-DT-ST_DVDRAM_GSA-H44N________________RB01____#304b3
63635383447303720372020202020202020#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
#1:
    Device=\Device\CdRom0
    SymbolicLink=\DosDevices\D:
    UniqueId=\??\IDE#CdRomHL-DT-ST_DVDRAM_GSA-H44N________________RB01____#304b3
63635383447303720372020202020202020#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
 
\Device\Harddisk1\DP(1)0-0+d
#0:
    Device=\Device\Harddisk1\DP(1)0-0+d
    SymbolicLink=\DosDevices\E:
    UniqueId=\??\STORAGE#RemovableMedia#8&1c1fa76d&0&RM#{53f5630d-b6bf-11d0-94f2
-00a0c91efb8b}
#1:
    Device=\Device\Harddisk1\DP(1)0-0+d
    SymbolicLink=\??\Volume{be1a0e42-3b1b-11e3-8c73-20cf308e6b3a}
    UniqueId=\??\STORAGE#RemovableMedia#8&1c1fa76d&0&RM#{53f5630d-b6bf-11d0-94f2
-00a0c91efb8b}
 
C:\Documents and Settings\Пользователь>

а с помощью

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 #pragma comment(lib, "setupapi.lib")
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
 
int main() {
 
    static const GUID GUID_DEVINTERFACE_LIST = { 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } };
 
 
    //Индекс устройства 0 1 2 3 4 5....
    DWORD deviceIndex = 1;
 
 
HDEVINFO hardwareDeviceInfoSet;
    SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
    PSP_INTERFACE_DEVICE_DETAIL_DATA deviceDetail;
    ULONG requiredSize;
    HANDLE deviceHandle = INVALID_HANDLE_VALUE;
    DWORD result;
 
 
 
 
     //Get a list of devices matching the criteria (hid interface, present)
    hardwareDeviceInfoSet = SetupDiGetClassDevs (&GUID_DEVINTERFACE_LIST,
                                                 NULL, // Define no enumerator (global)
                                                 NULL, // Define no
                                                 (DIGCF_PRESENT | // Only Devices present
                                                 DIGCF_DEVICEINTERFACE)); // Function class devices.
 
    deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
 
 
 
    //Go through the list and get the interface data
    result = SetupDiEnumDeviceInterfaces (hardwareDeviceInfoSet,
                                          NULL, //infoData,
                                          &GUID_DEVINTERFACE_LIST, //interfaceClassGuid,
                                          deviceIndex, 
                                          &deviceInterfaceData);
 
 
    /* Failed to get a device - possibly the index is larger than the number of devices */
    if (result == FALSE)
    {
        SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
        printf("Step 1 Error");
        return 0;
    }
 
 
     //Get the details with null values to get the required size of the buffer
    SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
                                     &deviceInterfaceData,
                                     NULL, //interfaceDetail,
                                     0, //interfaceDetailSize,
                                     &requiredSize,
                                     0); //infoData))
 
    //Allocate the buffer
    deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
    deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
 
    //Fill the buffer with the device details
    if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
                                          &deviceInterfaceData,
                                          deviceDetail,
                                          requiredSize,
                                          &requiredSize,
                                          NULL)) 
    {
        SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
        free (deviceDetail);
        printf("Error step2");
        //Log("hidin: -- failed to get device info");
       // return INVALID_HANDLE_VALUE;
    }
    
    printf("Result: %s", deviceDetail->DevicePath);
    return 0;
}
Я получаю символьную ссылку на устройство

C++
1
2
3
C:\Documents and Settings\Пользователь>C:\win.exe
Result: \\?\usbstor#disk&ven_jetflash&prod_ts4gjfv30&rev_8.07#ocjok3di&0#{53f563
07-b6bf-11d0-94f2-00a0c91efb8b}
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
06.11.2013, 19:17  [ТС] 19
Корнем зла считаю отличие определения Flash устройства
Миниатюры
Точка монтирования USB диска SetupAPI   Точка монтирования USB диска SetupAPI  
0
0 / 0 / 1
Регистрация: 16.10.2011
Сообщений: 53
06.11.2013, 21:55  [ТС] 20
Похоже этот вариант отпадает ибо я не могу совладеть с этой структурой

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PMOUNTMGR_MOUNT_POINTS pMountPoints = (PMOUNTMGR_MOUNT_POINTS) pbyOutBuffer;
            for (i=0; i<pMountPoints->NumberOfMountPoints; i++) {
                _tprintf (TEXT("#%i:\n"), i);
                _tprintf (TEXT("    Device=%.*ls\n"),
                        pMountPoints->MountPoints[i].DeviceNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].DeviceNameOffset);
                _tprintf (TEXT("    SymbolicLink=%.*ls\n"),
                        pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset);
                ccb = sizeof(szUniqueId)/sizeof(szUniqueId[0]);
 
                if (CryptBinaryToString (pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset,
                                        pMountPoints->MountPoints[i].UniqueIdLength,
                                        CRYPT_STRING_BASE64, 
                                        szUniqueId, &ccb))
                    _tprintf (TEXT("    UniqueId=%s\n"), szUniqueId);
                else
                    _tprintf (TEXT("    UniqueId=%.*ls\n"),
                            pMountPoints->MountPoints[i].UniqueIdLength/sizeof(WCHAR),
                            pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset);
            }
        }
Ибо как вот то что ниже например объявить в перменную char * string для того чтобы потом с помощью if сравнить с входным элементом не ясно
C++
1
2
3
  _tprintf (TEXT("    SymbolicLink=%.*ls\n"),
                        pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR),
                        pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset);
Скорее всего придется искать другие варианты решения проблемы

Добавлено через 22 минуты
Разобрался

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    char buffer[256]; //Это для названия раздела
                char deviceid[256]; //это для символьной ссылки устройства
 
                sprintf (buffer, "%.*ls\n", pMountPoints->MountPoints[i].SymbolicLinkNameLength/sizeof(WCHAR),
                       pbyOutBuffer + pMountPoints->MountPoints[i].SymbolicLinkNameOffset);
//Ищем в строке подстроку E:(будет входной параметр в функцию)
int jk = countBasestrSubstr(buffer,"E:");   
            printf("\n\n %d \n\n",jk);
        
                ccb = sizeof(szUniqueId)/sizeof(szUniqueId[0]);
 
                if (CryptBinaryToString (pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset,
                                        pMountPoints->MountPoints[i].UniqueIdLength,
                                        CRYPT_STRING_BASE64, 
                                        szUniqueId, &ccb)) {
                    
                
                }
                else
                {
//Это будет выходной параметр из функции
                    sprintf(deviceid, "%.*ls\n", pMountPoints->MountPoints[i].UniqueIdLength/sizeof(WCHAR),
                            pbyOutBuffer + pMountPoints->MountPoints[i].UniqueIdOffset);
                    printf(deviceid);
 
 
                  
                }
В итоге напишется функция char function(char * driveletter) которая будет возвращать char deviceid
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2013, 21:55

Ошибка монтирования образа диска на VirtualBox
Доброго! Поставил на VB убунту. Хочу установить дополнения, выбираю как обычно Устройства -...

Программа для монтирования образа диска (iso)
Пожалуйста, какой пакет(программа) надо установить в Mandriva, чтобы она монтировала образ диска...

Как изменить флаги монтирования по умолчанию для usb-носителей?
Хочу изменить флаги монтирования по умочанию, где это можно сделать. В /etc/udev/rules.d не...

Python linux нужно написать программу для монтирования и размонтирования usb
Здравствуйте, сразу скажу, что в питоне я полный чайник, нужно написать программу для монтирования...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru