Ошибка проверки во время выполнения № 2 - Стек вокруг переменной {param} был поврежден - PullRequest
0 голосов
/ 09 мая 2020

У меня есть следующий код C ++. Я просто публикую куски там, где, по моему мнению, есть проблема. Например, эти две строчки - моя самая большая проблема. Я понимаю, что означает эта ошибка, но не знаю, как исправить массив byte []. BYTE bitmapRow [1050 * 8]; BYTE compRow [2100 * 8]; CreateImage работает только с 24bpp. У меня есть другие чанки с 8bpp, моно chrome. Чем следует инициализировать этот массив байтов? Ошибка, которую я получаю, говорит:

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

...