Всем спасибо, отчасти все были правы.
Итак для тех, кто вдруг наткнется на эту ветку с поиском такого же ответа.
Делать GetDIBits надо с флагом DIB_PAL_COLORS, но это лишь требование для получения корректной битмапы. Ошибка же заключалось в том — что если у нас палитра (а она будет для 256-разрядных изображний) объявление BITMAPINFO bmi не выделит нам достаточно места для хранения всей битмапинфы, так как она просто не знает, сколько выделять под палитру и выделит лишь под BITMAPINFOHEADER — известное заранее значение. Выход из этой ситуации — использовать указатель на структуру PBITMAPINFO и выделять —
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * (2^(SIZE)));
где SIZE — размер картинки.