mirror of
https://github.com/reactos/reactos.git
synced 2025-01-07 14:51:00 +00:00
[MSPORTS]
Implement ComDBResizeDatabase. svn path=/trunk/; revision=53696
This commit is contained in:
parent
d28eae967a
commit
3b374be2f7
1 changed files with 82 additions and 2 deletions
|
@ -11,6 +11,8 @@
|
|||
WINE_DEFAULT_DEBUG_CHANNEL(msports);
|
||||
|
||||
#define BITS_PER_BYTE 8
|
||||
#define BITMAP_SIZE_INCREMENT 0x400
|
||||
#define BITMAP_SIZE_INVALID_BITS 0x3FF
|
||||
|
||||
typedef struct _COMDB
|
||||
{
|
||||
|
@ -276,6 +278,9 @@ ComDBGetCurrentPortUsage(IN HCOMDB hComDB,
|
|||
BYTE cMask;
|
||||
LONG lError = ERROR_SUCCESS;
|
||||
|
||||
TRACE("ComDBGetCurrentPortUsage(%p %p %lu %lu %p)\n",
|
||||
hComDB, Buffer, BufferSize, ReportType, MaxPortsReported);
|
||||
|
||||
if (hComDB == INVALID_HANDLE_VALUE ||
|
||||
hComDB == NULL ||
|
||||
(Buffer == NULL && MaxPortsReported == NULL) ||
|
||||
|
@ -581,8 +586,83 @@ WINAPI
|
|||
ComDBResizeDatabase(IN HCOMDB hComDB,
|
||||
IN DWORD NewSize)
|
||||
{
|
||||
FIXME("ComDBResizeDatabase(%p %lu)\n", hComDB, NewSize);
|
||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||
PCOMDB pComDB;
|
||||
PBYTE pBitmap = NULL;
|
||||
DWORD dwSize;
|
||||
DWORD dwNewSize;
|
||||
DWORD dwType;
|
||||
LONG lError;
|
||||
|
||||
TRACE("ComDBResizeDatabase(%p %lu)\n", hComDB, NewSize);
|
||||
|
||||
if (hComDB == INVALID_HANDLE_VALUE ||
|
||||
hComDB == NULL ||
|
||||
(NewSize & BITMAP_SIZE_INVALID_BITS))
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
|
||||
pComDB = (PCOMDB)hComDB;
|
||||
|
||||
/* Wait for the mutex */
|
||||
WaitForSingleObject(pComDB->hMutex, INFINITE);
|
||||
|
||||
/* Get the required bitmap size */
|
||||
lError = RegQueryValueExW(pComDB->hKey,
|
||||
L"ComDB",
|
||||
NULL,
|
||||
&dwType,
|
||||
NULL,
|
||||
&dwSize);
|
||||
if (lError != ERROR_SUCCESS)
|
||||
goto done;
|
||||
|
||||
/* Check the size limits */
|
||||
if (NewSize > COMDB_MAX_PORTS_ARBITRATED ||
|
||||
NewSize <= dwSize * BITS_PER_BYTE)
|
||||
{
|
||||
lError = ERROR_BAD_LENGTH;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Calculate the new bitmap size */
|
||||
dwNewSize = NewSize / BITS_PER_BYTE;
|
||||
|
||||
/* Allocate the new bitmap */
|
||||
pBitmap = HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
dwSize);
|
||||
if (pBitmap == NULL)
|
||||
{
|
||||
ERR("Failed to allocate the bitmap!\n");
|
||||
lError = ERROR_ACCESS_DENIED;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Read the current bitmap */
|
||||
lError = RegQueryValueExW(pComDB->hKey,
|
||||
L"ComDB",
|
||||
NULL,
|
||||
&dwType,
|
||||
pBitmap,
|
||||
&dwSize);
|
||||
if (lError != ERROR_SUCCESS)
|
||||
goto done;
|
||||
|
||||
/* Write the new bitmap */
|
||||
lError = RegSetValueExW(pComDB->hKey,
|
||||
L"ComDB",
|
||||
0,
|
||||
REG_BINARY,
|
||||
pBitmap,
|
||||
dwNewSize);
|
||||
|
||||
done:;
|
||||
/* Release the mutex */
|
||||
ReleaseMutex(pComDB->hMutex);
|
||||
|
||||
if (pBitmap != NULL)
|
||||
HeapFree(GetProcessHeap(), 0, pBitmap);
|
||||
|
||||
return lError;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue