setupapi: add DeviceInstanceID()
This commit is contained in:
		
							parent
							
								
									eaf17becfa
								
							
						
					
					
						commit
						bb3f1932fa
					
				@ -364,6 +364,29 @@ func (deviceInfoSet DevInfo) DeviceInstallParams(deviceInfoData *DevInfoData) (*
 | 
			
		||||
	return SetupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sys	setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceInstanceIdW
 | 
			
		||||
 | 
			
		||||
// SetupDiGetDeviceInstanceId function retrieves the instance ID of the device
 | 
			
		||||
func SetupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (string, error) {
 | 
			
		||||
	reqSize := uint32(1024)
 | 
			
		||||
	for {
 | 
			
		||||
		buf := make([]uint16, reqSize)
 | 
			
		||||
		err := setupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData, &buf[0], uint32(len(buf)), &reqSize)
 | 
			
		||||
		if err == windows.ERROR_INSUFFICIENT_BUFFER {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		return windows.UTF16ToString(buf), nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeviceInstanceID method retrieves the instance ID of the device.
 | 
			
		||||
func (deviceInfoSet DevInfo) DeviceInstanceID(deviceInfoData *DevInfoData) (string, error) {
 | 
			
		||||
	return SetupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetupDiGetClassInstallParams function retrieves class installation parameters for a device information set or a particular device information element.
 | 
			
		||||
//sys	SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetClassInstallParamsW
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -139,6 +139,11 @@ func TestSetupDiEnumDeviceInfo(t *testing.T) {
 | 
			
		||||
		if data.ClassGUID != deviceClassNetGUID {
 | 
			
		||||
			t.Error("SetupDiEnumDeviceInfo returned different class GUID")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		_, err = devInfoList.DeviceInstanceID(data)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("Error calling SetupDiGetDeviceInstanceId: %s", err.Error())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -57,6 +57,7 @@ var (
 | 
			
		||||
	procSetupDiGetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiGetDeviceRegistryPropertyW")
 | 
			
		||||
	procSetupDiSetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiSetDeviceRegistryPropertyW")
 | 
			
		||||
	procSetupDiGetDeviceInstallParamsW    = modsetupapi.NewProc("SetupDiGetDeviceInstallParamsW")
 | 
			
		||||
	procSetupDiGetDeviceInstanceIdW       = modsetupapi.NewProc("SetupDiGetDeviceInstanceIdW")
 | 
			
		||||
	procSetupDiGetClassInstallParamsW     = modsetupapi.NewProc("SetupDiGetClassInstallParamsW")
 | 
			
		||||
	procSetupDiSetDeviceInstallParamsW    = modsetupapi.NewProc("SetupDiSetDeviceInstallParamsW")
 | 
			
		||||
	procSetupDiSetClassInstallParamsW     = modsetupapi.NewProc("SetupDiSetClassInstallParamsW")
 | 
			
		||||
@ -285,6 +286,18 @@ func setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInf
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall6(procSetupDiGetDeviceInstanceIdW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(instanceId)), uintptr(instanceIdSize), uintptr(unsafe.Pointer(instanceIdRequiredSize)), 0)
 | 
			
		||||
	if r1 == 0 {
 | 
			
		||||
		if e1 != 0 {
 | 
			
		||||
			err = errnoErr(e1)
 | 
			
		||||
		} else {
 | 
			
		||||
			err = syscall.EINVAL
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) {
 | 
			
		||||
	r1, _, e1 := syscall.Syscall6(procSetupDiGetClassInstallParamsW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), uintptr(unsafe.Pointer(requiredSize)), 0)
 | 
			
		||||
	if r1 == 0 {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user