|
|
/////////////////////////////////////////////////////////////////////////////
// FILE : minidriv.c //
// //
// DESCRIPTION : Implementation for the driver Device Driver Interface. //
// For further details about driver interface functions - //
// refer to the Windows 95 DDK chapter under the DDK - //
// Documentation. //
// //
// AUTHOR : DanL. //
// //
// HISTORY : //
// Oct 19 1999 DannyL Creation. //
// //
// Copyright (C) 1999 Microsoft Corporation All Rights Reserved //
/////////////////////////////////////////////////////////////////////////////
#include "stdhdr.h"
#include "resource.h"
#include "..\faxdrv32\faxdrv32.h" // faxdrv32 api
#include "faxreg.h"
#define TEXT(quote) quote
//
// To enable the user info tab in the printer properties, define:
//
// #define ENABLE_USER_INFO_TAB
DBG_DECLARE_MODULE("fxsdrv");
HANDLE g_hModule;
//
// Decleration for the winproc of the user info tab on the device mode property
// sheet page.
//
BOOL FAR PASCAL UserInfoDlgProc( HWND hDlg, WORD message, WPARAM wParam, LPARAM lParam );
//
// Debugging mechanizm for device pointer debug prints (lpdev, lpdv->lpMd and the device context).
//
#if 0
//#ifdef DBG_DEBUG
#define DEBUG_OUTPUT_DEVICE_POINTERS(sz, lpDev) OutputDevicePointers(sz, lpDev)
void OutputDevicePointers(char* szMessage, LPDV lpdv) { DBG_PROC_ENTRY("OutputDevicePointers");
DBG_TRACE3( "Device Event:%s lpdv:%#lx lpdv->lpMd:%#lx", szMessage, lpdv, lpdv->lpMd);
if (lpdv->lpMd) { DBG_TRACE2("Device Event:%s dc:%#lx", szMessage, ((LPEXTPDEV)lpdv->lpMd)->hAppDC); } RETURN; } #else
#define DEBUG_OUTPUT_DEVICE_POINTERS(sz, lpDev)
#endif
////////////////////////////////////////////////////////////////////////////////////////
// Printer-Escape Functions
//
// The printer-escape functions support device-specific operations. The
// following briefly describes these escape functions.
//
// ABORTDOC The ABORTDOC escape function signals the abnormal
// cancellation of a print job.
//
// BANDINFO The BANDINFO escape function RETURNs information about a
// band of bitmap data.
//
// ENDDOC The ENDDOC escape function signals the end of a print job.
//
// NEXTBAND The NEXTBAND escape function prints a band of bitmap data.
//
// QUERYESCSUPPORT The QUERYESCSUPPORT escape function specifies whether the
// driver supports a specified escape.
//
// SETABORTDOC The SETABORTDOC escape function calls an application's
// cancellation procedure.
//
// STARTDOC The STARTDOC escape function signals the beginning of a
// print job.
//
// The previous list of printer escapes is a list of escapes supported by the
// Microsoft Windows Universal Printer Driver (UNIDRV.DLL). It is not a
// comprehensive list of all Windows escape functions. Most of the escape
// functions now have equivalent Windows API functions with Windows 3.1. The
// escapes are supported for backward compatibility, but application
// developers are encouraged to start using the new API calls.
//
#ifndef NOCONTROL
short WINAPI Control(lpdv, function, lpInData, lpOutData) LPDV lpdv; WORD function; LPSTR lpInData; LPSTR lpOutData; { LPEXTPDEV lpXPDV; LPEXTPDEV lpOldXPDV; short sRet, sRc; DBG_PROC_ENTRY("Control"); if (lpdv) { DBG_TRACE1("lpdv: 0x%lx", lpdv); }
DBG_TRACE1("function: %d", function);
if (lpInData) { DBG_TRACE2("lpInData: 0x%lx, *lpInData: %d", lpInData, *((LPWORD)lpInData));
}
if (lpOutData) { DBG_TRACE1("lpOutData: 0x%lx", lpOutData); }
//
// get pointer to our private data stored in UNIDRV's PDEVICE
//
lpXPDV = ((LPEXTPDEV)lpdv->lpMd);
switch(function) { case SETPRINTERDC: //
// save app's DC for QueryAbort() calls.
//
DBG_TRACE("SETPRINTERDC");
if(lpXPDV) lpXPDV->hAppDC = *(HANDLE FAR *)lpInData; DEBUG_OUTPUT_DEVICE_POINTERS("SETPRINTERDC", lpdv); break;
case NEXTBAND: DBG_TRACE("NEXTBAND"); //
// call UNIDRV.DLL's NEXTBAND to see if we're at end of page
//
sRet = UniControl(lpdv, function, lpInData, lpOutData); //
// check for end of page (ie, empty rectangle) or failure
//
if((!IsRectEmpty((LPRECT)lpOutData)) || (sRet <= 0)) { RETURN sRet; } //
// Rewind buffer pointer.
//
lpXPDV->lpScanBuf -= lpXPDV->dwTotalScanBytes; ASSERT(lpXPDV->dwTotalScanBytes != 0); //
// Add this page to our tiff.
//
DEBUG_OUTPUT_DEVICE_POINTERS("Before FaxEddPage", lpdv); sRc = FaxAddPage( lpXPDV->dwPointer, (LPBYTE)lpXPDV->lpScanBuf, lpXPDV->dwTotalScanBytes * 8 / lpXPDV->dwTotalScans, lpXPDV->dwTotalScans); if(sRc != TRUE) { if(sRc < 0) { ERROR_PROMPT(NULL,THUNK_CALL_FAIL); } DBG_CALL_FAIL("FaxAddPage",0); RETURN SP_ERROR; } //
// clean up page stuff
// initialize job variables
//
lpXPDV->dwTotalScans = lpXPDV->dwTotalScanBytes = 0;
RETURN sRet;
case STARTDOC: { DOCINFO di; char szTiffName[MAX_PATH] = "*.tif";
DBG_TRACE("STARTDOC"); if(IsBadReadPtr(lpOutData,1)) { RETURN SP_ERROR; } //
// If the output file is named "file:" we must pop up a dialog
// and request the output filename from the user.
//
if(((LPDOCINFO)lpOutData)->lpszOutput && (_fstrncmp(((LPDOCINFO)lpOutData)->lpszOutput,"file:",5) == 0)) { OPENFILENAME ofn; char szTitle[MAX_LENGTH_CAPTION]=""; char szFilters[MAX_LENGTH_PRINT_TO_FILE_FILTERS]="";
_fmemset(&ofn,0,sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = GetActiveWindow(); LoadString(g_hModule, IDS_PRINT_TO_FILE_FILTER, szFilters, sizeof(szFilters) - 1); ofn.lpstrDefExt = FAX_TIF_FILE_EXT; ofn.lpstrFilter = StringReplace(szFilters,'\n','\0'); ofn.nMaxFile = sizeof(szTiffName) -1; ofn.lpstrFile = szTiffName; LoadString(g_hModule, IDS_CAPTION_PRINT_TO_FILE, szTitle, sizeof(szTitle) - 1); ofn.lpstrTitle = szTitle; if(!GetOpenFileName(&ofn)) { //
// User aborted.
//
RETURN SP_APPABORT; } ((LPDOCINFO)lpOutData)->lpszOutput = szTiffName; } //
// Create the tiff/output file for pages.
//
DEBUG_OUTPUT_DEVICE_POINTERS("Before FaxStartDoc", lpdv); sRc = FaxStartDoc(lpXPDV->dwPointer, (LPDOCINFO)lpOutData); if(sRc != TRUE) { if(sRc < 0) { ERROR_PROMPT(NULL,THUNK_CALL_FAIL); } DBG_CALL_FAIL("FaxStartDoc",0); RETURN SP_ERROR; } //
// pass NUL file to OpenJob in order to redirect the print
// job to dev nul sinc we take care of the print job ourselves.
//
di.cbSize = sizeof(DOCINFO); di.lpszDocName = NULL; di.lpszOutput = (LPSTR)"nul"; //
// call UNIDRV.DLL's Control()
//
sRet = UniControl(lpdv, function, lpInData, (LPSTR)&di); //
// if failure clean up scan buffer
//
if(sRet <= 0) { FaxEndDoc(lpXPDV->dwPointer, TRUE); } RETURN sRet; } case ABORTDOC: DBG_TRACE("ABORTDOC"); //
// The input parameter for FaxEndDoc reflects the difference.
//
case ENDDOC: DBG_TRACE("ENDDOC"); //
// Finalize tiff generation.
//
DEBUG_OUTPUT_DEVICE_POINTERS("Before FaxEndDoc", lpdv); sRc = FaxEndDoc(lpXPDV->dwPointer, function == ABORTDOC); if(sRc != TRUE) { if(sRc < 0) { ERROR_PROMPT(NULL,THUNK_CALL_FAIL); } DBG_CALL_FAIL("FaxEndDoc",0); RETURN SP_ERROR; } break;
case RESETDEVICE: DBG_TRACE("RESETDEVICE"); //
// ResetDC was called - Copy the context to the new DC
//
lpOldXPDV = ((LPEXTPDEV)((LPDV)lpInData)->lpMd); sRc = FaxResetDC(&(lpOldXPDV->dwPointer), &(lpXPDV->dwPointer)); if(sRc != TRUE) { if(sRc < 0) { ERROR_PROMPT(NULL,THUNK_CALL_FAIL); } DBG_CALL_FAIL("FaxResetDC",0); RETURN SP_ERROR; } break;
default: DBG_TRACE1("UNSUPPORTED: %d",function); break; } // end case
// call UNIDRV's Control
RETURN (UniControl(lpdv, function, lpInData, lpOutData)); } #endif
#ifndef NODEVBITBLT
BOOL WINAPI DevBitBlt(lpdv, DstxOrg, DstyOrg, lpSrcDev, SrcxOrg, SrcyOrg, xExt, yExt, lRop, lpPBrush, lpDrawmode) LPDV lpdv; // --> to destination bitmap descriptor
short DstxOrg; // Destination origin - x coordinate
short DstyOrg; // Destination origin - y coordinate
LPBITMAP lpSrcDev; // --> to source bitmap descriptor
short SrcxOrg; // Source origin - x coordinate
short SrcyOrg; // Source origin - y coordinate
WORD xExt; // x extent of the BLT
WORD yExt; // y extent of the BLT
long lRop; // Raster operation descriptor
LPPBRUSH lpPBrush; // --> to a physical brush (pattern)
LPDRAWMODE lpDrawmode; { DBG_PROC_ENTRY("DevBitBlt"); RETURN UniBitBlt(lpdv, DstxOrg, DstyOrg, lpSrcDev, SrcxOrg, SrcyOrg, xExt, yExt, lRop, lpPBrush, lpDrawmode); } #endif
#ifndef NOPIXEL
DWORD WINAPI Pixel(lpdv, x, y, Color, lpDrawMode) LPDV lpdv; short x; short y; DWORD Color; LPDRAWMODE lpDrawMode; { DBG_PROC_ENTRY("Pixel"); RETURN UniPixel(lpdv, x, y, Color, lpDrawMode); } #endif
#ifndef NOOUTPUT
short WINAPI Output(lpdv, style, count, lpPoints, lpPPen, lpPBrush, lpDrawMode, lpCR) LPDV lpdv; // --> to the destination
WORD style; // Output operation
WORD count; // # of points
LPPOINT lpPoints; // --> to a set of points
LPVOID lpPPen; // --> to physical pen
LPPBRUSH lpPBrush; // --> to physical brush
LPDRAWMODE lpDrawMode; // --> to a Drawing mode
LPRECT lpCR; // --> to a clipping rectange if <> 0
{ DBG_PROC_ENTRY("Output"); RETURN UniOutput(lpdv, style, count, lpPoints, lpPPen, lpPBrush, lpDrawMode, lpCR); } #endif
#ifndef NOSTRBLT
DWORD WINAPI StrBlt(lpdv, x, y, lpCR, lpStr, count, lpFont, lpDrawMode, lpXform) LPDV lpdv; short x; short y; LPRECT lpCR; LPSTR lpStr; int count; LPFONTINFO lpFont; LPDRAWMODE lpDrawMode; // includes background mode and bkColor
LPTEXTXFORM lpXform; { DBG_PROC_ENTRY("StrBlt"); // StrBlt is never called by GDI.
// Keep a stub function here so nobody complains.
//
RETURN 0; } #endif
#ifndef NOSCANLR
short WINAPI ScanLR(lpdv, x, y, Color, DirStyle) LPDV lpdv; short x; short y; DWORD Color; WORD DirStyle; { DBG_PROC_ENTRY("ScanLR"); // ScanLR is only called for RASDISPLAY devices.
// Keep a stub function here so nobody complains.
//
RETURN 0; } #endif
#ifndef NOENUMOBJ
short WINAPI EnumObj(lpdv, style, lpCallbackFunc, lpClientData) LPDV lpdv; WORD style; FARPROC lpCallbackFunc; LPVOID lpClientData; { DBG_PROC_ENTRY("EnumObj"); RETURN UniEnumObj(lpdv, style, lpCallbackFunc, lpClientData); } #endif
#ifndef NOCOLORINFO
DWORD WINAPI ColorInfo(lpdv, ColorIn, lpPhysBits) LPDV lpdv; DWORD ColorIn; LPDWORD lpPhysBits; { DBG_PROC_ENTRY("ColorInfo"); RETURN UniColorInfo(lpdv, ColorIn, lpPhysBits); } #endif
#ifndef NOREALIZEOBJECT
DWORD WINAPI RealizeObject(lpdv, sStyle, lpInObj, lpOutObj, lpTextXForm) LPDV lpdv; short sStyle; LPSTR lpInObj; LPSTR lpOutObj; LPTEXTXFORM lpTextXForm; { DBG_PROC_ENTRY("RealizeObject"); RETURN UniRealizeObject(lpdv, sStyle, lpInObj, lpOutObj, lpTextXForm); } #endif
#ifndef NOENUMDFONTS
short WINAPI EnumDFonts(lpdv, lpFaceName, lpCallbackFunc, lpClientData) LPDV lpdv; LPSTR lpFaceName; FARPROC lpCallbackFunc; LPVOID lpClientData; { DBG_PROC_ENTRY("EnumDFonts"); RETURN UniEnumDFonts(lpdv, lpFaceName, lpCallbackFunc, lpClientData); } #endif
// Enable will be called twice by the GDI
// First: the unidriver fills the GDIINFO structure (so the GDI will know the
// size of PDEVICE, and alloc memory for it.
// Second: To initialize the already allocated PDEIVCE.
#ifndef NOENABLE
WORD WINAPI Enable( LPVOID lpDevInfo, WORD wAction, LPSTR lpDestDevType, LPSTR lpOutputFile, LPVOID lpData ) { CUSTOMDATA cd; short sRet; LPEXTPDEV lpXPDV = NULL;
DBG_PROC_ENTRY("Enable"); DBG_TRACE1("lpDevInfo: 0x%lx", lpDevInfo); DBG_TRACE1("wAction: %d", wAction); DBG_TRACE1("lpDestDevType: %s", lpDestDevType); DBG_TRACE1("lpOutputFile: %s", lpOutputFile); DBG_TRACE1("lpData: 0x%lx", lpData);
cd.cbSize = sizeof(CUSTOMDATA); cd.hMd = g_hModule; // output raster graphics in portrait and landscape orientation.
cd.fnOEMDump = fnDump;
if (!(sRet = UniEnable((LPDV)lpDevInfo, wAction, lpDestDevType, // Printer model
lpOutputFile, // Port name
(LPDM)lpData, &cd))) { RETURN (sRet); }
switch(wAction) { case 0x0000: // Initializes the driver and associated hardware and then copies
// device-specific information needed by the driver to the PDEVICE
// structure pointed to by lpDevInfo.
case 0x8000: // Initializes the PDEVICE structure pointed to by lpDevInfo,
// but does not initialize the driver and peripheral hardware.
{ LPDV lpdv = (LPDV)lpDevInfo; DBG_TRACE("Init PDEVICE"); //
// allocate space for our private data
//
if (!(lpdv->hMd = GlobalAlloc(GHND, sizeof(EXTPDEV)))) { RETURN 0; } if (!(lpdv->lpMd = GlobalLock(lpdv->hMd))) { GlobalFree (lpdv->hMd); RETURN 0; }
lpXPDV = (LPEXTPDEV) lpdv->lpMd; //
// alloc page scan buffer
//
if(!(lpXPDV->hScanBuf = GlobalAlloc(GHND, BUF_CHUNK))) { GlobalUnlock (lpdv->hMd); GlobalFree (lpdv->hMd); RETURN 0; } if (!(lpXPDV->lpScanBuf = (char _huge *)GlobalLock(lpXPDV->hScanBuf))) { GlobalUnlock (lpdv->hMd); GlobalFree (lpdv->hMd); GlobalFree (lpXPDV->hScanBuf); RETURN 0; }
lpXPDV->dwScanBufSize = BUF_CHUNK; //
// initialize job variables
//
lpXPDV->dwTotalScans = 0; lpXPDV->dwTotalScanBytes = 0;
//
// Set the device context parameters in a newly allocated 32 bit driver context
// and save the returned pointer
//
DBG_TRACE3("lpData:0x%lx, lpDestDevType:%s ,lpOutputFile:%s",lpData, lpDestDevType, lpOutputFile); sRet = FaxCreateDriverContext( lpDestDevType, lpOutputFile, (LPDEVMODE)lpData, &(lpXPDV->dwPointer)); if(sRet != TRUE) { if(sRet < 0) { ERROR_PROMPT(NULL,THUNK_CALL_FAIL); } DBG_CALL_FAIL("FaxCreateDriverContext",0);
GlobalUnlock (lpdv->hMd); GlobalFree (lpdv->hMd); GlobalUnlock (lpXPDV->hScanBuf); GlobalFree (lpXPDV->hScanBuf); RETURN 0; } } break; case 0x0001: case 0x8001: //
// Copies the device driver information to the GDIINFO structure pointed
// to by lpDevInfo. GDIINFO also contains information about the sizes of
// DEVMODE and PDEVICE needed by the GDI to allocate them.
//
{ // GDIINFO far* lpgdiinfo = (GDIINFO far*)lpDevInfo;
DBG_TRACE("Init GDIINFO"); } break; default: DBG_TRACE("UNSUPPORTED style"); }
RETURN sRet; } #endif
#ifndef NODISABLE
void WINAPI Disable(lpdv) LPDV lpdv; { DBG_PROC_ENTRY("Disable"); //
// if allocated private PDEVICE data
//
if (lpdv->hMd) { LPEXTPDEV lpXPDV;
// get pointer to our private data stored in UNIDRV's PDEVICE
lpXPDV = ((LPEXTPDEV)lpdv->lpMd); ASSERT(lpXPDV);
DEBUG_OUTPUT_DEVICE_POINTERS("Before calling fax disable", lpdv); // check to see if scan buffer is still around
if (lpXPDV->hScanBuf) { GlobalUnlock(lpXPDV->hScanBuf); GlobalFree(lpXPDV->hScanBuf); }
//
// Free 32 bit driver context
//
FaxDisable(lpXPDV->dwPointer);
//
// Release our pdev
//
GlobalUnlock(lpdv->hMd); GlobalFree(lpdv->hMd); } UniDisable(lpdv); RETURN; } #endif
#ifndef NODEVEXTTEXTOUT
DWORD WINAPI DevExtTextOut(lpdv, x, y, lpCR, lpStr, count, lpFont, lpDrawMode, lpXform, lpWidths, lpOpaqRect, options) LPDV lpdv; short x; short y; LPRECT lpCR; LPSTR lpStr; int count; LPFONTINFO lpFont; LPDRAWMODE lpDrawMode; LPTEXTXFORM lpXform; LPSHORT lpWidths; LPRECT lpOpaqRect; WORD options; { DBG_PROC_ENTRY("DevExtTextOut"); RETURN(UniExtTextOut(lpdv, x, y, lpCR, lpStr, count, lpFont, lpDrawMode, lpXform, lpWidths, lpOpaqRect, options)); } #endif
#ifndef NODEVGETCHARWIDTH
short WINAPI DevGetCharWidth(lpdv, lpBuf, chFirst, chLast, lpFont, lpDrawMode, lpXForm) LPDV lpdv; LPSHORT lpBuf; WORD chFirst; WORD chLast; LPFONTINFO lpFont; LPDRAWMODE lpDrawMode; LPTEXTXFORM lpXForm; { DBG_PROC_ENTRY("DevGetCharWidth"); RETURN(UniGetCharWidth(lpdv, lpBuf, chFirst, chLast, lpFont,lpDrawMode, lpXForm)); } #endif
#ifndef NODEVICEBITMAP
short WINAPI DeviceBitmap(lpdv, command, lpBitMap, lpBits) LPDV lpdv; WORD command; LPBITMAP lpBitMap; LPSTR lpBits; { DBG_PROC_ENTRY("DeviceBitmap"); RETURN 0; } #endif
#ifndef NOFASTBORDER
short WINAPI FastBorder(lpRect, width, depth, lRop, lpdv, lpPBrush, lpDrawmode, lpCR) LPRECT lpRect; short width; short depth; long lRop; LPDV lpdv; long lpPBrush; long lpDrawmode; LPRECT lpCR; { DBG_PROC_ENTRY("FastBorder"); RETURN 0; } #endif
#ifndef NOSETATTRIBUTE
short WINAPI SetAttribute(lpdv, statenum, index, attribute) LPDV lpdv; WORD statenum; WORD index; WORD attribute; { DBG_PROC_ENTRY("SetAttribute"); RETURN 0; } #endif
//
// The ExtDeviceMode function also displays a dialog box that
// allows a user to select printer options such as paper size,
// paper orientation, output quality, and so on. Printer
// drivers written for Windows 3.x and later versions support
// this function. This DDI replaces obsolete DeviceMode.
//
int WINAPI ExtDeviceMode(hWnd, hDriver, lpDevModeOutput, lpDeviceName, lpPort, lpDevModeInput, lpProfile, wMode) HWND hWnd; // parent for DM_PROMPT dialog box
HANDLE hDriver; // handle from LoadLibrary()
LPDM lpDevModeOutput;// output DEVMODE for DM_COPY
LPSTR lpDeviceName; // device name
LPSTR lpPort; // port name
LPDM lpDevModeInput; // input DEVMODE for DM_MODIFY
LPSTR lpProfile; // alternate .INI file
WORD wMode; // operation(s) to carry out
#define FAILURE -1
{ int iRc;
DBG_PROC_ENTRY("ExtDeviceMode");
ASSERT(!(wMode & DM_COPY) || lpDevModeOutput); DBG_TRACE2("params: lpDevModeInput:0x%lx wMode:%d",lpDevModeInput,wMode);
//
// We don't do anything particular here. Let unidrive manage the default devmode...
//
iRc = UniExtDeviceMode(hWnd, hDriver, lpDevModeOutput, lpDeviceName, lpPort, lpDevModeInput, lpProfile, wMode); if(iRc < 0) { DBG_CALL_FAIL("UniExtDeviceMode",iRc); } RETURN iRc; }
#ifndef WANT_WIN30
#ifndef NODMPS
int WINAPI ExtDeviceModePropSheet(hWnd, hInst, lpDevName, lpPort, dwReserved, lpfnAdd, lParam) HWND hWnd; // Parent window for dialog
HANDLE hInst; // handle from LoadLibrary()
LPSTR lpDevName; // friendly name
LPSTR lpPort; // port name
DWORD dwReserved; // for future use
LPFNADDPROPSHEETPAGE lpfnAdd; // Callback to add dialog page
LPARAM lParam; // Pass to callback
{ int iRc;
DBG_PROC_ENTRY("ExtDeviceModePropSheet"); DBG_TRACE1("lpDevName PTR [0x%08X]",lpDevName);
DBG_TRACE3("hInst:[%ld] lpDevName:[%s] lpPort:[%s]",hInst, (LPSTR)lpDevName, (LPSTR)lpPort); DBG_TRACE1("lpfnAdd:[%ld]",lpfnAdd); iRc = UniExtDeviceModePropSheet(hWnd, hInst, lpDevName, lpPort, dwReserved, lpfnAdd, lParam); if (iRc < 0) { DBG_CALL_FAIL("UniExtDeviceModePropSheet",0); }
RETURN iRc; } #endif
#endif
#ifndef NODEVICECAPABILITIES
DWORD WINAPI DeviceCapabilities(lpDevName, lpPort, wIndex, lpOutput, lpdm) LPSTR lpDevName; LPSTR lpPort; WORD wIndex; LPSTR lpOutput; LPDM lpdm; { DWORD dwCap;
DBG_PROC_ENTRY("DeviceCapabilities"); DBG_TRACE1("Capability index: %d",wIndex); dwCap = UniDeviceCapabilities(lpDevName, lpPort, wIndex, lpOutput, lpdm, g_hModule); DBG_TRACE1("Reporeted Capability %d", dwCap); if (DC_VERSION == wIndex ) { DBG_TRACE1("Reporting DC_VERSION [0x%08X]",dwCap); } RETURN dwCap; } #endif
#ifndef NOADVANCEDSETUPDIALOG
LONG WINAPI AdvancedSetUpDialog(hWnd, hInstMiniDrv, lpdmIn, lpdmOut) HWND hWnd; HANDLE hInstMiniDrv; // handle of the driver module
LPDM lpdmIn; // initial device settings
LPDM lpdmOut; // final device settings
{ DBG_PROC_ENTRY("AdvancedSetUpDialog"); RETURN(UniAdvancedSetUpDialog(hWnd, hInstMiniDrv, lpdmIn, lpdmOut)); } #endif
#ifndef NODIBBLT
short WINAPI DIBBLT(lpBmp, style, iStart, sScans, lpDIBits, lpBMI, lpDrawMode, lpConvInfo) LPBITMAP lpBmp; WORD style; WORD iStart; WORD sScans; LPSTR lpDIBits; LPBITMAPINFO lpBMI; LPDRAWMODE lpDrawMode; LPSTR lpConvInfo; { DBG_PROC_ENTRY("DIBBLT"); RETURN(UniDIBBlt(lpBmp, style, iStart, sScans, lpDIBits, lpBMI, lpDrawMode, lpConvInfo)); } #endif
#ifndef NOCREATEDIBITMAP
short WINAPI CreateDIBitmap() { DBG_PROC_ENTRY("CreateDIBitmap"); // CreateDIBitmap is never called by GDI.
// Keep a stub function here so nobody complains.
//
RETURN(0); } #endif
#ifndef NOSETDIBITSTODEVICE
short WINAPI SetDIBitsToDevice(lpdv, DstXOrg, DstYOrg, StartScan, NumScans, lpCR, lpDrawMode, lpDIBits, lpDIBHdr, lpConvInfo) LPDV lpdv; WORD DstXOrg; WORD DstYOrg; WORD StartScan; WORD NumScans; LPRECT lpCR; LPDRAWMODE lpDrawMode; LPSTR lpDIBits; LPBITMAPINFOHEADER lpDIBHdr; LPSTR lpConvInfo; { DBG_PROC_ENTRY("SetDIBitsToDevice"); RETURN(UniSetDIBitsToDevice(lpdv, DstXOrg, DstYOrg, StartScan, NumScans, lpCR, lpDrawMode, lpDIBits, lpDIBHdr, lpConvInfo)); } #endif
#ifndef NOSTRETCHDIB
int WINAPI StretchDIB(lpdv, wMode, DstX, DstY, DstXE, DstYE, SrcX, SrcY, SrcXE, SrcYE, lpBits, lpDIBHdr, lpConvInfo, dwRop, lpbr, lpdm, lpClip) LPDV lpdv; WORD wMode; short DstX, DstY, DstXE, DstYE; short SrcX, SrcY, SrcXE, SrcYE; LPSTR lpBits; /* pointer to DIBitmap Bits */ LPBITMAPINFOHEADER lpDIBHdr; /* pointer to DIBitmap info Block */ LPSTR lpConvInfo; /* not used */ DWORD dwRop; LPPBRUSH lpbr; LPDRAWMODE lpdm; LPRECT lpClip; { DBG_PROC_ENTRY("StretchDIB"); RETURN(UniStretchDIB(lpdv, wMode, DstX, DstY, DstXE, DstYE, SrcX, SrcY, SrcXE, SrcYE, lpBits, lpDIBHdr, lpConvInfo, dwRop, lpbr, lpdm, lpClip)); } #endif
#if 0 // nobody is calling this DDI. Deleted.
#ifndef NOQUERYDEVICENAMES
long WINAPI QueryDeviceNames(lprgDeviceNames) LPSTR lprgDeviceNames; { DBG_PROC_ENTRY("QueryDeviceNames"); RETURN UniQueryDeviceNames(g_hModule,lprgDeviceNames); } #endif
#endif
#ifndef NODEVINSTALL
int WINAPI DevInstall(hWnd, lpDevName, lpOldPort, lpNewPort) HWND hWnd; LPSTR lpDevName; LPSTR lpOldPort, lpNewPort; {
short sRc;
int nRet; DBG_PROC_ENTRY("DevInstall"); //
// This call is made right after installation of the driver into the system
// directory.
//
DBG_TRACE3("hWnd: %ld DevName: %s OldPort: %s", hWnd,lpDevName,lpOldPort); DBG_TRACE1("NewPort: %s",lpNewPort);
sRc = FaxDevInstall(lpDevName,lpOldPort,lpNewPort); if(sRc < 0) { ERROR_PROMPT(NULL,THUNK_CALL_FAIL); RETURN 0; }
if (!sRc) { DBG_CALL_FAIL("FaxDevInstall",0); RETURN 0; } nRet = UniDevInstall(hWnd, lpDevName, lpOldPort, lpNewPort);
DBG_TRACE1("UniDevInstall() returned: %d",nRet);
return nRet;
} #endif
#ifndef NOBITMAPBITS
BOOL WINAPI BitmapBits(lpdv, fFlags, dwCount, lpBits) LPDV lpdv; DWORD fFlags; DWORD dwCount; LPSTR lpBits; { DBG_PROC_ENTRY("BitmapBits"); RETURN UniBitmapBits(lpdv, fFlags, dwCount, lpBits); } #endif
#ifndef NOSELECTBITMAP
BOOL WINAPI DeviceSelectBitmap(lpdv, lpPrevBmp, lpBmp, fFlags) LPDV lpdv; LPBITMAP lpPrevBmp; LPBITMAP lpBmp; DWORD fFlags; { DBG_PROC_ENTRY("DeviceSelectBitmap"); RETURN UniDeviceSelectBitmap(lpdv, lpPrevBmp, lpBmp, fFlags); } #endif
BOOL WINAPI thunk1632_ThunkConnect16(LPSTR, LPSTR, WORD, DWORD);
#ifndef NOLIBMAIN
int WINAPI LibMain(HANDLE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLine) { DBG_PROC_ENTRY("LibMain"); //
// Save instance handle.
//
g_hModule = hInstance; if( !(thunk1632_ThunkConnect16( "fxsdrv.dll", // name of 16-bit DLL
"fxsdrv32.dll",// name of 32-bit DLL
g_hModule, 1)) ) { DBG_CALL_FAIL("thunk1632_ThunkConnect16",0); RETURN FALSE; } RETURN TRUE; } #endif
VOID WINAPI WEP(short fExitWindows);
#pragma alloc_text(WEP_TEXT, WEP)
VOID WINAPI WEP(fExitWindows) short fExitWindows; { SDBG_PROC_ENTRY("WEP"); if( !(thunk1632_ThunkConnect16( "fxsdrv.dll", // name of 16-bit DLL
"fxsdrv32.dll",// name of 32-bit DLL
g_hModule, 0)) ) { DBG_MESSAGE_BOX("thunk1632_ThunkConnect16 failed"); RETURN; }
RETURN; }
|