api: serialize driver installation
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
		
							parent
							
								
									724508d61f
								
							
						
					
					
						commit
						007db8bd94
					
				@ -621,7 +621,7 @@ WintunGetAdapter(_In_z_ const WCHAR *Pool, _In_z_ const WCHAR *Name, _Out_ WINTU
 | 
				
			|||||||
        return LOG(WINTUN_LOG_ERR, L"Failed to impersonate SYSTEM user"), ERROR_ACCESS_DENIED;
 | 
					        return LOG(WINTUN_LOG_ERR, L"Failed to impersonate SYSTEM user"), ERROR_ACCESS_DENIED;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DWORD Result;
 | 
					    DWORD Result;
 | 
				
			||||||
    HANDLE Mutex = NamespaceTakeMutex(Pool);
 | 
					    HANDLE Mutex = NamespaceTakePoolMutex(Pool);
 | 
				
			||||||
    if (!Mutex)
 | 
					    if (!Mutex)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Result = ERROR_INVALID_HANDLE;
 | 
					        Result = ERROR_INVALID_HANDLE;
 | 
				
			||||||
@ -1029,7 +1029,7 @@ CreateAdapter(
 | 
				
			|||||||
    LOG(WINTUN_LOG_INFO, L"Creating adapter");
 | 
					    LOG(WINTUN_LOG_INFO, L"Creating adapter");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DWORD Result;
 | 
					    DWORD Result;
 | 
				
			||||||
    HANDLE Mutex = NamespaceTakeMutex(Pool);
 | 
					    HANDLE Mutex = NamespaceTakePoolMutex(Pool);
 | 
				
			||||||
    if (!Mutex)
 | 
					    if (!Mutex)
 | 
				
			||||||
        return ERROR_INVALID_HANDLE;
 | 
					        return ERROR_INVALID_HANDLE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1428,10 +1428,16 @@ static BOOL EnsureWintunUnloaded(VOID)
 | 
				
			|||||||
static WINTUN_STATUS
 | 
					static WINTUN_STATUS
 | 
				
			||||||
InstallDriver(_Out_writes_z_(MAX_PATH) WCHAR InfStorePath[MAX_PATH], _Inout_ BOOL *RebootRequired)
 | 
					InstallDriver(_Out_writes_z_(MAX_PATH) WCHAR InfStorePath[MAX_PATH], _Inout_ BOOL *RebootRequired)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    HANDLE DriverInstallationLock = NamespaceTakeDriverInstallationMutex();
 | 
				
			||||||
 | 
					    if (!DriverInstallationLock)
 | 
				
			||||||
 | 
					        return LOG_LAST_ERROR(L"Failed to take driver installation mutex");
 | 
				
			||||||
    DWORD Result;
 | 
					    DWORD Result;
 | 
				
			||||||
    WCHAR RandomTempSubDirectory[MAX_PATH];
 | 
					    WCHAR RandomTempSubDirectory[MAX_PATH];
 | 
				
			||||||
    if ((Result = CreateTemporaryDirectory(RandomTempSubDirectory)) != ERROR_SUCCESS)
 | 
					    if ((Result = CreateTemporaryDirectory(RandomTempSubDirectory)) != ERROR_SUCCESS)
 | 
				
			||||||
        return LOG(WINTUN_LOG_ERR, L"Failed to create temporary folder"), Result;
 | 
					    {
 | 
				
			||||||
 | 
					        LOG(WINTUN_LOG_ERR, L"Failed to create temporary folder");
 | 
				
			||||||
 | 
					        goto cleanupDriverInstallationLock;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    WCHAR CatPath[MAX_PATH] = { 0 };
 | 
					    WCHAR CatPath[MAX_PATH] = { 0 };
 | 
				
			||||||
    WCHAR SysPath[MAX_PATH] = { 0 };
 | 
					    WCHAR SysPath[MAX_PATH] = { 0 };
 | 
				
			||||||
@ -1518,6 +1524,8 @@ cleanupDelete:
 | 
				
			|||||||
    DeleteFileW(InfPath);
 | 
					    DeleteFileW(InfPath);
 | 
				
			||||||
cleanupDirectory:
 | 
					cleanupDirectory:
 | 
				
			||||||
    RemoveDirectoryW(RandomTempSubDirectory);
 | 
					    RemoveDirectoryW(RandomTempSubDirectory);
 | 
				
			||||||
 | 
					cleanupDriverInstallationLock:
 | 
				
			||||||
 | 
					    NamespaceReleaseMutex(DriverInstallationLock);
 | 
				
			||||||
    return Result;
 | 
					    return Result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1730,7 +1738,7 @@ cleanupDirectory:
 | 
				
			|||||||
static WINTUN_STATUS
 | 
					static WINTUN_STATUS
 | 
				
			||||||
GetAdapter(_In_z_ const WCHAR *Pool, _In_ const GUID *CfgInstanceID, _Out_ WINTUN_ADAPTER **Adapter)
 | 
					GetAdapter(_In_z_ const WCHAR *Pool, _In_ const GUID *CfgInstanceID, _Out_ WINTUN_ADAPTER **Adapter)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    HANDLE Mutex = NamespaceTakeMutex(Pool);
 | 
					    HANDLE Mutex = NamespaceTakePoolMutex(Pool);
 | 
				
			||||||
    if (!Mutex)
 | 
					    if (!Mutex)
 | 
				
			||||||
        return ERROR_INVALID_HANDLE;
 | 
					        return ERROR_INVALID_HANDLE;
 | 
				
			||||||
    HDEVINFO DevInfo;
 | 
					    HDEVINFO DevInfo;
 | 
				
			||||||
@ -1940,7 +1948,7 @@ cleanupToken:
 | 
				
			|||||||
WINTUN_STATUS WINAPI
 | 
					WINTUN_STATUS WINAPI
 | 
				
			||||||
WintunEnumAdapters(_In_z_ const WCHAR *Pool, _In_ WINTUN_ENUM_CALLBACK_FUNC Func, _In_ LPARAM Param)
 | 
					WintunEnumAdapters(_In_z_ const WCHAR *Pool, _In_ WINTUN_ENUM_CALLBACK_FUNC Func, _In_ LPARAM Param)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    HANDLE Mutex = NamespaceTakeMutex(Pool);
 | 
					    HANDLE Mutex = NamespaceTakePoolMutex(Pool);
 | 
				
			||||||
    if (!Mutex)
 | 
					    if (!Mutex)
 | 
				
			||||||
        return ERROR_INVALID_HANDLE;
 | 
					        return ERROR_INVALID_HANDLE;
 | 
				
			||||||
    DWORD Result = ERROR_SUCCESS;
 | 
					    DWORD Result = ERROR_SUCCESS;
 | 
				
			||||||
 | 
				
			|||||||
@ -102,7 +102,7 @@ cleanupLeaveCriticalSection:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
_Check_return_
 | 
					_Check_return_
 | 
				
			||||||
HANDLE
 | 
					HANDLE
 | 
				
			||||||
NamespaceTakeMutex(_In_z_ const WCHAR *Pool)
 | 
					NamespaceTakePoolMutex(_In_z_ const WCHAR *Pool)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    HANDLE Mutex = NULL;
 | 
					    HANDLE Mutex = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -147,6 +147,30 @@ cleanupSha256:
 | 
				
			|||||||
    return Mutex;
 | 
					    return Mutex;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_Check_return_
 | 
				
			||||||
 | 
					HANDLE
 | 
				
			||||||
 | 
					NamespaceTakeDriverInstallationMutex(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    HANDLE Mutex = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (NamespaceRuntimeInit() != ERROR_SUCCESS)
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    Mutex = CreateMutexW(&SecurityAttributes, FALSE, L"Wintun\\Wintun-Driver-Installation-Mutex");
 | 
				
			||||||
 | 
					    if (!Mutex)
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    switch (WaitForSingleObject(Mutex, INFINITE))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    case WAIT_OBJECT_0:
 | 
				
			||||||
 | 
					    case WAIT_ABANDONED:
 | 
				
			||||||
 | 
					        goto out;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CloseHandle(Mutex);
 | 
				
			||||||
 | 
					    Mutex = NULL;
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
					    return Mutex;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
NamespaceReleaseMutex(_In_ HANDLE Mutex)
 | 
					NamespaceReleaseMutex(_In_ HANDLE Mutex)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
_Check_return_
 | 
					_Check_return_
 | 
				
			||||||
HANDLE
 | 
					HANDLE
 | 
				
			||||||
NamespaceTakeMutex(_In_z_ const WCHAR *Pool);
 | 
					NamespaceTakePoolMutex(_In_z_ const WCHAR *Pool);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_Check_return_
 | 
				
			||||||
 | 
					HANDLE
 | 
				
			||||||
 | 
					NamespaceTakeDriverInstallationMutex(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
NamespaceReleaseMutex(_In_ HANDLE Mutex);
 | 
					NamespaceReleaseMutex(_In_ HANDLE Mutex);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user