From: Eric Kohl Date: Mon, 12 Sep 2011 14:24:24 +0000 (+0000) Subject: [MSPORTS] X-Git-Tag: backups/icu4ros-bringup@60647~299 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=3b374be2f76dd249c77cb68ca4f44cfd04fd2e42;ds=inline [MSPORTS] Implement ComDBResizeDatabase. svn path=/trunk/; revision=53696 --- diff --git a/reactos/dll/win32/msports/comdb.c b/reactos/dll/win32/msports/comdb.c index 2db51d02b79..20a6a803857 100644 --- a/reactos/dll/win32/msports/comdb.c +++ b/reactos/dll/win32/msports/comdb.c @@ -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 */