diff options
-rw-r--r-- | api/adapter.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/api/adapter.c b/api/adapter.c index 298e038..1ca8c2c 100644 --- a/api/adapter.c +++ b/api/adapter.c @@ -427,28 +427,33 @@ static _Return_type_success_(return != FALSE) BOOL } static _Return_type_success_(return != FALSE) BOOL - GetNetCfgInstanceId(_In_ HDEVINFO DevInfo, _In_ SP_DEVINFO_DATA *DevInfoData, _Out_ GUID *CfgInstanceID) + GetNetCfgInstanceIdFromHKEY(_In_ HKEY Key, _Out_ GUID *CfgInstanceID) { - HKEY Key = SetupDiOpenDevRegKey(DevInfo, DevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_QUERY_VALUE); - if (Key == INVALID_HANDLE_VALUE) - { - LOG_LAST_ERROR(L"Opening device registry key failed"); - return FALSE; - } - DWORD LastError = ERROR_SUCCESS; WCHAR *ValueStr = RegistryQueryString(Key, L"NetCfgInstanceId", TRUE); if (!ValueStr) - { - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get NetCfgInstanceId"); - goto cleanupKey; - } + return RET_ERROR(TRUE, LOG(WINTUN_LOG_ERR, L"Failed to get NetCfgInstanceId")); + DWORD LastError = ERROR_SUCCESS; if (FAILED(CLSIDFromString(ValueStr, CfgInstanceID))) { LOG(WINTUN_LOG_ERR, L"NetCfgInstanceId is not a GUID"); LastError = ERROR_INVALID_DATA; } Free(ValueStr); -cleanupKey: + return RET_ERROR(TRUE, LastError); +} + +static _Return_type_success_(return != FALSE) BOOL + GetNetCfgInstanceIdFromDevInfo(_In_ HDEVINFO DevInfo, _In_ SP_DEVINFO_DATA *DevInfoData, _Out_ GUID *CfgInstanceID) +{ + HKEY Key = SetupDiOpenDevRegKey(DevInfo, DevInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DRV, KEY_QUERY_VALUE); + if (Key == INVALID_HANDLE_VALUE) + { + LOG_LAST_ERROR(L"Opening device registry key failed"); + return FALSE; + } + DWORD LastError = ERROR_SUCCESS; + if (!GetNetCfgInstanceIdFromHKEY(Key, CfgInstanceID)) + LastError = GetLastError(); RegCloseKey(Key); return RET_ERROR(TRUE, LastError); } @@ -472,7 +477,7 @@ static _Return_type_success_(return != FALSE) BOOL continue; } GUID CfgInstanceID2; - if (GetNetCfgInstanceId(*DevInfo, DevInfoData, &CfgInstanceID2) && + if (GetNetCfgInstanceIdFromDevInfo(*DevInfo, DevInfoData, &CfgInstanceID2) && !memcmp(CfgInstanceID, &CfgInstanceID2, sizeof(GUID))) return TRUE; } @@ -561,20 +566,11 @@ static _Return_type_success_(return != NULL) WINTUN_ADAPTER goto cleanupKey; } - WCHAR *ValueStr = RegistryQueryString(Key, L"NetCfgInstanceId", TRUE); - if (!ValueStr) - { - LastError = LOG(WINTUN_LOG_ERR, L"Failed to get NetCfgInstanceId"); - goto cleanupAdapter; - } - if (FAILED(CLSIDFromString(ValueStr, &Adapter->CfgInstanceID))) + if (!GetNetCfgInstanceIdFromHKEY(Key, &Adapter->CfgInstanceID)) { - LOG(WINTUN_LOG_ERR, L"NetCfgInstanceId is not Adapter GUID"); - Free(ValueStr); - LastError = ERROR_INVALID_DATA; + LastError = GetLastError(); goto cleanupAdapter; } - Free(ValueStr); if (!RegistryQueryDWORD(Key, L"NetLuidIndex", &Adapter->LuidIndex, TRUE)) { @@ -672,7 +668,7 @@ _Return_type_success_(return != NULL) WINTUN_ADAPTER *WINAPI } GUID CfgInstanceID; - if (!GetNetCfgInstanceId(DevInfo, &DevInfoData, &CfgInstanceID)) + if (!GetNetCfgInstanceIdFromDevInfo(DevInfo, &DevInfoData, &CfgInstanceID)) continue; /* TODO: is there a better way than comparing ifnames? */ |