Add support for setupapi.SetupDiOpenDevRegKey()

Furthermore setupapi.DevInfoData has been obsoleted.
SetupDiEnumDeviceInfo() fills existing SP_DEVINFO_DATA structure now.
As other functions of SetupAPI use SP_DEVINFO_DATA, converting it to
DevInfoData and back would hurt performance.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman
2019-02-01 13:00:44 +01:00
committed by Jason A. Donenfeld
parent 955d8dfe04
commit dce5192d86
4 changed files with 76 additions and 26 deletions

View File

@@ -43,7 +43,7 @@ func TestSetupDiGetDeviceInfoListDetailLocal(t *testing.T) {
if err != nil {
t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
}
defer SetupDiDestroyDeviceInfoList(devInfoList)
defer devInfoList.Close()
data, err := SetupDiGetDeviceInfoListDetail(devInfoList)
if err != nil {
@@ -68,7 +68,7 @@ func TestSetupDiGetDeviceInfoListDetailRemote(t *testing.T) {
if err != nil {
t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
}
defer SetupDiDestroyDeviceInfoList(devInfoList)
defer devInfoList.Close()
data, err := SetupDiGetDeviceInfoListDetail(devInfoList)
if err != nil {
@@ -93,10 +93,11 @@ func TestSetupDiEnumDeviceInfo(t *testing.T) {
if err != nil {
t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
}
defer SetupDiDestroyDeviceInfoList(devInfoList)
defer devInfoList.Close()
var data SP_DEVINFO_DATA
for i := 0; true; i++ {
data, err := SetupDiEnumDeviceInfo(devInfoList, i)
err := SetupDiEnumDeviceInfo(devInfoList, i, &data)
if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == 259 /*ERROR_NO_MORE_ITEMS*/ {
break
@@ -109,3 +110,28 @@ func TestSetupDiEnumDeviceInfo(t *testing.T) {
}
}
}
func TestSetupDiOpenDevRegKey(t *testing.T) {
devInfoList, err := SetupDiGetClassDevsEx(&deviceClassNetGUID, "", 0, DIGCF_PRESENT, DevInfo(0), "")
if err != nil {
t.Errorf("Error calling SetupDiGetClassDevsEx: %s", err.Error())
}
defer devInfoList.Close()
var data SP_DEVINFO_DATA
for i := 0; true; i++ {
err := SetupDiEnumDeviceInfo(devInfoList, i, &data)
if err != nil {
if errWin, ok := err.(syscall.Errno); ok && errWin == 259 /*ERROR_NO_MORE_ITEMS*/ {
break
}
continue
}
key, err := SetupDiOpenDevRegKey(devInfoList, &data, DICS_FLAG_GLOBAL, 0, DIREG_DRV, windows.KEY_READ)
if err != nil {
t.Errorf("Error calling SetupDiOpenDevRegKey: %s", err.Error())
}
defer key.Close()
}
}