/******************************Module*Header*******************************\ * Module Name: usersrv.c * * Copyright (c) 1996-1999 Microsoft Corporation * \**************************************************************************/ #include "precomp.hxx" // // The following methods are thunks to support calls to user mode // font drivers // #define DEFINE_FUNCTION(x, y) \ union { \ PFN Generic; \ PFN_Drv##x Kernel; \ } y = { ppfn(INDEX_Drv##x) }; class ATTACHOBJ { public: PDEVOBJ *pObject; ATTACHOBJ(PDEVOBJ *pObject_); ~ATTACHOBJ(); }; ATTACHOBJ::ATTACHOBJ(PDEVOBJ *pObject_) { if (pObject_->bFontDriver()) { pObject = pObject_; KeAttachProcess(PsGetProcessPcb(gpepCSRSS)); } else { pObject = 0; } } ATTACHOBJ::~ATTACHOBJ() { if (pObject) { KeDetachProcess(); } } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::EnablePDEV * \**************************************************************************/ DHPDEV PDEVOBJ::EnablePDEV( DEVMODEW *pdm , LPWSTR pwszLogAddress , ULONG cPat , HSURF *phsurfPatterns , ULONG cjCaps , GDIINFO *pGdiInfo , ULONG cjDevInfo , DEVINFO *pdi , HDEV hdev , LPWSTR pwszDeviceName , HANDLE hDriver ) { DHPDEV ReturnValue; DEFINE_FUNCTION(EnablePDEV, pfn); ReturnValue = (*pfn.Kernel)(pdm, pwszLogAddress, cPat, phsurfPatterns, cjCaps, pGdiInfo, cjDevInfo, pdi, hdev, pwszDeviceName, hDriver); return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::DisablePDEV * \**************************************************************************/ VOID PDEVOBJ::DisablePDEV( DHPDEV dhpdev) { DEFINE_FUNCTION(DisablePDEV, pfn); (*pfn.Kernel)(dhpdev); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::CompletePDEV * \**************************************************************************/ VOID PDEVOBJ::CompletePDEV( DHPDEV dhpdev, HDEV hdev) { DEFINE_FUNCTION(CompletePDEV, pfn); (*pfn.Kernel)(dhpdev, hdev); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryFont * \**************************************************************************/ IFIMETRICS* PDEVOBJ::QueryFont( DHPDEV dhpdev , ULONG_PTR iFile , ULONG iFace , ULONG_PTR *pid ) { IFIMETRICS *ReturnValue = NULL; DEFINE_FUNCTION(QueryFont, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(dhpdev, iFile, iFace, pid); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryFontTree * \**************************************************************************/ PVOID PDEVOBJ::QueryFontTree( DHPDEV dhpdev , ULONG_PTR iFile , ULONG iFace , ULONG iMode , ULONG_PTR *pid ) { PVOID ReturnValue = NULL; DEFINE_FUNCTION(QueryFontTree, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(dhpdev, iFile, iFace, iMode, pid); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryFontData * \**************************************************************************/ LONG PDEVOBJ::QueryFontData( DHPDEV dhpdev , FONTOBJ *pfo , ULONG iMode , HGLYPH hg , GLYPHDATA *pgd , PVOID pv , ULONG cjSize ) { LONG ReturnValue = FD_ERROR; DEFINE_FUNCTION(QueryFontData, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(dhpdev, pfo, iMode, hg, pgd, pv, cjSize); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::DestroyFont * \**************************************************************************/ VOID PDEVOBJ::DestroyFont(FONTOBJ *pfo) { BOOL bUnmap = FALSE; RFONTTMPOBJ rfo(PFO_TO_PRF(pfo)); // check ref count { SEMOBJ so(ghsemPublicPFT); if (rfo.pPFF()->cRFONT == 1) bUnmap = TRUE; } if (bUnmap) { UnmapPrintKView(rfo.pPFF()->hff); } DEFINE_FUNCTION(DestroyFont, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); (*pfn.Kernel)(pfo); } } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryFontCaps * \**************************************************************************/ LONG PDEVOBJ::QueryFontCaps( ULONG culCaps , ULONG *pulCaps ) { LONG ReturnValue; DEFINE_FUNCTION(QueryFontCaps, pfn); ReturnValue = (*pfn.Kernel)(culCaps, pulCaps); return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::LoadFontFile * \**************************************************************************/ HFF PDEVOBJ::LoadFontFile( ULONG cFiles , ULONG_PTR *piFile , PVOID *ppvView , ULONG *pcjView , DESIGNVECTOR *pdv , ULONG ulLangID , ULONG ulFastCheckSum ) { HFF ReturnValue = 0; DEFINE_FUNCTION(LoadFontFile, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(cFiles, piFile, ppvView, pcjView, pdv, ulLangID, ulFastCheckSum); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::UnloadFontFile * \**************************************************************************/ BOOL PDEVOBJ::UnloadFontFile(ULONG_PTR iFile) { BOOL ReturnValue = FALSE; DEFINE_FUNCTION(UnloadFontFile, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(iFile); } else{ return(-1); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryFontFile * \**************************************************************************/ LONG PDEVOBJ::QueryFontFile( ULONG_PTR iFile , ULONG ulMode , ULONG cjBuf , ULONG *pulBuf ) { LONG ReturnValue = FD_ERROR; DEFINE_FUNCTION(QueryFontFile, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(iFile, ulMode, cjBuf, pulBuf); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryAdvanceWidths * \**************************************************************************/ BOOL PDEVOBJ::QueryAdvanceWidths( DHPDEV dhpdev , FONTOBJ *pfo , ULONG iMode , HGLYPH *phg , PVOID pvWidths , ULONG cGlyphs ) { BOOL ReturnValue = FALSE; DEFINE_FUNCTION(QueryAdvanceWidths, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(dhpdev, pfo, iMode, phg, pvWidths, cGlyphs); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::Free * \**************************************************************************/ VOID PDEVOBJ::Free(PVOID pv, ULONG_PTR id) { DEFINE_FUNCTION(Free, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); (*pfn.Kernel)(pv, id); } } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::bQueryGlyphAttrs * \**************************************************************************/ PFD_GLYPHATTR PDEVOBJ::QueryGlyphAttrs( FONTOBJ *pfo, ULONG iMode ) { DEFINE_FUNCTION(QueryGlyphAttrs, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); if (pfn.Kernel) { return (*pfn.Kernel)(pfo, iMode); } } return NULL; } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryTrueTypeTable * \**************************************************************************/ LONG PDEVOBJ::QueryTrueTypeTable( ULONG_PTR iFile , ULONG ulFont , ULONG ulTag , PTRDIFF dpStart , ULONG cjBuf , BYTE *pjBuf , BYTE **ppjTable , ULONG *pcjTable ) { LONG ReturnValue = FD_ERROR; DEFINE_FUNCTION(QueryTrueTypeTable, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); if (pjBuf) { *pjBuf = 0; } if (pfn.Kernel) { ReturnValue = (*pfn.Kernel)(iFile, ulFont, ulTag, dpStart, cjBuf, pjBuf, ppjTable, pcjTable); } } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::QueryTrueTypeOutline * \**************************************************************************/ LONG PDEVOBJ::QueryTrueTypeOutline( DHPDEV dhpdev , FONTOBJ *pfo , HGLYPH hglyph , BOOL bMetricsOnly , GLYPHDATA *pgldt , ULONG cjBuf , TTPOLYGONHEADER *ppoly ) { LONG ReturnValue = FD_ERROR; DEFINE_FUNCTION(QueryTrueTypeOutline, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(dhpdev, pfo, hglyph, bMetricsOnly, pgldt, cjBuf, ppoly); } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::GetTrueTypeFile * \**************************************************************************/ PVOID PDEVOBJ::GetTrueTypeFile(ULONG_PTR iFile, ULONG *pcj) { PVOID ReturnValue = 0; DEFINE_FUNCTION(GetTrueTypeFile, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); *pcj = 0; if (pfn.Kernel) { ReturnValue = (*pfn.Kernel)(iFile, pcj); } } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::FontManagement * \**************************************************************************/ BOOL PDEVOBJ::FontManagement( SURFOBJ *pso, FONTOBJ *pfo, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut ) { BOOL ReturnValue = FALSE; DEFINE_FUNCTION(FontManagement, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); if (pfn.Kernel) { ReturnValue = (*pfn.Kernel)(pso, pfo, iEsc, cjIn, pvIn, cjOut, pvOut); } } return(ReturnValue); } /******************************Public*Routine******************************\ * * Routine Name: * * PDEVOBJ::Escape * \**************************************************************************/ ULONG PDEVOBJ::Escape( SURFOBJ *pso , ULONG iEsc , ULONG cjIn , PVOID pvIn , ULONG cjOut , PVOID pvOut ) { ULONG ReturnValue = 0; DEFINE_FUNCTION(Escape, pfn); if (gpepCSRSS) { ATTACHOBJ ato(this); ReturnValue = (*pfn.Kernel)(pso, iEsc, cjIn, pvIn, cjOut, pvOut); } return(ReturnValue); }