You can use the following code to send raw data directly to a printer in
Windows NT or Windows 95.
 
// RawDataToPrinter - sends binary data directly to a printer
//
// Params:
//   szPrinterName - NULL terminated string specifying printer name
//   lpData        - Pointer to raw data bytes
//   dwCount       - Length of lpData in bytes
//
// Returns: TRUE for success, FALSE for failure
//
BOOL RawDataToPrinter( LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount )
{
  HANDLE     hPrinter;
  DOC_INFO_1 DocInfo;
  DWORD      dwJob;
  DWORD      dwBytesWritten;
 
  // Need a handle to the printer
  if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) )
    return FALSE;
 
  // Fill in the structure with info about this "document"
  DocInfo.pDocName = "My Document";
  DocInfo.pOutputFile = NULL;
  DocInfo.pDatatype = "RAW";
  // Inform the spooler the document is beginning
  if( (dwJob = StartDocPrinter( hPrinter, 1, (LPSTR)&DocInfo )) == 0 )
  {
    ClosePrinter( hPrinter );
    return FALSE;
  }
  // Start a page
  if( ! StartPagePrinter( hPrinter ) )
  {
    EndDocPrinter( hPrinter );
    ClosePrinter( hPrinter );
    return FALSE;
  }
  // Send the data to the printer
  if( ! WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
  {
    EndPagePrinter( hPrinter );
    EndDocPrinter( hPrinter );
    ClosePrinter( hPrinter );
    return FALSE;
  }
  // End the page
  if( ! EndPagePrinter( hPrinter ) )
  {
    EndDocPrinter( hPrinter );
    ClosePrinter( hPrinter );
    return FALSE;
  }
  // Inform the spooler that the document is ending
  if( ! EndDocPrinter( hPrinter ) )
  {
    ClosePrinter( hPrinter );
    return FALSE;
  }
  // Tidy up the printer handle
  ClosePrinter( hPrinter );
  // Check to see if correct number of bytes writen
  if( dwBytesWritten != dwCount )
    return FALSE;
  return TRUE;
}