The bulk IN/OUT endpoints of CDC can carry ANY size of data block, even MBytes, by splitting it into packets of the endpoint size (wMaxPacketSize, usually 64 bytes).
Here is a snippet of block transfer of large buffer over bulk endpoints using endpoint interrupt. http://www.microchip.com/forums/tm.aspx?m=462636
This snippet is written for WinUSB example, but it's applied to CDC bulk IN/OUT endpoints, too.
In CDC example context, the outline of the code is the same, but you have to replace WinUSB specific macros into CDC ones.
WINUSB_BULK_EP ---> CDC_DATA_EP
WINUSB_BULK_IN_EP_SIZE ---> CDC_DATA_IN_EP_SIZE
WINUSB_BULK_OUT_EP_SIZE ---> CDC_DATA_OUT_EP_SIZE
USBWinUsbBulkInHandle ---> extern CDCDataInHandle;
USBWinUsbBulkOutHandle ---> extern CDCDataOutHandle;
USBGenWrite ---> USBTxOnePacket
USBGenRead ---> USBRxOnePacket
For block write over CDC bulk IN endpoint, you need an extra code line to send ZLP (Zero-Length Packet), when the transfer size is just the multiple of 64 bytes.
Start_Block_Write( ... );
while ( bulk_in_occupied ); // wait until block transfer finishes
// just for demonstration.
// usually, state machine is applied to run other tasks,
// instead of this local loop.
CDCDataInHandle = USBTxOnePacket( CDC_DATA_EP, NULL, 0 ); // send ZLP
The snippet says "no-ping pong" - It means that this code doesn't effectively use ping-pong, even when enabled.
Full ping-pong setting is still fine on usb_config.h
#define USB_PING_PONG_MODE USB_PING_PONG__FULL_PING_PONG
On your PC app, increase RX buffer size on the class driver using SetupComm()