1678 lines
66 KiB
C
1678 lines
66 KiB
C
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
printers.c
|
|
|
|
Abstract:
|
|
|
|
<abstract>
|
|
|
|
Author:
|
|
|
|
Calin Negreanu (calinn) 08 Mar 2000
|
|
|
|
Revision History:
|
|
|
|
<alias> <date> <comments>
|
|
|
|
--*/
|
|
|
|
//
|
|
// Includes
|
|
//
|
|
|
|
#include "pch.h"
|
|
#include "logmsg.h"
|
|
#include <winspool.h>
|
|
|
|
#define DBG_PRINTERS "Printers"
|
|
|
|
//
|
|
// Strings
|
|
//
|
|
|
|
#define S_PRINTERS_POOL_NAME "Printers"
|
|
#define S_PRINTERS_NAME TEXT("Printers")
|
|
#define S_CORPNET_NAME TEXT("Net Printers and Drives")
|
|
|
|
//
|
|
// Constants
|
|
//
|
|
|
|
// None
|
|
|
|
//
|
|
// Macros
|
|
//
|
|
|
|
// None
|
|
|
|
//
|
|
// Types
|
|
//
|
|
|
|
typedef struct {
|
|
PCTSTR Pattern;
|
|
HASHTABLE_ENUM HashData;
|
|
} PRINTER_ENUM, *PPRINTER_ENUM;
|
|
|
|
typedef struct {
|
|
BOOL Default;
|
|
DWORD dmFields;
|
|
SHORT dmOrientation;
|
|
SHORT dmPaperSize;
|
|
SHORT dmPaperLength;
|
|
SHORT dmPaperWidth;
|
|
POINTL dmPosition;
|
|
SHORT dmScale;
|
|
SHORT dmCopies;
|
|
SHORT dmDefaultSource;
|
|
SHORT dmPrintQuality;
|
|
SHORT dmColor;
|
|
SHORT dmDuplex;
|
|
SHORT dmYResolution;
|
|
SHORT dmTTOption;
|
|
SHORT dmCollate;
|
|
CHAR dmFormName[CCHFORMNAME];
|
|
WORD dmLogPixels;
|
|
DWORD dmBitsPerPel;
|
|
DWORD dmPelsWidth;
|
|
DWORD dmPelsHeight;
|
|
DWORD dmDisplayFlags;
|
|
DWORD dmNup;
|
|
DWORD dmDisplayFrequency;
|
|
DWORD dmICMMethod;
|
|
DWORD dmICMIntent;
|
|
DWORD dmMediaType;
|
|
DWORD dmDitherType;
|
|
DWORD dmPanningWidth;
|
|
DWORD dmPanningHeight;
|
|
} PRINTER_DATAA, *PPRINTER_DATAA;
|
|
|
|
typedef struct {
|
|
BOOL Default;
|
|
DWORD dmFields;
|
|
SHORT dmOrientation;
|
|
SHORT dmPaperSize;
|
|
SHORT dmPaperLength;
|
|
SHORT dmPaperWidth;
|
|
POINTL dmPosition;
|
|
SHORT dmScale;
|
|
SHORT dmCopies;
|
|
SHORT dmDefaultSource;
|
|
SHORT dmPrintQuality;
|
|
SHORT dmColor;
|
|
SHORT dmDuplex;
|
|
SHORT dmYResolution;
|
|
SHORT dmTTOption;
|
|
SHORT dmCollate;
|
|
WCHAR dmFormName[CCHFORMNAME];
|
|
WORD dmLogPixels;
|
|
DWORD dmBitsPerPel;
|
|
DWORD dmPelsWidth;
|
|
DWORD dmPelsHeight;
|
|
DWORD dmDisplayFlags;
|
|
DWORD dmNup;
|
|
DWORD dmDisplayFrequency;
|
|
DWORD dmICMMethod;
|
|
DWORD dmICMIntent;
|
|
DWORD dmMediaType;
|
|
DWORD dmDitherType;
|
|
DWORD dmPanningWidth;
|
|
DWORD dmPanningHeight;
|
|
} PRINTER_DATAW, *PPRINTER_DATAW;
|
|
|
|
#ifdef UNICODE
|
|
#define PRINTER_DATA PRINTER_DATAW
|
|
#define PPRINTER_DATA PPRINTER_DATAW
|
|
#else
|
|
#define PRINTER_DATA PRINTER_DATAA
|
|
#define PPRINTER_DATA PPRINTER_DATAA
|
|
#endif
|
|
|
|
//
|
|
// Globals
|
|
//
|
|
|
|
BOOL g_PrinterMigEnabled = FALSE;
|
|
PMHANDLE g_PrintersPool = NULL;
|
|
HASHTABLE g_PrintersTable;
|
|
MIG_OBJECTTYPEID g_PrinterTypeId = 0;
|
|
static BOOL g_IsWin9x = FALSE;
|
|
GROWBUFFER g_PrinterConversionBuff = INIT_GROWBUFFER;
|
|
BOOL g_DelayPrintersOp = FALSE;
|
|
|
|
//
|
|
// Macro expansion list
|
|
//
|
|
|
|
// None
|
|
|
|
//
|
|
// Private function prototypes
|
|
//
|
|
|
|
// None
|
|
|
|
//
|
|
// Macro expansion definition
|
|
//
|
|
|
|
// None
|
|
|
|
//
|
|
// Private prototypes
|
|
//
|
|
|
|
SGMENUMERATIONCALLBACK SgmPrintersCallback;
|
|
VCMENUMERATIONCALLBACK VcmPrintersCallback;
|
|
|
|
TYPE_ENUMFIRSTPHYSICALOBJECT EnumFirstPrinter;
|
|
TYPE_ENUMNEXTPHYSICALOBJECT EnumNextPrinter;
|
|
TYPE_ABORTENUMPHYSICALOBJECT AbortEnumPrinter;
|
|
TYPE_CONVERTOBJECTTOMULTISZ ConvertPrinterToMultiSz;
|
|
TYPE_CONVERTMULTISZTOOBJECT ConvertMultiSzToPrinter;
|
|
TYPE_GETNATIVEOBJECTNAME GetNativePrinterName;
|
|
TYPE_ACQUIREPHYSICALOBJECT AcquirePrinter;
|
|
TYPE_RELEASEPHYSICALOBJECT ReleasePrinter;
|
|
TYPE_DOESPHYSICALOBJECTEXIST DoesPrinterExist;
|
|
TYPE_REMOVEPHYSICALOBJECT RemovePrinter;
|
|
TYPE_CREATEPHYSICALOBJECT CreatePrinter;
|
|
TYPE_REPLACEPHYSICALOBJECT ReplacePrinter;
|
|
TYPE_CONVERTOBJECTCONTENTTOUNICODE ConvertPrinterContentToUnicode;
|
|
TYPE_CONVERTOBJECTCONTENTTOANSI ConvertPrinterContentToAnsi;
|
|
TYPE_FREECONVERTEDOBJECTCONTENT FreeConvertedPrinterContent;
|
|
|
|
//
|
|
// Code
|
|
//
|
|
|
|
BOOL
|
|
PrintersInitialize (
|
|
VOID
|
|
)
|
|
{
|
|
OSVERSIONINFO versionInfo;
|
|
|
|
ZeroMemory (&versionInfo, sizeof (OSVERSIONINFO));
|
|
versionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
|
if (!GetVersionEx (&versionInfo)) {
|
|
return FALSE;
|
|
}
|
|
g_IsWin9x = (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
|
|
g_PrintersTable = HtAllocWithData (sizeof (PPRINTER_DATA));
|
|
if (!g_PrintersTable) {
|
|
return FALSE;
|
|
}
|
|
g_PrintersPool = PmCreateNamedPool (S_PRINTERS_POOL_NAME);
|
|
return (g_PrintersPool != NULL);
|
|
}
|
|
|
|
BOOL
|
|
pLoadPrintersData (
|
|
VOID
|
|
)
|
|
{
|
|
PTSTR defaultPrinter = NULL;
|
|
PTSTR defaultPrinterPtr = NULL;
|
|
DWORD defaultGap = 1024;
|
|
DWORD initialSize = 0;
|
|
DWORD resultSize = 0;
|
|
PBYTE prnBuffer = NULL;
|
|
DWORD prnBufferSize = 0;
|
|
DWORD prnNumbers = 0;
|
|
DWORD error;
|
|
PPRINTER_INFO_2 prnInfo;
|
|
PPRINTER_DATA printerData;
|
|
|
|
do {
|
|
initialSize = initialSize + defaultGap;
|
|
defaultPrinter = (PTSTR) PmGetMemory (g_PrintersPool, initialSize * sizeof (TCHAR));
|
|
resultSize = GetProfileString (TEXT("windows"), TEXT("device"), TEXT(",,"), defaultPrinter, initialSize);
|
|
if (resultSize < (initialSize - 1)) {
|
|
break;
|
|
}
|
|
PmReleaseMemory (g_PrintersPool, defaultPrinter);
|
|
} while (TRUE);
|
|
defaultPrinterPtr = _tcschr (defaultPrinter, TEXT(','));
|
|
if (defaultPrinterPtr) {
|
|
*defaultPrinterPtr = 0;
|
|
}
|
|
|
|
if (!EnumPrinters (PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &prnBufferSize, &prnNumbers)) {
|
|
error = GetLastError ();
|
|
if (error != ERROR_INSUFFICIENT_BUFFER) {
|
|
PmReleaseMemory (g_PrintersPool, defaultPrinter);
|
|
return FALSE;
|
|
}
|
|
}
|
|
if (prnBufferSize) {
|
|
prnBuffer = PmGetMemory (g_PrintersPool, prnBufferSize);
|
|
if (!EnumPrinters (PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 2, prnBuffer, prnBufferSize, &prnBufferSize, &prnNumbers)) {
|
|
PmReleaseMemory (g_PrintersPool, defaultPrinter);
|
|
PmReleaseMemory (g_PrintersPool, prnBuffer);
|
|
return FALSE;
|
|
}
|
|
prnInfo = (PPRINTER_INFO_2) (prnBuffer);
|
|
while (prnNumbers) {
|
|
if (prnInfo->Attributes & PRINTER_ATTRIBUTE_NETWORK) {
|
|
printerData = (PPRINTER_DATA) PmGetMemory (g_PrintersPool, sizeof (PRINTER_DATA));
|
|
ZeroMemory (printerData, sizeof (PRINTER_DATA));
|
|
if (prnInfo->pDevMode) {
|
|
// let's save printer settings
|
|
printerData->dmFields = prnInfo->pDevMode->dmFields;
|
|
if (prnInfo->pDevMode->dmFields & DM_ORIENTATION) {
|
|
printerData->dmOrientation = prnInfo->pDevMode->dmOrientation;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PAPERSIZE) {
|
|
printerData->dmPaperSize = prnInfo->pDevMode->dmPaperSize;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PAPERLENGTH) {
|
|
printerData->dmPaperLength = prnInfo->pDevMode->dmPaperLength;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PAPERWIDTH) {
|
|
printerData->dmPaperWidth = prnInfo->pDevMode->dmPaperWidth;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_SCALE) {
|
|
printerData->dmScale = prnInfo->pDevMode->dmScale;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_POSITION) {
|
|
CopyMemory (&printerData->dmPosition, &prnInfo->pDevMode->dmPosition, sizeof(POINTL));
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_NUP) {
|
|
printerData->dmNup = prnInfo->pDevMode->dmNup;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_COPIES) {
|
|
printerData->dmCopies = prnInfo->pDevMode->dmCopies;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_DEFAULTSOURCE) {
|
|
printerData->dmDefaultSource = prnInfo->pDevMode->dmDefaultSource;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PRINTQUALITY) {
|
|
printerData->dmPrintQuality = prnInfo->pDevMode->dmPrintQuality;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_COLOR) {
|
|
printerData->dmColor = prnInfo->pDevMode->dmColor;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_DUPLEX) {
|
|
printerData->dmDuplex = prnInfo->pDevMode->dmDuplex;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_YRESOLUTION) {
|
|
printerData->dmYResolution = prnInfo->pDevMode->dmYResolution;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_TTOPTION) {
|
|
printerData->dmTTOption = prnInfo->pDevMode->dmTTOption;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_COLLATE) {
|
|
printerData->dmCollate = prnInfo->pDevMode->dmCollate;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_FORMNAME) {
|
|
CopyMemory (printerData->dmFormName, prnInfo->pDevMode->dmFormName, sizeof (printerData->dmFormName));
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_LOGPIXELS) {
|
|
printerData->dmLogPixels = prnInfo->pDevMode->dmLogPixels;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_BITSPERPEL) {
|
|
printerData->dmBitsPerPel = prnInfo->pDevMode->dmBitsPerPel;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PELSWIDTH) {
|
|
printerData->dmPelsWidth = prnInfo->pDevMode->dmPelsWidth;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PELSHEIGHT) {
|
|
printerData->dmPelsHeight = prnInfo->pDevMode->dmPelsHeight;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_DISPLAYFLAGS) {
|
|
printerData->dmDisplayFlags = prnInfo->pDevMode->dmDisplayFlags;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_DISPLAYFREQUENCY) {
|
|
printerData->dmDisplayFrequency = prnInfo->pDevMode->dmDisplayFrequency;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_ICMMETHOD) {
|
|
printerData->dmICMMethod = prnInfo->pDevMode->dmICMMethod;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_ICMINTENT) {
|
|
printerData->dmICMIntent = prnInfo->pDevMode->dmICMIntent;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_MEDIATYPE) {
|
|
printerData->dmMediaType = prnInfo->pDevMode->dmMediaType;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_DITHERTYPE) {
|
|
printerData->dmDitherType = prnInfo->pDevMode->dmDitherType;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PANNINGWIDTH) {
|
|
printerData->dmPanningWidth = prnInfo->pDevMode->dmPanningWidth;
|
|
}
|
|
if (prnInfo->pDevMode->dmFields & DM_PANNINGHEIGHT) {
|
|
printerData->dmPanningHeight = prnInfo->pDevMode->dmPanningHeight;
|
|
}
|
|
}
|
|
printerData->Default = StringIMatch (prnInfo->pPrinterName, defaultPrinter);
|
|
if (g_IsWin9x) {
|
|
HtAddStringEx (g_PrintersTable, prnInfo->pPortName, &printerData, FALSE);
|
|
} else {
|
|
HtAddStringEx (g_PrintersTable, prnInfo->pPrinterName, &printerData, FALSE);
|
|
}
|
|
}
|
|
prnInfo ++;
|
|
prnNumbers --;
|
|
}
|
|
PmReleaseMemory (g_PrintersPool, prnBuffer);
|
|
}
|
|
PmReleaseMemory (g_PrintersPool, defaultPrinter);
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
PrintersTerminate (
|
|
VOID
|
|
)
|
|
{
|
|
HASHTABLE_ENUM e;
|
|
PPRINTER_DATA printerData;
|
|
|
|
GbFree (&g_PrinterConversionBuff);
|
|
|
|
if (g_PrintersTable) {
|
|
if (EnumFirstHashTableString (&e, g_PrintersTable)) {
|
|
do {
|
|
printerData = *((PPRINTER_DATA *) e.ExtraData);
|
|
if (printerData) {
|
|
PmReleaseMemory (g_PrintersPool, printerData);
|
|
}
|
|
} while (EnumNextHashTableString (&e));
|
|
}
|
|
HtFree (g_PrintersTable);
|
|
g_PrintersTable = NULL;
|
|
}
|
|
if (g_PrintersPool) {
|
|
PmDestroyPool (g_PrintersPool);
|
|
g_PrintersPool = NULL;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersEtmInitialize (
|
|
IN MIG_PLATFORMTYPEID Platform,
|
|
IN PMIG_LOGCALLBACK LogCallback,
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
TYPE_REGISTER printerTypeData;
|
|
|
|
LogReInit (NULL, NULL, NULL, (PLOGCALLBACK) LogCallback);
|
|
|
|
pLoadPrintersData ();
|
|
|
|
ZeroMemory (&printerTypeData, sizeof (TYPE_REGISTER));
|
|
|
|
if (Platform == PLATFORM_SOURCE) {
|
|
|
|
printerTypeData.EnumFirstPhysicalObject = EnumFirstPrinter;
|
|
printerTypeData.EnumNextPhysicalObject = EnumNextPrinter;
|
|
printerTypeData.AbortEnumPhysicalObject = AbortEnumPrinter;
|
|
printerTypeData.ConvertObjectToMultiSz = ConvertPrinterToMultiSz;
|
|
printerTypeData.ConvertMultiSzToObject = ConvertMultiSzToPrinter;
|
|
printerTypeData.GetNativeObjectName = GetNativePrinterName;
|
|
printerTypeData.AcquirePhysicalObject = AcquirePrinter;
|
|
printerTypeData.ReleasePhysicalObject = ReleasePrinter;
|
|
printerTypeData.ConvertObjectContentToUnicode = ConvertPrinterContentToUnicode;
|
|
printerTypeData.ConvertObjectContentToAnsi = ConvertPrinterContentToAnsi;
|
|
printerTypeData.FreeConvertedObjectContent = FreeConvertedPrinterContent;
|
|
|
|
g_PrinterTypeId = IsmRegisterObjectType (
|
|
S_PRINTERS_NAME,
|
|
TRUE,
|
|
FALSE,
|
|
&printerTypeData
|
|
);
|
|
} else {
|
|
|
|
printerTypeData.EnumFirstPhysicalObject = EnumFirstPrinter;
|
|
printerTypeData.EnumNextPhysicalObject = EnumNextPrinter;
|
|
printerTypeData.AbortEnumPhysicalObject = AbortEnumPrinter;
|
|
printerTypeData.ConvertObjectToMultiSz = ConvertPrinterToMultiSz;
|
|
printerTypeData.ConvertMultiSzToObject = ConvertMultiSzToPrinter;
|
|
printerTypeData.GetNativeObjectName = GetNativePrinterName;
|
|
printerTypeData.AcquirePhysicalObject = AcquirePrinter;
|
|
printerTypeData.ReleasePhysicalObject = ReleasePrinter;
|
|
printerTypeData.DoesPhysicalObjectExist = DoesPrinterExist;
|
|
printerTypeData.RemovePhysicalObject = RemovePrinter;
|
|
printerTypeData.CreatePhysicalObject = CreatePrinter;
|
|
printerTypeData.ReplacePhysicalObject = ReplacePrinter;
|
|
printerTypeData.ConvertObjectContentToUnicode = ConvertPrinterContentToUnicode;
|
|
printerTypeData.ConvertObjectContentToAnsi = ConvertPrinterContentToAnsi;
|
|
printerTypeData.FreeConvertedObjectContent = FreeConvertedPrinterContent;
|
|
|
|
g_PrinterTypeId = IsmRegisterObjectType (
|
|
S_PRINTERS_NAME,
|
|
TRUE,
|
|
FALSE,
|
|
&printerTypeData
|
|
);
|
|
}
|
|
MYASSERT (g_PrinterTypeId);
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
WINAPI
|
|
PrintersEtmNewUserCreated (
|
|
IN PCTSTR UserName,
|
|
IN PCTSTR DomainName,
|
|
IN PCTSTR UserProfileRoot,
|
|
IN PSID UserSid
|
|
)
|
|
{
|
|
// a new user was created, the printer operations need to be delayed
|
|
PrintersTerminate ();
|
|
g_DelayPrintersOp = TRUE;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersSgmInitialize (
|
|
IN PMIG_LOGCALLBACK LogCallback,
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
LogReInit (NULL, NULL, NULL, (PLOGCALLBACK) LogCallback);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersSgmParse (
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
PCTSTR friendlyName;
|
|
|
|
friendlyName = GetStringResource (MSG_PRINTERS_NAME);
|
|
|
|
//IsmAddComponentAlias (
|
|
// S_PRINTERS_NAME,
|
|
// MASTERGROUP_SYSTEM,
|
|
// friendlyName,
|
|
// COMPONENT_NAME,
|
|
// FALSE
|
|
// );
|
|
|
|
IsmAddComponentAlias (
|
|
S_CORPNET_NAME,
|
|
MASTERGROUP_SYSTEM,
|
|
friendlyName,
|
|
COMPONENT_NAME,
|
|
FALSE
|
|
);
|
|
|
|
FreeStringResource (friendlyName);
|
|
return TRUE;
|
|
}
|
|
|
|
UINT
|
|
SgmPrintersCallback (
|
|
IN PCMIG_OBJECTENUMDATA Data,
|
|
IN ULONG_PTR CallerArg
|
|
)
|
|
{
|
|
IsmAbandonObjectOnCollision (Data->ObjectTypeId, Data->ObjectName);
|
|
IsmMakeApplyObject (Data->ObjectTypeId, Data->ObjectName);
|
|
return CALLBACK_ENUM_CONTINUE;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersSgmQueueEnumeration (
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
ENCODEDSTRHANDLE pattern;
|
|
|
|
if (!IsmIsComponentSelected (S_PRINTERS_NAME, 0) &&
|
|
!IsmIsComponentSelected (S_CORPNET_NAME, 0)
|
|
) {
|
|
g_PrinterMigEnabled = FALSE;
|
|
return TRUE;
|
|
}
|
|
g_PrinterMigEnabled = TRUE;
|
|
|
|
pattern = IsmCreateSimpleObjectPattern (NULL, TRUE, NULL, FALSE);
|
|
IsmQueueEnumeration (
|
|
g_PrinterTypeId,
|
|
pattern,
|
|
SgmPrintersCallback,
|
|
(ULONG_PTR) 0,
|
|
S_PRINTERS_NAME
|
|
);
|
|
IsmDestroyObjectHandle (pattern);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersVcmInitialize (
|
|
IN PMIG_LOGCALLBACK LogCallback,
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
LogReInit (NULL, NULL, NULL, (PLOGCALLBACK) LogCallback);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersVcmParse (
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
return PrintersSgmParse (Reserved);
|
|
}
|
|
|
|
UINT
|
|
VcmPrintersCallback (
|
|
IN PCMIG_OBJECTENUMDATA Data,
|
|
IN ULONG_PTR CallerArg
|
|
)
|
|
{
|
|
IsmMakePersistentObject (Data->ObjectTypeId, Data->ObjectName);
|
|
return CALLBACK_ENUM_CONTINUE;
|
|
}
|
|
|
|
BOOL
|
|
WINAPI
|
|
PrintersVcmQueueEnumeration (
|
|
IN PVOID Reserved
|
|
)
|
|
{
|
|
ENCODEDSTRHANDLE pattern;
|
|
|
|
if (!IsmIsComponentSelected (S_PRINTERS_NAME, 0) &&
|
|
!IsmIsComponentSelected (S_CORPNET_NAME, 0)
|
|
) {
|
|
g_PrinterMigEnabled = FALSE;
|
|
return TRUE;
|
|
}
|
|
g_PrinterMigEnabled = TRUE;
|
|
|
|
pattern = IsmCreateSimpleObjectPattern (NULL, TRUE, NULL, FALSE);
|
|
IsmQueueEnumeration (
|
|
g_PrinterTypeId,
|
|
pattern,
|
|
VcmPrintersCallback,
|
|
(ULONG_PTR) 0,
|
|
S_PRINTERS_NAME
|
|
);
|
|
IsmDestroyObjectHandle (pattern);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
pEnumPrinterWorker (
|
|
OUT PMIG_TYPEOBJECTENUM EnumPtr,
|
|
IN PPRINTER_ENUM PrinterEnum
|
|
)
|
|
{
|
|
if (EnumPtr->ObjectNode) {
|
|
IsmDestroyObjectString (EnumPtr->ObjectNode);
|
|
EnumPtr->ObjectNode = NULL;
|
|
}
|
|
if (EnumPtr->ObjectLeaf) {
|
|
IsmDestroyObjectString (EnumPtr->ObjectLeaf);
|
|
EnumPtr->ObjectLeaf = NULL;
|
|
}
|
|
do {
|
|
EnumPtr->ObjectName = IsmCreateObjectHandle (PrinterEnum->HashData.String, NULL);
|
|
if (!ObsPatternMatch (PrinterEnum->Pattern, EnumPtr->ObjectName)) {
|
|
if (!EnumNextHashTableString (&PrinterEnum->HashData)) {
|
|
AbortEnumPrinter (EnumPtr);
|
|
return FALSE;
|
|
}
|
|
continue;
|
|
}
|
|
EnumPtr->NativeObjectName = PrinterEnum->HashData.String;
|
|
IsmCreateObjectStringsFromHandle (EnumPtr->ObjectName, &EnumPtr->ObjectNode, &EnumPtr->ObjectLeaf);
|
|
EnumPtr->Level = 1;
|
|
EnumPtr->SubLevel = 0;
|
|
EnumPtr->IsLeaf = FALSE;
|
|
EnumPtr->IsNode = TRUE;
|
|
EnumPtr->Details.DetailsSize = 0;
|
|
EnumPtr->Details.DetailsData = NULL;
|
|
return TRUE;
|
|
} while (TRUE);
|
|
}
|
|
|
|
BOOL
|
|
EnumFirstPrinter (
|
|
IN OUT PMIG_TYPEOBJECTENUM EnumPtr, CALLER_INITIALIZED
|
|
IN MIG_OBJECTSTRINGHANDLE Pattern,
|
|
IN UINT MaxLevel
|
|
)
|
|
{
|
|
PPRINTER_ENUM printerEnum = NULL;
|
|
|
|
if (!g_PrintersTable) {
|
|
return FALSE;
|
|
}
|
|
printerEnum = (PPRINTER_ENUM) PmGetMemory (g_PrintersPool, sizeof (PRINTER_ENUM));
|
|
printerEnum->Pattern = PmDuplicateString (g_PrintersPool, Pattern);
|
|
EnumPtr->EtmHandle = (LONG_PTR) printerEnum;
|
|
|
|
if (EnumFirstHashTableString (&printerEnum->HashData, g_PrintersTable)) {
|
|
return pEnumPrinterWorker (EnumPtr, printerEnum);
|
|
} else {
|
|
AbortEnumPrinter (EnumPtr);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
EnumNextPrinter (
|
|
IN OUT PMIG_TYPEOBJECTENUM EnumPtr
|
|
)
|
|
{
|
|
PPRINTER_ENUM printerEnum = NULL;
|
|
|
|
if (EnumPtr->ObjectName) {
|
|
IsmDestroyObjectHandle (EnumPtr->ObjectName);
|
|
EnumPtr->ObjectName = NULL;
|
|
}
|
|
printerEnum = (PPRINTER_ENUM)(EnumPtr->EtmHandle);
|
|
if (!printerEnum) {
|
|
return FALSE;
|
|
}
|
|
if (EnumNextHashTableString (&printerEnum->HashData)) {
|
|
return pEnumPrinterWorker (EnumPtr, printerEnum);
|
|
} else {
|
|
AbortEnumPrinter (EnumPtr);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
VOID
|
|
AbortEnumPrinter (
|
|
IN OUT PMIG_TYPEOBJECTENUM EnumPtr
|
|
)
|
|
{
|
|
PPRINTER_ENUM printerEnum = NULL;
|
|
|
|
if (EnumPtr->ObjectName) {
|
|
IsmDestroyObjectHandle (EnumPtr->ObjectName);
|
|
EnumPtr->ObjectName = NULL;
|
|
}
|
|
if (EnumPtr->ObjectNode) {
|
|
IsmDestroyObjectString (EnumPtr->ObjectNode);
|
|
EnumPtr->ObjectNode = NULL;
|
|
}
|
|
if (EnumPtr->ObjectLeaf) {
|
|
IsmDestroyObjectString (EnumPtr->ObjectLeaf);
|
|
EnumPtr->ObjectLeaf = NULL;
|
|
}
|
|
printerEnum = (PPRINTER_ENUM)(EnumPtr->EtmHandle);
|
|
if (!printerEnum) {
|
|
return;
|
|
}
|
|
PmReleaseMemory (g_PrintersPool, printerEnum->Pattern);
|
|
PmReleaseMemory (g_PrintersPool, printerEnum);
|
|
ZeroMemory (EnumPtr, sizeof (MIG_TYPEOBJECTENUM));
|
|
}
|
|
|
|
BOOL
|
|
AcquirePrinter (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName,
|
|
OUT PMIG_CONTENT ObjectContent, CALLER_INITIALIZED
|
|
IN MIG_CONTENTTYPE ContentType,
|
|
IN UINT MemoryContentLimit
|
|
)
|
|
{
|
|
PCTSTR node;
|
|
PCTSTR leaf;
|
|
PPRINTER_DATA printerData = NULL;
|
|
BOOL result = FALSE;
|
|
|
|
if (!ObjectContent) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (ContentType == CONTENTTYPE_FILE) {
|
|
// nobody should request this as a file
|
|
MYASSERT (FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
if (IsmCreateObjectStringsFromHandle (ObjectName, &node, &leaf)) {
|
|
if (HtFindStringEx (g_PrintersTable, node, (PVOID)(&printerData), FALSE)) {
|
|
|
|
ObjectContent->MemoryContent.ContentBytes = (PCBYTE)printerData;
|
|
ObjectContent->MemoryContent.ContentSize = sizeof (PRINTER_DATA);
|
|
|
|
result = TRUE;
|
|
}
|
|
IsmDestroyObjectString (node);
|
|
IsmDestroyObjectString (leaf);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
BOOL
|
|
ReleasePrinter (
|
|
IN OUT PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
if (ObjectContent) {
|
|
ZeroMemory (ObjectContent, sizeof (MIG_CONTENT));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DoesPrinterExist (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName
|
|
)
|
|
{
|
|
PCTSTR node;
|
|
PCTSTR leaf;
|
|
PPRINTER_DATA printerData = NULL;
|
|
BOOL result = FALSE;
|
|
|
|
if (IsmCreateObjectStringsFromHandle (ObjectName, &node, &leaf)) {
|
|
if (g_PrintersTable &&
|
|
HtFindStringEx (g_PrintersTable, node, (PVOID)(&printerData), FALSE)
|
|
) {
|
|
result = TRUE;
|
|
}
|
|
IsmDestroyObjectString (node);
|
|
IsmDestroyObjectString (leaf);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
BOOL
|
|
RemovePrinter (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName
|
|
)
|
|
{
|
|
PCTSTR node;
|
|
PCTSTR leaf;
|
|
BOOL result = FALSE;
|
|
|
|
if (IsmCreateObjectStringsFromHandle (ObjectName, &node, &leaf)) {
|
|
if (node && (!leaf)) {
|
|
result = DeletePrinterConnection ((PTSTR)node);
|
|
}
|
|
IsmDestroyObjectString (node);
|
|
IsmDestroyObjectString (leaf);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
BOOL
|
|
CreatePrinter (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName,
|
|
IN PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
PCTSTR node;
|
|
PCTSTR leaf;
|
|
PPRINTER_DATA printerData;
|
|
HANDLE printerHandle = NULL;
|
|
BOOL result = FALSE;
|
|
UINT devModeSize;
|
|
PPRINTER_INFO_2 printerInfo;
|
|
UINT printerInfoSize;
|
|
PDEVMODE devMode;
|
|
|
|
if (!ObjectContent->ContentInFile) {
|
|
if (ObjectContent->MemoryContent.ContentBytes && ObjectContent->MemoryContent.ContentSize) {
|
|
if (IsmCreateObjectStringsFromHandle (ObjectName, &node, &leaf)) {
|
|
if (node && (!leaf)) {
|
|
|
|
if (g_DelayPrintersOp) {
|
|
|
|
// we need to delay this operation
|
|
// record delayed printer replace operation
|
|
IsmRecordDelayedOperation (
|
|
JRNOP_CREATE,
|
|
g_PrinterTypeId,
|
|
ObjectName,
|
|
ObjectContent
|
|
);
|
|
result = TRUE;
|
|
|
|
} else {
|
|
|
|
// record printer creation
|
|
IsmRecordOperation (
|
|
JRNOP_CREATE,
|
|
g_PrinterTypeId,
|
|
ObjectName
|
|
);
|
|
|
|
result = AddPrinterConnection ((PTSTR)node);
|
|
if (result) {
|
|
printerData = (PPRINTER_DATA)(ObjectContent->MemoryContent.ContentBytes);
|
|
if (printerData->dmFields) {
|
|
// let's restore printer settings
|
|
if (OpenPrinter ((PTSTR)node, &printerHandle, NULL)) {
|
|
if (GetPrinter (printerHandle, 2, 0, 0, &printerInfoSize) || (GetLastError () == ERROR_INSUFFICIENT_BUFFER)) {
|
|
printerInfo = PmGetMemory (g_PrintersPool, (printerInfoSize > sizeof (PRINTER_INFO_2))?printerInfoSize:sizeof (PRINTER_INFO_2));
|
|
ZeroMemory (printerInfo, (printerInfoSize > sizeof (PRINTER_INFO_2))?printerInfoSize:sizeof (PRINTER_INFO_2));
|
|
if (GetPrinter (printerHandle, 2, (PBYTE)printerInfo, printerInfoSize, &printerInfoSize)) {
|
|
if (printerInfo->pDevMode) {
|
|
devMode = printerInfo->pDevMode;
|
|
} else {
|
|
devModeSize = DocumentProperties (NULL, printerHandle, (PTSTR)node, NULL, NULL, 0);
|
|
if (devModeSize) {
|
|
devMode = PmGetMemory (g_PrintersPool, (devModeSize > sizeof (DEVMODE))?devModeSize:sizeof (DEVMODE));
|
|
if (!DocumentProperties (NULL, printerHandle, (PTSTR)node, devMode, NULL, DM_OUT_BUFFER) == IDOK) {
|
|
PmReleaseMemory (g_PrintersPool, devMode);
|
|
devMode = NULL;
|
|
} else {
|
|
printerInfo->pDevMode = devMode;
|
|
}
|
|
}
|
|
}
|
|
if (devMode) {
|
|
if ((devMode->dmFields & DM_ORIENTATION) && (printerData->dmFields & DM_ORIENTATION)) {
|
|
devMode->dmOrientation = printerData->dmOrientation;
|
|
}
|
|
if ((devMode->dmFields & DM_PAPERSIZE) && (printerData->dmFields & DM_PAPERSIZE)) {
|
|
devMode->dmPaperSize = printerData->dmPaperSize;
|
|
}
|
|
if ((devMode->dmFields & DM_PAPERLENGTH) && (printerData->dmFields & DM_PAPERLENGTH)) {
|
|
devMode->dmPaperLength = printerData->dmPaperLength;
|
|
}
|
|
if ((devMode->dmFields & DM_PAPERWIDTH) && (printerData->dmFields & DM_PAPERWIDTH)) {
|
|
devMode->dmPaperWidth = printerData->dmPaperWidth;
|
|
}
|
|
if ((devMode->dmFields & DM_SCALE) && (printerData->dmFields & DM_SCALE)) {
|
|
devMode->dmScale = printerData->dmScale;
|
|
}
|
|
if ((devMode->dmFields & DM_POSITION) && (printerData->dmFields & DM_POSITION)) {
|
|
CopyMemory (&devMode->dmScale, &printerData->dmScale, sizeof(POINTL));
|
|
}
|
|
if ((devMode->dmFields & DM_NUP) && (printerData->dmFields & DM_NUP)) {
|
|
devMode->dmNup = printerData->dmNup;
|
|
}
|
|
if ((devMode->dmFields & DM_COPIES) && (printerData->dmFields & DM_COPIES)) {
|
|
devMode->dmCopies = printerData->dmCopies;
|
|
}
|
|
if ((devMode->dmFields & DM_DEFAULTSOURCE) && (printerData->dmFields & DM_DEFAULTSOURCE)) {
|
|
devMode->dmDefaultSource = printerData->dmDefaultSource;
|
|
}
|
|
if ((devMode->dmFields & DM_PRINTQUALITY) && (printerData->dmFields & DM_PRINTQUALITY)) {
|
|
devMode->dmPrintQuality = printerData->dmPrintQuality;
|
|
}
|
|
if ((devMode->dmFields & DM_COLOR) && (printerData->dmFields & DM_COLOR)) {
|
|
devMode->dmColor = printerData->dmColor;
|
|
}
|
|
if ((devMode->dmFields & DM_DUPLEX) && (printerData->dmFields & DM_DUPLEX)) {
|
|
devMode->dmDuplex = printerData->dmDuplex;
|
|
}
|
|
if ((devMode->dmFields & DM_YRESOLUTION) && (printerData->dmFields & DM_YRESOLUTION)) {
|
|
devMode->dmYResolution = printerData->dmYResolution;
|
|
}
|
|
if ((devMode->dmFields & DM_TTOPTION) && (printerData->dmFields & DM_TTOPTION)) {
|
|
devMode->dmTTOption = printerData->dmTTOption;
|
|
}
|
|
if ((devMode->dmFields & DM_COLLATE) && (printerData->dmFields & DM_COLLATE)) {
|
|
devMode->dmCollate = printerData->dmCollate;
|
|
}
|
|
if ((devMode->dmFields & DM_FORMNAME) && (printerData->dmFields & DM_FORMNAME)) {
|
|
CopyMemory (devMode->dmFormName, printerData->dmFormName, sizeof (devMode->dmFormName));
|
|
}
|
|
if ((devMode->dmFields & DM_LOGPIXELS) && (printerData->dmFields & DM_LOGPIXELS)) {
|
|
devMode->dmLogPixels = printerData->dmLogPixels;
|
|
}
|
|
if ((devMode->dmFields & DM_BITSPERPEL) && (printerData->dmFields & DM_BITSPERPEL)) {
|
|
devMode->dmBitsPerPel = printerData->dmBitsPerPel;
|
|
}
|
|
if ((devMode->dmFields & DM_PELSWIDTH) && (printerData->dmFields & DM_PELSWIDTH)) {
|
|
devMode->dmPelsWidth = printerData->dmPelsWidth;
|
|
}
|
|
if ((devMode->dmFields & DM_PELSHEIGHT) && (printerData->dmFields & DM_PELSHEIGHT)) {
|
|
devMode->dmPelsHeight = printerData->dmPelsHeight;
|
|
}
|
|
if ((devMode->dmFields & DM_DISPLAYFLAGS) && (printerData->dmFields & DM_DISPLAYFLAGS)) {
|
|
devMode->dmDisplayFlags = printerData->dmDisplayFlags;
|
|
}
|
|
if ((devMode->dmFields & DM_DISPLAYFREQUENCY) && (printerData->dmFields & DM_DISPLAYFREQUENCY)) {
|
|
devMode->dmDisplayFrequency = printerData->dmDisplayFrequency;
|
|
}
|
|
if ((devMode->dmFields & DM_ICMMETHOD) && (printerData->dmFields & DM_ICMMETHOD)) {
|
|
devMode->dmICMMethod = printerData->dmICMMethod;
|
|
}
|
|
if ((devMode->dmFields & DM_ICMINTENT) && (printerData->dmFields & DM_ICMINTENT)) {
|
|
devMode->dmICMIntent = printerData->dmICMIntent;
|
|
}
|
|
if ((devMode->dmFields & DM_MEDIATYPE) && (printerData->dmFields & DM_MEDIATYPE)) {
|
|
devMode->dmMediaType = printerData->dmMediaType;
|
|
}
|
|
if ((devMode->dmFields & DM_DITHERTYPE) && (printerData->dmFields & DM_DITHERTYPE)) {
|
|
devMode->dmDitherType = printerData->dmDitherType;
|
|
}
|
|
if ((devMode->dmFields & DM_PANNINGWIDTH) && (printerData->dmFields & DM_PANNINGWIDTH)) {
|
|
devMode->dmPanningWidth = printerData->dmPanningWidth;
|
|
}
|
|
if ((devMode->dmFields & DM_PANNINGHEIGHT) && (printerData->dmFields & DM_PANNINGHEIGHT)) {
|
|
devMode->dmPanningHeight = printerData->dmPanningHeight;
|
|
}
|
|
if (DocumentProperties (NULL, printerHandle, (PTSTR)node, devMode, devMode, DM_IN_BUFFER | DM_OUT_BUFFER) == IDOK) {
|
|
SetPrinter (printerHandle, 2, (PBYTE)printerInfo, 0);
|
|
} else {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to restore printer %s settings", node));
|
|
}
|
|
if (devMode != printerInfo->pDevMode) {
|
|
PmReleaseMemory (g_PrintersPool, devMode);
|
|
}
|
|
} else {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to restore printer %s settings", node));
|
|
}
|
|
} else {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to restore printer %s settings", node));
|
|
}
|
|
PmReleaseMemory (g_PrintersPool, printerInfo);
|
|
} else {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to restore printer %s settings", node));
|
|
}
|
|
ClosePrinter (printerHandle);
|
|
} else {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to restore printer %s settings", node));
|
|
}
|
|
}
|
|
if (printerData && printerData->Default) {
|
|
result = SetDefaultPrinter (node);
|
|
if (!result) {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to set %s as default printer", node));
|
|
}
|
|
}
|
|
} else {
|
|
DEBUGMSG ((DBG_PRINTERS, "Failed to add printer connection for %s", node));
|
|
}
|
|
}
|
|
}
|
|
IsmDestroyObjectString (node);
|
|
IsmDestroyObjectString (leaf);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
BOOL
|
|
ReplacePrinter (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName,
|
|
IN PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
BOOL result = TRUE;
|
|
|
|
if (g_DelayPrintersOp) {
|
|
|
|
// we need to delay this operation
|
|
// record delayed printer replace operation
|
|
IsmRecordDelayedOperation (
|
|
JRNOP_REPLACE,
|
|
g_PrinterTypeId,
|
|
ObjectName,
|
|
ObjectContent
|
|
);
|
|
result = TRUE;
|
|
|
|
} else {
|
|
|
|
// we are going to delete any existing printers with this name,
|
|
// and create a new one
|
|
if (DoesPrinterExist (ObjectName)) {
|
|
result = RemovePrinter (ObjectName);
|
|
}
|
|
if (result) {
|
|
result = CreatePrinter (ObjectName, ObjectContent);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
PCTSTR
|
|
ConvertPrinterToMultiSz (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName,
|
|
IN PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
PCTSTR node, leaf;
|
|
PTSTR result = NULL;
|
|
BOOL bresult = TRUE;
|
|
PPRINTER_DATA printerData;
|
|
|
|
if (IsmCreateObjectStringsFromHandle (ObjectName, &node, &leaf)) {
|
|
|
|
MYASSERT (!leaf);
|
|
|
|
g_PrinterConversionBuff.End = 0;
|
|
|
|
GbCopyQuotedString (&g_PrinterConversionBuff, node);
|
|
|
|
MYASSERT (ObjectContent->Details.DetailsSize == 0);
|
|
MYASSERT (!ObjectContent->ContentInFile);
|
|
MYASSERT (ObjectContent->MemoryContent.ContentSize = sizeof (PRINTER_DATA));
|
|
|
|
if ((!ObjectContent->ContentInFile) &&
|
|
(ObjectContent->MemoryContent.ContentSize) &&
|
|
(ObjectContent->MemoryContent.ContentSize == sizeof (PRINTER_DATA)) &&
|
|
(ObjectContent->MemoryContent.ContentBytes)
|
|
) {
|
|
printerData = (PPRINTER_DATA)ObjectContent->MemoryContent.ContentBytes;
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->Default
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmFields
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmOrientation
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPaperSize
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPaperLength
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPaperWidth
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPosition.x
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPosition.y
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmScale
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmCopies
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmDefaultSource
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPrintQuality
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmColor
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmDuplex
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmYResolution
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmTTOption
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmCollate
|
|
);
|
|
GbCopyQuotedString (&g_PrinterConversionBuff, printerData->dmFormName);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmLogPixels
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmBitsPerPel
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPelsWidth
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPelsHeight
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmDisplayFlags
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmNup
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmDisplayFrequency
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmICMMethod
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmICMIntent
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmMediaType
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmDitherType
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPanningWidth
|
|
);
|
|
wsprintf (
|
|
(PTSTR) GbGrow (&g_PrinterConversionBuff, (sizeof (DWORD) * 2 + 3) * sizeof (TCHAR)),
|
|
TEXT("0x%08X"),
|
|
printerData->dmPanningHeight
|
|
);
|
|
} else {
|
|
bresult = FALSE;
|
|
}
|
|
|
|
if (bresult) {
|
|
GbCopyString (&g_PrinterConversionBuff, TEXT(""));
|
|
result = IsmGetMemory (g_PrinterConversionBuff.End);
|
|
CopyMemory (result, g_PrinterConversionBuff.Buf, g_PrinterConversionBuff.End);
|
|
}
|
|
|
|
g_PrinterConversionBuff.End = 0;
|
|
|
|
IsmDestroyObjectString (node);
|
|
IsmDestroyObjectString (leaf);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
BOOL
|
|
ConvertMultiSzToPrinter (
|
|
IN PCTSTR ObjectMultiSz,
|
|
OUT MIG_OBJECTSTRINGHANDLE *ObjectName,
|
|
OUT PMIG_CONTENT ObjectContent OPTIONAL
|
|
)
|
|
{
|
|
MULTISZ_ENUM multiSzEnum;
|
|
PCTSTR name = NULL;
|
|
PRINTER_DATA printerData;
|
|
DWORD dummy;
|
|
UINT index;
|
|
|
|
g_PrinterConversionBuff.End = 0;
|
|
|
|
ZeroMemory (&printerData, sizeof (PRINTER_DATA));
|
|
|
|
if (EnumFirstMultiSz (&multiSzEnum, ObjectMultiSz)) {
|
|
index = 0;
|
|
do {
|
|
if (index == 0) {
|
|
name = multiSzEnum.CurrentString;
|
|
}
|
|
if (index == 1) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.Default = dummy;
|
|
}
|
|
if (index == 2) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmFields = dummy;
|
|
}
|
|
if (index == 3) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmOrientation = (SHORT)dummy;
|
|
}
|
|
if (index == 4) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPaperSize = (SHORT)dummy;
|
|
}
|
|
if (index == 5) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPaperLength = (SHORT)dummy;
|
|
}
|
|
if (index == 6) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPaperWidth = (SHORT)dummy;
|
|
}
|
|
if (index == 7) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPosition.x = dummy;
|
|
}
|
|
if (index == 8) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPosition.y = dummy;
|
|
}
|
|
if (index == 9) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmScale = (SHORT)dummy;
|
|
}
|
|
if (index == 10) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmCopies = (SHORT)dummy;
|
|
}
|
|
if (index == 11) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmDefaultSource = (SHORT)dummy;
|
|
}
|
|
if (index == 12) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPrintQuality = (SHORT)dummy;
|
|
}
|
|
if (index == 13) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmColor = (SHORT)dummy;
|
|
}
|
|
if (index == 14) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmDuplex = (SHORT)dummy;
|
|
}
|
|
if (index == 15) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmYResolution = (SHORT)dummy;
|
|
}
|
|
if (index == 16) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmTTOption = (SHORT)dummy;
|
|
}
|
|
if (index == 17) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmCollate = (SHORT)dummy;
|
|
}
|
|
if (index == 18) {
|
|
if (!StringIMatch (multiSzEnum.CurrentString, TEXT("<empty>"))) {
|
|
StringCopyTcharCount (printerData.dmFormName, multiSzEnum.CurrentString, CCHFORMNAME);
|
|
}
|
|
}
|
|
if (index == 19) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmLogPixels = (WORD)dummy;
|
|
}
|
|
if (index == 20) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmBitsPerPel = dummy;
|
|
}
|
|
if (index == 21) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPelsWidth = dummy;
|
|
}
|
|
if (index == 22) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPelsHeight = dummy;
|
|
}
|
|
if (index == 23) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmDisplayFlags = dummy;
|
|
}
|
|
if (index == 24) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmNup = dummy;
|
|
}
|
|
if (index == 25) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmDisplayFrequency = dummy;
|
|
}
|
|
if (index == 26) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmICMMethod = dummy;
|
|
}
|
|
if (index == 27) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmICMIntent = dummy;
|
|
}
|
|
if (index == 28) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmMediaType = dummy;
|
|
}
|
|
if (index == 29) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmDitherType = dummy;
|
|
}
|
|
if (index == 30) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPanningWidth = dummy;
|
|
}
|
|
if (index == 31) {
|
|
_stscanf (multiSzEnum.CurrentString, TEXT("%lx"), &dummy);
|
|
printerData.dmPanningHeight = dummy;
|
|
}
|
|
index ++;
|
|
} while (EnumNextMultiSz (&multiSzEnum));
|
|
}
|
|
|
|
if (!name) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (ObjectContent) {
|
|
|
|
ObjectContent->ContentInFile = FALSE;
|
|
ObjectContent->MemoryContent.ContentSize = sizeof (PRINTER_DATA);
|
|
ObjectContent->MemoryContent.ContentBytes = IsmGetMemory (ObjectContent->MemoryContent.ContentSize);
|
|
CopyMemory (
|
|
(PBYTE)ObjectContent->MemoryContent.ContentBytes,
|
|
&printerData,
|
|
ObjectContent->MemoryContent.ContentSize
|
|
);
|
|
|
|
ObjectContent->Details.DetailsSize = 0;
|
|
ObjectContent->Details.DetailsData = NULL;
|
|
}
|
|
*ObjectName = IsmCreateObjectHandle (name, NULL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
PCTSTR
|
|
GetNativePrinterName (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName
|
|
)
|
|
{
|
|
PCTSTR node, leaf;
|
|
PTSTR nodePtr = NULL, nodeBegin = NULL;
|
|
UINT strSize = 0;
|
|
PTSTR result = NULL;
|
|
|
|
if (IsmCreateObjectStringsFromHandle (ObjectName, &node, &leaf)) {
|
|
if (node) {
|
|
nodePtr = _tcsrchr (node, TEXT('\\'));
|
|
if (nodePtr) {
|
|
*nodePtr = 0;
|
|
nodePtr ++;
|
|
}
|
|
nodeBegin = (PTSTR)node;
|
|
while (*nodeBegin == TEXT('\\')) {
|
|
nodeBegin ++;
|
|
}
|
|
if (nodePtr) {
|
|
strSize = CharCount (nodePtr) + \
|
|
CharCount (TEXT(" on ")) + \
|
|
CharCount (nodeBegin) + \
|
|
1;
|
|
result = IsmGetMemory (strSize * sizeof (TCHAR));
|
|
_tcscpy (result, nodePtr);
|
|
_tcscat (result, TEXT(" on "));
|
|
_tcscat (result, nodeBegin);
|
|
} else {
|
|
strSize = CharCount (nodeBegin) + \
|
|
1;
|
|
result = IsmGetMemory (strSize * sizeof (TCHAR));
|
|
_tcscpy (result, nodeBegin);
|
|
}
|
|
}
|
|
IsmDestroyObjectString (node);
|
|
IsmDestroyObjectString (leaf);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
PMIG_CONTENT
|
|
ConvertPrinterContentToUnicode (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName,
|
|
IN PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
PMIG_CONTENT result = NULL;
|
|
|
|
if (!ObjectContent) {
|
|
return result;
|
|
}
|
|
|
|
if (ObjectContent->ContentInFile) {
|
|
return result;
|
|
}
|
|
|
|
result = IsmGetMemory (sizeof (MIG_CONTENT));
|
|
|
|
if (result) {
|
|
|
|
CopyMemory (result, ObjectContent, sizeof (MIG_CONTENT));
|
|
|
|
if ((ObjectContent->MemoryContent.ContentSize != 0) &&
|
|
(ObjectContent->MemoryContent.ContentBytes != NULL)
|
|
) {
|
|
// convert Printer content
|
|
result->MemoryContent.ContentBytes = IsmGetMemory (sizeof (PRINTER_DATAW));
|
|
if (result->MemoryContent.ContentBytes) {
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->Default =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->Default;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmFields =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmFields;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmOrientation =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmOrientation;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPaperSize =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPaperSize;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPaperLength =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPaperLength;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPaperWidth =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPaperWidth;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPosition.x =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPosition.x;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPosition.y =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPosition.y;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmScale =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmScale;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmCopies =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmCopies;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmDefaultSource =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmDefaultSource;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPrintQuality =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPrintQuality;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmColor =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmColor;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmDuplex =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmDuplex;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmYResolution =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmYResolution;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmTTOption =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmTTOption;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmCollate =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmCollate;
|
|
DirectDbcsToUnicodeN (
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmFormName,
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmFormName,
|
|
CCHFORMNAME
|
|
);
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmLogPixels =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmLogPixels;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmBitsPerPel =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmBitsPerPel;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPelsWidth =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPelsWidth;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPelsHeight =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPelsHeight;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmDisplayFlags =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmDisplayFlags;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmNup =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmNup;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmDisplayFrequency =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmDisplayFrequency;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmICMMethod =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmICMMethod;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmICMIntent =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmICMIntent;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmMediaType =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmMediaType;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmDitherType =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmDitherType;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPanningWidth =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPanningWidth;
|
|
((PPRINTER_DATAW)result->MemoryContent.ContentBytes)->dmPanningHeight =
|
|
((PPRINTER_DATAA)ObjectContent->MemoryContent.ContentBytes)->dmPanningHeight;
|
|
result->MemoryContent.ContentSize = sizeof (PRINTER_DATAW);
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
PMIG_CONTENT
|
|
ConvertPrinterContentToAnsi (
|
|
IN MIG_OBJECTSTRINGHANDLE ObjectName,
|
|
IN PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
PMIG_CONTENT result = NULL;
|
|
|
|
if (!ObjectContent) {
|
|
return result;
|
|
}
|
|
|
|
if (ObjectContent->ContentInFile) {
|
|
return result;
|
|
}
|
|
|
|
result = IsmGetMemory (sizeof (MIG_CONTENT));
|
|
|
|
if (result) {
|
|
|
|
CopyMemory (result, ObjectContent, sizeof (MIG_CONTENT));
|
|
|
|
if ((ObjectContent->MemoryContent.ContentSize != 0) &&
|
|
(ObjectContent->MemoryContent.ContentBytes != NULL)
|
|
) {
|
|
// convert Printer content
|
|
result->MemoryContent.ContentBytes = IsmGetMemory (sizeof (PRINTER_DATAW));
|
|
if (result->MemoryContent.ContentBytes) {
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->Default =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->Default;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmFields =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmFields;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmOrientation =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmOrientation;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPaperSize =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPaperSize;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPaperLength =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPaperLength;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPaperWidth =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPaperWidth;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPosition.x =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPosition.x;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPosition.y =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPosition.y;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmScale =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmScale;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmCopies =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmCopies;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmDefaultSource =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmDefaultSource;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPrintQuality =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPrintQuality;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmColor =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmColor;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmDuplex =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmDuplex;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmYResolution =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmYResolution;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmTTOption =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmTTOption;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmCollate =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmCollate;
|
|
DirectUnicodeToDbcsN (
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmFormName,
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmFormName,
|
|
CCHFORMNAME
|
|
);
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmLogPixels =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmLogPixels;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmBitsPerPel =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmBitsPerPel;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPelsWidth =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPelsWidth;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPelsHeight =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPelsHeight;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmDisplayFlags =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmDisplayFlags;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmNup =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmNup;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmDisplayFrequency =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmDisplayFrequency;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmICMMethod =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmICMMethod;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmICMIntent =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmICMIntent;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmMediaType =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmMediaType;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmDitherType =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmDitherType;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPanningWidth =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPanningWidth;
|
|
((PPRINTER_DATAA)result->MemoryContent.ContentBytes)->dmPanningHeight =
|
|
((PPRINTER_DATAW)ObjectContent->MemoryContent.ContentBytes)->dmPanningHeight;
|
|
result->MemoryContent.ContentSize = sizeof (PRINTER_DATAA);
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
BOOL
|
|
FreeConvertedPrinterContent (
|
|
IN PMIG_CONTENT ObjectContent
|
|
)
|
|
{
|
|
if (!ObjectContent) {
|
|
return TRUE;
|
|
}
|
|
|
|
if (ObjectContent->MemoryContent.ContentBytes) {
|
|
IsmReleaseMemory (ObjectContent->MemoryContent.ContentBytes);
|
|
}
|
|
|
|
IsmReleaseMemory (ObjectContent);
|
|
|
|
return TRUE;
|
|
}
|
|
|