mirror of
https://github.com/reactos/reactos.git
synced 2024-07-07 05:05:09 +00:00
[MSPORTS]
Protect the COM database from concurrent access. svn path=/trunk/; revision=52084
This commit is contained in:
parent
588db734b0
commit
347ef6343f
|
@ -17,6 +17,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msports);
|
||||||
|
|
||||||
typedef struct _COMDB
|
typedef struct _COMDB
|
||||||
{
|
{
|
||||||
|
HANDLE hMutex;
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
} COMDB, *PCOMDB;
|
} COMDB, *PCOMDB;
|
||||||
|
|
||||||
|
@ -44,6 +45,9 @@ ComDBClaimNextFreePort(IN HCOMDB hComDB,
|
||||||
|
|
||||||
pComDB = (PCOMDB)hComDB;
|
pComDB = (PCOMDB)hComDB;
|
||||||
|
|
||||||
|
/* Wait for the mutex */
|
||||||
|
WaitForSingleObject(pComDB->hMutex, INFINITE);
|
||||||
|
|
||||||
/* Get the required bitmap size */
|
/* Get the required bitmap size */
|
||||||
lError = RegQueryValueExW(pComDB->hKey,
|
lError = RegQueryValueExW(pComDB->hKey,
|
||||||
L"ComDB",
|
L"ComDB",
|
||||||
|
@ -52,7 +56,10 @@ ComDBClaimNextFreePort(IN HCOMDB hComDB,
|
||||||
NULL,
|
NULL,
|
||||||
&dwSize);
|
&dwSize);
|
||||||
if (lError != ERROR_SUCCESS)
|
if (lError != ERROR_SUCCESS)
|
||||||
return lError;
|
{
|
||||||
|
ERR("Failed to query the bitmap size!\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Allocate the bitmap */
|
/* Allocate the bitmap */
|
||||||
pBitmap = HeapAlloc(GetProcessHeap(),
|
pBitmap = HeapAlloc(GetProcessHeap(),
|
||||||
|
@ -61,7 +68,8 @@ ComDBClaimNextFreePort(IN HCOMDB hComDB,
|
||||||
if (pBitmap == NULL)
|
if (pBitmap == NULL)
|
||||||
{
|
{
|
||||||
ERR("Failed to allocate the bitmap!\n");
|
ERR("Failed to allocate the bitmap!\n");
|
||||||
return lError;
|
lError = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the bitmap */
|
/* Read the bitmap */
|
||||||
|
@ -102,6 +110,10 @@ ComDBClaimNextFreePort(IN HCOMDB hComDB,
|
||||||
}
|
}
|
||||||
|
|
||||||
done:;
|
done:;
|
||||||
|
/* Release the mutex */
|
||||||
|
ReleaseMutex(pComDB->hMutex);
|
||||||
|
|
||||||
|
/* Release the bitmap */
|
||||||
if (pBitmap != NULL)
|
if (pBitmap != NULL)
|
||||||
HeapFree(GetProcessHeap(), 0, pBitmap);
|
HeapFree(GetProcessHeap(), 0, pBitmap);
|
||||||
|
|
||||||
|
@ -135,6 +147,9 @@ ComDBClaimPort(IN HCOMDB hComDB,
|
||||||
|
|
||||||
pComDB = (PCOMDB)hComDB;
|
pComDB = (PCOMDB)hComDB;
|
||||||
|
|
||||||
|
/* Wait for the mutex */
|
||||||
|
WaitForSingleObject(pComDB->hMutex, INFINITE);
|
||||||
|
|
||||||
/* Get the required bitmap size */
|
/* Get the required bitmap size */
|
||||||
lError = RegQueryValueExW(pComDB->hKey,
|
lError = RegQueryValueExW(pComDB->hKey,
|
||||||
L"ComDB",
|
L"ComDB",
|
||||||
|
@ -143,7 +158,10 @@ ComDBClaimPort(IN HCOMDB hComDB,
|
||||||
NULL,
|
NULL,
|
||||||
&dwSize);
|
&dwSize);
|
||||||
if (lError != ERROR_SUCCESS)
|
if (lError != ERROR_SUCCESS)
|
||||||
return lError;
|
{
|
||||||
|
ERR("Failed to query the bitmap size!\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Allocate the bitmap */
|
/* Allocate the bitmap */
|
||||||
pBitmap = HeapAlloc(GetProcessHeap(),
|
pBitmap = HeapAlloc(GetProcessHeap(),
|
||||||
|
@ -152,7 +170,8 @@ ComDBClaimPort(IN HCOMDB hComDB,
|
||||||
if (pBitmap == NULL)
|
if (pBitmap == NULL)
|
||||||
{
|
{
|
||||||
ERR("Failed to allocate the bitmap!\n");
|
ERR("Failed to allocate the bitmap!\n");
|
||||||
return lError;
|
lError = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the bitmap */
|
/* Read the bitmap */
|
||||||
|
@ -203,6 +222,10 @@ ComDBClaimPort(IN HCOMDB hComDB,
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
/* Release the mutex */
|
||||||
|
ReleaseMutex(pComDB->hMutex);
|
||||||
|
|
||||||
|
/* Release the bitmap */
|
||||||
if (pBitmap != NULL)
|
if (pBitmap != NULL)
|
||||||
HeapFree(GetProcessHeap(), 0, pBitmap);
|
HeapFree(GetProcessHeap(), 0, pBitmap);
|
||||||
|
|
||||||
|
@ -218,7 +241,8 @@ ComDBClose(IN HCOMDB hComDB)
|
||||||
|
|
||||||
TRACE("ComDBClose(%p)\n", hComDB);
|
TRACE("ComDBClose(%p)\n", hComDB);
|
||||||
|
|
||||||
if (hComDB == HCOMDB_INVALID_HANDLE_VALUE || hComDB == NULL)
|
if (hComDB == HCOMDB_INVALID_HANDLE_VALUE ||
|
||||||
|
hComDB == NULL)
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
pComDB = (PCOMDB)hComDB;
|
pComDB = (PCOMDB)hComDB;
|
||||||
|
@ -227,6 +251,10 @@ ComDBClose(IN HCOMDB hComDB)
|
||||||
if (pComDB->hKey != NULL)
|
if (pComDB->hKey != NULL)
|
||||||
RegCloseKey(pComDB->hKey);
|
RegCloseKey(pComDB->hKey);
|
||||||
|
|
||||||
|
/* Close the mutex */
|
||||||
|
if (pComDB->hMutex != NULL)
|
||||||
|
CloseHandle(pComDB->hMutex);
|
||||||
|
|
||||||
/* Release the database */
|
/* Release the database */
|
||||||
HeapFree(GetProcessHeap(), 0, pComDB);
|
HeapFree(GetProcessHeap(), 0, pComDB);
|
||||||
|
|
||||||
|
@ -267,9 +295,25 @@ ComDBOpen(OUT HCOMDB *phComDB)
|
||||||
if (pComDB == NULL)
|
if (pComDB == NULL)
|
||||||
{
|
{
|
||||||
ERR("Failed to allocate the database!\n");
|
ERR("Failed to allocate the database!\n");
|
||||||
|
*phComDB = HCOMDB_INVALID_HANDLE_VALUE;
|
||||||
return ERROR_ACCESS_DENIED;
|
return ERROR_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create a mutex to protect the database */
|
||||||
|
pComDB->hMutex = CreateMutexW(NULL,
|
||||||
|
FALSE,
|
||||||
|
L"ComDBMutex");
|
||||||
|
if (pComDB->hMutex == NULL)
|
||||||
|
{
|
||||||
|
ERR("Failed to create the mutex!\n");
|
||||||
|
HeapFree(GetProcessHeap(), 0, pComDB);
|
||||||
|
*phComDB = HCOMDB_INVALID_HANDLE_VALUE;
|
||||||
|
return ERROR_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for the mutex */
|
||||||
|
WaitForSingleObject(pComDB->hMutex, INFINITE);
|
||||||
|
|
||||||
/* Create or open the database key */
|
/* Create or open the database key */
|
||||||
lError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
lError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
||||||
L"System\\CurrentControlSet\\Control\\COM Name Arbiter",
|
L"System\\CurrentControlSet\\Control\\COM Name Arbiter",
|
||||||
|
@ -316,12 +360,18 @@ ComDBOpen(OUT HCOMDB *phComDB)
|
||||||
}
|
}
|
||||||
|
|
||||||
done:;
|
done:;
|
||||||
|
/* Release the mutex */
|
||||||
|
ReleaseMutex(pComDB->hMutex);
|
||||||
|
|
||||||
if (lError != ERROR_SUCCESS)
|
if (lError != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Clean up in case of failure */
|
/* Clean up in case of failure */
|
||||||
if (pComDB->hKey != NULL)
|
if (pComDB->hKey != NULL)
|
||||||
RegCloseKey(pComDB->hKey);
|
RegCloseKey(pComDB->hKey);
|
||||||
|
|
||||||
|
if (pComDB->hMutex != NULL)
|
||||||
|
CloseHandle(pComDB->hMutex);
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, pComDB);
|
HeapFree(GetProcessHeap(), 0, pComDB);
|
||||||
|
|
||||||
*phComDB = HCOMDB_INVALID_HANDLE_VALUE;
|
*phComDB = HCOMDB_INVALID_HANDLE_VALUE;
|
||||||
|
@ -361,6 +411,9 @@ ComDBReleasePort(IN HCOMDB hComDB,
|
||||||
|
|
||||||
pComDB = (PCOMDB)hComDB;
|
pComDB = (PCOMDB)hComDB;
|
||||||
|
|
||||||
|
/* Wait for the mutex */
|
||||||
|
WaitForSingleObject(pComDB->hMutex, INFINITE);
|
||||||
|
|
||||||
/* Get the required bitmap size */
|
/* Get the required bitmap size */
|
||||||
lError = RegQueryValueExW(pComDB->hKey,
|
lError = RegQueryValueExW(pComDB->hKey,
|
||||||
L"ComDB",
|
L"ComDB",
|
||||||
|
@ -369,7 +422,10 @@ ComDBReleasePort(IN HCOMDB hComDB,
|
||||||
NULL,
|
NULL,
|
||||||
&dwSize);
|
&dwSize);
|
||||||
if (lError != ERROR_SUCCESS)
|
if (lError != ERROR_SUCCESS)
|
||||||
return lError;
|
{
|
||||||
|
ERR("Failed to query the bitmap size!\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Allocate the bitmap */
|
/* Allocate the bitmap */
|
||||||
pBitmap = HeapAlloc(GetProcessHeap(),
|
pBitmap = HeapAlloc(GetProcessHeap(),
|
||||||
|
@ -378,7 +434,8 @@ ComDBReleasePort(IN HCOMDB hComDB,
|
||||||
if (pBitmap == NULL)
|
if (pBitmap == NULL)
|
||||||
{
|
{
|
||||||
ERR("Failed to allocate the bitmap!\n");
|
ERR("Failed to allocate the bitmap!\n");
|
||||||
return lError;
|
lError = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the bitmap */
|
/* Read the bitmap */
|
||||||
|
@ -416,6 +473,10 @@ ComDBReleasePort(IN HCOMDB hComDB,
|
||||||
dwSize);
|
dwSize);
|
||||||
|
|
||||||
done:;
|
done:;
|
||||||
|
/* Release the mutex */
|
||||||
|
ReleaseMutex(pComDB->hMutex);
|
||||||
|
|
||||||
|
/* Release the bitmap */
|
||||||
if (pBitmap != NULL)
|
if (pBitmap != NULL)
|
||||||
HeapFree(GetProcessHeap(), 0, pBitmap);
|
HeapFree(GetProcessHeap(), 0, pBitmap);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue