У меня есть \\.\SCSI#:
дескриптор, созданный с помощью CreateFile()
.Я знаю, что это указывает на конкретный HBA или (в моем случае) NVMe Controller.У него должна быть шина / устройство / функция, связанная с его перечислением.
До сих пор я пытался выяснить это через wmi, хотя я более чем открыт для решения C через WinApi.(на самом деле предпочел бы решение в C).
Получая объект, используя:
gwmi -namespace root\cimv2 -class Win32_SCSIController | format-list *
Это приводит к моему устройству NVMe следующим образом:
PSComputerName : DESK
Status : OK
Name : Standard NVM Express Controller
StatusInfo : 3
__GENUS : 2
__CLASS : Win32_SCSIController
__SUPERCLASS : CIM_SCSIController
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_SCSIController.DeviceID="PCI\\VEN_1987&DEV_5008&SUBSYS_50081987&REV_01\\4&CB74546&0&00E8"
__PROPERTY_COUNT : 31
__DERIVATION : {CIM_SCSIController, CIM_Controller, CIM_LogicalDevice, CIM_LogicalElement...}
__SERVER : DESK
__NAMESPACE : root\cimv2
__PATH : \\DESK\root\cimv2:Win32_SCSIController.DeviceID="PCI\\VEN_1987&DEV_5008&SUBSYS_50081987&REV_01\\4&CB74546&0&00E8"
Availability : 3
Caption : Standard NVM Express Controller
ConfigManagerErrorCode : 0
ConfigManagerUserConfig : False
ControllerTimeouts :
CreationClassName : Win32_SCSIController
Description : Standard NVM Express Controller
DeviceID : PCI\VEN_1987&DEV_5008&SUBSYS_50081987&REV_01\4&CB74546&0&00E8
DeviceMap :
DriverName : stornvme
ErrorCleared :
ErrorDescription :
HardwareVersion :
Index :
InstallDate :
LastErrorCode :
Manufacturer : Standard NVM Express Controller
MaxDataWidth :
MaxNumberControlled :
MaxTransferRate :
PNPDeviceID : PCI\VEN_1987&DEV_5008&SUBSYS_50081987&REV_01\4&CB74546&0&00E8
PowerManagementCapabilities :
PowerManagementSupported :
ProtectionManagement :
ProtocolSupported : 2
SystemCreationClassName : Win32_ComputerSystem
SystemName : DESK
TimeOfLastReset :
Scope : System.Management.ManagementScope
Path : \\DESK\root\cimv2:Win32_SCSIController.DeviceID="PCI\\VEN_1987&DEV_5008&SUBSYS_50081987&REV_01\\4&CB74546&0&00E8"
Options : System.Management.ObjectGetOptions
ClassPath : \\DESK\root\cimv2:Win32_SCSIController
Properties : {Availability, Caption, ConfigManagerErrorCode, ConfigManagerUserConfig...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers : {dynamic, Locale, provider, UUID}
Site : :
Обратите внимание, какИндекс пуст ... Я подумал, что это было бы число в \. \ SCSI #:
Играя немного больше, я могу получить Bus / Device / Function из этого:
$a = gwmi -namespace root\cimv2 -class Win32_PnPEntity -filter "DeviceId='PCI\\VEN_1987&DEV_5008&SUBSYS_50081987&REV_01\\4&CB74546&0&00E8'"
$a.GetDeviceProperties('DEVPKEY_Device_LocationInfo').deviceProperties.Data
PCI bus 5, device 0, function 0
Я также думал о вызове IOCTL_SCSI_GET_ADDRESS для дескриптора \\.\SCSI#:
, хотя это не работает (что имеет смысл, поскольку это не дескриптор lun, а скорее контроллер)
Как связать информацию шины / устройства / функции PCIe с ручкой \\.\SCSI#:
?