Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
| |
а где определён guid_slab_device_interface_cl ? 10.01.05 22:08 Число просмотров: 2158
Автор: eug Статус: Незарегистрированный пользователь Отредактировано 10.01.05 22:08 Количество правок: 1
|
вообще реально посредство таких манипуляций добраться до серийного номера usb drive'a ?
|
<beginners>
|
SetupDiGetClassDevs & SetupDiEnumDeviceInterfaces 10.01.05 14:04
Автор: eug Статус: Незарегистрированный пользователь Отредактировано 10.01.05 14:09 Количество правок: 2
|
есть вопрос по поводу сабжевых функций:
HDEVINFO SetupDiGetClassDevs(
const GUID* ClassGuid,
PCTSTR Enumerator,
HWND hwndParent,
DWORD Flags
);
---
BOOL SetupDiEnumDeviceInterfaces(
HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
const GUID* InterfaceClassGuid,
DWORD MemberIndex,
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData
);
---
Обе функции используют как входной параметр const GUID* InterfaceClassGuid, мне нужно получить
доступ для чтения к USB drive, в ветке HKLM\System\CurrentControlSet\Enum\USBStror\Нужный_Ключ\Id\ClassGUID
я вижу {4D36E967-E325-11CE-BFC1-08002BE10318}, SetupDiGetClassDevs получая этот GUID, возвращает
S_OK, однако, когда я пытаюсь получить заполненную структуру DeviceInterfaceData при помощи SetupDiEnumDeviceInterfaces вместо неё
я получаю "No more data is avaiable".
Куда копать ? Что нужно использовать как const GUID* InterfaceClassGuid ?
10x
|
|
Пример рабочего кода 10.01.05 19:16
Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 10.01.05 19:24 Количество правок: 1
|
void TEngineImp::OpenDevice(unsigned Number)
{
HDEVINFO hardwareDeviceInfo;
hardwareDeviceInfo = SetupDiGetClassDevsW((LPGUID)&GUID_SLAB_DEVICE_INTERFACE_CLASS, 0, 0, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if(INVALID_HANDLE_VALUE == hardwareDeviceInfo)
return;
SP_INTERFACE_DEVICE_DATA deviceInterfaceData;
deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
int i = 0;
do
{
if(SetupDiEnumDeviceInterfaces(hardwareDeviceInfo, 0, (LPGUID)&GUID_SLAB_DEVICE_INTERFACE_CLASS, i, &deviceInterfaceData))
{
PSP_INTERFACE_DEVICE_DETAIL_DATA deviceInterfaceDetailData;
ULONG predictedLength = 0;
ULONG requiredLength = 0, bytes = 0;
SetupDiGetInterfaceDeviceDetailW(hardwareDeviceInfo, &deviceInterfaceData, 0, 0, &requiredLength, 0);
predictedLength = requiredLength;
deviceInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(predictedLength);
deviceInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if(!SetupDiGetInterfaceDeviceDetailW(hardwareDeviceInfo, &deviceInterfaceData, deviceInterfaceDetailData, predictedLength, &requiredLength, 0))
{
free(deviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
return;
}
if(i == Number)
{
m_SlabControl.hHandle = CreateFile(deviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, 0);
free(deviceInterfaceDetailData);
SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
return;
}
free(deviceInterfaceDetailData);
}
else
if(ERROR_NO_MORE_ITEMS == GetLastError())
{
SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
return;
}
}
while(true);
} ---
|
| |
помогите "причесать" код, плиз [inside] 16.01.05 15:19
Автор: eug Статус: Незарегистрированный пользователь Отредактировано 16.01.05 15:19 Количество правок: 1
|
при сборке компонента в Release mode, ведёт себя странно:
при загрузке в сплоере работает, но по рефрешу не инициализируется снова, в Debug mode работает нормально.
CKeyVerificationControl()
{
l_driveSignature = 0;
s_errorStatus = 0;
char pattern[] = "\\\\?\\usbstor#disk&ven_lg&prod_x-tick_2.0";
bool endFlag = false;
CLSID GUID_CLASS_USB_DRV = CLSID_NULL;
HRESULT hres = CLSIDFromString(L"{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &GUID_CLASS_USB_DRV);
if(S_OK != hres)
{
endFlag = true;
s_errorStatus = 1; // CLSID convertion error
}
HDEVINFO hDevInfo = SetupDiGetClassDevs ( (GUID*)& GUID_CLASS_USB_DRV, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(INVALID_HANDLE_VALUE == hDevInfo)
{
endFlag = true;
s_errorStatus = 2; // no device found [invalid device handler]
}
PSP_DEVICE_INTERFACE_DATA DevInfoData =
(PSP_DEVICE_INTERFACE_DATA)malloc(sizeof(SP_DEVICE_INTERFACE_DATA));
DevInfoData ->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
short i = 0;
while(!endFlag)
{
if(SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &GUID_CLASS_USB_DRV, i++,DevInfoData))
{
ULONG requiredLength = 0;
SetupDiGetInterfaceDeviceDetail (hDevInfo, DevInfoData, NULL, 0, &requiredLength, NULL);
PSP_DEVICE_INTERFACE_DETAIL_DATA DevInfoDetail =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredLength);
DevInfoDetail ->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SetupDiGetInterfaceDeviceDetail (hDevInfo, DevInfoData, DevInfoDetail, requiredLength, &requiredLength, NULL);
short pos;
bool continueFlag = false;
char* niddle = DevInfoDetail->DevicePath;
for(pos=0;pos<strlen(pattern);pos++)
{
if(pattern[pos] != niddle[pos])
{
continueFlag = true;
break;
}
}
if(continueFlag)
{
continue;
}
//printf("%s", DevInfoDetail->DevicePath);
HANDLE hUsbDevice = CreateFile ( DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
DRIVE_LAYOUT_INFORMATION* lpOutBuffer = (DRIVE_LAYOUT_INFORMATION*)malloc(sizeof(DRIVE_LAYOUT_INFORMATION)); // output buffer
DWORD nOutBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION)*5; // size of output buffer
LPDWORD lpBytesReturned = (LPDWORD)malloc(sizeof(DRIVE_LAYOUT_INFORMATION)); // number of bytes returned
LPOVERLAPPED lpOverlapped = NULL; // OVERLAPPED structure
DeviceIoControl(
hUsbDevice, // handle to device
IOCTL_DISK_GET_DRIVE_LAYOUT, // dwIoControlCode
NULL, // lpInBuffer
0,
lpOutBuffer, // output buffer
nOutBufferSize, // size of output buffer
lpBytesReturned, // number of bytes returned
lpOverlapped // OVERLAPPED structure
);
l_driveSignature = lpOutBuffer->Signature;
free(DevInfoDetail);
//free(lpBytesReturned); // здесь падает
//free(lpOutBuffer); // и здесь :(
CloseHandle(hUsbDevice);
}
else
{
if(ERROR_NO_MORE_ITEMS == GetLastError())
{
endFlag = true;
}
}
}
if(!l_driveSignature)
{
s_errorStatus = 4; // no key inserted
}
}
---
10x
|
| |
а где определён guid_slab_device_interface_cl ? 10.01.05 22:08
Автор: eug Статус: Незарегистрированный пользователь Отредактировано 10.01.05 22:08 Количество правок: 1
|
вообще реально посредство таких манипуляций добраться до серийного номера usb drive'a ?
|
| | |
Re: 11.01.05 00:00
Автор: leo <Леонид Юрьев> Статус: Elderman
|
это просто мой GUID, где он определен - не важно. см MSDN и PlatformSDK на предмет "DEFINE_GUID".
> вообще реально посредство таких манипуляций добраться до > серийного номера usb drive'a ?
вполне реально добраться до file-handle к устройству (экземпляру класса), а потом через IOCTL (если такой предусмотрен) получить subj.
|
| | | |
а как узнать GUID конкретного подключенного устройства ? 11.01.05 00:24
Автор: eug Статус: Незарегистрированный пользователь Отредактировано 11.01.05 00:27 Количество правок: 1
|
> это просто мой GUID, где он определен - не важно. см MSDN и > PlatformSDK на предмет "DEFINE_GUID".
а как узнать GUID конкретного подключенного устройства ?
а то я всё реджистри уже облазил, и нахожу только GUID для классов устройств
[подобные в постах выше]
> вполне реально добраться до file-handle к устройству > (экземпляру класса), а потом через IOCTL (если такой > предусмотрен) получить subj. подскажите чайнику, плиз, вот у меня выводится:
DevInfoDetail->DevicePath =
\\?\usbstor#disk&ven_lg&prod_x-tick_2.0&rev_1.00#7&328699db&1#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
- что это за зверь, что из этого стринга можно понять ?
особенно интересует #7&328699db&1
file-handle - это то, что возвращает такой вот вызов:
HANDLE hUsbDevice = CreateFile ( DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); ?
|
| | | | |
А не у всякого устройства есть GUID 11.01.05 12:32
Автор: amirul <Serge> Статус: The Elderman
|
Есть GUID интерфейса. А это уже от драйвера зависит, будет ли устройство создавать простой симлинк или интерфейс. А GUID интерфейса для конкретного устройства всегда жестко задан и одинаков на всех машинах. Как пример, ты же не спрашиваешь как в винде называется com-порт, потому как имена одинаковые, с GUID-ом интерфейса то же самое, просто функции другие.
> подскажите чайнику, плиз, вот у меня выводится: > DevInfoDetail->DevicePath = > \\?\usbstor#disk&ven_lg∏_x-tick_2.0&rev_1.00#7&328699db > &1#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} > - что это за зверь, что из этого стринга можно понять ? > особенно интересует #7&328699db&1 Понять из этого стринга можно только то, что микрософт не хочет, чтобы ты обращался к нему напрямую, а использовал функции для работы с интерфейсами. Чтобы понять как работать с интерфейсами смотри DDK samle-ы из каталога:
NTDDK\src\general\toaster
В частности создание интерфейса из драйвера: функция Bus_AddDevice в файле bus\pnp.c
Ну и работа с интерфейсами из третьего кольца - подкаталог exe
Успехов
> file-handle - это то, что возвращает такой вот вызов: > HANDLE hUsbDevice = CreateFile ( > DevInfoDetail->DevicePath, GENERIC_READ | GENERIC_WRITE,
> FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0,
> NULL); ?
Да
|
| | | | | |
большое спасибо 11.01.05 12:55
Автор: eug Статус: Незарегистрированный пользователь
|
|
|
непонятки с ClassGUID 10.01.05 17:31
Автор: eug Статус: Незарегистрированный пользователь
|
если вместо {4D36E967-E325-11CE-BFC1-08002BE10318}, использовать {53f56307-b6bf-11d0-94f2-00a0c91efb8b},
то всё становится на свои места.
кто-нибудь может прояснить почему ?
|
|
|