api: don't return ERROR_SUCCESS if adapter doesn't come up
Otherwise we fail to remove the zombie adapter, and then the problem repeats itself. Note that this is part of a larger issue of clearing out bad GUIDs in NetSetup2 on recent Windows builds Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
5e48e4196e
commit
e51b49604b
@ -224,6 +224,13 @@ static _Return_type_success_(return != NULL) WCHAR *GetDeviceObjectFileName(_In_
|
|||||||
SetLastError(LastError);
|
SetLastError(LastError);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (!Interfaces[0])
|
||||||
|
{
|
||||||
|
LOG(WINTUN_LOG_ERR, L"Received empty adapter object file name");
|
||||||
|
Free(Interfaces);
|
||||||
|
SetLastError(ERROR_DEVICE_NOT_AVAILABLE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return Interfaces;
|
return Interfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1652,11 +1659,22 @@ static _Return_type_success_(return != NULL) WINTUN_ADAPTER *CreateAdapter(
|
|||||||
goto cleanupTcpipAdapterRegKey;
|
goto cleanupTcpipAdapterRegKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEVPROPTYPE PropertyType;
|
|
||||||
for (int Tries = 0; Tries < 1000; ++Tries)
|
for (int Tries = 0; Tries < 1000; ++Tries)
|
||||||
{
|
{
|
||||||
|
DEVPROPTYPE PropertyType;
|
||||||
|
INT32 ProblemCode;
|
||||||
NTSTATUS ProblemStatus;
|
NTSTATUS ProblemStatus;
|
||||||
if (SetupDiGetDevicePropertyW(
|
if (SetupDiGetDevicePropertyW(
|
||||||
|
DevInfo,
|
||||||
|
&DevInfoData,
|
||||||
|
&DEVPKEY_Device_ProblemCode,
|
||||||
|
&PropertyType,
|
||||||
|
(PBYTE)&ProblemCode,
|
||||||
|
sizeof(ProblemCode),
|
||||||
|
NULL,
|
||||||
|
0) &&
|
||||||
|
PropertyType == DEVPROP_TYPE_INT32 && ProblemCode &&
|
||||||
|
SetupDiGetDevicePropertyW(
|
||||||
DevInfo,
|
DevInfo,
|
||||||
&DevInfoData,
|
&DevInfoData,
|
||||||
&DEVPKEY_Device_ProblemStatus,
|
&DEVPKEY_Device_ProblemStatus,
|
||||||
@ -1667,11 +1685,12 @@ static _Return_type_success_(return != NULL) WINTUN_ADAPTER *CreateAdapter(
|
|||||||
0) &&
|
0) &&
|
||||||
PropertyType == DEVPROP_TYPE_NTSTATUS)
|
PropertyType == DEVPROP_TYPE_NTSTATUS)
|
||||||
{
|
{
|
||||||
LastError = RtlNtStatusToDosError(ProblemStatus);
|
|
||||||
_Analysis_assume_(LastError != ERROR_SUCCESS);
|
|
||||||
if (ProblemStatus != STATUS_PNP_DEVICE_CONFIGURATION_PENDING || Tries == 999)
|
if (ProblemStatus != STATUS_PNP_DEVICE_CONFIGURATION_PENDING || Tries == 999)
|
||||||
{
|
{
|
||||||
LOG_ERROR(LastError, L"Failed to setup adapter (status: 0x%x)", ProblemStatus);
|
LastError = RtlNtStatusToDosError(ProblemStatus);
|
||||||
|
LOG_ERROR(LastError, L"Failed to setup adapter (code: 0x%x, status: 0x%x)", ProblemCode, ProblemStatus);
|
||||||
|
if (LastError == ERROR_SUCCESS)
|
||||||
|
LastError = ERROR_NOT_READY;
|
||||||
goto cleanupTcpipAdapterRegKey;
|
goto cleanupTcpipAdapterRegKey;
|
||||||
}
|
}
|
||||||
Sleep(10);
|
Sleep(10);
|
||||||
|
Loading…
Reference in New Issue
Block a user