运行时检查失败#2-变量{param}周围的堆栈已损坏

我有以下C ++代码。我只是在我认为是问题的地方张贴了大部分。例如,这两行是我最大的问题。我知道此错误的含义,但不知道如何修复byte []数组。  BYTE bitmapRow [1050 * 8];  BYTE compRow [2100 * 8]; CreateImage仅处理24bpp。我还有其他8bpp的单色块。此Byte数组应初始化为什么?我得到的错误说

Run-Time Check Failure #2 - Stack around the variable 'bitmapRow' was corrupted.
Run-Time Check Failure #2 - Stack around the variable 'compRow' was corrupted.

我来自.NET背景,有很多错误处理? 我读到此错误意味着该数组已超过其最大值,并且缓冲区溢出。最糟糕的是,没有检查到位。我可以在这里添加哪种错误处理

BOOL APIENTRY
CreateImage(
    SURFOBJ *pso,
    BOOL firstPage,
    char *pageText
)
{
    PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
    POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;

    DWORD dwOffset = 0;
    DWORD dwWritten = 0;
    DWORD dwPageBufferSize = 0;
    int i = 0;
    ULONG n = 0;

    BYTE bitmapRow[1050 * 8];
    BYTE compRow[2100 * 8];
    DWORD dwRowSize = 0;
    DWORD dwCompPCLBitmapSize = 0;

    pOemPDEV->dwCompBitmapBufSize = 0;

    // compress each row and store in a buffer with PCL line headings
    for (i = 0; i < pso->sizlBitmap.cy; i++) {


        MoveMemory(bitmapRow, ((PBYTE &)pso->pvScan0) + (i * pso->lDelta), pso->lDelta);
        dwRowSize = CompressBitmapRow(compRow, bitmapRow, pso->lDelta);
            // Create PCL Row Heading
        char bufPCLLineHead[9];
        StringCchPrintfA(bufPCLLineHead, 9, "%c%s%d%s", 27, "*b", dwRowSize, "W");

        if ((dwCompPCLBitmapSize + dwRowSize + strlen(bufPCLLineHead))
    > pOemPDEV->dwCompBitmapBufSize) {
            if (!GrowCompBitmapBuf(pOemPDEV)) {

            }
        }

        if (pOemPDEV->pCompBitmapBufStart) {
            // write the PCL line heading to the buffer
            MoveMemory(pOemPDEV->pCompBitmapBufStart + dwCompPCLBitmapSize,
                bufPCLLineHead, strlen(bufPCLLineHead));
            dwCompPCLBitmapSize += strlen(bufPCLLineHead);

            // write the compressed row to the buffer
            MoveMemory(pOemPDEV->pCompBitmapBufStart + dwCompPCLBitmapSize,
                compRow, dwRowSize);
            dwCompPCLBitmapSize += dwRowSize;
        }
    }
 // Calculate size and create buffer 
    dwPageBufferSize = 21;

    if (!firstPage)
        dwPageBufferSize++;

    bGrowBuffer(pOemPDEV, dwPageBufferSize);

    // Write out bitmap header PCL
    dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->pBufStart, dwPageBufferSize);

    // Write out PCL plus compressed bitmap bytes
    dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->pCompBitmapBufStart, dwCompPCLBitmapSize);

    // Write out PCL end bitmap
    dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, bufEndRas, 4);

    // Free Compressed Bitmap Memory
    if (pOemPDEV->pCompBitmapBufStart) {
        MemFree(pOemPDEV->pCompBitmapBufStart);
        pOemPDEV->pCompBitmapBufStart = NULL;
        pOemPDEV->dwCompBitmapBufSize = 0;
        dwPageBufferSize = 0;
    }

    // Free Memory
    vFreeBuffer(pOemPDEV);


    return TRUE;
}




BOOL
GrowCompBitmapBuf(
    POEMPDEV pOemPDEV
)
/*++

Routine Description:

    Grows memory by 1000 bytes (per call) to hold compressed
    bitmap and PCL data.

Arguments:

    POEMPDEV - Pointer to the private PDEV structure

Return Value:

    BOOL - True is successful

--*/
{
    DWORD dwOldBufferSize = 0;
    PBYTE pNewBuffer = NULL;

    dwOldBufferSize = pOemPDEV->pCompBitmapBufStart ? pOemPDEV->dwCompBitmapBufSize : 0;
    pOemPDEV->dwCompBitmapBufSize = dwOldBufferSize + 4096;

    pNewBuffer = (PBYTE)MemAlloc(pOemPDEV->dwCompBitmapBufSize);
    if (pNewBuffer == NULL) {
        MemFree(pOemPDEV->pCompBitmapBufStart);
        pOemPDEV->pCompBitmapBufStart = NULL;
        pOemPDEV->dwCompBitmapBufSize = 0;
        return FALSE;
    }

    if (pOemPDEV->pCompBitmapBufStart) {
        CopyMemory(pNewBuffer, pOemPDEV->pCompBitmapBufStart, dwOldBufferSize);
        MemFree(pOemPDEV->pCompBitmapBufStart);
        pOemPDEV->pCompBitmapBufStart = pNewBuffer;
    }
    else {
        pOemPDEV->pCompBitmapBufStart = pNewBuffer;
    }

    return TRUE;
}

enter image description here