64 lines
2.9 KiB
C
64 lines
2.9 KiB
C
#include "progwrp.h"
|
|
#include "export.h"
|
|
#include "implementations.h"
|
|
#include <cfgmgr32.h>
|
|
|
|
const DEVPROPKEY DEVPKEY_Device_DeviceDesc = {0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 2 };
|
|
const DEVPROPKEY DEVPKEY_Device_BusNumber = {0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 23};
|
|
const DEVPROPKEY DEVPKEY_Device_Address = {0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 30};
|
|
const DEVPROPKEY DEVPKEY_Device_InstanceId = {0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 256};
|
|
const DEVPROPKEY DEVPKEY_Device_Parent = {0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 8};
|
|
const DEVPROPKEY DEVPKEY_Device_Children = {0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7, 9};
|
|
const DEVPROPKEY DEVPKEY_Device_HardwareIds = {0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 3};
|
|
|
|
BOOL DevPropKeyCmp(const DEVPROPKEY PropertyKey0, const DEVPROPKEY PropertyKey1)
|
|
{
|
|
if(PropertyKey0.fmtid.Data1 == PropertyKey1.fmtid.Data1 &&
|
|
PropertyKey0.fmtid.Data2 == PropertyKey1.fmtid.Data2 &&
|
|
PropertyKey0.fmtid.Data3 == PropertyKey1.fmtid.Data3 &&
|
|
PropertyKey0.fmtid.Data4 == PropertyKey1.fmtid.Data4 &&
|
|
PropertyKey0.pid == PropertyKey1.pid)
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD WINAPI DevPropKeyEqual(const DEVPROPKEY* PropertyKey)
|
|
{
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_DeviceDesc))
|
|
return SPDRP_DEVICEDESC;
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_BusNumber))
|
|
return SPDRP_BUSNUMBER;
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_Address))
|
|
return SPDRP_ADDRESS;
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_InstanceId))
|
|
return SPDRP_MAXIMUM_PROPERTY; // use SetupDiGetDeviceInstanceIdW
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_Parent))
|
|
return SPDRP_MAXIMUM_PROPERTY; // CM_Get_Parent then CM_Get_Device_ID
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_Children))
|
|
return SPDRP_MAXIMUM_PROPERTY; // CM_Get_Child then CM_Get_Sibling CM_Get_Device_ID
|
|
if(DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_HardwareIds))
|
|
return SPDRP_HARDWAREID;
|
|
|
|
return SPDRP_MAXIMUM_PROPERTY;
|
|
}
|
|
|
|
BOOL WINAPI Implementation_SetupDiGetDevicePropertyW(
|
|
HDEVINFO DeviceInfoSet,
|
|
PSP_DEVINFO_DATA DeviceInfoData,
|
|
const DEVPROPKEY *PropertyKey,
|
|
DEVPROPTYPE *PropertyType,
|
|
PBYTE PropertyBuffer,
|
|
DWORD PropertyBufferSize,
|
|
PDWORD RequiredSize,
|
|
DWORD Flags
|
|
)
|
|
{
|
|
if (DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_InstanceId)) {
|
|
return SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, (PWSTR)PropertyBuffer, PropertyBufferSize, RequiredSize);
|
|
}
|
|
if (DevPropKeyCmp(*PropertyKey, DEVPKEY_Device_Parent)) {
|
|
return TRUE;
|
|
}
|
|
return SetupDiGetDeviceRegistryPropertyW(DeviceInfoSet, DeviceInfoData, DevPropKeyEqual(PropertyKey), PropertyType, PropertyBuffer, PropertyBufferSize, RequiredSize);
|
|
} |