api: selectively use temporary variable to prepare output
Suggested-by: Jason A. Donenfeld <Jason@zx2c4.com> Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
		
							parent
							
								
									8c935ce151
								
							
						
					
					
						commit
						1b3af95be3
					
				@ -33,14 +33,17 @@ AdapterGetDrvInfoDetail(
 | 
			
		||||
    DWORD Size = sizeof(SP_DRVINFO_DETAIL_DATA_W) + 0x100;
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        *DrvInfoDetailData = HeapAlloc(ModuleHeap, 0, Size);
 | 
			
		||||
        if (!*DrvInfoDetailData)
 | 
			
		||||
        SP_DRVINFO_DETAIL_DATA_W *p = HeapAlloc(ModuleHeap, 0, Size);
 | 
			
		||||
        if (!p)
 | 
			
		||||
            return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
 | 
			
		||||
        (*DrvInfoDetailData)->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W);
 | 
			
		||||
        if (SetupDiGetDriverInfoDetailW(DevInfo, DevInfoData, DrvInfoData, *DrvInfoDetailData, Size, &Size))
 | 
			
		||||
        p->cbSize = sizeof(SP_DRVINFO_DETAIL_DATA_W);
 | 
			
		||||
        if (SetupDiGetDriverInfoDetailW(DevInfo, DevInfoData, DrvInfoData, p, Size, &Size))
 | 
			
		||||
        {
 | 
			
		||||
            *DrvInfoDetailData = p;
 | 
			
		||||
            return ERROR_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
        DWORD Result = GetLastError();
 | 
			
		||||
        HeapFree(ModuleHeap, 0, *DrvInfoDetailData);
 | 
			
		||||
        HeapFree(ModuleHeap, 0, p);
 | 
			
		||||
        if (Result != ERROR_INSUFFICIENT_BUFFER)
 | 
			
		||||
            return LOG_ERROR(L"Failed", Result);
 | 
			
		||||
    }
 | 
			
		||||
@ -57,13 +60,16 @@ GetDeviceRegistryProperty(
 | 
			
		||||
{
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        *Buf = HeapAlloc(ModuleHeap, 0, *BufLen);
 | 
			
		||||
        if (!*Buf)
 | 
			
		||||
        BYTE *p = HeapAlloc(ModuleHeap, 0, *BufLen);
 | 
			
		||||
        if (!p)
 | 
			
		||||
            return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
 | 
			
		||||
        if (SetupDiGetDeviceRegistryPropertyW(DevInfo, DevInfoData, Property, ValueType, *Buf, *BufLen, BufLen))
 | 
			
		||||
        if (SetupDiGetDeviceRegistryPropertyW(DevInfo, DevInfoData, Property, ValueType, p, *BufLen, BufLen))
 | 
			
		||||
        {
 | 
			
		||||
            *Buf = p;
 | 
			
		||||
            return ERROR_SUCCESS;
 | 
			
		||||
        }
 | 
			
		||||
        DWORD Result = GetLastError();
 | 
			
		||||
        HeapFree(ModuleHeap, 0, *Buf);
 | 
			
		||||
        HeapFree(ModuleHeap, 0, p);
 | 
			
		||||
        if (Result != ERROR_INSUFFICIENT_BUFFER)
 | 
			
		||||
            return LOG_ERROR(L"Querying property failed", Result);
 | 
			
		||||
    }
 | 
			
		||||
@ -506,8 +512,8 @@ CreateAdapterData(
 | 
			
		||||
    if (Key == INVALID_HANDLE_VALUE)
 | 
			
		||||
        return LOG_LAST_ERROR(L"Opening device registry key failed");
 | 
			
		||||
 | 
			
		||||
    *Adapter = HeapAlloc(ModuleHeap, 0, sizeof(WINTUN_ADAPTER));
 | 
			
		||||
    if (!*Adapter)
 | 
			
		||||
    WINTUN_ADAPTER *a = HeapAlloc(ModuleHeap, 0, sizeof(WINTUN_ADAPTER));
 | 
			
		||||
    if (!a)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Out of memory");
 | 
			
		||||
        Result = ERROR_OUTOFMEMORY;
 | 
			
		||||
@ -522,7 +528,7 @@ CreateAdapterData(
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Failed to query NetCfgInstanceId value");
 | 
			
		||||
        goto cleanupAdapter;
 | 
			
		||||
    }
 | 
			
		||||
    if (FAILED(CLSIDFromString(ValueStr, &(*Adapter)->CfgInstanceID)))
 | 
			
		||||
    if (FAILED(CLSIDFromString(ValueStr, &a->CfgInstanceID)))
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"NetCfgInstanceId is not a GUID");
 | 
			
		||||
        HeapFree(ModuleHeap, 0, ValueStr);
 | 
			
		||||
@ -532,7 +538,7 @@ CreateAdapterData(
 | 
			
		||||
    HeapFree(ModuleHeap, 0, ValueStr);
 | 
			
		||||
 | 
			
		||||
    /* Read the NetLuidIndex value. */
 | 
			
		||||
    Result = RegistryQueryDWORD(Key, L"NetLuidIndex", &(*Adapter)->LuidIndex, TRUE);
 | 
			
		||||
    Result = RegistryQueryDWORD(Key, L"NetLuidIndex", &a->LuidIndex, TRUE);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Failed to query NetLuidIndex value");
 | 
			
		||||
@ -540,7 +546,7 @@ CreateAdapterData(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Read the NetLuidIndex value. */
 | 
			
		||||
    Result = RegistryQueryDWORD(Key, L"*IfType", &(*Adapter)->IfType, TRUE);
 | 
			
		||||
    Result = RegistryQueryDWORD(Key, L"*IfType", &a->IfType, TRUE);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Failed to query *IfType value");
 | 
			
		||||
@ -548,24 +554,24 @@ CreateAdapterData(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    DWORD Size;
 | 
			
		||||
    if (!SetupDiGetDeviceInstanceIdW(
 | 
			
		||||
            DevInfo, DevInfoData, (*Adapter)->DevInstanceID, _countof((*Adapter)->DevInstanceID), &Size))
 | 
			
		||||
    if (!SetupDiGetDeviceInstanceIdW(DevInfo, DevInfoData, a->DevInstanceID, _countof(a->DevInstanceID), &Size))
 | 
			
		||||
    {
 | 
			
		||||
        Result = LOG_LAST_ERROR(L"Failed to get device instance ID");
 | 
			
		||||
        goto cleanupAdapter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (wcsncpy_s((*Adapter)->Pool, _countof((*Adapter)->Pool), Pool, _TRUNCATE) == STRUNCATE)
 | 
			
		||||
    if (wcsncpy_s(a->Pool, _countof(a->Pool), Pool, _TRUNCATE) == STRUNCATE)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Pool name too long");
 | 
			
		||||
        Result = ERROR_INVALID_PARAMETER;
 | 
			
		||||
        goto cleanupAdapter;
 | 
			
		||||
    }
 | 
			
		||||
    *Adapter = a;
 | 
			
		||||
    Result = ERROR_SUCCESS;
 | 
			
		||||
 | 
			
		||||
cleanupAdapter:
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
        HeapFree(ModuleHeap, 0, *Adapter);
 | 
			
		||||
        HeapFree(ModuleHeap, 0, a);
 | 
			
		||||
cleanupKey:
 | 
			
		||||
    RegCloseKey(Key);
 | 
			
		||||
    return Result;
 | 
			
		||||
@ -884,7 +890,6 @@ cleanupQueriedStore:
 | 
			
		||||
    return Result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static BOOL
 | 
			
		||||
IsOurDrvInfoDetail(_In_ const SP_DRVINFO_DETAIL_DATA_W *DrvInfoDetailData)
 | 
			
		||||
{
 | 
			
		||||
@ -1167,7 +1172,8 @@ CreateAdapter(
 | 
			
		||||
        goto cleanupNetDevRegKey;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Result = CreateAdapterData(Pool, DevInfo, &DevInfoData, Adapter);
 | 
			
		||||
    WINTUN_ADAPTER *a;
 | 
			
		||||
    Result = CreateAdapterData(Pool, DevInfo, &DevInfoData, &a);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Failed to create adapter data");
 | 
			
		||||
@ -1176,7 +1182,7 @@ CreateAdapter(
 | 
			
		||||
 | 
			
		||||
    HKEY TcpipAdapterRegKey;
 | 
			
		||||
    WCHAR TcpipAdapterRegPath[MAX_REG_PATH];
 | 
			
		||||
    Result = GetTcpipAdapterRegPath(*Adapter, TcpipAdapterRegPath);
 | 
			
		||||
    Result = GetTcpipAdapterRegPath(a, TcpipAdapterRegPath);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
        goto cleanupAdapter;
 | 
			
		||||
    Result = RegistryOpenKeyWait(
 | 
			
		||||
@ -1200,7 +1206,7 @@ CreateAdapter(
 | 
			
		||||
 | 
			
		||||
    HKEY TcpipInterfaceRegKey;
 | 
			
		||||
    WCHAR TcpipInterfaceRegPath[MAX_REG_PATH];
 | 
			
		||||
    Result = GetTcpipInterfaceRegPath(*Adapter, TcpipInterfaceRegPath);
 | 
			
		||||
    Result = GetTcpipInterfaceRegPath(a, TcpipInterfaceRegPath);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Failed to determine interface-specific TCP/IP network registry key path");
 | 
			
		||||
@ -1224,15 +1230,17 @@ CreateAdapter(
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
        LOG_ERROR(L"Failed to set EnableDeadGWDetect", Result);
 | 
			
		||||
 | 
			
		||||
    Result = WintunSetAdapterName(*Adapter, Name);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
    Result = WintunSetAdapterName(a, Name);
 | 
			
		||||
    if (Result == ERROR_SUCCESS)
 | 
			
		||||
        *Adapter = a;
 | 
			
		||||
    else
 | 
			
		||||
        LOG_ERROR(L"Failed to set adapter name", Result);
 | 
			
		||||
    RegCloseKey(TcpipInterfaceRegKey);
 | 
			
		||||
cleanupTcpipAdapterRegKey:
 | 
			
		||||
    RegCloseKey(TcpipAdapterRegKey);
 | 
			
		||||
cleanupAdapter:
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
        HeapFree(ModuleHeap, 0, *Adapter);
 | 
			
		||||
        HeapFree(ModuleHeap, 0, a);
 | 
			
		||||
cleanupNetDevRegKey:
 | 
			
		||||
    RegCloseKey(NetDevRegKey);
 | 
			
		||||
cleanupDevice:
 | 
			
		||||
 | 
			
		||||
@ -181,13 +181,16 @@ RegistryQuery(
 | 
			
		||||
{
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        *Buf = HeapAlloc(ModuleHeap, 0, *BufLen);
 | 
			
		||||
        if (!*Buf)
 | 
			
		||||
        BYTE *p = HeapAlloc(ModuleHeap, 0, *BufLen);
 | 
			
		||||
        if (!p)
 | 
			
		||||
            return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
 | 
			
		||||
        LSTATUS Result = RegQueryValueExW(Key, Name, NULL, ValueType, (BYTE *)*Buf, BufLen);
 | 
			
		||||
        LSTATUS Result = RegQueryValueExW(Key, Name, NULL, ValueType, p, BufLen);
 | 
			
		||||
        if (Result == ERROR_SUCCESS)
 | 
			
		||||
        {
 | 
			
		||||
            *Buf = p;
 | 
			
		||||
            return ERROR_SUCCESS;
 | 
			
		||||
        HeapFree(ModuleHeap, 0, *Buf);
 | 
			
		||||
        }
 | 
			
		||||
        HeapFree(ModuleHeap, 0, p);
 | 
			
		||||
        if (Result != ERROR_MORE_DATA)
 | 
			
		||||
            return Log ? LOG_ERROR(L"Querying value failed", Result) : Result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -67,8 +67,8 @@ typedef struct _TUN_SESSION
 | 
			
		||||
WINTUN_STATUS WINAPI
 | 
			
		||||
WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out_ TUN_SESSION **Session)
 | 
			
		||||
{
 | 
			
		||||
    *Session = HeapAlloc(ModuleHeap, HEAP_ZERO_MEMORY, sizeof(TUN_SESSION));
 | 
			
		||||
    if (!*Session)
 | 
			
		||||
    TUN_SESSION *s = HeapAlloc(ModuleHeap, HEAP_ZERO_MEMORY, sizeof(TUN_SESSION));
 | 
			
		||||
    if (!s)
 | 
			
		||||
        return LOG(WINTUN_LOG_ERR, L"Out of memory"), ERROR_OUTOFMEMORY;
 | 
			
		||||
    const ULONG RingSize = TUN_RING_SIZE(Capacity);
 | 
			
		||||
    DWORD Result;
 | 
			
		||||
@ -84,25 +84,25 @@ WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out
 | 
			
		||||
        Result = ERROR_ACCESS_DENIED;
 | 
			
		||||
        goto cleanupAllocatedRegion;
 | 
			
		||||
    }
 | 
			
		||||
    (*Session)->Descriptor.Send.RingSize = RingSize;
 | 
			
		||||
    (*Session)->Descriptor.Send.Ring = (TUN_RING *)AllocatedRegion;
 | 
			
		||||
    (*Session)->Descriptor.Send.TailMoved = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL);
 | 
			
		||||
    if (!(*Session)->Descriptor.Send.TailMoved)
 | 
			
		||||
    s->Descriptor.Send.RingSize = RingSize;
 | 
			
		||||
    s->Descriptor.Send.Ring = (TUN_RING *)AllocatedRegion;
 | 
			
		||||
    s->Descriptor.Send.TailMoved = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL);
 | 
			
		||||
    if (!s->Descriptor.Send.TailMoved)
 | 
			
		||||
    {
 | 
			
		||||
        Result = LOG_LAST_ERROR(L"Failed to create send event");
 | 
			
		||||
        goto cleanupToken;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    (*Session)->Descriptor.Receive.RingSize = RingSize;
 | 
			
		||||
    (*Session)->Descriptor.Receive.Ring = (TUN_RING *)(AllocatedRegion + RingSize);
 | 
			
		||||
    (*Session)->Descriptor.Receive.TailMoved = CreateEvent(&SecurityAttributes, FALSE, FALSE, NULL);
 | 
			
		||||
    if (!(*Session)->Descriptor.Receive.TailMoved)
 | 
			
		||||
    s->Descriptor.Receive.RingSize = RingSize;
 | 
			
		||||
    s->Descriptor.Receive.Ring = (TUN_RING *)(AllocatedRegion + RingSize);
 | 
			
		||||
    s->Descriptor.Receive.TailMoved = CreateEventW(&SecurityAttributes, FALSE, FALSE, NULL);
 | 
			
		||||
    if (!s->Descriptor.Receive.TailMoved)
 | 
			
		||||
    {
 | 
			
		||||
        Result = LOG_LAST_ERROR(L"Failed to create receive event");
 | 
			
		||||
        goto cleanupSendTailMoved;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Result = WintunGetAdapterDeviceObject(Adapter, &(*Session)->Handle);
 | 
			
		||||
    Result = WintunGetAdapterDeviceObject(Adapter, &s->Handle);
 | 
			
		||||
    if (Result != ERROR_SUCCESS)
 | 
			
		||||
    {
 | 
			
		||||
        LOG(WINTUN_LOG_ERR, L"Failed to open adapter device object");
 | 
			
		||||
@ -110,9 +110,9 @@ WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out
 | 
			
		||||
    }
 | 
			
		||||
    DWORD BytesReturned;
 | 
			
		||||
    if (!DeviceIoControl(
 | 
			
		||||
                 (*Session)->Handle,
 | 
			
		||||
            s->Handle,
 | 
			
		||||
            TUN_IOCTL_REGISTER_RINGS,
 | 
			
		||||
                 &(*Session)->Descriptor,
 | 
			
		||||
            &s->Descriptor,
 | 
			
		||||
            sizeof(TUN_REGISTER_RINGS),
 | 
			
		||||
            NULL,
 | 
			
		||||
            0,
 | 
			
		||||
@ -123,23 +123,23 @@ WintunStartSession(_In_ const WINTUN_ADAPTER *Adapter, _In_ DWORD Capacity, _Out
 | 
			
		||||
        goto cleanupHandle;
 | 
			
		||||
    }
 | 
			
		||||
    RevertToSelf();
 | 
			
		||||
    (*Session)->Capacity = Capacity;
 | 
			
		||||
    (void)InitializeCriticalSectionAndSpinCount(&(*Session)->Receive.Lock, LOCK_SPIN_COUNT);
 | 
			
		||||
    (void)InitializeCriticalSectionAndSpinCount(&(*Session)->Send.Lock, LOCK_SPIN_COUNT);
 | 
			
		||||
    s->Capacity = Capacity;
 | 
			
		||||
    (void)InitializeCriticalSectionAndSpinCount(&s->Receive.Lock, LOCK_SPIN_COUNT);
 | 
			
		||||
    (void)InitializeCriticalSectionAndSpinCount(&s->Send.Lock, LOCK_SPIN_COUNT);
 | 
			
		||||
    *Session = s;
 | 
			
		||||
    return ERROR_SUCCESS;
 | 
			
		||||
cleanupHandle:
 | 
			
		||||
    CloseHandle((*Session)->Handle);
 | 
			
		||||
    CloseHandle(s->Handle);
 | 
			
		||||
cleanupReceiveTailMoved:
 | 
			
		||||
    CloseHandle((*Session)->Descriptor.Receive.TailMoved);
 | 
			
		||||
    CloseHandle(s->Descriptor.Receive.TailMoved);
 | 
			
		||||
cleanupSendTailMoved:
 | 
			
		||||
    CloseHandle((*Session)->Descriptor.Send.TailMoved);
 | 
			
		||||
    CloseHandle(s->Descriptor.Send.TailMoved);
 | 
			
		||||
cleanupToken:
 | 
			
		||||
    RevertToSelf();
 | 
			
		||||
cleanupAllocatedRegion:
 | 
			
		||||
    VirtualFree(AllocatedRegion, 0, MEM_RELEASE);
 | 
			
		||||
cleanupRings:
 | 
			
		||||
    HeapFree(ModuleHeap, 0, *Session);
 | 
			
		||||
    *Session = NULL;
 | 
			
		||||
    HeapFree(ModuleHeap, 0, s);
 | 
			
		||||
    return Result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user