mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
7.4 KiB
326 lines
7.4 KiB
/*++
|
|
*
|
|
* WOW v1.0
|
|
*
|
|
* Copyright (c) 1991, Microsoft Corporation
|
|
*
|
|
* WSPOOL.C
|
|
* WOW32 printer spooler support routines
|
|
*
|
|
* These routines help a Win 3.0 task to use the print spooler apis. These
|
|
* apis were exposed by DDK in Win 3.1.
|
|
*
|
|
* History:
|
|
* Created 1-July-1993 by Chandan Chauhan (ChandanC)
|
|
*
|
|
--*/
|
|
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include <winspool.h>
|
|
|
|
extern WORD gUser16hInstance;
|
|
|
|
MODNAME(wspool.c);
|
|
|
|
LPDEVMODE GetDefaultDevMode32(LPSTR szDriver)
|
|
{
|
|
LONG cbDevMode;
|
|
LPDEVMODE lpDevMode = NULL;
|
|
|
|
if (szDriver != NULL) {
|
|
|
|
if (!(*spoolerapis[WOW_EXTDEVICEMODE].lpfn)) {
|
|
if (!LoadLibraryAndGetProcAddresses("WINSPOOL.DRV", spoolerapis, WOW_SPOOLERAPI_COUNT)) {
|
|
goto LeaveGetDefaultDevMode32;
|
|
}
|
|
}
|
|
|
|
if ((cbDevMode = (*spoolerapis[WOW_EXTDEVICEMODE].lpfn)(NULL, NULL, NULL, szDriver, NULL, NULL, NULL, 0)) > 0) {
|
|
if ((lpDevMode = (LPDEVMODE) malloc_w(cbDevMode)) != NULL) {
|
|
if ((*spoolerapis[WOW_EXTDEVICEMODE].lpfn)(NULL, NULL, lpDevMode, szDriver, NULL, NULL, NULL, DM_COPY) != IDOK) {
|
|
free_w(lpDevMode);
|
|
lpDevMode = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
LeaveGetDefaultDevMode32:
|
|
|
|
if (!lpDevMode) {
|
|
LOGDEBUG(0,("WOW::GetDefaultDevMode32: Unable to get default DevMode\n"));
|
|
}
|
|
}
|
|
|
|
return(lpDevMode);
|
|
}
|
|
|
|
ULONG FASTCALL WG32OpenJob (PVDMFRAME pFrame)
|
|
{
|
|
PSZ psz1;
|
|
PSZ psz2;
|
|
CHAR szDriver[40];
|
|
ULONG ul=0;
|
|
DOC_INFO_1 DocInfo1;
|
|
HANDLE hnd;
|
|
register POPENJOB16 parg16;
|
|
PRINTER_DEFAULTS PrinterDefault;
|
|
PPRINTER_DEFAULTS pPrinterDefault = NULL;
|
|
|
|
GETARGPTR(pFrame, sizeof(OPENJOB16), parg16);
|
|
GETPSZPTR(parg16->f1, psz1);
|
|
GETPSZPTR(parg16->f2, psz2);
|
|
|
|
if (!(*spoolerapis[WOW_OpenPrinterA].lpfn)) {
|
|
if (!LoadLibraryAndGetProcAddresses("WINSPOOL.DRV", spoolerapis, WOW_SPOOLERAPI_COUNT)) {
|
|
return (0);
|
|
}
|
|
}
|
|
|
|
if (GetDriverName(psz1, szDriver)) {
|
|
if ((PrinterDefault.pDevMode = GetDefaultDevMode32(szDriver)) != NULL) {
|
|
PrinterDefault.pDatatype = NULL;
|
|
PrinterDefault.DesiredAccess = 0;
|
|
pPrinterDefault = &PrinterDefault;
|
|
}
|
|
|
|
if ((*spoolerapis[WOW_OpenPrinterA].lpfn) (szDriver, &hnd, pPrinterDefault)) {
|
|
|
|
DocInfo1.pDocName = psz2;
|
|
DocInfo1.pOutputFile = psz1;
|
|
DocInfo1.pDatatype = NULL;
|
|
|
|
if (ul = (*spoolerapis[WOW_StartDocPrinterA].lpfn) (hnd, 1, (LPBYTE)&DocInfo1)) {
|
|
ul = GetPrn16(hnd);
|
|
}
|
|
else {
|
|
ul = GetLastError();
|
|
}
|
|
|
|
}
|
|
else {
|
|
ul = GetLastError();
|
|
}
|
|
}
|
|
|
|
LOGDEBUG(0,("WOW::WG32OpenJob: ul = %x\n", ul));
|
|
|
|
if (pPrinterDefault) {
|
|
free_w(PrinterDefault.pDevMode);
|
|
}
|
|
|
|
FREEPSZPTR(psz1);
|
|
FREEPSZPTR(psz2);
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
ULONG FASTCALL WG32StartSpoolPage (PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul=0;
|
|
register PSTARTSPOOLPAGE16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(STARTSPOOLPAGE16), parg16);
|
|
|
|
if (!(ul = (*spoolerapis[WOW_StartPagePrinter].lpfn) (Prn32(parg16->f1)))) {
|
|
ul = GetLastError();
|
|
}
|
|
|
|
LOGDEBUG(0,("WOW::WG32StartSpoolPage: ul = %x\n", ul));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
ULONG FASTCALL WG32EndSpoolPage (PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul=0;
|
|
register PENDSPOOLPAGE16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ENDSPOOLPAGE16), parg16);
|
|
|
|
if (!(ul = (*spoolerapis[WOW_EndPagePrinter].lpfn) (Prn32(parg16->f1)))) {
|
|
ul = GetLastError();
|
|
}
|
|
|
|
LOGDEBUG(0,("WOW::WG32EndSpoolPage: ul = %x\n", ul));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
ULONG FASTCALL WG32CloseJob (PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul=0;
|
|
register PCLOSEJOB16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(CLOSEJOB16), parg16);
|
|
|
|
if (!(ul = (*spoolerapis[WOW_EndDocPrinter].lpfn) (Prn32(parg16->f1)))) {
|
|
|
|
ul = GetLastError();
|
|
}
|
|
|
|
if (!(ul = (*spoolerapis[WOW_ClosePrinter].lpfn) (Prn32(parg16->f1)))) {
|
|
ul = GetLastError();
|
|
}
|
|
|
|
if (ul) {
|
|
FreePrn(parg16->f1);
|
|
}
|
|
|
|
LOGDEBUG(0,("WOW::WG32CloseJob: ul = %x\n", ul));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
ULONG FASTCALL WG32WriteSpool (PVDMFRAME pFrame)
|
|
{
|
|
DWORD dwWritten;
|
|
ULONG ul=0;
|
|
register PWRITESPOOL16 parg16;
|
|
LPVOID pBuf;
|
|
|
|
GETARGPTR(pFrame, sizeof(WRITESPOOL16), parg16);
|
|
GETMISCPTR (parg16->f2, pBuf);
|
|
|
|
if (ul = (*spoolerapis[WOW_WritePrinter].lpfn) (Prn32(parg16->f1), pBuf,
|
|
FETCHWORD(parg16->f3), &dwWritten)) {
|
|
ul = FETCHWORD(parg16->f3);
|
|
}
|
|
else {
|
|
ul = GetLastError();
|
|
}
|
|
|
|
LOGDEBUG(0,("WOW::WG32WriteSpool: ul = %x\n", ul));
|
|
|
|
FREEMISCPTR(pBuf);
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
ULONG FASTCALL WG32DeleteJob (PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul = 0;
|
|
register PDELETEJOB16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(DELETEJOB16), parg16);
|
|
|
|
if (!(ul = (*spoolerapis[WOW_DeletePrinter].lpfn) (Prn32(parg16->f1)))) {
|
|
ul = GetLastError();
|
|
}
|
|
|
|
LOGDEBUG(0,("WOW::WG32DeleteJob: ul = %x\n", ul));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
WORD GetPrn16(HANDLE h32)
|
|
{
|
|
HANDLE hnd;
|
|
HAND16 h16 = 0;
|
|
VPVOID vp;
|
|
LPBYTE lpMem16;
|
|
|
|
hnd = LocalAlloc16(LMEM_MOVEABLE, sizeof(HANDLE), (HANDLE) gUser16hInstance);
|
|
|
|
vp = LocalLock16(hnd);
|
|
|
|
if (vp) {
|
|
GETMISCPTR (vp, lpMem16);
|
|
if (lpMem16) {
|
|
*((PDWORD16)lpMem16) = (DWORD) h32;
|
|
FREEMISCPTR(lpMem16);
|
|
LocalUnlock16(hnd);
|
|
}
|
|
}
|
|
else {
|
|
LOGDEBUG (0, ("WOW::GETPRN16: Can't allocate a 16 bit handle\n"));
|
|
}
|
|
|
|
return (LOWORD(hnd));
|
|
}
|
|
|
|
|
|
HANDLE Prn32(WORD h16)
|
|
{
|
|
VPVOID vp;
|
|
HANDLE h32;
|
|
LPBYTE lpMem16;
|
|
|
|
vp = LocalLock16 ((HANDLE) MAKELONG(h16, gUser16hInstance));
|
|
if (vp) {
|
|
GETMISCPTR (vp, lpMem16);
|
|
|
|
if (lpMem16) {
|
|
h32 = (HANDLE) *((PDWORD16)lpMem16);
|
|
FREEMISCPTR(lpMem16);
|
|
}
|
|
LocalUnlock16 ((HANDLE) MAKELONG(h16, gUser16hInstance));
|
|
}
|
|
|
|
return (h32);
|
|
}
|
|
|
|
|
|
VOID FreePrn (WORD h16)
|
|
{
|
|
LocalFree16 ((HANDLE) MAKELONG(h16, gUser16hInstance));
|
|
}
|
|
|
|
|
|
BOOL GetDriverName (char *psz, char *szDriver)
|
|
{
|
|
CHAR szAllDevices[1024];
|
|
CHAR *szNextDevice;
|
|
CHAR szPrinter[64];
|
|
CHAR *szOutput;
|
|
|
|
GetProfileString ("devices", NULL, "", szAllDevices, sizeof(szAllDevices));
|
|
szNextDevice = szAllDevices;
|
|
|
|
LOGDEBUG(6,("WOW::GetDriverName: szAllDevices = %s\n", szAllDevices));
|
|
|
|
while (*szNextDevice) {
|
|
GetProfileString ("devices", szNextDevice, "", szPrinter, sizeof(szPrinter));
|
|
if (*szPrinter) {
|
|
if (szOutput = strchr (szPrinter, ',')) {
|
|
szOutput++;
|
|
while (*szOutput == ' ') {
|
|
szOutput++;
|
|
}
|
|
|
|
if (!_stricmp(psz, szOutput)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (szNextDevice = strchr (szNextDevice, '\0')) {
|
|
szNextDevice++;
|
|
}
|
|
else {
|
|
szNextDevice = "";
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (*szNextDevice) {
|
|
LOGDEBUG(0,("WOW::GetDriverName: szNextDevice = %s\n", szNextDevice));
|
|
|
|
if (lstrcpy (szDriver, szNextDevice)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|