Skip to main content

C++ Print Driver Error RRS feed

  • Question

  • Our print driver written in c++ fails to convert to PCL for some documents.
    This is the code that doesn't work. Before this routine there is another routine which places a text line header. I see the header in the PCL file and nothing else. Its the same document with the only difference between how they actually print

        Case1: PCl fails: Open a 3rd application which is used for signatures,File print to our print driver from the third party application.
        Case2: PCl fails:File save from the 3rd party application. Open in Adobe reader and then print to our driver.
        Case3: PCL is good.  Open the 3rd application which is used for signatures,File print to Microsoft PDF and then from adobe reader print to our print driver

    When I compared the two PDF's one looked like a PDF form and the other was more flattened. I guess file save to adobe reader makes it flat. This is a legacy V3 user mode print driver running on windows 10. For the same windows 10 we have internally pcl is fine and we cannot reproduce the issue
    The customer says that its more of a laptop issue and production workstations. I am not sure why production workstations and doesn't makes sense. 

    How do I troubleshoot this problem? I have a process monitor log for both good and bad file. I went thru the two good and bad logs but couldn't figure out why the print driver  doesn't covert to PCL in  one case for a PDF form like document

    Question: What tools can help me troubleshot this driver at the customer site? They have Windbg installed. Do I need to install this on the server since the print driver is a share. Please help. 

    The event viewer on the server has this error. 

        The document Print Document, owned by , failed to print on printer 'Name'. Try to print the document again, or restart the print spooler. 
        Data type: NT EMF 1.008. Size of the spool file in bytes: 628788. Number of bytes printed: 12900. Total number of pages in the document: 6. Number of pages printed: 0. 
        Client computer: ''Wrkstation. Win32 error code returned by the print processor: 2147500037. Unspecified error

            SURFOBJ *pso, 
            BOOL firstPage,
            char *pageText
            Routine Description:
            Creates standard PCL end-of-document lines.
            SURFOBJ - Surface Object
            BOOL - First Page ?
            char * Page Text
            Return Value:
            BOOL - True if successful
                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];
            BYTE compRow[2100];
            DWORD dwRowSize = 0;
            DWORD dwCompPCLBitmapSize = 0;
            //wchar_t traceBuff[256];
            pOemPDEV->dwCompBitmapBufSize = 0;
            // TRACE OUT ----------------------------------------------------
            //ZeroMemory(traceBuff, 256);
            //StringCchPrintf(traceBuff, 256, L"Top of CreatePCLRasterGraphicPage");
            // -----------------------------------------------------------------
            // Invert color
            for (n = 0; n < pso->cjBits; n++)
            *(((PBYTE &)pso->pvBits) + n) ^= 0xFF;
            // compress each row and store in a buffer with PCL line headings
            for (i = 0; i < pso->; i++) {
            // Zero Memory hack for bottom of form black line
            if (*(((PBYTE &)pso->pvScan0) + (i * pso->lDelta) + 319) == 0xFF)
            ZeroMemory(((PBYTE &)pso->pvScan0) + (i * pso->lDelta), 320);
            // Copy the bitmap scan line into bitmapRow and send them off to be compressed
            ZeroMemory(bitmapRow, 1050);
            ZeroMemory(compRow, 2100);
            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)) {
            //ZeroMemory(traceBuff, 256);
            //StringCchPrintf(traceBuff, 256, 
            // L"Compressed bitmap buffer could not allocate more memory.");
            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)
            bGrowBuffer(pOemPDEV, dwPageBufferSize);
            // Add all Raster Header Lines
            if (!firstPage) 
            // Add a Form Feed
            char bufFormFeed[2];
            StringCchPrintfA(bufFormFeed, 2, "%c", 12); // 1 char
            MoveMemory(pOemPDEV->pBufStart + dwOffset, bufFormFeed, 2);
            dwOffset += 1;
            // Position cursor at X0, Y0
            char bufXY[8];
            StringCchPrintfA(bufXY, 8, "%c%s", 27, "*p0x0Y"); // 7 chars
            MoveMemory(pOemPDEV->pBufStart + dwOffset, bufXY, 8);
            dwOffset += 7;
            // Start Raster Graphics
            char bufStartRas[6];
            StringCchPrintfA(bufStartRas, 6, "%c%s", 27, "*r1A"); // 5 chars
            MoveMemory(pOemPDEV->pBufStart + dwOffset, bufStartRas, 6);
            dwOffset += 5;
            // Raster Encoding - Run-Length Encoding
            char bufRasEncoding[6];
            StringCchPrintfA(bufRasEncoding, 6, "%c%s", 27, "*b1M"); // 5 chars
            MoveMemory(pOemPDEV->pBufStart + dwOffset, bufRasEncoding, 6);
            dwOffset += 5;
            // 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);
            // End Raster Graphics
            char bufEndRas[5];
            StringCchPrintfA(bufEndRas, 5, "%c%s", 27, "*rB"); // 4 chars
            MoveMemory(pOemPDEV->pBufStart + dwOffset, bufEndRas, 5);
            // Write out PCL end bitmap
            dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, bufEndRas, 4);
            // Free Compressed Bitmap Memory
            if (pOemPDEV->pCompBitmapBufStart) {
            pOemPDEV->pCompBitmapBufStart = NULL;
            pOemPDEV->dwCompBitmapBufSize = 0;
            dwPageBufferSize = 0;
            // Free Memory
            // Write Page Text to the spooler
            size_t charCount = 0;
            StringCchLengthA(pageText, 32767, &charCount);
            char bufWriteText[15];
            ZeroMemory(bufWriteText, 15);
            StringCchPrintfA(bufWriteText, 15, "%c%s%d%s", 27, "(r", charCount, "W");
            dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, bufWriteText, strlen(bufWriteText));
            dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pageText, charCount);
            return TRUE;



    • Edited by SunDisplay Tuesday, August 27, 2019 6:56 PM
    Tuesday, August 27, 2019 6:55 PM