HBITMAP Helper_CreateBitmapFromBuffer(LPBYTE pBuffer, DWORD cbSize) 

HBITMAP hBmp=NULL; 
HDC hdc=NULL; 
HPALETTE hPal=NULL,hOldPal=NULL; 
BITMAPFILEHEADER *pbmfHeader=(BITMAPFILEHEADER *)pBuffer; 
DWORD dwOffset=sizeof(BITMAPFILEHEADER); 
// File type should be 'BM' BITMAPINFOHEADER *pbmiHeader = (LPBITMAPINFOHEADER)(pBuffer+dwOffset) ; 
BITMAPINFO * pbmInfo = (LPBITMAPINFO)(pBuffer+dwOffset) ; 
// If bmiHeader.biClrUsed is zero we have to infer the number 
// of colors from the number of bits used to specify it. 
int nColors = pbmiHeader->biClrUsed ? pbmiHeader->biClrUsed : 
1 < < pbmiHeader->biBitCount; LPVOID lpDIBBits; 
if (pbmfHeader->bfType != ((WORD) ('M' < < 8) | 'B')) return NULL; 
if( pbmInfo->bmiHeader.biBitCount > 8 ) 
lpDIBBits = (LPVOID)((LPDWORD)(pbmInfo->bmiColors + pbmInfo->bmiHeader.biClrUsed) + 
((pbmInfo->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0)); 
else 
lpDIBBits = (LPVOID)(pbmInfo->bmiColors + nColors); hdc=GetDC(NULL); 
// Create the palette 
if( nColors <= 256 ) 

UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors); 
LOGPALETTE *pLP = (LOGPALETTE *) malloc(nSize); 
int i; 
pLP->palVersion = 0x300; 
pLP->palNumEntries = nColors; for( i=0; i < nColors; i++) 

pLP->palPalEntry[i].peRed = pbmInfo->bmiColors[i].rgbRed; 
pLP->palPalEntry[i].peGreen = pbmInfo->bmiColors[i].rgbGreen; 
pLP->palPalEntry[i].peBlue = pbmInfo->bmiColors[i].rgbBlue; 
pLP->palPalEntry[i].peFlags = 0; 

hPal=CreatePalette(pLP); 
free(pLP); 
hOldPal=(HPALETTE)SelectObject(hdc,hPal); 
RealizePalette(hdc); 

hBmp = CreateDIBitmap( hdc, // handle to device context 
pbmiHeader, // pointer to bitmap size and format data 
CBM_INIT, // initialization flag 
lpDIBBits, // pointer to initialization data 
pbmInfo, // pointer to bitmap color-format data 
DIB_RGB_COLORS); // color-data usage 
if( hPal ) 

SelectObject(hdc,hOldPal); 
DeleteObject(hPal); 

ReleaseDC(NULL,hdc); 
return hBmp; 
}