mirror of https://github.com/tongzx/nt5src
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.
2420 lines
94 KiB
2420 lines
94 KiB
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1990 - 2000
|
|
All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
dbgspl.c
|
|
|
|
Abstract:
|
|
|
|
This module provides all the public exported APIs relating to Printer
|
|
and Job management for the Local Print Providor
|
|
|
|
Author:
|
|
|
|
Krishna Ganugapati (KrishnaG) 1-July-1993
|
|
|
|
Revision History:
|
|
|
|
KrishnaG: Created: 1-July-1993 (imported most of IanJa's stuff)
|
|
KrishnaG: Added: 7-July-1993 (added AndrewBe's UnicodeAnsi conversion routines)
|
|
KrishnaG Added: 3-Aug-1993 (added DevMode/SecurityDescriptor dumps)
|
|
MattFe 7 NOV 94 win32spl debug extentions
|
|
|
|
To do:
|
|
|
|
Write a generic dump unicode string (reduce the code!!)
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#include "dbglocal.h"
|
|
#include "dbgsec.h"
|
|
|
|
#define NULL_TERMINATED 0
|
|
#define VERBOSE_ON 1
|
|
#define VERBOSE_OFF 0
|
|
|
|
|
|
typedef void (*PNTSD_OUTPUT_ROUTINE)(char *, ...);
|
|
|
|
BOOL
|
|
DbgDumpIniPrintProc(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIPRINTPROC pIniPrintProc
|
|
);
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniDriver(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIDRIVER pIniDriver
|
|
);
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniEnvironment(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIENVIRONMENT pIniEnvironment
|
|
);
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniNetPrint(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PININETPRINT pIniNetPrint
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpIniMonitor(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIMONITOR pIniMonitor
|
|
);
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniPort(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIPORT pIniPort
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpIniPrinter(
|
|
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIPRINTER pIniPrinter
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpIniForm(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIFORM pForm
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpIniJob(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIJOB pIniJob
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpProvidor(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
LPPROVIDOR pProvidor
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpSpool(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PSPOOL pSpool
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpShadowFile(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PSHADOWFILE pShadowFile
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpShadowFile2(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PSHADOWFILE_2 pShadowFile
|
|
);
|
|
|
|
VOID
|
|
PrintData(
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
LPSTR TypeString,
|
|
LPSTR VarString,
|
|
...
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpWCacheIniPrinter(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PWCACHEINIPRINTEREXTRA pWCacheIniPrinter
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpWSpool(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PWSPOOL pSpool
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpIniSpooler(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINISPOOLER pIniSpooler
|
|
);
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniVersion(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PINIVERSION pIniVersion
|
|
);
|
|
|
|
BOOL
|
|
DbgDumpPrintHandle(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
PPRINTHANDLE pPrintHandle
|
|
);
|
|
|
|
|
|
typedef struct _DBG_PRINTER_ACCESS
|
|
{
|
|
DWORD Attribute;
|
|
LPSTR String;
|
|
} DBG_PRINTER_ACCESS, *PDBG_PRINTER_ACCESS;
|
|
|
|
|
|
DBG_PRINTER_ACCESS
|
|
PrinterAccessTable[] =
|
|
{
|
|
SERVER_ACCESS_ADMINISTER ,"Server_Access_Administer",
|
|
SERVER_ACCESS_ENUMERATE ,"Server_Access_Enumerate",
|
|
PRINTER_ACCESS_ADMINISTER ,"Printer_Access_Administer",
|
|
PRINTER_ACCESS_USE ,"Printer_Access_Use",
|
|
JOB_ACCESS_ADMINISTER ,"Job_Access_Administer"
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct _DBG_SPOOLER_FLAGS
|
|
{
|
|
DWORD SpoolerFlags;
|
|
LPSTR String;
|
|
} DBG_SPOOLER_FLAGS, *PDBG_SPOOLER_FLAGS;
|
|
|
|
|
|
DBG_SPOOLER_FLAGS
|
|
SpoolerFlagsTable[] =
|
|
|
|
{
|
|
SPL_UPDATE_WININI_DEVICES ,"Update_WinIni_Devices",
|
|
SPL_PRINTER_CHANGES ,"Printer_Changes",
|
|
SPL_LOG_EVENTS ,"Log_Events",
|
|
SPL_FORMS_CHANGE ,"Forms_Change",
|
|
SPL_BROADCAST_CHANGE ,"Broadcast_Change",
|
|
SPL_SECURITY_CHECK ,"Security_Check",
|
|
SPL_OPEN_CREATE_PORTS ,"Open_Create_Ports",
|
|
SPL_FAIL_OPEN_PRINTERS_PENDING_DELETION ,"Fail_Open_Printers_Pending_Deletion",
|
|
SPL_REMOTE_HANDLE_CHECK ,"Remote_Handle_Check"
|
|
};
|
|
|
|
|
|
|
|
typedef struct _DBG_PRINTER_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_PRINTER_STATUS, *PDBG_PRINTER_STATUS;
|
|
|
|
|
|
DBG_PRINTER_STATUS
|
|
PrinterStatusTable[] =
|
|
|
|
{
|
|
PRINTER_ZOMBIE_OBJECT, "Zombie_Object",
|
|
PRINTER_PENDING_CREATION, "Pending_Creation",
|
|
PRINTER_OK, "OK",
|
|
PRINTER_FROM_REG, "From_Reg",
|
|
PRINTER_WAS_SHARED, "Was_Shared",
|
|
|
|
PRINTER_ERROR, "Error",
|
|
PRINTER_PAPER_JAM, "PaperJam",
|
|
PRINTER_PAPEROUT, "PaperOut",
|
|
PRINTER_MANUAL_FEED, "ManualFeed",
|
|
PRINTER_PAPER_PROBLEM, "PaperProblem",
|
|
PRINTER_OFFLINE, "OffLine",
|
|
PRINTER_IO_ACTIVE, "IOActive",
|
|
PRINTER_BUSY, "Busy",
|
|
PRINTER_PRINTING, "Printing",
|
|
PRINTER_OUTPUT_BIN_FULL, "OutputBinFull",
|
|
PRINTER_NOT_AVAILABLE, "NotAvailable",
|
|
PRINTER_WAITING, "Waiting",
|
|
PRINTER_PROCESSING, "Processing",
|
|
PRINTER_INITIALIZING, "Initializing",
|
|
PRINTER_WARMING_UP, "WarmingUp",
|
|
PRINTER_TONER_LOW, "TonerLow",
|
|
PRINTER_NO_TONER, "NoToner",
|
|
PRINTER_PAGE_PUNT, "PagePunt",
|
|
PRINTER_USER_INTERVENTION, "UserIntervention",
|
|
PRINTER_OUT_OF_MEMORY, "OutOfMemory",
|
|
PRINTER_DOOR_OPEN, "DoorOpen",
|
|
PRINTER_SERVER_UNKNOWN, "ServerUnknown",
|
|
|
|
PRINTER_PAUSED, "Paused",
|
|
PRINTER_PENDING_DELETION, "Pending_Deletion",
|
|
};
|
|
|
|
typedef struct _DBG_EXTERNAL_PRINTER_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_EXTERNAL_PRINTER_STATUS, *PDBG_EXTERNAL_PRINTER_STATUS;
|
|
|
|
|
|
DBG_EXTERNAL_PRINTER_STATUS
|
|
ExternalPrinterStatusTable[] =
|
|
|
|
{
|
|
PRINTER_STATUS_PAUSED , "Paused",
|
|
PRINTER_STATUS_ERROR , "Error",
|
|
PRINTER_STATUS_PENDING_DELETION , "Pending_Deletion",
|
|
PRINTER_STATUS_PAPER_JAM , "Paper_Jam",
|
|
PRINTER_STATUS_PAPER_OUT , "Paper_Out",
|
|
PRINTER_STATUS_MANUAL_FEED , "Manual_Feed",
|
|
PRINTER_STATUS_PAPER_PROBLEM , "Paper_Problem",
|
|
PRINTER_STATUS_OFFLINE , "OffLine",
|
|
PRINTER_STATUS_IO_ACTIVE , "IO_Active",
|
|
PRINTER_STATUS_BUSY , "Busy",
|
|
PRINTER_STATUS_PRINTING , "Printing",
|
|
PRINTER_STATUS_OUTPUT_BIN_FULL , "Output_Bin_Full",
|
|
PRINTER_STATUS_NOT_AVAILABLE , "Not_Available",
|
|
PRINTER_STATUS_WAITING , "Waiting",
|
|
PRINTER_STATUS_PROCESSING , "Processing",
|
|
PRINTER_STATUS_INITIALIZING , "Initializing",
|
|
PRINTER_STATUS_WARMING_UP , "Warming_Up",
|
|
PRINTER_STATUS_TONER_LOW , "Toner_Low",
|
|
PRINTER_STATUS_NO_TONER , "No_Toner",
|
|
PRINTER_STATUS_PAGE_PUNT , "Page_Punt",
|
|
PRINTER_STATUS_USER_INTERVENTION , "User_Intervention",
|
|
PRINTER_STATUS_OUT_OF_MEMORY , "Out_Of_Memory",
|
|
PRINTER_STATUS_DOOR_OPEN , "Door_Open",
|
|
PRINTER_STATUS_SERVER_UNKNOWN , "Server_Unknown"
|
|
};
|
|
|
|
typedef struct _DBG_PORT_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_PORT_STATUS, *PDBG_PORT_STATUS;
|
|
|
|
DBG_PORT_STATUS
|
|
PortStatusTable[] =
|
|
|
|
{
|
|
PORT_STATUS_OFFLINE , "Offline",
|
|
PORT_STATUS_PAPER_JAM , "PaperJam",
|
|
PORT_STATUS_PAPER_OUT , "PaperOut",
|
|
PORT_STATUS_OUTPUT_BIN_FULL , "OutputBinFull",
|
|
PORT_STATUS_PAPER_PROBLEM , "PaperJam",
|
|
PORT_STATUS_NO_TONER , "NoToner",
|
|
PORT_STATUS_DOOR_OPEN , "DoorOpen",
|
|
PORT_STATUS_USER_INTERVENTION , "UserIntervention",
|
|
PORT_STATUS_OUT_OF_MEMORY , "OutOfMemory",
|
|
|
|
PORT_STATUS_TONER_LOW , "TonerLow",
|
|
|
|
PORT_STATUS_WARMING_UP , "WarmingUp",
|
|
PORT_STATUS_POWER_SAVE , "PowerSave"
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _DBG_PRINTER_ATTRIBUTE
|
|
{
|
|
DWORD Attribute;
|
|
LPSTR String;
|
|
} DBG_PRINTER_ATTRIBUTE, *PDBG_PRINTER_ATTRIBUTE;
|
|
|
|
|
|
DBG_PRINTER_ATTRIBUTE
|
|
ChangeStatusTable[] =
|
|
|
|
{
|
|
STATUS_CHANGE_FORMING, "Forming",
|
|
STATUS_CHANGE_VALID, "Valid",
|
|
STATUS_CHANGE_CLOSING, "Closing",
|
|
STATUS_CHANGE_CLIENT, "Client",
|
|
STATUS_CHANGE_ACTIVE, "Active",
|
|
|
|
STATUS_CHANGE_INFO, "Info",
|
|
|
|
STATUS_CHANGE_ACTIVE_REQ, "ActiveRequest",
|
|
|
|
STATUS_CHANGE_DISCARDED, "Discarded",
|
|
|
|
STATUS_CHANGE_DISCARDNOTED, "DiscardNoted",
|
|
};
|
|
|
|
DBG_PRINTER_ATTRIBUTE
|
|
PrinterAttributeTable[] =
|
|
|
|
{
|
|
PRINTER_ATTRIBUTE_QUEUED, "Queued",
|
|
PRINTER_ATTRIBUTE_DIRECT, "Direct",
|
|
PRINTER_ATTRIBUTE_DEFAULT, "Default",
|
|
PRINTER_ATTRIBUTE_SHARED, "Shared",
|
|
PRINTER_ATTRIBUTE_NETWORK, "Network",
|
|
PRINTER_ATTRIBUTE_LOCAL, "Local",
|
|
PRINTER_ATTRIBUTE_HIDDEN, "Hidden",
|
|
PRINTER_ATTRIBUTE_ENABLE_DEVQ, "Enable_DevQ",
|
|
PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS, "KeepPrintedJobs",
|
|
PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST, "DoCompleteFirst",
|
|
PRINTER_ATTRIBUTE_ENABLE_BIDI, "EnableBidi",
|
|
PRINTER_ATTRIBUTE_FAX, "Fax",
|
|
PRINTER_ATTRIBUTE_WORK_OFFLINE, "Offline"
|
|
};
|
|
|
|
|
|
typedef struct _DBG_JOB_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_JOB_STATUS, *PDBG_JOB_STATUS;
|
|
|
|
DBG_JOB_STATUS
|
|
JobStatusTable[] =
|
|
|
|
{
|
|
JOB_PAUSED, "Paused",
|
|
JOB_ERROR, "Error",
|
|
JOB_OFFLINE, "OffLine",
|
|
JOB_PAPEROUT, "PaperOut",
|
|
|
|
JOB_PENDING_DELETION, "Deleting",
|
|
JOB_SPOOLING, "Spooling",
|
|
JOB_PRINTING, "Printing",
|
|
JOB_PRINTED, "Printed",
|
|
JOB_BLOCKED_DEVQ, "Blocked_DevQ",
|
|
JOB_DELETED, "Deleted",
|
|
|
|
JOB_DESPOOLING, "Despooling",
|
|
JOB_DIRECT, "Direct",
|
|
JOB_COMPLETE, "Complete",
|
|
JOB_RESTART, "Restart",
|
|
JOB_REMOTE, "Remote",
|
|
JOB_NOTIFICATION_SENT, "Notification_Sent",
|
|
JOB_PRINT_TO_FILE, "Print_To_File",
|
|
JOB_TYPE_ADDJOB, "AddJob",
|
|
JOB_SCHEDULE_JOB, "Schedule_Job",
|
|
JOB_TIMEOUT, "Timeout",
|
|
JOB_ABANDON, "Abandon",
|
|
JOB_TRUE_EOJ, "TrueEOJ",
|
|
JOB_COMPOUND, "Compound",
|
|
JOB_HIDDEN, "Hidden",
|
|
JOB_TYPE_OPTIMIZE, "MemoryMap Optimization",
|
|
JOB_PP_CLOSE, "Print Proccessor Close",
|
|
JOB_DOWNLEVEL, "Downlevel Job"
|
|
};
|
|
|
|
typedef struct _DBG_PINIPORT_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_PINIPORT_STATUS, *PDBG_PINIPORT_STATUS;
|
|
|
|
|
|
DBG_PINIPORT_STATUS
|
|
pIniPortStatusTable[]=
|
|
{
|
|
PP_PAUSED ,"Paused",
|
|
PP_WAITING ,"Waiting",
|
|
PP_RUNTHREAD ,"RunThread",
|
|
PP_THREADRUNNING ,"ThreadRunning",
|
|
PP_RESTART ,"Restart",
|
|
PP_CHECKMON ,"CheckMon",
|
|
PP_STOPMON ,"StopMon",
|
|
PP_QPROCCHECK ,"QProcCheck",
|
|
PP_QPROCPAUSE ,"QProcPause",
|
|
PP_QPROCABORT ,"QProctAbort",
|
|
PP_QPROCCLOSE ,"QProcClose",
|
|
PP_PAUSEAFTER ,"PauseAfter",
|
|
PP_MONITORRUNNING ,"MonitorRunning",
|
|
PP_RUNMONITOR ,"RunMonitor",
|
|
PP_MONITOR ,"Monitor",
|
|
PP_FILE ,"File",
|
|
PP_ERROR ,"Error",
|
|
PP_WARNING ,"Warning",
|
|
PP_INFORMATIONAL ,"Informational",
|
|
PP_DELETING ,"Deleting",
|
|
PP_STARTDOC ,"StartDoc",
|
|
PP_PLACEHOLDER ,"Placeholder",
|
|
};
|
|
|
|
|
|
|
|
typedef struct _DBG_WSPOOL_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_WSPOOL_STATUS, *PDBG_WSPOOL_STATUS;
|
|
|
|
|
|
DBG_WSPOOL_STATUS
|
|
WSpoolStatusTable[]=
|
|
{
|
|
WSPOOL_STATUS_STARTDOC ,"StartDoc",
|
|
WSPOOL_STATUS_BEGINPAGE ,"BeginPage",
|
|
WSPOOL_STATUS_TEMP_CONNECTION ,"Temp_Connection",
|
|
WSPOOL_STATUS_OPEN_ERROR ,"Open_Error",
|
|
WSPOOL_STATUS_PRINT_FILE ,"Print_File",
|
|
WSPOOL_STATUS_USE_CACHE ,"Use_Cache",
|
|
WSPOOL_STATUS_NO_RPC_HANDLE ,"No_Rpc_Handle",
|
|
WSPOOL_STATUS_PENDING_DELETE ,"Pending_delete",
|
|
WSPOOL_STATUS_RESETPRINTER_PENDING ,"ResetPrinter_Pending"
|
|
};
|
|
|
|
|
|
typedef struct _DBG_PSPOOL_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_PSPOOL_STATUS, *PDBG_PSPOOL_STATUS;
|
|
|
|
|
|
DBG_PSPOOL_STATUS
|
|
pSpoolStatusTable[]=
|
|
{
|
|
SPOOL_STATUS_STARTDOC ,"StartDoc",
|
|
SPOOL_STATUS_BEGINPAGE ,"BeginPage",
|
|
SPOOL_STATUS_CANCELLED ,"Cancelled",
|
|
SPOOL_STATUS_PRINTING ,"Printing",
|
|
SPOOL_STATUS_ADDJOB ,"AddJob",
|
|
SPOOL_STATUS_PRINT_FILE ,"Print_File",
|
|
SPOOL_STATUS_NOTIFY ,"Notify",
|
|
SPOOL_STATUS_FLUSH_PRINTER ,"FlushPrinter"
|
|
};
|
|
|
|
|
|
typedef struct _DBG_PSPOOL_TYPE_OF_HANDLE
|
|
{
|
|
DWORD TypeOfHandle;
|
|
LPSTR String;
|
|
} DBG_PSPOOL_TYPE_OF_HANDLE, *PDBG_PSPOOL_TYPE_OF_HANDLE;
|
|
|
|
|
|
DBG_PSPOOL_TYPE_OF_HANDLE
|
|
pSpoolTypeOfHandleTable[]=
|
|
{
|
|
|
|
PRINTER_HANDLE_PRINTER, "Printer",
|
|
PRINTER_HANDLE_REMOTE_DATA, "RemoteData",
|
|
PRINTER_HANDLE_REMOTE_CALL, "RemoteCall",
|
|
PRINTER_HANDLE_JOB, "Job",
|
|
PRINTER_HANDLE_PORT, "Port",
|
|
PRINTER_HANDLE_DIRECT, "Direct",
|
|
PRINTER_HANDLE_SERVER, "Server",
|
|
PRINTER_HANDLE_3XCLIENT, "Nt3x_Client",
|
|
PRINTER_HANDLE_REMOTE_ADMIN, "Remote Admin"
|
|
};
|
|
|
|
|
|
|
|
typedef struct _DBG_WCACHEPRINTER_STATUS
|
|
{
|
|
DWORD Status;
|
|
LPSTR String;
|
|
} DBG_WCACHEPRINTER_STATUS, *PDBG_WCACHEPRINTER_STATUS;
|
|
|
|
|
|
DBG_WCACHEPRINTER_STATUS
|
|
WCachePrinterStatusTable[]=
|
|
{
|
|
|
|
EXTRA_STATUS_PENDING_FFPCN ,"Pending_FFPCN",
|
|
EXTRA_STATUS_DOING_REFRESH ,"Doing_Refresh"
|
|
};
|
|
|
|
|
|
typedef struct _DBG_DEVMODE_FIELDS {
|
|
DWORD dmField;
|
|
LPSTR String;
|
|
}DBG_DEVMODE_FIELDS;
|
|
|
|
#define MAX_DEVMODE_FIELDS 14
|
|
|
|
DBG_DEVMODE_FIELDS DevModeFieldsTable[] =
|
|
{
|
|
0x00000001, "dm_orientation",
|
|
0x00000002, "dm_papersize",
|
|
0x00000004, "dm_paperlength",
|
|
0x00000008, "dm_paperwidth",
|
|
0x00000010, "dm_scale",
|
|
0x00000100, "dm_copies",
|
|
0x00000200, "dm_defautsource",
|
|
0x00000400, "dm_printquality",
|
|
0x00000800, "dm_color",
|
|
0x00001000, "dm_duplex",
|
|
0x00002000, "dm_yresolution",
|
|
0x00004000, "dm_ttoption",
|
|
0x00008000, "dm_collate",
|
|
0x00010000, "dm_formname"
|
|
};
|
|
|
|
typedef struct _DBG_PINIDRIVER_FLAGS {
|
|
DWORD dwDriverFlag;
|
|
LPSTR String;
|
|
} DBG_PINIDRIVER_FLAGS;
|
|
|
|
DBG_PINIDRIVER_FLAGS pIniDriverFlagsTable[] =
|
|
{
|
|
PRINTER_DRIVER_PENDING_DELETION, "Pending-Deletion"
|
|
};
|
|
|
|
|
|
#define MAX_DEVMODE_PAPERSIZES 41
|
|
|
|
LPSTR DevModePaperSizes[] =
|
|
{
|
|
" Letter 8 1/2 x 11 in ",
|
|
" Letter Small 8 1/2 x 11 in ",
|
|
" Tabloid 11 x 17 in ",
|
|
" Ledger 17 x 11 in ",
|
|
" Legal 8 1/2 x 14 in ",
|
|
" Statement 5 1/2 x 8 1/2 in ",
|
|
" Executive 7 1/4 x 10 1/2 in ",
|
|
" A3 297 x 420 mm ",
|
|
" A4 210 x 297 mm ",
|
|
" A4 Small 210 x 297 mm ",
|
|
" A5 148 x 210 mm ",
|
|
" B4 250 x 354 ",
|
|
" B5 182 x 257 mm ",
|
|
" Folio 8 1/2 x 13 in ",
|
|
" Quarto 215 x 275 mm ",
|
|
" 10x14 in ",
|
|
" 11x17 in ",
|
|
" Note 8 1/2 x 11 in ",
|
|
" Envelope #9 3 7/8 x 8 7/8 ",
|
|
" Envelope #10 4 1/8 x 9 1/2 ",
|
|
" Envelope #11 4 1/2 x 10 3/8 ",
|
|
" Envelope #12 4 \276 x 11 ",
|
|
" Envelope #14 5 x 11 1/2 ",
|
|
" C size sheet ",
|
|
" D size sheet ",
|
|
" E size sheet ",
|
|
" Envelope DL 110 x 220mm ",
|
|
" Envelope C5 162 x 229 mm ",
|
|
" Envelope C3 324 x 458 mm ",
|
|
" Envelope C4 229 x 324 mm ",
|
|
" Envelope C6 114 x 162 mm ",
|
|
" Envelope C65 114 x 229 mm ",
|
|
" Envelope B4 250 x 353 mm ",
|
|
" Envelope B5 176 x 250 mm ",
|
|
" Envelope B6 176 x 125 mm ",
|
|
" Envelope 110 x 230 mm ",
|
|
" Envelope Monarch 3.875 x 7.5 in ",
|
|
" 6 3/4 Envelope 3 5/8 x 6 1/2 in ",
|
|
" US Std Fanfold 14 7/8 x 11 in ",
|
|
" German Std Fanfold 8 1/2 x 12 in ",
|
|
" German Legal Fanfold 8 1/2 x 13 in "
|
|
};
|
|
|
|
|
|
|
|
|
|
VOID
|
|
ExtractPrinterAccess(PNTSD_OUTPUT_ROUTINE Print, DWORD Attribute)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Attribute != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(PrinterAccessTable)/sizeof(PrinterAccessTable[0])) {
|
|
if (Attribute & PrinterAccessTable[i].Attribute) {
|
|
(*Print)("%s ", PrinterAccessTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractPrinterAttributes(PNTSD_OUTPUT_ROUTINE Print, DWORD Attribute)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Attribute != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(PrinterAttributeTable)/sizeof(PrinterAttributeTable[0])) {
|
|
if (Attribute & PrinterAttributeTable[i].Attribute) {
|
|
(*Print)("%s ", PrinterAttributeTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractChangeStatus(PNTSD_OUTPUT_ROUTINE Print, ESTATUS eStatus)
|
|
{
|
|
DWORD i = 0;
|
|
if ( eStatus != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(ChangeStatusTable)/sizeof(ChangeStatusTable[0])) {
|
|
if (eStatus & ChangeStatusTable[i].Attribute) {
|
|
(*Print)("%s ", ChangeStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractExternalPrinterStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(ExternalPrinterStatusTable)/sizeof(ExternalPrinterStatusTable[0])) {
|
|
if (Status & ExternalPrinterStatusTable[i].Status) {
|
|
(*Print)("%s ", ExternalPrinterStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractSpoolerFlags(PNTSD_OUTPUT_ROUTINE Print, DWORD SpoolerFlags)
|
|
{
|
|
DWORD i = 0;
|
|
if ( SpoolerFlags != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(SpoolerFlagsTable)/sizeof(SpoolerFlagsTable[0])) {
|
|
if (SpoolerFlags & SpoolerFlagsTable[i].SpoolerFlags) {
|
|
(*Print)("%s ", SpoolerFlagsTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
ExtractPrinterStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(PrinterStatusTable)/sizeof(PrinterStatusTable[0])) {
|
|
if (Status & PrinterStatusTable[i].Status) {
|
|
(*Print)("%s ", PrinterStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
ExtractWCachePrinterStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(WCachePrinterStatusTable)/sizeof(WCachePrinterStatusTable[0])) {
|
|
if (Status & WCachePrinterStatusTable[i].Status) {
|
|
(*Print)("%s ", WCachePrinterStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
ExtractPortStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
|
|
(*Print)(" ");
|
|
if ( Status != 0 ) {
|
|
while (i < sizeof(PortStatusTable)/sizeof(PortStatusTable[0])) {
|
|
if (Status == PortStatusTable[i].Status) {
|
|
(*Print)("%s ", PortStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
} else {
|
|
|
|
}
|
|
(*Print)("\n");
|
|
|
|
}
|
|
|
|
VOID
|
|
ExtractJobStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(JobStatusTable)/sizeof(JobStatusTable[0])) {
|
|
if (Status & JobStatusTable[i].Status) {
|
|
(*Print)("%s ", JobStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractpSpoolTypeOfHandle(PNTSD_OUTPUT_ROUTINE Print, DWORD TypeOfHandle)
|
|
{
|
|
DWORD i = 0;
|
|
if ( TypeOfHandle != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(pSpoolTypeOfHandleTable)/sizeof(pSpoolTypeOfHandleTable[0])) {
|
|
if (TypeOfHandle & pSpoolTypeOfHandleTable[i].TypeOfHandle) {
|
|
(*Print)("%s ", pSpoolTypeOfHandleTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractpSpoolStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(pSpoolStatusTable)/sizeof(pSpoolStatusTable[0])) {
|
|
if (Status & pSpoolStatusTable[i].Status) {
|
|
(*Print)("%s ", pSpoolStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
ExtractWSpoolStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(WSpoolStatusTable)/sizeof(WSpoolStatusTable[0])) {
|
|
if (Status & WSpoolStatusTable[i].Status) {
|
|
(*Print)("%s ", WSpoolStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractpIniPortStatus(PNTSD_OUTPUT_ROUTINE Print, DWORD Status)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Status != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(pIniPortStatusTable)/sizeof(pIniPortStatusTable[0])) {
|
|
if (Status & pIniPortStatusTable[i].Status) {
|
|
(*Print)("%s ", pIniPortStatusTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
(*Print)("\n");
|
|
}
|
|
}
|
|
|
|
VOID
|
|
ExtractpIniDriverFlags(PNTSD_OUTPUT_ROUTINE Print, DWORD Flags)
|
|
{
|
|
DWORD i = 0;
|
|
if ( Flags != 0 ) {
|
|
(*Print)(" ");
|
|
while (i < sizeof(pIniDriverFlagsTable)/sizeof(pIniDriverFlagsTable[0])) {
|
|
if (Flags & pIniDriverFlagsTable[i].dwDriverFlag) {
|
|
(*Print)("%s ", pIniDriverFlagsTable[i].String);
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
(*Print)("\n");
|
|
}
|
|
|
|
|
|
|
|
// All of the primary spooler structures are identified by an
|
|
// "signature" field which is the first DWORD in the structure
|
|
// This function examines the signature field in the structure
|
|
// and appropriately dumps out the contents of the structure in
|
|
// a human-readable format.
|
|
|
|
BOOL
|
|
DbgDumpStructure(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, UINT_PTR pData)
|
|
{
|
|
|
|
INIDRIVER IniDriver;
|
|
INIENVIRONMENT IniEnvironment;
|
|
INIPRINTER IniPrinter;
|
|
INIPRINTPROC IniPrintProc;
|
|
ININETPRINT IniNetPrint;
|
|
INIMONITOR IniMonitor;
|
|
INIPORT IniPort;
|
|
WINIPORT WIniPort;
|
|
INIFORM IniForm;
|
|
INIJOB IniJob;
|
|
SPOOL Spool;
|
|
WSPOOL WSpool;
|
|
SHADOWFILE ShadowFile;
|
|
SHADOWFILE_2 ShadowFile2;
|
|
PRINTHANDLE PrintHandle;
|
|
DWORD Signature;
|
|
INISPOOLER IniSpooler;
|
|
INIVERSION IniVersion;
|
|
WCACHEINIPRINTEREXTRA WCacheIniPrinterExtra;
|
|
|
|
movestruct(pData,&Signature, DWORD);
|
|
switch (Signature) {
|
|
|
|
case ISP_SIGNATURE: // dump INISPOOLER
|
|
movestruct(pData, &IniSpooler, INISPOOLER);
|
|
DbgDumpIniSpooler(hCurrentProcess, Print, (PINISPOOLER)&IniSpooler);
|
|
break;
|
|
|
|
case IPP_SIGNATURE: // dump INIPRINTPROC structure
|
|
movestruct(pData, &IniPrintProc, INIPRINTPROC);
|
|
DbgDumpIniPrintProc(hCurrentProcess, Print, (PINIPRINTPROC)&IniPrintProc);
|
|
break;
|
|
|
|
case ID_SIGNATURE: // dump INIDRIVER structure
|
|
movestruct(pData, &IniDriver, INIDRIVER);
|
|
DbgDumpIniDriver(hCurrentProcess, Print, (PINIDRIVER)&IniDriver);
|
|
break;
|
|
|
|
case IE_SIGNATURE: // dump INIENVIRONMENT structure
|
|
movestruct(pData, &IniEnvironment, INIENVIRONMENT);
|
|
DbgDumpIniEnvironment(hCurrentProcess, Print, (PINIENVIRONMENT)&IniEnvironment);
|
|
break;
|
|
|
|
case IV_SIGNATURE: // dump INIVERSION structure
|
|
movestruct(pData, &IniVersion, INIVERSION);
|
|
DbgDumpIniVersion(hCurrentProcess, Print, (PINIVERSION)&IniVersion);
|
|
break;
|
|
|
|
case IP_SIGNATURE:
|
|
movestruct(pData, &IniPrinter, INIPRINTER);
|
|
DbgDumpIniPrinter(hCurrentProcess, Print, (PINIPRINTER)&IniPrinter);
|
|
break;
|
|
|
|
case WCIP_SIGNATURE:
|
|
movestruct(pData, &WCacheIniPrinterExtra, WCACHEINIPRINTEREXTRA);
|
|
DbgDumpWCacheIniPrinter(hCurrentProcess, Print, (PWCACHEINIPRINTEREXTRA)&WCacheIniPrinterExtra);
|
|
break;
|
|
|
|
case IN_SIGNATURE:
|
|
movestruct(pData, &IniNetPrint, ININETPRINT);
|
|
DbgDumpIniNetPrint(hCurrentProcess, Print, (PININETPRINT)&IniNetPrint);
|
|
break;
|
|
|
|
case IMO_SIGNATURE:
|
|
movestruct(pData, &IniMonitor, INIMONITOR);
|
|
DbgDumpIniMonitor(hCurrentProcess, Print, (PINIMONITOR)&IniMonitor);
|
|
break;
|
|
|
|
case IPO_SIGNATURE:
|
|
movestruct(pData, &IniPort, INIPORT);
|
|
DbgDumpIniPort(hCurrentProcess, Print, (PINIPORT)&IniPort);
|
|
break;
|
|
|
|
case WIPO_SIGNATURE:
|
|
movestruct(pData, &WIniPort, WINIPORT);
|
|
DbgDumpWIniPort(hCurrentProcess, Print, (PWINIPORT)&WIniPort);
|
|
break;
|
|
|
|
case IFO_SIGNATURE:
|
|
movestruct(pData, &IniForm, INIFORM);
|
|
DbgDumpIniForm(hCurrentProcess, Print, (PINIFORM)&IniForm);
|
|
break;
|
|
|
|
case IJ_SIGNATURE:
|
|
movestruct(pData, &IniJob, INIJOB);
|
|
DbgDumpIniJob(hCurrentProcess, Print, (PINIJOB)&IniJob);
|
|
break;
|
|
|
|
case SJ_SIGNATURE:
|
|
movestruct(pData, &Spool, SPOOL);
|
|
DbgDumpSpool(hCurrentProcess, Print, (PSPOOL)&Spool);
|
|
break;
|
|
|
|
case WSJ_SIGNATURE:
|
|
movestruct(pData, &WSpool, WSPOOL);
|
|
DbgDumpWSpool(hCurrentProcess, Print, (PWSPOOL)&WSpool);
|
|
break;
|
|
|
|
case SF_SIGNATURE:
|
|
movestruct(pData, &ShadowFile, SHADOWFILE);
|
|
DbgDumpShadowFile(hCurrentProcess, Print, (PSHADOWFILE)&ShadowFile);
|
|
break;
|
|
|
|
case SF_SIGNATURE_2:
|
|
movestruct(pData, &ShadowFile2, SHADOWFILE_2);
|
|
DbgDumpShadowFile2(hCurrentProcess, Print, (PSHADOWFILE_2)&ShadowFile2);
|
|
break;
|
|
|
|
case PRINTHANDLE_SIGNATURE:
|
|
movestruct(pData, &PrintHandle, PRINTHANDLE);
|
|
DbgDumpPrintHandle(hCurrentProcess, Print, (PPRINTHANDLE)&PrintHandle);
|
|
break;
|
|
|
|
|
|
default:
|
|
// Unknown signature -- no data to dump
|
|
(*Print)("Warning: Unknown Signature\n");
|
|
break;
|
|
}
|
|
(*Print)("\n");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniEntry(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIENTRY pIniEntry)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniEntry\n");
|
|
(*Print)("DWORD signature %d\n", pIniEntry->signature);
|
|
(*Print)("PINIENTRY pNext %p\n", pIniEntry->pNext);
|
|
|
|
movestr(pIniEntry->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniPrintProc(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIPRINTPROC pIniPrintProc)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
DWORD i = 0;
|
|
|
|
(*Print)("IniPrintProc\n");
|
|
(*Print)("DWORD signature %d\n", pIniPrintProc->signature);
|
|
(*Print)("PINIPRINTPROC pNext %x\n", pIniPrintProc->pNext);
|
|
(*Print)("DWORD cRef %d\n", pIniPrintProc->cRef);
|
|
|
|
|
|
movestr(pIniPrintProc->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("DWORD pName %ws\n", Buffer);
|
|
|
|
movestr(pIniPrintProc->pDLLName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDLLName %ws\n", Buffer);
|
|
(*Print)("LPWSTR cbDatatypes %d\n", pIniPrintProc->cbDatatypes);
|
|
(*Print)("LPWSTR cDatatypes %d\n", pIniPrintProc->cDatatypes);
|
|
for (i = 0; i < pIniPrintProc->cDatatypes; i++ ) {
|
|
(*Print)(" Each of the Strings here \n");
|
|
}
|
|
(*Print)("HANDLE hLibrary 0x%.8x\n", pIniPrintProc->hLibrary);
|
|
(*Print)("FARPROC Install 0x%.8x\n", pIniPrintProc->Install);
|
|
(*Print)("FARPROC EnumDatatypes 0x%.8x\n", pIniPrintProc->EnumDatatypes);
|
|
(*Print)("FARPROC Open 0x%.8x\n", pIniPrintProc->Open);
|
|
(*Print)("FARPROC Print 0x%.8x\n", pIniPrintProc->Print);
|
|
(*Print)("FARPROC Close 0x%.8x\n", pIniPrintProc->Close);
|
|
(*Print)("FARPROC Control 0x%.8x\n", pIniPrintProc->Control);
|
|
(*Print)("CRITICAL_SECTION CriticalSection 0x%.8x\n", pIniPrintProc->CriticalSection);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniDriver(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIDRIVER pIniDriver)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
WCHAR UnKnown[] = L"Not Initialized";
|
|
WCHAR Kernel[] = L"Kernel Mode";
|
|
WCHAR User[] = L"User Mode";
|
|
SYSTEMTIME SystemTime;
|
|
|
|
(*Print)("IniDriver\n");
|
|
(*Print)("DWORD signature %d\n", pIniDriver->signature);
|
|
(*Print)("PINIDRIVER pNext %p\n", pIniDriver->pNext);
|
|
(*Print)("DWORD cRef %d\n", pIniDriver->cRef);
|
|
|
|
movestr(pIniDriver->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pDriverFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDriverFile %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pConfigFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pConfigFile %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pDataFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDataFile %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pHelpFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pHelpFile %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pDependentFiles, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDependentFiles %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pMonitorName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pMonitorName %ws\n", Buffer);
|
|
(*Print)("PINIMONITOR pIniLangMonitor %p\n", pIniDriver->pIniLangMonitor);
|
|
|
|
movestr(pIniDriver->pDefaultDataType, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDefaultDataType %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pszzPreviousNames, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszzPreviousNames %ws\n", Buffer);
|
|
|
|
switch (pIniDriver->dwDriverAttributes) {
|
|
case 0:
|
|
(*Print)("DWORD dwDriverAttributes %ws\n", (LPWSTR)UnKnown);
|
|
break;
|
|
case 1:
|
|
(*Print)("DWORD dwDriverAttributes %ws\n", (LPWSTR)Kernel);
|
|
break;
|
|
case 2:
|
|
(*Print)("DWORD dwDriverAttributes %ws\n", (LPWSTR)User);
|
|
break;
|
|
}
|
|
|
|
(*Print)("DWORD cVersion %d\n", pIniDriver->cVersion);
|
|
(*Print)("DWORD dwTempDir %d\n", pIniDriver->dwTempDir);
|
|
|
|
movestr(pIniDriver->pszMfgName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR Manufacturer %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pszOEMUrl, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR OEM URL %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pszHardwareID, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR HardwareID %ws\n", Buffer);
|
|
|
|
movestr(pIniDriver->pszProvider, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR Provider %ws\n", Buffer);
|
|
|
|
(*Print)("DWORDLONG DriverVersion %I64x\n", pIniDriver->dwlDriverVersion);
|
|
|
|
if (pIniDriver->ftDriverDate.dwHighDateTime &&
|
|
pIniDriver->ftDriverDate.dwLowDateTime &&
|
|
FileTimeToSystemTime(&pIniDriver->ftDriverDate, &SystemTime))
|
|
{
|
|
(*Print)("SYSTEMTIME DriverDate %d/%d/%d %d %d:%d:%d.%d\n",SystemTime.wYear,
|
|
SystemTime.wMonth,
|
|
SystemTime.wDay,
|
|
SystemTime.wDayOfWeek,
|
|
SystemTime.wHour,
|
|
SystemTime.wMinute,
|
|
SystemTime.wSecond,
|
|
SystemTime.wMilliseconds);
|
|
}
|
|
else
|
|
{
|
|
(*Print)("SYSTEMTIME DriverDate Not initialized\n");
|
|
}
|
|
|
|
(*Print)("DWORD dwDriverFlags %08x", pIniDriver->dwDriverFlags);
|
|
|
|
ExtractpIniDriverFlags(Print, pIniDriver->dwDriverFlags);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniEnvironment(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIENVIRONMENT pIniEnvironment)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniEnvironment\n");
|
|
(*Print)("DWORD signature %d\n", pIniEnvironment->signature);
|
|
(*Print)("struct _INIENVIRONMENT *pNext %p\n", pIniEnvironment->pNext);
|
|
(*Print)("DWORD cRef %d\n", pIniEnvironment->cRef);
|
|
|
|
movestr(pIniEnvironment->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pIniEnvironment->pDirectory, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDirectory %ws\n", Buffer);
|
|
|
|
(*Print)("PINIVERSION pIniVersion %p\n", pIniEnvironment->pIniVersion);
|
|
(*Print)("PINIPRINTPROC pIniPrintProc %p\n", pIniEnvironment->pIniPrintProc);
|
|
(*Print)("PINISPOOLER pIniSpooler %p\n", pIniEnvironment->pIniSpooler);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniVersion( HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIVERSION pIniVersion )
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniVersion\n");
|
|
(*Print)("DWORD signature %d\n", pIniVersion->signature);
|
|
(*Print)("struct _IniVersion *pNext %p\n", pIniVersion->pNext);
|
|
|
|
movestr(pIniVersion->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pIniVersion->szDirectory, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR szDirectory %ws\n", Buffer);
|
|
(*Print)("DWORD cMajorVersion %d\n", pIniVersion->cMajorVersion );
|
|
(*Print)("DWORD cMinorVersion %d\n", pIniVersion->cMinorVersion );
|
|
(*Print)("PINIDRIVER pIniDriver %p\n", pIniVersion->pIniDriver );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpWCacheIniPrinter(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PWCACHEINIPRINTEREXTRA pWCacheIniPrinter)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
|
|
(*Print)("WCacheIniPrinterExtra\n");
|
|
(*Print)("DWORD signature %d\n", pWCacheIniPrinter->signature);
|
|
|
|
(*Print)("DWORD cb %d\n", pWCacheIniPrinter->cb);
|
|
|
|
(*Print)("LPPRINTER_INFO_2 pPI2 %p\n", pWCacheIniPrinter->pPI2);
|
|
(*Print)("DWORD cbPI2 %d\n", pWCacheIniPrinter->cbPI2);
|
|
|
|
DbgDumpPI2( hCurrentProcess, Print, (UINT_PTR)pWCacheIniPrinter->pPI2, 1 );
|
|
|
|
(*Print)("DWORD cCacheID %d\n", pWCacheIniPrinter->cCacheID );
|
|
(*Print)("DWORD cRef %d\n", pWCacheIniPrinter->cRef );
|
|
(*Print)("DWORD dwServerVersion %x\n", pWCacheIniPrinter->dwServerVersion );
|
|
(*Print)("DWORD dwTickCount %x\n", pWCacheIniPrinter->dwTickCount );
|
|
(*Print)("DWORD Status 0x%.8x\n", pWCacheIniPrinter->Status );
|
|
ExtractWCachePrinterStatus( Print, pWCacheIniPrinter->Status );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniPrinter(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIPRINTER pIniPrinter)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniPrinter\n");
|
|
(*Print)("DWORD signature %d\n", pIniPrinter->signature);
|
|
|
|
(*Print)("PINIPRINTER pNext %p\n", pIniPrinter->pNext);
|
|
(*Print)("DWORD cRef %d\n", pIniPrinter->cRef);
|
|
|
|
movestr(pIniPrinter->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pIniPrinter->pShareName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pShareName %ws\n", Buffer);
|
|
|
|
(*Print)("PINIPRINTPROC pIniPrintProc %p\n", pIniPrinter->pIniPrintProc);
|
|
|
|
movestr(pIniPrinter->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDatatype %ws\n", Buffer);
|
|
|
|
movestr(pIniPrinter->pParameters, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pParameters %ws\n", Buffer);
|
|
|
|
movestr(pIniPrinter->pComment, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pComment %ws\n", Buffer);
|
|
|
|
(*Print)("PINIDRIVER pIniDriver %p\n", pIniPrinter->pIniDriver);
|
|
(*Print)("DWORD cbDevMode %d\n", pIniPrinter->cbDevMode);
|
|
(*Print)("LPDEVMODE pDevMode %p\n", pIniPrinter->pDevMode);
|
|
(*Print)("DWORD Priority %d\n", pIniPrinter->Priority);
|
|
(*Print)("DWORD DefaultPriority %d\n", pIniPrinter->DefaultPriority);
|
|
(*Print)("DWORD StartTime %d\n", pIniPrinter->StartTime);
|
|
(*Print)("DWORD UntilTime %d\n", pIniPrinter->UntilTime);
|
|
|
|
movestr(pIniPrinter->pSepFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pSepFile %ws\n", Buffer);
|
|
|
|
(*Print)("DWORD Status 0x%.8x\n", pIniPrinter->Status);
|
|
ExtractPrinterStatus( Print, pIniPrinter->Status );
|
|
|
|
movestr(pIniPrinter->pLocation, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pLocation %ws\n", Buffer);
|
|
|
|
|
|
(*Print)("DWORD Attributes 0x%.8x\n",pIniPrinter->Attributes);
|
|
ExtractPrinterAttributes( Print, pIniPrinter->Attributes );
|
|
|
|
(*Print)("DWORD cJobs %d\n", pIniPrinter->cJobs);
|
|
(*Print)("DWORD AveragePPM %d\n", pIniPrinter->AveragePPM);
|
|
(*Print)("BOOL GenerateOnClose 0x%.8x\n", pIniPrinter->GenerateOnClose);
|
|
(*Print)("PINIPORT pIniNetPort %p\n", pIniPrinter->pIniNetPort);
|
|
(*Print)("PINIJOB pIniFirstJob %p\n", pIniPrinter->pIniFirstJob);
|
|
(*Print)("PINIJOB pIniLastJob %p\n", pIniPrinter->pIniLastJob);
|
|
(*Print)("PSECURITY_DESCRIPTOR pSecurityDescriptor %p\n", pIniPrinter->pSecurityDescriptor);
|
|
(*Print)("PSPOOL *pSpool %p\n", pIniPrinter->pSpool);
|
|
|
|
if ( pIniPrinter->pSpoolDir == NULL ) {
|
|
|
|
(*Print)("LPWSTR pSpoolDir %p\n", pIniPrinter->pSpoolDir);
|
|
|
|
} else {
|
|
|
|
movestr(pIniPrinter->pSpoolDir, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pSpoolDir %ws\n", Buffer);
|
|
}
|
|
|
|
(*Print)("DWORD cTotalJobs %d\n", pIniPrinter->cTotalJobs);
|
|
(*Print)("DWORD cTotalBytes.LowPart %d\n", pIniPrinter->cTotalBytes.LowPart);
|
|
(*Print)("DWORD cTotalBytes.HighPart %d\n", pIniPrinter->cTotalBytes.HighPart);
|
|
(*Print)("SYSTEMTIME stUpTime %d/%d/%d %d %d:%d:%d.%d\n",pIniPrinter->stUpTime.wYear,
|
|
pIniPrinter->stUpTime.wMonth,
|
|
pIniPrinter->stUpTime.wDay,
|
|
pIniPrinter->stUpTime.wDayOfWeek,
|
|
pIniPrinter->stUpTime.wHour,
|
|
pIniPrinter->stUpTime.wMinute,
|
|
pIniPrinter->stUpTime.wSecond,
|
|
pIniPrinter->stUpTime.wMilliseconds);
|
|
(*Print)("DWORD MaxcRef %d\n", pIniPrinter->MaxcRef);
|
|
(*Print)("DWORD cTotalPagesPrinted %d\n", pIniPrinter->cTotalPagesPrinted);
|
|
(*Print)("DWORD cSpooling %d\n", pIniPrinter->cSpooling);
|
|
(*Print)("DWORD cMaxSpooling %d\n", pIniPrinter->cMaxSpooling);
|
|
(*Print)("DWORD cErrorOutOfPaper %d\n", pIniPrinter->cErrorOutOfPaper);
|
|
(*Print)("DWORD cErrorNotReady %d\n", pIniPrinter->cErrorNotReady);
|
|
(*Print)("DWORD cJobError %d\n", pIniPrinter->cJobError);
|
|
(*Print)("DWORD dwLastError %d\n", pIniPrinter->dwLastError);
|
|
(*Print)("PINISPOOLER pIniSpooler %p\n", pIniPrinter->pIniSpooler);
|
|
(*Print)("DWORD cZombieRef %d\n", pIniPrinter->cZombieRef);
|
|
(*Print)("LPBYTE pExtraData %x\n", pIniPrinter->pExtraData);
|
|
(*Print)("DWORD cChangeID %d\n", pIniPrinter->cChangeID);
|
|
(*Print)("DWORD cPorts %d\n", pIniPrinter->cPorts);
|
|
(*Print)("PINIPORT *ppIniPorts %x\n", pIniPrinter->ppIniPorts);
|
|
(*Print)("DWORD PortStatus %d\n", pIniPrinter->PortStatus);
|
|
(*Print)("DWORD dnsTimeout %d\n", pIniPrinter->dnsTimeout);
|
|
(*Print)("DWORD txTimeout %d\n", pIniPrinter->txTimeout);
|
|
movestr(pIniPrinter->pszObjectGUID, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszObjectGUID %ws\n", Buffer);
|
|
(*Print)("DWORD DsKeyUpdate %x\n", pIniPrinter->DsKeyUpdate);
|
|
(*Print)("DWORD DsKeyUpdateForeground %x\n", pIniPrinter->DsKeyUpdateForeground);
|
|
movestr(pIniPrinter->pszDN, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszDN %ws\n", Buffer);
|
|
movestr(pIniPrinter->pszCN, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszCN %ws\n", Buffer);
|
|
(*Print)("DWORD cRefIC %d\n", pIniPrinter->cRefIC);
|
|
(*Print)("DWORD dwAction %d\n", pIniPrinter->dwAction);
|
|
(*Print)("BOOL bDsPendingDeletion %d\n", pIniPrinter->bDsPendingDeletion);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniNetPrint(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PININETPRINT pIniNetPrint)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniNetPrint\n");
|
|
(*Print)("DWORD signature %d\n", pIniNetPrint->signature);
|
|
(*Print)("PININETPRINT *pNext %p\n", pIniNetPrint->pNext);
|
|
(*Print)("DWORD TickCount %d\n", pIniNetPrint->TickCount);
|
|
|
|
movestr(pIniNetPrint->pDescription, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDescription %ws\n", Buffer);
|
|
|
|
movestr(pIniNetPrint->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pIniNetPrint->pComment, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pComment %ws\n", Buffer);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniMonitor(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIMONITOR pIniMonitor)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniMonitor\n");
|
|
(*Print)("DWORD signature %d\n", pIniMonitor->signature);
|
|
(*Print)("PINIMONITOR pNext %p\n", pIniMonitor->pNext);
|
|
(*Print)("DWORD cRef %d\n", pIniMonitor->cRef);
|
|
|
|
movestr(pIniMonitor->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pIniMonitor->pMonitorDll, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pMonitorDll %ws\n", Buffer);
|
|
|
|
(*Print)("HANDLE hModule %p\n", pIniMonitor->hModule);
|
|
(*Print)("PMONITORINIT pMonitorInit %p\n", pIniMonitor->pMonitorInit);
|
|
(*Print)("HANDLE hMonitor %p\n", pIniMonitor->hMonitor);
|
|
(*Print)("BOOL bUplevel %%.8x\n", pIniMonitor->bUplevel);
|
|
(*Print)("PINISPOOLER pIniSpooler %p\n", pIniMonitor->pIniSpooler);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniPort(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIPORT pIniPort)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniPort\n");
|
|
(*Print)("DWORD signature %d\n", pIniPort->signature);
|
|
(*Print)("struct _INIPORT *pNext %p\n", pIniPort->pNext);
|
|
(*Print)("DWORD cRef 0x%.8x\n", pIniPort->cRef);
|
|
|
|
movestr(pIniPort->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
(*Print)("HANDLE hProc 0x%.8x\n", pIniPort->hProc);
|
|
(*Print)("DWORD Status 0x%.8x\n", pIniPort->Status);
|
|
ExtractpIniPortStatus( Print, pIniPort->Status);
|
|
ExtractPortStatus( Print, pIniPort->PrinterStatus);
|
|
|
|
(*Print)("HANDLE Semaphore 0x%.8x\n", pIniPort->Semaphore);
|
|
(*Print)("PINIJOB pIniJob %p\n", pIniPort->pIniJob);
|
|
(*Print)("DWORD cJobs %d\n", pIniPort->cJobs);
|
|
(*Print)("DWORD cPrinters %d\n", pIniPort->cPrinters);
|
|
(*Print)("PINIPRINTER *ppIniPrinter %p\n", pIniPort->ppIniPrinter);
|
|
|
|
(*Print)("PINIMONITOR pIniMonitor %p\n", pIniPort->pIniMonitor);
|
|
(*Print)("PINIMONITOR pIniLangMonitor %p\n", pIniPort->pIniLangMonitor);
|
|
(*Print)("HANDLE hWaitToOpenOrClose 0x%.8x\n", pIniPort->hWaitToOpenOrClose);
|
|
(*Print)("HANDLE hEvent 0x%.8x\n", pIniPort->hEvent);
|
|
(*Print)("HANDLE hPort 0x%.8x\n", pIniPort->hPort);
|
|
(*Print)("HANDLE Ready 0x%.8x\n", pIniPort->Ready);
|
|
(*Print)("HANDLE hPortThread 0x%.8x\n", pIniPort->hPortThread);
|
|
(*Print)("PINISPOOLER pIniSpooler %p\n", pIniPort->pIniSpooler);
|
|
(*Print)("DWORD InCriticalSection %d\n", pIniPort->InCriticalSection);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpWIniPort(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PWINIPORT pWIniPort)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("WIniPort\n");
|
|
(*Print)("DWORD signature %d\n", pWIniPort->signature);
|
|
(*Print)("DWORD cb %d\n", pWIniPort->cb);
|
|
(*Print)("struct _WIniPort *pNext %p\n", pWIniPort->pNext);
|
|
|
|
movestr(pWIniPort->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpIniForm(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIFORM pIniForm)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniForm\n");
|
|
(*Print)("DWORD signature %d\n", pIniForm->signature);
|
|
(*Print)("struct _INIFORM *pNext %p\n", pIniForm->pNext);
|
|
(*Print)("DWORD cRef %d\n", pIniForm->cRef);
|
|
|
|
movestr(pIniForm->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %p %ws\n", pIniForm->pName, Buffer );
|
|
|
|
(*Print)("SIZEL Size cx %d cy %d\n", pIniForm->Size.cx, pIniForm->Size.cy);
|
|
(*Print)("RECTL ImageableArea left %d right %d top %d bottom %d\n",
|
|
pIniForm->ImageableArea.left,
|
|
pIniForm->ImageableArea.right,
|
|
pIniForm->ImageableArea.top,
|
|
pIniForm->ImageableArea.bottom);
|
|
(*Print)("DWORD Type 0x%.8x", pIniForm->Type);
|
|
|
|
if ( pIniForm->Type & FORM_BUILTIN )
|
|
(*Print)(" FORM_BUILTIN\n");
|
|
else
|
|
(*Print)(" FORM_USERDEFINED\n");
|
|
|
|
(*Print)("DWORD cFormOrder %d\n", pIniForm->cFormOrder);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniSpooler(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINISPOOLER pIniSpooler)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniSpooler\n" );
|
|
(*Print)("DWORD signature %d\n", pIniSpooler->signature);
|
|
(*Print)("PINISPOOLER pIniNextSpooler %p\n", pIniSpooler->pIniNextSpooler);
|
|
(*Print)("DWORD cRef %d\n", pIniSpooler->cRef);
|
|
movestr(pIniSpooler->pMachineName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pMachineName %ws\n", Buffer);
|
|
(*Print)("DWORD cOtherNames %d\n", pIniSpooler->cOtherNames);
|
|
(*Print)("(LPWSTR *) ppszOtherNames %p\n", pIniSpooler->ppszOtherNames);
|
|
movestr(pIniSpooler->pDir, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDir %ws\n", Buffer);
|
|
(*Print)("PINIPRINTER pIniPrinter %p\n", pIniSpooler->pIniPrinter);
|
|
(*Print)("PINIENVIRONMENT pIniEnvironment %p\n", pIniSpooler->pIniEnvironment);
|
|
(*Print)("PINIMONITOR pIniMonitor %p\n", pIniSpooler->pIniMonitor);
|
|
(*Print)("PINIPORT pIniPort %p\n", pIniSpooler->pIniPort);
|
|
(*Print)("PSHARED pShared %p\n", pIniSpooler->pShared);
|
|
(*Print)("PININETPRINT pIniNetPrint %p\n", pIniSpooler->pIniNetPrint);
|
|
(*Print)("PSPOOL pSpool %p\n", pIniSpooler->pSpool);
|
|
movestr(pIniSpooler->pDefaultSpoolDir, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDefaultSpoolDir %ws\n", Buffer);
|
|
movestr(pIniSpooler->pszRegistryMonitors, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszRegistryMonitors %ws\n", Buffer);
|
|
movestr(pIniSpooler->pszRegistryEnvironments, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszRegistryEnvironments %ws\n", Buffer);
|
|
movestr(pIniSpooler->pszRegistryEventLog, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszRegistryEventLog %ws\n", Buffer);
|
|
movestr(pIniSpooler->pszRegistryProviders, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszRegistryProviders %ws\n", Buffer);
|
|
movestr(pIniSpooler->pszEventLogMsgFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszEventLogMsgFile %ws\n", Buffer);
|
|
(*Print)("PSHARE_INFO_2 pDriversShareInfo %p\n", pIniSpooler->pDriversShareInfo);
|
|
movestr(pIniSpooler->pszDriversShare, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszDriversShare %ws\n", Buffer);
|
|
movestr(pIniSpooler->pszRegistryForms, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszRegistryForms %ws\n", Buffer);
|
|
(*Print)("DWORD SpoolerFlags %d\n", pIniSpooler->SpoolerFlags );
|
|
ExtractSpoolerFlags( Print, pIniSpooler->SpoolerFlags );
|
|
(*Print)("FARPROC pfnReadRegistryExtra 0x%.8x\n", pIniSpooler->pfnReadRegistryExtra );
|
|
(*Print)("FARPROC pfnWriteRegistryExtra 0x%.8x\n", pIniSpooler->pfnWriteRegistryExtra );
|
|
(*Print)("FARPROC pfnFreePrinterExtra 0x%.8x\n", pIniSpooler->pfnFreePrinterExtra );
|
|
(*Print)("DWORD cEnumerateNetworkPrinters %d\n", pIniSpooler->cEnumerateNetworkPrinters );
|
|
(*Print)("DWORD cAddNetPrinters %d\n", pIniSpooler->cAddNetPrinters );
|
|
(*Print)("DWORD cFormOrderMax %d\n", pIniSpooler->cFormOrderMax );
|
|
(*Print)("HKEY hckRoot %p\n", pIniSpooler->hckRoot );
|
|
(*Print)("HKEY hckPrinters %p\n", pIniSpooler->hckPrinters );
|
|
(*Print)("DWORD cFullPrintingJobs %d\n", pIniSpooler->cFullPrintingJobs );
|
|
(*Print)("DWORD hEventNoPrintingJobs %p\n", pIniSpooler->hEventNoPrintingJobs );
|
|
(*Print)("HKEY hJobIdMap %p\n", pIniSpooler->hJobIdMap );
|
|
(*Print)("DWORD dwEventLogging %d\n", pIniSpooler->dwEventLogging );
|
|
(*Print)("BOOL bEnableNetPopups %d\n", pIniSpooler->bEnableNetPopups );
|
|
(*Print)("DWORD dwJobCompletionTimeout %d\n", pIniSpooler->dwJobCompletionTimeout );
|
|
(*Print)("DWORD dwBeepEnabled %d\n", pIniSpooler->dwBeepEnabled );
|
|
(*Print)("HKEY bEnableNetPopupToComputer %d\n", pIniSpooler->bEnableNetPopupToComputer );
|
|
(*Print)("HKEY bEnableRetryPopups %d\n", pIniSpooler->bEnableRetryPopups );
|
|
movestr(pIniSpooler->pszClusterGUID, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszClusterGUID %ws\n", Buffer);
|
|
(*Print)("HKEY hClusterToken %p\n", pIniSpooler->hClusterToken );
|
|
(*Print)("DWORD dwRestartJobOnPoolTimeout %p\n", pIniSpooler->dwRestartJobOnPoolTimeout );
|
|
(*Print)("DWORD bRestartJobOnPoolEnabled %p\n", pIniSpooler->bRestartJobOnPoolEnabled );
|
|
(*Print)("DWORD bImmortal %p\n", pIniSpooler->bImmortal );
|
|
movestr(pIniSpooler->pszFullMachineName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszFullMachineName %ws\n", Buffer);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpIniJob(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PINIJOB pIniJob)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("IniJob\n");
|
|
(*Print)("DWORD signature %d\n", pIniJob->signature);
|
|
(*Print)("PINIJOB pIniNextJob %p\n", pIniJob->pIniNextJob);
|
|
(*Print)("PINIJOB pIniPrevJob %p\n", pIniJob->pIniPrevJob);
|
|
(*Print)("DWORD cRef %d\n", pIniJob->cRef);
|
|
(*Print)("DWORD Status 0x%.8x\n", pIniJob->Status);
|
|
ExtractJobStatus( Print, pIniJob->Status );
|
|
|
|
(*Print)("DWORD JobId %d\n", pIniJob->JobId);
|
|
(*Print)("DWORD Priority %d\n", pIniJob->Priority);
|
|
|
|
movestr(pIniJob->pNotify, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pNotify %ws\n", Buffer);
|
|
|
|
movestr(pIniJob->pUser, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pUser %ws\n", Buffer);
|
|
|
|
movestr(pIniJob->pMachineName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pMachineName %ws\n", Buffer);
|
|
|
|
movestr(pIniJob->pDocument, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDocument %ws\n", Buffer);
|
|
|
|
movestr(pIniJob->pOutputFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pOutputFile %ws\n", Buffer);
|
|
|
|
(*Print)("PINIPRINTER pIniPrinter %p\n", pIniJob->pIniPrinter);
|
|
(*Print)("PINIDRIVER pIniDriver %p\n", pIniJob->pIniDriver);
|
|
(*Print)("LPDEVMODE pDevMode %p\n", pIniJob->pDevMode);
|
|
(*Print)("PINIPRINTPROC pIniPrintProc %p\n", pIniJob->pIniPrintProc);
|
|
|
|
movestr(pIniJob->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDatatype %ws\n", Buffer);
|
|
|
|
movestr(pIniJob->pParameters, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pParameters %ws\n", Buffer);
|
|
(*Print)("SYSTEMTIME Submitted %d/%d/%d %d %d:%d:%d.%d\n",pIniJob->Submitted.wYear,
|
|
pIniJob->Submitted.wMonth,
|
|
pIniJob->Submitted.wDay,
|
|
pIniJob->Submitted.wDayOfWeek,
|
|
pIniJob->Submitted.wHour,
|
|
pIniJob->Submitted.wMinute,
|
|
pIniJob->Submitted.wSecond,
|
|
pIniJob->Submitted.wMilliseconds);
|
|
// (*Print)("DWORD StartPrintingTickCount %d\n", pIniJob->StartPrintingTickCount );
|
|
(*Print)("DWORD Time %d\n", pIniJob->Time);
|
|
(*Print)("DWORD StartTime %d\n", pIniJob->StartTime);
|
|
(*Print)("DWORD UntilTime %d\n", pIniJob->UntilTime);
|
|
(*Print)("DWORD Size %d\n", pIniJob->Size);
|
|
(*Print)("HANDLE hWriteFile 0x%.8x\n", pIniJob->hWriteFile);
|
|
|
|
movestr(pIniJob->pStatus, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pStatus %ws\n", Buffer);
|
|
|
|
(*Print)("PBOOL pBuffer %p\n", pIniJob->pBuffer);
|
|
(*Print)("DWORD cbBuffer %d\n", pIniJob->cbBuffer);
|
|
(*Print)("HANDLE WaitForRead 0x%.8x\n", pIniJob->WaitForRead);
|
|
(*Print)("HANDLE WaitForWrite 0x%.8x\n", pIniJob->WaitForWrite);
|
|
(*Print)("HANDLE StartDocComplete 0x%.8x\n", pIniJob->StartDocComplete);
|
|
(*Print)("DWORD StartDocError 0x%.8x\n", pIniJob->StartDocError);
|
|
(*Print)("PINIPORT pIniPort %p\n", pIniJob->pIniPort);
|
|
(*Print)("HANDLE hToken 0x%.8x\n", pIniJob->hToken);
|
|
(*Print)("PSECURITY_DESCRIPTOR pSecurityDescriptor %p\n", pIniJob->pSecurityDescriptor);
|
|
(*Print)("DWORD cPagesPrinted %d\n", pIniJob->cPagesPrinted);
|
|
(*Print)("DWORD cPages %d\n", pIniJob->cPages);
|
|
(*Print)("DWORD dwJobNumberOfPagesPerSide %d\n", pIniJob->dwJobNumberOfPagesPerSide);
|
|
(*Print)("DWORD dwDrvNumberOfPagesPerSide %d\n", pIniJob->dwDrvNumberOfPagesPerSide);
|
|
(*Print)("DWORD cLogicalPagesPrinted %d\n", pIniJob->cLogicalPagesPrinted);
|
|
(*Print)("DWORD cLogicalPages %d\n", pIniJob->cLogicalPages);
|
|
(*Print)("BOOL GenerateOnClose 0x%.8x\n", pIniJob->GenerateOnClose);
|
|
(*Print)("DWORD cbPrinted %d\n", pIniJob->cbPrinted);
|
|
(*Print)("DWORD NextJobId %d\n", pIniJob->NextJobId);
|
|
(*Print)("PINIJOB pCurrentIniJob %p\n", pIniJob->pCurrentIniJob);
|
|
(*Print)("DWORD dwJobControlsPending %d\n", pIniJob->dwJobControlsPending);
|
|
(*Print)("DWORD dwReboots %d\n", pIniJob->dwReboots);
|
|
(*Print)("DWORD dwValidSize %d\n", pIniJob->dwValidSize);
|
|
(*Print)("DWORD bWaitForEnd %d\n", pIniJob->bWaitForEnd);
|
|
(*Print)("DWORD WaitForSeek %d\n", pIniJob->WaitForSeek);
|
|
(*Print)("DWORD bWaitForSeek %d\n", pIniJob->bWaitForSeek);
|
|
(*Print)("DWORD dwAlert %d\n", pIniJob->dwAlert);
|
|
|
|
movestr(pIniJob->pszSplFileName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pszSplFileName %ws\n", Buffer);
|
|
|
|
(*Print)("HANDLE hFileItem 0x%.8x\n", pIniJob->hFileItem);
|
|
(*Print)("DWORD AddJobLevel %d\n", pIniJob->AddJobLevel);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpProvidor(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, LPPROVIDOR pProvidor)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
movestr(pProvidor->lpName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR ProvidorName %ws\n", Buffer);
|
|
(*Print)("HANDLE hModule %p\n", pProvidor->hModule);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpSpool(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PSPOOL pSpool)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("Spool - LocalSpl Handle\n");
|
|
(*Print)("DWORD signature %d\n", pSpool->signature);
|
|
(*Print)("struct _SPOOL *pNext %p\n", pSpool->pNext);
|
|
(*Print)("DWORD cRef %d\n", pSpool->cRef);
|
|
|
|
movestr(pSpool->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
movestr(pSpool->pFullMachineName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pFullMachineName %ws\n", Buffer);
|
|
|
|
movestr(pSpool->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDatatype %ws\n", Buffer);
|
|
(*Print)("PINIPRINTPROC pIniPrintProc %p\n", pSpool->pIniPrintProc);
|
|
(*Print)("LPDEVMODE pDevMode %p\n", pSpool->pDevMode);
|
|
(*Print)("PINIPRINTER pIniPrinter %p\n", pSpool->pIniPrinter);
|
|
(*Print)("PINIPORT pIniPort %p\n", pSpool->pIniPort);
|
|
(*Print)("PINIJOB pIniJob %p\n", pSpool->pIniJob);
|
|
(*Print)("DWORD TypeofHandle %d\n", pSpool->TypeofHandle);
|
|
ExtractpSpoolTypeOfHandle( Print, pSpool->TypeofHandle);
|
|
|
|
(*Print)("PINIPORT pIniNetPort %p\n", pSpool->pIniNetPort);
|
|
(*Print)("HANDLE hPort %p\n", pSpool->hPort);
|
|
(*Print)("DWORD Status %d\n", pSpool->Status);
|
|
ExtractpSpoolStatus( Print, pSpool->Status);
|
|
|
|
(*Print)("ACCESS_MASK GrantedAccess %p\n", (DWORD)pSpool->GrantedAccess);
|
|
(*Print)("DWORD ChangeFlags %p\n", pSpool->ChangeFlags);
|
|
(*Print)("DWORD WaitFlags %x\n", pSpool->WaitFlags);
|
|
(*Print)("PDWORD pChangeFlags %p\n", pSpool->pChangeFlags);
|
|
(*Print)("HANDLE ChangeEvent %d\n", pSpool->ChangeEvent);
|
|
(*Print)("DWORD OpenPortError %x\n", pSpool->OpenPortError);
|
|
(*Print)("HANDLE hNotify %p\n", pSpool->hNotify);
|
|
(*Print)("ESTATUS eStatus %d\n", pSpool->eStatus);
|
|
(*Print)("pIniSpooler pIniSpooler %p\n", pSpool->pIniSpooler);
|
|
(*Print)("PINIXCV pIniXcv %p\n", pSpool->pIniXcv);
|
|
movestr(pSpool->SplClientInfo1.pUserName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pUserName %ws\n", Buffer);
|
|
movestr(pSpool->SplClientInfo1.pMachineName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pMachineName %ws\n", Buffer);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpWSpool(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PWSPOOL pWSpool)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("WSpool - Win32Spl Handle\n");
|
|
(*Print)("DWORD signature %d\n", pWSpool->signature);
|
|
(*Print)("struct _WSPOOL *pNext %p\n", pWSpool->pNext);
|
|
(*Print)("struct _WSPOOL *pPrev %p\n", pWSpool->pPrev);
|
|
(*Print)("DWORD cRef %d\n", pWSpool->cRef);
|
|
|
|
Buffer[0] = L'\0';
|
|
movestr(pWSpool->pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
Buffer[0] = L'\0';
|
|
|
|
(*Print)("DWORD Type %d\n", pWSpool->Type);
|
|
|
|
if ( pWSpool->Type == SJ_WIN32HANDLE )
|
|
(*Print)(" SJ_WIN32HANDLE\n");
|
|
|
|
if ( pWSpool->Type == LM_HANDLE )
|
|
(*Print)(" LM_HANDLE\n");
|
|
|
|
(*Print)("HANDLE RpcHandle %p\n", pWSpool->RpcHandle);
|
|
|
|
movestr(pWSpool->pServer, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pServer %ws\n", Buffer);
|
|
Buffer[0] = L'\0';
|
|
|
|
movestr(pWSpool->pShare, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pShare %ws\n", Buffer);
|
|
Buffer[0] = L'\0';
|
|
|
|
(*Print)("HANDLE hFile %p\n", pWSpool->hFile);
|
|
(*Print)("DWORD Status %d\n", pWSpool->Status);
|
|
ExtractWSpoolStatus( Print, pWSpool->Status );
|
|
|
|
(*Print)("DWORD RpcError %d\n", pWSpool->RpcError);
|
|
(*Print)("LMNOTIFY LMNotify %p %p %p\n", pWSpool->LMNotify.ChangeEvent,
|
|
pWSpool->LMNotify.hNotify,
|
|
pWSpool->LMNotify.fdwChangeFlags );
|
|
|
|
(*Print)("HANDLE hIniSpooler %p\n", pWSpool->hIniSpooler );
|
|
(*Print)("HANDLE hSplPrinter %p\n", pWSpool->hSplPrinter );
|
|
(*Print)("HANDLE hToken %p\n", pWSpool->hToken );
|
|
|
|
movestr(pWSpool->PrinterDefaults.pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR PrinterDefaults.pDatatype %ws\n", Buffer);
|
|
Buffer[0] = L'\0';
|
|
(*Print)("LPDEVMODE PrinterDefaults.pDevMode %p\n", pWSpool->PrinterDefaults.pDevMode);
|
|
(*Print)("ACCESS_MASK PrinterDefaults.DesiredAccess %x\n", pWSpool->PrinterDefaults.DesiredAccess);
|
|
ExtractPrinterAccess( Print, pWSpool->PrinterDefaults.DesiredAccess);
|
|
(*Print)("HANDLE hWaitValidHandle %p\n", pWSpool->hWaitValidHandle );
|
|
(*Print)("BOOL bNt3xServer %d\n", pWSpool->bNt3xServer);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
DbgDumpShadowFile(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PSHADOWFILE pShadowFile)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("ShadowFile\n");
|
|
(*Print)("DWORD signature %d\n", pShadowFile->signature);
|
|
(*Print)("DWORD Status 0x%.8x\n", pShadowFile->Status);
|
|
(*Print)("DWORD JobId %d\n", pShadowFile->JobId);
|
|
(*Print)("DWORD Priority %d\n", pShadowFile->Priority);
|
|
|
|
movestr(pShadowFile->pNotify, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pNotify %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pUser, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pUser %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDocument, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDocument %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pPrinterName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrinterName %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDriverName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDriverName %ws\n", Buffer);
|
|
|
|
(*Print)("LPDEVMODE pDevMode %p\n", pShadowFile->pDevMode);
|
|
|
|
movestr(pShadowFile->pPrintProcName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrintProcName %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDatatype %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pParameters %ws\n", Buffer);
|
|
//SYSTEMTIME Submitted;
|
|
(*Print)("DWORD StartTime %d\n", pShadowFile->StartTime);
|
|
(*Print)("DWORD UntilTime %d\n", pShadowFile->UntilTime);
|
|
(*Print)("DWORD Size %d\n", pShadowFile->Size);
|
|
(*Print)("DWORD cPages %d\n", pShadowFile->cPages);
|
|
(*Print)("DWORD cbSecurityDescriptor %d\n", pShadowFile->cbSecurityDescriptor);
|
|
(*Print)("PSECURITY_DESCRIPTOR pSecurityDescriptor %p\n", pShadowFile->pSecurityDescriptor);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpShadowFile2(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PSHADOWFILE_2 pShadowFile)
|
|
{
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
|
|
(*Print)("ShadowFile2\n");
|
|
(*Print)("DWORD signature %x\n", pShadowFile->signature);
|
|
(*Print)("DWORD Status 0x%.8x\n", pShadowFile->Status);
|
|
(*Print)("DWORD JobId %d\n", pShadowFile->JobId);
|
|
(*Print)("DWORD Priority %d\n", pShadowFile->Priority);
|
|
|
|
movestr(pShadowFile->pNotify, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pNotify %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pUser, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pUser %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDocument, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDocument %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pPrinterName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrinterName %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDriverName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDriverName %ws\n", Buffer);
|
|
|
|
(*Print)("LPDEVMODE pDevMode %p\n", pShadowFile->pDevMode);
|
|
|
|
movestr(pShadowFile->pPrintProcName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrintProcName %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDatatype %ws\n", Buffer);
|
|
|
|
movestr(pShadowFile->pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pParameters %ws\n", Buffer);
|
|
//SYSTEMTIME Submitted;
|
|
(*Print)("DWORD StartTime %d\n", pShadowFile->StartTime);
|
|
(*Print)("DWORD UntilTime %d\n", pShadowFile->UntilTime);
|
|
(*Print)("DWORD Size %d\n", pShadowFile->Size);
|
|
(*Print)("DWORD cPages %d\n", pShadowFile->cPages);
|
|
(*Print)("DWORD cbSecurityDescriptor %d\n", pShadowFile->cbSecurityDescriptor);
|
|
(*Print)("PSECURITY_DESCRIPTOR pSecurityDescriptor %p\n", pShadowFile->pSecurityDescriptor);
|
|
(*Print)("DWORD Version %d\n", pShadowFile->Version);
|
|
(*Print)("DWORD dwReboots %d\n", pShadowFile->dwReboots);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
DbgDumpPrintHandle(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PPRINTHANDLE pPrintHandle)
|
|
{
|
|
NOTIFY Notify;
|
|
|
|
(*Print)("PrintHandle\n");
|
|
(*Print)("DWORD signature %d\n", pPrintHandle->signature);
|
|
(*Print)("LPPROVIDOR pProvidor %p\n", pPrintHandle->pProvidor);
|
|
(*Print)("HANDLE hPrinter 0x%.8x\n", pPrintHandle->hPrinter);
|
|
(*Print)("PCHANGE pChange %p\n", pPrintHandle->pChange);
|
|
|
|
if (pPrintHandle->pChange) {
|
|
DbgDumpChange(hCurrentProcess, Print, pPrintHandle->pChange);
|
|
}
|
|
|
|
(*Print)("PNOTIFY pNotify %p\n", pPrintHandle->pNotify);
|
|
|
|
if (pPrintHandle->pNotify) {
|
|
movestruct(pPrintHandle->pNotify, &Notify, NOTIFY);
|
|
DbgDumpNotify(hCurrentProcess, Print, &Notify);
|
|
}
|
|
|
|
(*Print)("PPRINTHANDLE pNext %p\n", pPrintHandle->pNext);
|
|
(*Print)("DWORD fdwReplyTypes 0x%.8x\n", pPrintHandle->fdwReplyTypes);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpChange(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PCHANGE pChange)
|
|
{
|
|
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
CHANGE Change;
|
|
|
|
// if we've got no address, then quit now - nothing we can do
|
|
|
|
if (!pChange) {
|
|
return(0);
|
|
}
|
|
|
|
|
|
movestruct(pChange, &Change, CHANGE);
|
|
|
|
if (Change.signature != CHANGEHANDLE_SIGNATURE) {
|
|
(*Print)("Warning: Unknown Signature\n");
|
|
return FALSE;
|
|
}
|
|
|
|
(*Print)("Change %p\n", pChange);
|
|
(*Print)(" Link %p\n", Change.Link.pNext);
|
|
(*Print)(" signature %d\n", Change.signature);
|
|
(*Print)(" eStatus 0x%x ", Change.eStatus);
|
|
ExtractChangeStatus(Print, Change.eStatus);
|
|
|
|
(*Print)(" dwColor %d\n", Change.dwColor);
|
|
(*Print)(" cRef %d\n", Change.cRef);
|
|
|
|
movestr(Change.pszLocalMachine, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)(" pszLocalMachine %ws\n", Buffer);
|
|
|
|
DbgDumpChangeInfo(hCurrentProcess, Print, &Change.ChangeInfo);
|
|
|
|
(*Print)(" dwCount 0x%.8x\n", Change.dwCount);
|
|
(*Print)(" hEvent 0x%.8x\n", Change.hEvent);
|
|
(*Print)(" fdwChangeFlags 0x%.8x\n", Change.fdwChangeFlags);
|
|
(*Print)(" dwPrinterRemote 0x%.8x\n", Change.dwPrinterRemote);
|
|
(*Print)(" hNotifyRemote 0x%.8x\n", Change.hNotifyRemote);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpNotify(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PNOTIFY pNotify)
|
|
{
|
|
(*Print)("Notify\n");
|
|
(*Print)(" signature %d\n", pNotify->signature);
|
|
(*Print)(" pPrintHandle %p\n", pNotify->pPrintHandle);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpChangeInfo(HANDLE hCurrentProcess, PNTSD_OUTPUT_ROUTINE Print, PCHANGEINFO pChangeInfo)
|
|
{
|
|
(*Print)(" ChangeInfo %x\n", pChangeInfo);
|
|
(*Print)(" Link %p\n", pChangeInfo->Link.pNext);
|
|
(*Print)(" pPrintHandle %p\n", pChangeInfo->pPrintHandle);
|
|
(*Print)(" fdwOptions 0x%.8x\n", pChangeInfo->fdwOptions);
|
|
(*Print)(" fdwFilterFlags 0x%.8x\n", pChangeInfo->fdwFilterFlags);
|
|
(*Print)(" dwStatus 0x%.8x\n", pChangeInfo->fdwStatus);
|
|
(*Print)(" dwPollTime 0x%.8x\n", pChangeInfo->dwPollTime);
|
|
(*Print)(" dwPollTimeLeft 0x%.8x\n", pChangeInfo->dwPollTimeLeft);
|
|
(*Print)(" bResetPollTime 0x%.8x\n", pChangeInfo->bResetPollTime);
|
|
(*Print)(" fdwFlags 0x%.8x\n", pChangeInfo->fdwFlags);
|
|
(*Print)(" pPrinterNotifyInfo %p\n", pChangeInfo->pPrinterNotifyInfo);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
DbgDumpLL(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
UINT_PTR pAddress,
|
|
BOOL bCountOn,
|
|
DWORD dwCount,
|
|
PUINT_PTR pNextAddress
|
|
)
|
|
{
|
|
|
|
INIDRIVER IniDriver;
|
|
INIENVIRONMENT IniEnvironment;
|
|
INIPRINTER IniPrinter;
|
|
INIPRINTPROC IniPrintProc;
|
|
ININETPRINT IniNetPrint;
|
|
INIMONITOR IniMonitor;
|
|
INIPORT IniPort;
|
|
WINIPORT WIniPort;
|
|
INIFORM IniForm;
|
|
INIJOB IniJob;
|
|
INISPOOLER IniSpooler;
|
|
SPOOL Spool;
|
|
WSPOOL WSpool;
|
|
SHADOWFILE ShadowFile;
|
|
SHADOWFILE_2 ShadowFile2;
|
|
DWORD Signature;
|
|
UINT_PTR NextAddress;
|
|
PRINTHANDLE PrintHandle;
|
|
INIVERSION IniVersion;
|
|
WCACHEINIPRINTEREXTRA WCacheIniPrinterExtra;
|
|
BOOL bRetval = TRUE;
|
|
DWORD i;
|
|
|
|
if (!pAddress) {
|
|
*pNextAddress = 0;
|
|
return FALSE ;
|
|
}
|
|
|
|
if (bCountOn && (dwCount == 0)) {
|
|
*pNextAddress = (UINT_PTR)pAddress;
|
|
return FALSE ;
|
|
}
|
|
|
|
for (i=0; pAddress && (!bCountOn || i < dwCount); i++)
|
|
{
|
|
movestruct(pAddress,&Signature, DWORD);
|
|
|
|
(*Print)("\n%p ",pAddress);
|
|
|
|
switch (Signature) {
|
|
|
|
case ISP_SIGNATURE: // dump INISPOOLER
|
|
movestruct(pAddress, &IniSpooler, INISPOOLER);
|
|
DbgDumpIniSpooler(hCurrentProcess, Print, (PINISPOOLER)&IniSpooler);
|
|
NextAddress = (UINT_PTR)IniSpooler.pIniNextSpooler;
|
|
break;
|
|
|
|
case IPP_SIGNATURE: // dump INIPRINTPROC structure
|
|
movestruct(pAddress, &IniPrintProc, INIPRINTPROC);
|
|
DbgDumpIniPrintProc(hCurrentProcess, Print, (PINIPRINTPROC)&IniPrintProc);
|
|
NextAddress = (UINT_PTR)IniPrintProc.pNext;
|
|
break;
|
|
|
|
case ID_SIGNATURE: // dump INIDRIVER structure
|
|
movestruct(pAddress, &IniDriver, INIDRIVER);
|
|
DbgDumpIniDriver(hCurrentProcess, Print, (PINIDRIVER)&IniDriver);
|
|
NextAddress = (UINT_PTR)IniDriver.pNext;
|
|
break;
|
|
|
|
case IE_SIGNATURE: // dump INIENVIRONMENT structure
|
|
movestruct(pAddress, &IniEnvironment, INIENVIRONMENT);
|
|
DbgDumpIniEnvironment(hCurrentProcess, Print, (PINIENVIRONMENT)&IniEnvironment);
|
|
NextAddress = (UINT_PTR)IniEnvironment.pNext;
|
|
break;
|
|
|
|
case IV_SIGNATURE: // dump INIVERSION structure
|
|
movestruct(pAddress, &IniVersion, INIVERSION);
|
|
DbgDumpIniVersion(hCurrentProcess, Print, (PINIVERSION)&IniVersion);
|
|
NextAddress = (UINT_PTR)IniVersion.pNext;
|
|
break;
|
|
|
|
case IP_SIGNATURE:
|
|
movestruct(pAddress, &IniPrinter, INIPRINTER);
|
|
DbgDumpIniPrinter(hCurrentProcess, Print, (PINIPRINTER)&IniPrinter);
|
|
NextAddress = (UINT_PTR)IniPrinter.pNext;
|
|
break;
|
|
|
|
case WCIP_SIGNATURE:
|
|
movestruct(pAddress, &WCacheIniPrinterExtra, WCACHEINIPRINTEREXTRA);
|
|
DbgDumpWCacheIniPrinter(hCurrentProcess, Print, (PWCACHEINIPRINTEREXTRA)&WCacheIniPrinterExtra);
|
|
NextAddress = 0;
|
|
break;
|
|
|
|
case IN_SIGNATURE:
|
|
movestruct(pAddress, &IniNetPrint, ININETPRINT);
|
|
DbgDumpIniNetPrint(hCurrentProcess, Print, (PININETPRINT)&IniNetPrint);
|
|
NextAddress = (UINT_PTR)IniNetPrint.pNext;
|
|
break;
|
|
|
|
case IMO_SIGNATURE:
|
|
movestruct(pAddress, &IniMonitor, INIMONITOR);
|
|
DbgDumpIniMonitor(hCurrentProcess, Print, (PINIMONITOR)&IniMonitor);
|
|
NextAddress = (UINT_PTR)IniMonitor.pNext;
|
|
break;
|
|
|
|
case IPO_SIGNATURE:
|
|
movestruct(pAddress, &IniPort, INIPORT);
|
|
DbgDumpIniPort(hCurrentProcess, Print, (PINIPORT)&IniPort);
|
|
NextAddress = (UINT_PTR)IniPort.pNext;
|
|
break;
|
|
|
|
case WIPO_SIGNATURE:
|
|
movestruct(pAddress, &WIniPort, WINIPORT);
|
|
DbgDumpWIniPort(hCurrentProcess, Print, (PWINIPORT)&WIniPort);
|
|
NextAddress = (UINT_PTR)WIniPort.pNext;
|
|
break;
|
|
|
|
case IFO_SIGNATURE:
|
|
movestruct(pAddress, &IniForm, INIFORM);
|
|
DbgDumpIniForm(hCurrentProcess, Print, (PINIFORM)&IniForm);
|
|
NextAddress = (UINT_PTR)IniForm.pNext;
|
|
break;
|
|
|
|
case IJ_SIGNATURE:
|
|
movestruct(pAddress, &IniJob, INIJOB);
|
|
DbgDumpIniJob(hCurrentProcess, Print, (PINIJOB)&IniJob);
|
|
NextAddress = (UINT_PTR)IniJob.pIniNextJob;
|
|
break;
|
|
|
|
case SJ_SIGNATURE:
|
|
movestruct(pAddress, &Spool, SPOOL);
|
|
DbgDumpSpool(hCurrentProcess, Print, (PSPOOL)&Spool);
|
|
NextAddress = (UINT_PTR)Spool.pNext;
|
|
break;
|
|
|
|
case WSJ_SIGNATURE:
|
|
movestruct(pAddress, &WSpool, WSPOOL);
|
|
DbgDumpWSpool(hCurrentProcess, Print, (PWSPOOL)&WSpool);
|
|
NextAddress = (UINT_PTR)WSpool.pNext;
|
|
break;
|
|
|
|
case PRINTHANDLE_SIGNATURE:
|
|
movestruct(pAddress, &PrintHandle, PRINTHANDLE);
|
|
DbgDumpPrintHandle(hCurrentProcess, Print, (PPRINTHANDLE)&PrintHandle);
|
|
NextAddress = 0x00000000;
|
|
break;
|
|
|
|
case SF_SIGNATURE:
|
|
movestruct(pAddress, &ShadowFile, SHADOWFILE);
|
|
DbgDumpShadowFile(hCurrentProcess, Print, (PSHADOWFILE)&ShadowFile);
|
|
NextAddress = 0x00000000;
|
|
break;
|
|
|
|
case SF_SIGNATURE_2:
|
|
movestruct(pAddress, &ShadowFile2, SHADOWFILE_2);
|
|
DbgDumpShadowFile2(hCurrentProcess, Print, (PSHADOWFILE_2)&ShadowFile2);
|
|
NextAddress = 0x00000000;
|
|
break;
|
|
|
|
default:
|
|
// Unknown signature -- no data to dump
|
|
(*Print)("Warning: Unknown Signature\n");
|
|
NextAddress = 0x00000000;
|
|
bRetval = FALSE;
|
|
break;
|
|
}
|
|
|
|
pAddress = NextAddress;
|
|
*pNextAddress = NextAddress;
|
|
}
|
|
|
|
return bRetval ;
|
|
}
|
|
|
|
BOOL DumpDevMode(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
UINT_PTR lpAddress
|
|
)
|
|
{
|
|
DEVMODEW DevMode;
|
|
DWORD i;
|
|
|
|
Print("DevMode\n");
|
|
|
|
if (!lpAddress) {
|
|
Print("\n Null DEVMODE Structure lpDevMode = NULL\n");
|
|
return TRUE ;
|
|
}
|
|
movestruct(lpAddress, &DevMode, DEVMODEW);
|
|
|
|
Print("TCHAR dmDeviceName[32] %ws\n", DevMode.dmDeviceName);
|
|
Print("WORD dmSpecVersion %d\n", DevMode.dmSpecVersion);
|
|
Print("WORD dmDriverVersion %d\n", DevMode.dmDriverVersion);
|
|
Print("WORD dmSize %d\n", DevMode.dmSize);
|
|
Print("WORD dmDriverExtra %d\n", DevMode.dmDriverExtra);
|
|
Print("DWORD dmFields %d\n", DevMode.dmFields);
|
|
|
|
for (i = 0; i < MAX_DEVMODE_FIELDS; i++ ) {
|
|
if (DevMode.dmFields & DevModeFieldsTable[i].dmField) {
|
|
Print("\t %s is ON\n", DevModeFieldsTable[i].String);
|
|
} else {
|
|
Print("\t %s is OFF\n", DevModeFieldsTable[i].String);
|
|
}
|
|
}
|
|
|
|
Print("short dmOrientation %d\n", DevMode.dmOrientation);
|
|
Print("short dmPaperSize %d\n", DevMode.dmPaperSize);
|
|
|
|
if ((DevMode.dmPaperSize >= 1) && (DevMode.dmPaperSize <= MAX_DEVMODE_PAPERSIZES)) {
|
|
Print("Paper size from dmPaperSize is %s\n", DevModePaperSizes[DevMode.dmPaperSize - 1]);
|
|
} else {
|
|
Print("Paper size from dmPaperSize is out of bounds!!\n");
|
|
}
|
|
|
|
Print("short dmPaperLength %d\n", DevMode.dmPaperLength);
|
|
Print("short dmPaperWidth %d\n", DevMode.dmPaperWidth);
|
|
|
|
Print("short dmScale %d\n", DevMode.dmScale);
|
|
Print("short dmCopies %d\n", DevMode.dmCopies);
|
|
Print("short dmDefaultSource %d\n", DevMode.dmDefaultSource);
|
|
Print("short dmPrintQuality %d\n", DevMode.dmPrintQuality);
|
|
Print("short dmColor %d\n", DevMode.dmColor);
|
|
Print("short dmDuplex %d\n", DevMode.dmDuplex);
|
|
Print("short dmYResolution %d\n", DevMode.dmYResolution);
|
|
Print("short dmTTOption %d\n", DevMode.dmTTOption);
|
|
Print("short dmCollate %d\n", DevMode.dmCollate);
|
|
Print("TCHAR dmFormName[32] %ws\n", DevMode.dmFormName);
|
|
Print("DWORD dmLogPixels %d\n", DevMode.dmLogPixels);
|
|
Print("USHORT dmBitsPerPel %d\n", DevMode.dmBitsPerPel);
|
|
Print("DWORD dmPelsWidth %d\n", DevMode.dmPelsWidth);
|
|
Print("DWORD dmPelsHeight %d\n", DevMode.dmPelsHeight);
|
|
Print("DWORD dmDisplayFlags %d\n", DevMode.dmDisplayFlags);
|
|
Print("DWORD dmDisplayFrequency %d\n", DevMode.dmDisplayFrequency);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DbgDumpPI2(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
UINT_PTR lpAddress,
|
|
DWORD dwCount
|
|
)
|
|
{
|
|
PRINTER_INFO_2 pi2;
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
PPRINTER_INFO_2 pPrinterInfo;
|
|
|
|
for ( pPrinterInfo = (PPRINTER_INFO_2)lpAddress;
|
|
pPrinterInfo != NULL && dwCount != 0;
|
|
pPrinterInfo++, dwCount-- ) {
|
|
|
|
|
|
movestruct( pPrinterInfo, &pi2, PRINTER_INFO_2);
|
|
|
|
(*Print)("\nAddress %x\n", pPrinterInfo );
|
|
|
|
movestr(pi2.pServerName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pServerName %ws\n", Buffer);
|
|
|
|
movestr(pi2.pPrinterName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrinterName %ws\n", Buffer);
|
|
|
|
movestr(pi2.pShareName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pShareName %ws\n", Buffer);
|
|
|
|
movestr(pi2.pPortName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPortName %ws\n", Buffer);
|
|
|
|
movestr(pi2.pDriverName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDriverName %ws\n", Buffer);
|
|
|
|
movestr(pi2.pComment, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pComment %ws\n", Buffer);
|
|
|
|
movestr(pi2.pLocation, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pLocation %ws\n", Buffer);
|
|
|
|
(*Print)("LPDEVMODE pDevMode %p\n", pi2.pDevMode);
|
|
|
|
movestr(pi2.pSepFile, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pSepFile %ws\n", Buffer);
|
|
|
|
movestr(pi2.pPrintProcessor, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrintProcessor %ws\n", Buffer);
|
|
|
|
movestr(pi2.pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pDatatype %ws\n", Buffer);
|
|
|
|
movestr(pi2.pParameters, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pParameters %ws\n", Buffer);
|
|
|
|
(*Print)("PSECURITY_DESCRIPTOR pSecurityDescriptor %p\n", pi2.pSecurityDescriptor);
|
|
|
|
(*Print)("DWORD Attributes 0x%.8x\n",pi2.Attributes);
|
|
ExtractPrinterAttributes( Print, pi2.Attributes);
|
|
|
|
(*Print)("DWORD Priority %d\n", pi2.Priority);
|
|
(*Print)("DWORD DefaultPriority %d\n", pi2.DefaultPriority);
|
|
(*Print)("DWORD StartTime %d\n", pi2.StartTime);
|
|
(*Print)("DWORD UntilTime %d\n", pi2.UntilTime);
|
|
|
|
(*Print)("DWORD Status 0x%.8x\n", pi2.Status);
|
|
ExtractExternalPrinterStatus( Print, pi2.Status );
|
|
|
|
(*Print)("DWORD cJobs %d\n", pi2.cJobs);
|
|
(*Print)("DWORD AveragePPM %d\n", pi2.AveragePPM);
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL DbgDumpPI0(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
UINT_PTR lpAddress,
|
|
DWORD dwCount
|
|
)
|
|
{
|
|
PRINTER_INFO_STRESS pi0;
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
PPRINTER_INFO_STRESS pPrinterInfo;
|
|
|
|
for ( pPrinterInfo = (PPRINTER_INFO_STRESS)lpAddress;
|
|
pPrinterInfo != NULL && dwCount != 0;
|
|
pPrinterInfo++, dwCount-- ) {
|
|
|
|
|
|
movestruct( pPrinterInfo, &pi0, PRINTER_INFO_STRESS);
|
|
|
|
(*Print)("\nAddress %x\n", pPrinterInfo );
|
|
|
|
movestr(pi0.pPrinterName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pPrinterName %ws\n", Buffer);
|
|
|
|
movestr(pi0.pServerName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pServerName %ws\n", Buffer);
|
|
|
|
(*Print)("DWORD cJobs %d\n", pi0.cJobs);
|
|
|
|
(*Print)("DWORD cTotalJobs %d\n", pi0.cTotalJobs);
|
|
|
|
(*Print)("DWORD cTotalBytes (LOWER DWORD) %d\n", pi0.cTotalBytes);
|
|
|
|
(*Print)("SYSTEMTIME stUpTime %d/%d/%d %d %d:%d:%d.%d\n",pi0.stUpTime.wYear,
|
|
pi0.stUpTime.wMonth,
|
|
pi0.stUpTime.wDay,
|
|
pi0.stUpTime.wDayOfWeek,
|
|
pi0.stUpTime.wHour,
|
|
pi0.stUpTime.wMinute,
|
|
pi0.stUpTime.wSecond,
|
|
pi0.stUpTime.wMilliseconds);
|
|
|
|
(*Print)("DWORD MaxcRef %d\n", pi0.MaxcRef);
|
|
|
|
(*Print)("DWORD cTotalPagesPrinted %d\n", pi0.cTotalPagesPrinted);
|
|
|
|
(*Print)("DWORD dwGetVersion %d\n", pi0.dwGetVersion);
|
|
|
|
(*Print)("DWORD fFreeBuild %d\n", pi0.fFreeBuild);
|
|
|
|
(*Print)("DWORD cSpooling %d\n", pi0.cSpooling);
|
|
|
|
(*Print)("DWORD cMaxSpooling %d\n", pi0.cMaxSpooling);
|
|
|
|
(*Print)("DWORD cRef %d\n", pi0.cRef);
|
|
|
|
(*Print)("DWORD cErrorOutOfPaper %d\n", pi0.cErrorOutOfPaper);
|
|
|
|
(*Print)("DWORD cErrorNotReady %d\n", pi0.cErrorNotReady);
|
|
|
|
(*Print)("DWORD cJobError %d\n", pi0.cJobError);
|
|
|
|
(*Print)("DWORD dwNumberOfProcessors %d\n", pi0.dwNumberOfProcessors);
|
|
|
|
(*Print)("DWORD dwProcessorType %d\n", pi0.dwProcessorType);
|
|
|
|
(*Print)("DWORD dwHighPartTotalBytes %d\n", pi0.dwHighPartTotalBytes);
|
|
|
|
(*Print)("DWORD cChangeID %d\n", pi0.cChangeID);
|
|
|
|
(*Print)("DWORD dwLastError %d\n", pi0.dwLastError);
|
|
|
|
(*Print)("DWORD Status 0x%.8x\n", pi0.Status);
|
|
ExtractExternalPrinterStatus( Print, pi0.Status );
|
|
|
|
(*Print)("DWORD cEnumerateNetworkPrinters %d\n", pi0.cEnumerateNetworkPrinters);
|
|
|
|
(*Print)("DWORD cAddNetPrinters %d\n", pi0.cAddNetPrinters);
|
|
|
|
(*Print)("WORD wProcessorArchitecture %d\n", pi0.wProcessorArchitecture);
|
|
|
|
(*Print)("WORD wProcessorLevel %d\n", pi0.wProcessorLevel);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DbgDumpFI1(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
UINT_PTR lpAddress,
|
|
DWORD dwCount
|
|
)
|
|
{
|
|
FORM_INFO_1 fi1;
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
PFORM_INFO_1 pFORMInfo;
|
|
|
|
for ( pFORMInfo = (PFORM_INFO_1)lpAddress;
|
|
pFORMInfo != NULL && dwCount != 0;
|
|
pFORMInfo++, dwCount-- ) {
|
|
|
|
|
|
movestruct( pFORMInfo, &fi1, FORM_INFO_1);
|
|
|
|
(*Print)("\nAddress %p\n", pFORMInfo );
|
|
|
|
(*Print)("DWORD Flags %x", fi1.Flags);
|
|
|
|
if ( fi1.Flags & FORM_BUILTIN )
|
|
(*Print)(" FORM_BUILTIN\n");
|
|
else
|
|
(*Print)(" FORM_USERDEFINED\n");
|
|
|
|
movestr(fi1.pName, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR pName %ws\n", Buffer);
|
|
|
|
(*Print)("SIZEL Size cx %d cy %d\n", fi1.Size.cx, fi1.Size.cy);
|
|
(*Print)("RECTL ImageableArea left %d right %d top %d bottom %d\n",
|
|
fi1.ImageableArea.left,
|
|
fi1.ImageableArea.right,
|
|
fi1.ImageableArea.top,
|
|
fi1.ImageableArea.bottom);
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DbgDumpPDEF(
|
|
HANDLE hCurrentProcess,
|
|
PNTSD_OUTPUT_ROUTINE Print,
|
|
UINT_PTR lpAddress,
|
|
DWORD dwCount
|
|
)
|
|
{
|
|
PRINTER_DEFAULTS PDef;
|
|
WCHAR Buffer[MAX_PATH+1];
|
|
PPRINTER_DEFAULTS pPDef;
|
|
|
|
pPDef = ( PPRINTER_DEFAULTS )lpAddress;
|
|
|
|
movestruct( pPDef, &PDef, PRINTER_DEFAULTS);
|
|
|
|
(*Print)("\nAddress %x\n", pPDef );
|
|
|
|
Buffer[0] = L'\0';
|
|
movestr(PDef.pDatatype, Buffer, sizeof(WCHAR)*MAX_PATH);
|
|
(*Print)("LPWSTR PrinterDefaults.pDatatype %p %ws\n", PDef.pDatatype, Buffer);
|
|
(*Print)("LPDEVMODE PrinterDefaults.pDevMode %p\n", PDef.pDevMode);
|
|
(*Print)("ACCESS_MASK PrinterDefaults.DesiredAccess %p\n", PDef.DesiredAccess);
|
|
ExtractPrinterAccess( Print, PDef.DesiredAccess );
|
|
|
|
return TRUE;
|
|
}
|