powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / STORAGE_DEVICE_DESCRIPTOR
7 сообщений из 7, страница 1 из 1
STORAGE_DEVICE_DESCRIPTOR
    #39648463
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробую получить данные из структуры STORAGE_DEVICE_DESCRIPTOR для HDD.
Делаю для всех одинаково
Код: plaintext
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.
STORAGE_PROPERTY_QUERY storagePropertyQuery;
ZeroMemory(&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY));
storagePropertyQuery.PropertyId = StorageDeviceProperty;
storagePropertyQuery.QueryType = PropertyStandardQuery;

// Get the necessary output buffer size
STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader = { 0 };
DWORD dwBytesReturned = 0;

if (!::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
	&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
	&storageDescriptorHeader, sizeof(STORAGE_DESCRIPTOR_HEADER),
	&dwBytesReturned, NULL))
{
	dwRet = ::GetLastError();
	::CloseHandle(hDevice);
	return dwRet;
}

// Alloc the output buffer
const DWORD dwOutBufferSize = storageDescriptorHeader.Size;
BYTE* pOutBuffer = new BYTE[dwOutBufferSize];
ZeroMemory(pOutBuffer, dwOutBufferSize);

// Get the storage device descriptor
if (!::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
	&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
	pOutBuffer, dwOutBufferSize,
	&dwBytesReturned, NULL))
{
	dwRet = ::GetLastError();
	delete[]pOutBuffer;
	::CloseHandle(hDevice);
	return dwRet;
}

STORAGE_DEVICE_DESCRIPTOR* pDeviceDescriptor = (STORAGE_DEVICE_DESCRIPTOR*) pOutBuffer;
char *strVID;
strVID = (char*)((char*)pDeviceDescriptor + pDeviceDescriptor->VendorIdOffset);

int aa = strlen(strVID);
TCHAR* sMsg = new TCHAR[aa + 1];

for (int i = 0; i<aa + 1; i++)
	{
		sMsg[i] = strVID[i];
	}

MessageBox(
	NULL,
	sMsg,
	_T("SerialNumber"),
	MB_OK | MB_ICONINFORMATION
);


Но получается только 3 позиции правильно получить: ProductIdOffset, ProductRevisionOffset, SerialNumberOffset, а остальные выдают неправильно: Version - пусто, Size - ????, DeviceType, DeviceTypeModifier, RemovableMedia - (.

А как правильно получить оставшиеся?
...
Рейтинг: 0 / 0
STORAGE_DEVICE_DESCRIPTOR
    #39648467
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, еще VendorIdOffset пропустил, тоже выводит скобку - (.
...
Рейтинг: 0 / 0
STORAGE_DEVICE_DESCRIPTOR
    #39649100
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISVersion - пусто, Size - ????, DeviceType, DeviceTypeModifier, RemovableMedia - (.
А как правильно получить оставшиеся?
Судя по доке, Version - это размер структуры STORAGE_DEVICE_DESCRIPTOR. Я не знаю, почему так. Но догадываюсь и осуждаю.
Size - это полный размер, со всеми строками и дополнительными данными.
DeviceType, DeviceTypeModifier - это про SCSI-2, байтовые значения (не оффсеты)
RemovableMedia - флаг (ejectable/не-ejectable)

AISVendorIdOffsetу меня всё ок. Скобка "(" - это 40, смещение до строки VendorId, а у тебя похоже выводится не VendorId, а это само смещение, как первый символ.
...
Рейтинг: 0 / 0
STORAGE_DEVICE_DESCRIPTOR
    #39649150
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,
да, с RemovableMedia и VendorIdOffset, это я погорячился. RemovableMedia, как boolean - работает, и VendorIdOffset оказывается тоже работает, просто у одних девайсах его нет.
А вот с DeviceType, который в структуре как BYTE - проблема, не могу ни как достать.

Хотя DeviceType получается получить через MEDIA_TYPE, но хотелось бы с STORAGE_DEVICE_DESCRIPTOR его получить.

ПС. Да, еще не пойму как BusType получить, тоже не получается.

Может кто поделится опытом, как получить DeviceType и BusType?
...
Рейтинг: 0 / 0
STORAGE_DEVICE_DESCRIPTOR
    #39649317
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISХотя DeviceType получается получить через MEDIA_TYPE, но хотелось бы с STORAGE_DEVICE_DESCRIPTOR его получить.а что ты подразумеваешь под DeviceType? В примере выше - это просто байт, для SCSI-2.
...
Рейтинг: 0 / 0
STORAGE_DEVICE_DESCRIPTOR
    #39649332
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,
может я и ошибаюсь, но получая через IOCTL_STORAGE_GET_DEVICE_NUMBER в структуре STORAGE_DEVICE_NUMBER есть DeviceType и для частного случая (HDD. USB-flash) получаю 7, т.е. = FILE_DEVICE_DISK в Enum DEVICE_TYPE.
Вот собственно и тут я ожидаю того же. Или в структуре STORAGE_DEVICE_DESCRIPTOR DeviceType это не то же самое?
...
Рейтинг: 0 / 0
STORAGE_DEVICE_DESCRIPTOR
    #39649649
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, судя по доке , это

msdn DeviceType
Specifies the device type as defined by the Small Computer Systems Interface (SCSI) specification.

а в STORAGE_DEVICE_NUMBER набор типов гораздо шире
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / STORAGE_DEVICE_DESCRIPTOR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]