/* Author: Jeffrey Altman (jaltman@secure-endpoints.com), Secure Endpoints Inc., New York City. Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. All rights reserved. */ #include #include "ckcdeb.h" /* Typedefs, debug formats, etc */ #include "ckcker.h" /* Kermit definitions */ #include "ckucmd.h" HANDLE hPrinter=NULL; DWORD dwJob=0; int Win32PrtOpen( char * prtname ) { DOC_INFO_1 DocInfo; if( ! OpenPrinter( prtname, &hPrinter, NULL ) ) { int error = GetLastError(); debug(F111,"Win32PrtOpen OpenPrinter() failed",prtname,error); printf("ERROR: Unable to open printer: %s (%d)\n", prtname,error); return FALSE; } // Fill in the structure with info about this "document" DocInfo.pDocName = "Kermit-95"; DocInfo.pOutputFile = NULL; DocInfo.pDatatype = "RAW"; // Inform the spooler the document is beginning if( (dwJob = StartDocPrinter( hPrinter, 1, (LPSTR)&DocInfo )) == 0 ) { int error = GetLastError(); debug(F111,"Win32PrtOpen StartDocPrinter() failed",prtname,error); printf("ERROR: Unable to start doc on printer: %s (%d)\n", prtname,error); ClosePrinter( hPrinter ); hPrinter = NULL; return FALSE; } // Start a page if( ! StartPagePrinter( hPrinter ) ) { int error = GetLastError(); debug(F111,"Win32PrtOpen StartPagePrinter() failed",prtname,error); printf("ERROR: Unable to start page on printer: %s (%d)\n", prtname,error); EndDocPrinter( hPrinter ); ClosePrinter( hPrinter ); hPrinter = NULL; return FALSE; } return TRUE; } int Win32PrtWrite( char * pData, int bytes ) { DWORD dwBytesWritten; if ( hPrinter == NULL ) return -1; // Send the data to the printer if( ! WritePrinter( hPrinter, pData, bytes, &dwBytesWritten ) ) { EndPagePrinter( hPrinter ); EndDocPrinter( hPrinter ); ClosePrinter( hPrinter ); hPrinter = NULL; return -2; } return (int) dwBytesWritten; } int Win32PrtClose( void ) { // End the page if( ! EndPagePrinter( hPrinter ) ) { EndDocPrinter( hPrinter ); ClosePrinter( hPrinter ); hPrinter = NULL; return FALSE; } // Inform the spooler that the document is ending if( ! EndDocPrinter( hPrinter ) ) { ClosePrinter( hPrinter ); hPrinter = NULL; return FALSE; } // Tidy up the printer handle ClosePrinter( hPrinter ); hPrinter = NULL; return TRUE; } int Win32PrtFile( char * filename, char * prtname ) { HANDLE hPrinter,hFile; SECURITY_ATTRIBUTES security ; DOC_INFO_1 DocInfo; DWORD dwBytesWritten; CHAR lpData[4096]; DWORD dwCount=0; // First try to open the file security.nLength = sizeof(SECURITY_ATTRIBUTES); security.lpSecurityDescriptor = NULL ; security.bInheritHandle = FALSE ; hFile = CreateFile( filename, GENERIC_READ, TRUE, &security, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ( !hFile ) return FALSE; // Need a handle to the printer if( ! OpenPrinter( prtname, &hPrinter, NULL ) ) { CloseHandle( hFile ); return FALSE; } // Fill in the structure with info about this "document" DocInfo.pDocName = filename; DocInfo.pOutputFile = NULL; DocInfo.pDatatype = "RAW"; // Inform the spooler the document is beginning if( (dwJob = StartDocPrinter( hPrinter, 1, (LPSTR)&DocInfo )) == 0 ) { ClosePrinter( hPrinter ); CloseHandle( hFile ); return FALSE; } // Start a page if( ! StartPagePrinter( hPrinter ) ) { EndDocPrinter( hPrinter ); ClosePrinter( hPrinter ); CloseHandle( hFile ); return FALSE; } do { // Read data from the file if ( !ReadFile(hFile, lpData, 4096, &dwCount, NULL) ) { EndPagePrinter( hPrinter ); EndDocPrinter( hPrinter ); ClosePrinter( hPrinter ); CloseHandle( hFile ); return FALSE; } // Send the data to the printer if( ! WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) ) { EndPagePrinter( hPrinter ); EndDocPrinter( hPrinter ); ClosePrinter( hPrinter ); CloseHandle( hFile ); return FALSE; } } while ( dwCount > 0 ); // 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 ); CloseHandle( hFile ); return FALSE; } // Tidy up the printer handle ClosePrinter( hPrinter ); CloseHandle( hFile ); return TRUE; } #ifdef COMMENT typedef struct _PRINTER_INFO_2 { // pri2 LPTSTR pServerName; LPTSTR pPrinterName; LPTSTR pShareName; LPTSTR pPortName; LPTSTR pDriverName; LPTSTR pComment; LPTSTR pLocation; LPDEVMODE pDevMode; LPTSTR pSepFile; LPTSTR pPrintProcessor; LPTSTR pDatatype; LPTSTR pParameters; PSECURITY_DESCRIPTOR pSecurityDescriptor; DWORD Attributes; DWORD Priority; DWORD DefaultPriority; DWORD StartTime; DWORD UntilTime; DWORD Status; DWORD cJobs; DWORD AveragePPM; } PRINTER_INFO_2; #endif int Win32EnumPrt( struct keytab ** pTable, struct keytab ** pTable2, int * pN, int *pDefault ) { DWORD dwBytesNeeded; DWORD dwPrtRet2; DWORD dwMaxPrt; LPTSTR lpName = NULL; DWORD dwEnumFlags = PRINTER_ENUM_LOCAL; DWORD dwLevel = 2; LPPRINTER_INFO_1 pPrtInfo1=NULL; LPPRINTER_INFO_2 pPrtInfo2=NULL; int i, n, rc ; CHAR szDefault[256]=""; int iDefault = -1; BOOL (WINAPI * p_GetDefaultPrinter)( LPTSTR pszBuffer, // printer name buffer LPDWORD pcchBuffer // size of name buffer ) = NULL; static HANDLE hWinSpool = INVALID_HANDLE_VALUE; if ( !p_GetDefaultPrinter ) { if ( hWinSpool == INVALID_HANDLE_VALUE ) hWinSpool = LoadLibrary("winspool.drv"); if ( hWinSpool != INVALID_HANDLE_VALUE ) (FARPROC) p_GetDefaultPrinter = GetProcAddress( hWinSpool, "GetDefaultPrinterA" ); } if ( p_GetDefaultPrinter ) { DWORD dwSize = 256; debug(F100,"Win32EnumPrt calling GetDefaultPrinter","",0); rc = p_GetDefaultPrinter( szDefault, &dwSize ); debug(F111,"Win32EnumPrt GetDefaultPrinter returns",szDefault,rc); } else { debug(F100,"Win32EnumPrt calling GetProfileString","",0); rc = GetProfileString("windows","device",",,,",szDefault,256); debug(F111,"Win32EnumPrt GetProfileString returns",szDefault,rc); } if (rc) { for ( i=0;szDefault[i];i++ ) { if ( szDefault[i] == ',' ) { szDefault[i] = '\0'; break; } } } if ( *pTable ) { for ( i=0 ; i < *pN ; i++ ) free( (*pTable)[i].kwd ) ; free ( *pTable ) ; } *pTable = NULL; if ( *pTable2 ) { for ( i=0 ; i < *pN ; i++ ) free( (*pTable2)[i].kwd ) ; free ( *pTable2 ) ; } *pTable2 = NULL; *pN = 0; *pDefault = -1; if ( !isWin95() ) { // dwEnumFlags |= PRINTER_ENUM_CONNECTIONS; if ( dwLevel == 1 ) { dwEnumFlags |= PRINTER_ENUM_NETWORK; dwEnumFlags |= PRINTER_ENUM_REMOTE; } debug(F111,"Win32EnumPrt","dwEnumFlags",dwEnumFlags); } // // get byte count needed for buffer, alloc buffer, the enum the printers // debug(F100,"Win32EnumPrt calling EnumPrinters","",0); rc = EnumPrinters (dwEnumFlags, lpName, dwLevel, NULL, 0, &dwBytesNeeded, &dwPrtRet2); debug(F101,"Win32EnumPrt EnumPrinters returns","",0); // // (simple error checking, if these work assume rest will too) // if ( dwLevel == 1 ) { if (!(pPrtInfo1 = (LPPRINTER_INFO_1) LocalAlloc (LPTR, dwBytesNeeded))) { return(FALSE); } } else { if (!(pPrtInfo2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwBytesNeeded))) { return(FALSE); } } debug(F100,"Win32EnumPrt calling EnumPrinters","",0); rc = EnumPrinters (dwEnumFlags, lpName, dwLevel, (dwLevel == 1 ? (LPBYTE) pPrtInfo1 : (LPBYTE) pPrtInfo2), dwBytesNeeded, &dwBytesNeeded, &dwPrtRet2); debug(F101,"Win32EnumPrt EnumPrinters returns","",0); if (!rc || dwPrtRet2 == 0) { LocalFree( dwLevel == 1 ? (LPBYTE) pPrtInfo1 : (LPBYTE) pPrtInfo2 ); return(FALSE); } /* we now have an enumeration of all printer names */ (*pTable) = (struct keytab *) malloc( dwPrtRet2 * sizeof(struct keytab) ); if ( !(*pTable) ) { LocalFree( dwLevel == 1 ? (LPBYTE) pPrtInfo1 : (LPBYTE) pPrtInfo2 ); return(FALSE); } (*pTable2) = (struct keytab *) malloc( dwPrtRet2 * sizeof(struct keytab) ); if ( !(*pTable2) ) { free(pTable); pTable = NULL; LocalFree( dwLevel == 1 ? (LPBYTE) pPrtInfo1 : (LPBYTE) pPrtInfo2 ); return(FALSE); } for ( i=0 ; i j ; k--) { (*pTable)[k].kwd = (*pTable)[k-1].kwd; (*pTable2)[k].kwd = (*pTable2)[k-1].kwd; (*pTable)[k].kwval = (*pTable)[k-1].kwval; (*pTable2)[k].kwval = (*pTable2)[k-1].kwval; (*pTable)[k].flgs = (*pTable)[k-1].flgs; (*pTable2)[k].flgs = (*pTable2)[k-1].flgs; } (*pTable)[j].kwd = p1; (*pTable2)[j].kwd = p2; (*pTable)[j].kwval = i; (*pTable2)[j].kwval = i; (*pTable)[j].flgs = 0; (*pTable2)[j].flgs = 0; } *pN = dwPrtRet2 ; if ( iDefault == -1 ) *pDefault = 0; else { for ( i=0 ; i