информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - 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},
то всё становится на свои места.
кто-нибудь может прояснить почему ?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach