BOOL
GetPropertyOfDeviceOrAdapter(
IN LPTSTR lpFileName
)
{
STORAGE_BUS_TYPE Ret = BusTypeUnknown;
TCHAR FileSymName[MAX_PATH * 2] = {0};
TCHAR VolumeSymName[10] = {0};
HANDLE hVolume = INVALID_HANDLE_VALUE;
STORAGE_PROPERTY_QUERY Query;
STORAGE_DEVICE_DESCRIPTOR devDescriptor = {0};
BOOL bResult = FALSE;
DWORD dwBytesReturned = 0;
__try
{
ZeroMemory(&Query, sizeof(STORAGE_PROPERTY_QUERY));
if (!lpFileName)
{
printf("[GetPropertyOfDeviceOrAdapter] : input parameter error \n");
__leave;
}
_tcscat_s(FileSymName, MAX_PATH * 2, _T("\\\\.\\"));
_tcscat_s(FileSymName, MAX_PATH * 2, lpFileName);
CopyMemory(VolumeSymName, FileSymName, 5 * sizeof(TCHAR));
_tcscat_s(VolumeSymName, 10, _T(":"));
hVolume = CreateFile(
VolumeSymName,
SYNCHRONIZE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hVolume == INVALID_HANDLE_VALUE)
{
printf("[GetPropertyOfDeviceOrAdapter] : CreateFile failed. (%d) \n", GetLastError());
__leave;
}
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
devDescriptor.Size = sizeof(STORAGE_DEVICE_DESCRIPTOR);
bResult = DeviceIoControl(
hVolume,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query,
sizeof(STORAGE_PROPERTY_QUERY),
&devDescriptor,
devDescriptor.Size,
&dwBytesReturned,
NULL
);
if (!bResult)
{
printf("[GetPropertyOfDeviceOrAdapter] : DeviceIoControl failed. (%d) \n", GetLastError());
__leave;
}
Ret = devDescriptor.BusType;
}
__finally
{
if (hVolume != INVALID_HANDLE_VALUE)
CloseHandle(hVolume);
}
return Ret;
}