Initial checkin of junk code from my bzr tree.
authorGerald (Jerry) Carter <jerry@samba.org>
Mon, 15 Oct 2007 12:22:41 +0000 (07:22 -0500)
committerGerald (Jerry) Carter <jerry@samba.org>
Mon, 15 Oct 2007 12:23:25 +0000 (07:23 -0500)
Original tree was located at http://people.samba.org/bzr/jerry/slag/

47 files changed:
AbortPrinter.c [new file with mode: 0644]
AddForm.c [new file with mode: 0644]
AddJob.c [new file with mode: 0644]
AddPrinter.c [new file with mode: 0644]
AddPrinterConnection.c [new file with mode: 0644]
AddPrinterDriver.c [new file with mode: 0644]
AddPrinterDriverEx.c [new file with mode: 0644]
AddPrinterEx.c [new file with mode: 0644]
DeleteForm.c [new file with mode: 0644]
DeletePrinter.c [new file with mode: 0644]
DeletePrinterConnection.c [new file with mode: 0644]
DeletePrinterData.c [new file with mode: 0644]
DeletePrinterDataEx.c [new file with mode: 0644]
DeletePrinterDriver.c [new file with mode: 0644]
DeletePrinterDriverEx.c [new file with mode: 0644]
DeletePrinterKey.c [new file with mode: 0644]
DocPrinter.c [new file with mode: 0644]
EnumForms.c [new file with mode: 0644]
EnumJobs.c [new file with mode: 0644]
EnumMonitors.c [new file with mode: 0644]
EnumPorts.c [new file with mode: 0644]
EnumPrintProcessorDatatypes.c [new file with mode: 0644]
EnumPrintProcessors.c [new file with mode: 0644]
EnumPrinterData.c [new file with mode: 0644]
EnumPrinterDataEx.c [new file with mode: 0644]
EnumPrinterDrivers.c [new file with mode: 0644]
EnumPrinterKey.c [new file with mode: 0644]
EnumPrinters.c [new file with mode: 0644]
GetForm.c [new file with mode: 0644]
GetJob.c [new file with mode: 0644]
GetPrintProcessorDirectory.c [new file with mode: 0644]
GetPrinter.c [new file with mode: 0644]
GetPrinterData.c [new file with mode: 0644]
GetPrinterDataEx.c [new file with mode: 0644]
GetPrinterDriver.c [new file with mode: 0644]
GetPrinterDriverDirectory.c [new file with mode: 0644]
OpenPrinter.c [new file with mode: 0644]
PagePrinter.c [new file with mode: 0644]
PrinterChangeNotification.c [new file with mode: 0644]
PrinterChangeNotify.c [new file with mode: 0644]
ResetPrinter.c [new file with mode: 0644]
SetForm.c [new file with mode: 0644]
SetJob.c [new file with mode: 0644]
SetPrinter.c [new file with mode: 0644]
SetPrinterData.c [new file with mode: 0644]
SetPrinterDataEx.c [new file with mode: 0644]
printlib.c [new file with mode: 0644]

diff --git a/AbortPrinter.c b/AbortPrinter.c
new file mode 100644 (file)
index 0000000..33c6704
--- /dev/null
@@ -0,0 +1,66 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+       LPVOID lpMsgBuf;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+       if (strcmp(argv[1], "NULL") == 0)\r
+       {\r
+               argv[1] = NULL;\r
+               printf ("Calling AbortPrinter() on local machine\n");\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+\r
+       if (!AbortPrinter (printer))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("AbortPrinter called successfully for [%s]\n", argv[1]);\r
+       }\r
+\r
+\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/AddForm.c b/AddForm.c
new file mode 100644 (file)
index 0000000..aa3dc0e
--- /dev/null
+++ b/AddForm.c
@@ -0,0 +1,92 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                          printer;\r
+       PRINTER_DEFAULTS        defaults;\r
+       DWORD                           returned, needed, i;\r
+       PFORM_INFO_1            buffer1 = NULL;\r
+\r
+       if ( argc < 3) {\r
+               fprintf (stderr, "useage: %s <localprinter> <networkprinter>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER;\r
+       defaults.pDatatype = NULL;\r
+       defaults.pDevMode = NULL;\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, &defaults))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+\r
+       EnumForms(printer, 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {\r
+               fprintf (stderr, "Error getting form information for [%s] using NULL buffer.\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ( (buffer1 = (FORM_INFO_1*)malloc(needed)) == NULL ) {\r
+               fprintf (stderr, "Unable to malloc memory for FORM_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+\r
+       if (!EnumForms(printer, 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[1], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       /* close the printer */\r
+       if ( !ClosePrinter(printer) ) {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[2], &printer, &defaults))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               if ( buffer1[i].Flags == FORM_PRINTER ) {\r
+                       printf("Adding form \"%s\"\n", buffer1[i].pName );\r
+                       if ( !AddForm( printer, 1, (LPBYTE)&buffer1[i] ) )\r
+                               PrintLastError();\r
+               }\r
+       }       \r
+\r
+\r
+       free (buffer1);\r
+\r
+\r
+       /* close the printer */\r
+       if ( !ClosePrinter(printer) ) {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/AddJob.c b/AddJob.c
new file mode 100644 (file)
index 0000000..c3e36d1
--- /dev/null
+++ b/AddJob.c
@@ -0,0 +1,128 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned, needed, i;\r
+       PJOB_INFO_1             buffer1 = NULL;\r
+       PJOB_INFO_2             buffer2 = NULL;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       EnumJobs(printer, START_JOB, MAX_JOBS, 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+               {\r
+                       fprintf (stderr, "Error getting job information for [%s] using NULL buffer.\n", argv[2]);\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("No jobs returned for [%s]\n", argv[1]);\r
+                       ClosePrinter (printer);\r
+                       exit (0);\r
+               }\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for JOB_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumJobs(printer, START_JOB, MAX_JOBS, 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Job Info Level 1:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_job_info_1 (&buffer1[i]);\r
+       }\r
+       printf ("\n");\r
+       free (buffer1);\r
+\r
+\r
+       /* INFO LEVEL 2 */\r
+       EnumJobs(printer, START_JOB, MAX_JOBS, 2, (LPBYTE)buffer2, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+               {\r
+                       fprintf (stderr, "Error getting job information for [%s] using NULL buffer.\n", argv[2]);\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("No jobs returned for [%s]\n", argv[1]);\r
+                       ClosePrinter (printer);\r
+                       exit (0);\r
+               }\r
+       }\r
+\r
+       if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for JOB_INFO_2 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumJobs(printer, START_JOB, MAX_JOBS, 2, (LPBYTE)buffer2, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Job Info Level 2:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_job_info_2 (&buffer2[i]);\r
+       }\r
+       printf ("\n");\r
+       free (buffer2);\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/AddPrinter.c b/AddPrinter.c
new file mode 100644 (file)
index 0000000..52c1ee2
--- /dev/null
@@ -0,0 +1,67 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       PRINTER_INFO_2          buffer;\r
+       HANDLE                          printer;\r
+       LPVOID                          lpMsgBuf;\r
+       \r
+       if (argc < 5)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername> <printername> <sharename> <port name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       memset(&buffer, 0 , sizeof(buffer));\r
+\r
+       buffer.pServerName      = strdup (argv[1]);\r
+       buffer.pPrinterName = strdup (argv[2]);\r
+       buffer.pShareName       = strdup (argv[3]);\r
+       buffer.pPortName        = strdup (argv[4]);\r
+       buffer.pDriverName      = strdup ("Apple LaserWriter II NTX v51.8");\r
+       buffer.pPrintProcessor  = strdup ("winprint");\r
+       buffer.pDatatype        = strdup ("RAW");\r
+       buffer.Attributes       = PRINTER_ATTRIBUTE_SHARED;\r
+       buffer.pSecurityDescriptor = NULL;\r
+\r
+\r
+       printf ("Attempting to add printer [%s] on server [%s]\n", \r
+               buffer.pPrinterName, buffer.pServerName);\r
+       printf ("\nPrinter Info 1:\n");\r
+       print_printer_info_2 (&buffer);\r
+       printf ("\n");\r
+\r
+       printer = AddPrinter (buffer.pServerName, 2, (LPBYTE)(&buffer));\r
+       if ( printer == NULL)\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] added successfully on server [%s]!\n",\r
+                       buffer.pPrinterName, buffer.pServerName);\r
+               if (!ClosePrinter (printer))\r
+                       fprintf (stderr, "Error closing printer handle!\n");\r
+               else\r
+                       printf ("Printer handle closed successfully.\n");\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/AddPrinterConnection.c b/AddPrinterConnection.c
new file mode 100644 (file)
index 0000000..32e0cfd
--- /dev/null
@@ -0,0 +1,38 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       LPVOID  lpMsgBuf;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!AddPrinterConnection(argv[1]))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Successfully established connection to [%s].\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/AddPrinterDriver.c b/AddPrinterDriver.c
new file mode 100644 (file)
index 0000000..88d74f2
--- /dev/null
@@ -0,0 +1,60 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+/* we assume the necessary driver files are already uploaded\r
+   on the server.  We also only exercise The info level 3\r
+   since that is the one used by the NT Add Printer Wizard */\r
+int main (int argc, char* argv[])\r
+{\r
+       DRIVER_INFO_3   buffer3;\r
+       BYTE                    pDependentFiles[] = { "PSCRIPT.HLP\0PSCRPTUI.DLL\0PSCRIPT.DLL\0LWNTX518.PPD\0\0" };\r
+       LPVOID                  lpMsgBuf;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* we'll use the Apple LaserWriter II NTX v51.8 driver\r
+          for simplcity */\r
+       buffer3.cVersion                = 2;\r
+       buffer3.pEnvironment    = strdup("Windows NT x86");\r
+       buffer3.pName                   = strdup("Apple LaserWriter II NTX v51.8");\r
+       buffer3.pDriverPath             = strdup("pscript.dll");\r
+       buffer3.pDataFile               = strdup("lwntx518.ppd");\r
+       buffer3.pConfigFile             = strdup("pscriptui.dll");\r
+       buffer3.pDependentFiles = pDependentFiles;\r
+       buffer3.pHelpFile               = strdup("pscript.hlp");\r
+       buffer3.pMonitorName    = NULL;\r
+       buffer3.pDefaultDataType = strdup("RAW");\r
+\r
+       printf ("Attempting to add Driver Info Level 3 :\n");\r
+       print_driver_info_3 (&buffer3);\r
+       printf ("\n");\r
+\r
+\r
+       if (!AddPrinterDriver(argv[1], 3, (LPBYTE)&buffer3))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer Driver installed successfully\n");\r
+       }\r
+\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/AddPrinterDriverEx.c b/AddPrinterDriverEx.c
new file mode 100644 (file)
index 0000000..1377855
--- /dev/null
@@ -0,0 +1,57 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+/* we assume the necessary driver files are already uploaded\r
+   on the server.  We also only exercise The info level 6\r
+   since that is the one used by the Win2k Add Printer Wizard */\r
+int main (int argc, char* argv[])\r
+{\r
+       DRIVER_INFO_6   buffer;\r
+       BYTE                    pDependentFiles[] = { "PSCRIPT.HLP\0PSCRPTUI.DLL\0PSCRIPT.DLL\0LWNTX518.PPD\0\0" };\r
+       LPVOID                  lpMsgBuf;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* we'll use the Apple LaserWriter II NTX v51.8 driver\r
+          for simplcity */\r
+       memset( &buffer, 0, sizeof(DRIVER_INFO_6) );\r
+\r
+       buffer.cVersion                 = 0;\r
+       buffer.pEnvironment             = strdup("Windows NT x86");\r
+       buffer.pName                    = strdup("Apple LaserWriter II NTX v51.8");\r
+       buffer.pDriverPath              = strdup("pscript.dll");\r
+       buffer.pDataFile                = strdup("lwntx518.ppd");\r
+       buffer.pConfigFile              = strdup("pscriptui.dll");\r
+       buffer.pDependentFiles  = pDependentFiles;\r
+       buffer.pHelpFile                = strdup("pscript.hlp");\r
+       buffer.pDefaultDataType = strdup("RAW");\r
+\r
+       printf ("Attempting to add Driver Info Level 6 :\n");\r
+       print_driver_info_6 (&buffer);\r
+       printf ("\n");\r
+\r
+\r
+       if (!AddPrinterDriverEx(argv[1], 6, (LPBYTE)&buffer, APD_COPY_ALL_FILES))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer Driver installed successfully\n");\r
+\r
+       if (!AddPrinterDriver(argv[1], 6, (LPBYTE)&buffer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer Driver installed successfully\n");\r
+\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/AddPrinterEx.c b/AddPrinterEx.c
new file mode 100644 (file)
index 0000000..52c1ee2
--- /dev/null
@@ -0,0 +1,67 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       PRINTER_INFO_2          buffer;\r
+       HANDLE                          printer;\r
+       LPVOID                          lpMsgBuf;\r
+       \r
+       if (argc < 5)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername> <printername> <sharename> <port name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       memset(&buffer, 0 , sizeof(buffer));\r
+\r
+       buffer.pServerName      = strdup (argv[1]);\r
+       buffer.pPrinterName = strdup (argv[2]);\r
+       buffer.pShareName       = strdup (argv[3]);\r
+       buffer.pPortName        = strdup (argv[4]);\r
+       buffer.pDriverName      = strdup ("Apple LaserWriter II NTX v51.8");\r
+       buffer.pPrintProcessor  = strdup ("winprint");\r
+       buffer.pDatatype        = strdup ("RAW");\r
+       buffer.Attributes       = PRINTER_ATTRIBUTE_SHARED;\r
+       buffer.pSecurityDescriptor = NULL;\r
+\r
+\r
+       printf ("Attempting to add printer [%s] on server [%s]\n", \r
+               buffer.pPrinterName, buffer.pServerName);\r
+       printf ("\nPrinter Info 1:\n");\r
+       print_printer_info_2 (&buffer);\r
+       printf ("\n");\r
+\r
+       printer = AddPrinter (buffer.pServerName, 2, (LPBYTE)(&buffer));\r
+       if ( printer == NULL)\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] added successfully on server [%s]!\n",\r
+                       buffer.pPrinterName, buffer.pServerName);\r
+               if (!ClosePrinter (printer))\r
+                       fprintf (stderr, "Error closing printer handle!\n");\r
+               else\r
+                       printf ("Printer handle closed successfully.\n");\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/DeleteForm.c b/DeleteForm.c
new file mode 100644 (file)
index 0000000..5adea0c
--- /dev/null
@@ -0,0 +1,64 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       LPVOID                  lpMsgBuf;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <form name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       printf ("Attempting to remove %s...\n", argv[2]);\r
+       if (!DeleteForm(printer, (LPTSTR)argv[2]))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Form removed successfully!\n");\r
+       }\r
+       printf ("\n");\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinter.c b/DeletePrinter.c
new file mode 100644 (file)
index 0000000..8b8348c
--- /dev/null
@@ -0,0 +1,60 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+       LPVOID  lpMsgBuf;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       if (!DeletePrinter(printer))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+\r
+               if (!ClosePrinter(printer))\r
+               {\r
+                       fprintf (stderr, "Error closing printer!\n");\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+               }\r
+\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] deleted successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinterConnection.c b/DeletePrinterConnection.c
new file mode 100644 (file)
index 0000000..97f626b
--- /dev/null
@@ -0,0 +1,38 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       LPVOID  lpMsgBuf;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!DeletePrinterConnection(argv[1]))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Successfully deleted connection to [%s].\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinterData.c b/DeletePrinterData.c
new file mode 100644 (file)
index 0000000..7508d2c
--- /dev/null
@@ -0,0 +1,60 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+       LPVOID  lpMsgBuf;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <data name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       if (DeletePrinterData(printer, argv[2]) != ERROR_SUCCESS)\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer Data [%s] deleted successfully\n", argv[2]);\r
+       }\r
+\r
+\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinterDataEx.c b/DeletePrinterDataEx.c
new file mode 100644 (file)
index 0000000..6a580ff
--- /dev/null
@@ -0,0 +1,42 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <data name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the server */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Server [%s] opened successfully.\n\n", argv[1]);\r
+\r
+       if (DeletePrinterDataEx(printer, "DsSpool", argv[2]) != ERROR_SUCCESS)\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer Data [%s] deleted successfully\n", argv[2]);\r
+\r
+\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinterDriver.c b/DeletePrinterDriver.c
new file mode 100644 (file)
index 0000000..48c4f7b
--- /dev/null
@@ -0,0 +1,41 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+/* we assume the necessary driver files are already uploaded\r
+   on the server.  We also only exercise The info level 3\r
+   since that is the one used by the NT Add Printer Wizard */\r
+int main (int argc, char* argv[])\r
+{\r
+       LPVOID                  lpMsgBuf;\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername> <arch> <driver name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+\r
+       if (!DeletePrinterDriver(argv[1], argv[2], argv[3]))\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer Driver deleted successfully\n");\r
+       }\r
+\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinterDriverEx.c b/DeletePrinterDriverEx.c
new file mode 100644 (file)
index 0000000..d67491b
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+/* we assume the necessary driver files are already uploaded\r
+   on the server.  We also only exercise The info level 3\r
+   since that is the one used by the NT Add Printer Wizard */\r
+int main (int argc, char* argv[])\r
+{\r
+       LPVOID                  lpMsgBuf;\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername> <arch> <driver name> <version>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+\r
+       if (!DeletePrinterDriverEx( argv[1], argv[2], argv[3], DPD_DELETE_SPECIFIC_VERSION|DPD_DELETE_UNUSED_FILES, atoi(argv[4]) ) ) \r
+               PrintLastError();\r
+       else\r
+               printf ("Printer Driver deleted successfully\n");\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/DeletePrinterKey.c b/DeletePrinterKey.c
new file mode 100644 (file)
index 0000000..ffc5b04
--- /dev/null
@@ -0,0 +1,48 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned=0, \r
+                                       status;\r
+       LPTSTR                  buffer = NULL;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the server */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+\r
+       status = DeletePrinterKey(printer, "PrinterDriverData");\r
+       if (status != ERROR_SUCCESS)\r
+               PrintLastError();\r
+       else\r
+               printf ("Success!\n");\r
+\r
+\r
+       /* close the server */\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/DocPrinter.c b/DocPrinter.c
new file mode 100644 (file)
index 0000000..03d553b
--- /dev/null
@@ -0,0 +1,73 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+       DOC_INFO_1      buffer;\r
+       LPVOID  lpMsgBuf;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       buffer.pDocName         = strdup("Testing StartDocPrinter");\r
+       buffer.pDatatype        = strdup("RAW");\r
+       buffer.pOutputFile      = NULL;\r
+\r
+       printf ("Attempting to call StartDocPrinter() using DOC_INFO_1 :\n");\r
+       print_doc_info_1 (&buffer);\r
+       printf ("\n");\r
+\r
+       if (StartDocPrinter (printer, 1, (LPBYTE)&buffer))\r
+               printf ("Document spooled sucessfully\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+\r
+       printf ("Attempting to call EndDocPrinter\n");\r
+       if (EndDocPrinter (printer))\r
+               printf ("Document removed from spool sucessfully\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+\r
+\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/EnumForms.c b/EnumForms.c
new file mode 100644 (file)
index 0000000..30add77
--- /dev/null
@@ -0,0 +1,76 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned, needed, i;\r
+       PFORM_INFO_1    buffer1 = NULL;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       EnumForms(printer, 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s] using NULL buffer.\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for FORM_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumForms(printer, 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[1], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Form Info Level 1:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_form_info_1 (&buffer1[i]);\r
+               printf ("\n");\r
+       }\r
+       free (buffer1);\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/EnumJobs.c b/EnumJobs.c
new file mode 100644 (file)
index 0000000..426e864
--- /dev/null
@@ -0,0 +1,128 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned, needed, i;\r
+       PJOB_INFO_1             buffer1 = NULL;\r
+       PJOB_INFO_2             buffer2 = NULL;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       EnumJobs(printer, START_JOB, MAX_JOBS, 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+               {\r
+                       fprintf (stderr, "Error getting job information for [%s] using NULL buffer.\n", argv[2]);\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("Info Level 1 : No jobs returned for [%s]\n", argv[1]);\r
+                       ClosePrinter (printer);\r
+                       exit (0);\r
+               }\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for JOB_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumJobs(printer, START_JOB, MAX_JOBS, 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Job Info Level 1:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_job_info_1 (&buffer1[i]);\r
+       }\r
+       printf ("\n");\r
+       free (buffer1);\r
+\r
+\r
+       /* INFO LEVEL 2 */\r
+       EnumJobs(printer, START_JOB, MAX_JOBS, 2, (LPBYTE)buffer2, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+               {\r
+                       fprintf (stderr, "Error getting job information for [%s] using NULL buffer.\n", argv[2]);\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("Info Level 2 : No jobs returned for [%s]\n", argv[1]);\r
+                       ClosePrinter (printer);\r
+                       exit (0);\r
+               }\r
+       }\r
+\r
+       if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for JOB_INFO_2 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumJobs(printer, START_JOB, MAX_JOBS, 2, (LPBYTE)buffer2, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Job Info Level 2:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_job_info_2 (&buffer2[i]);\r
+       }\r
+       printf ("\n");\r
+       free (buffer2);\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/EnumMonitors.c b/EnumMonitors.c
new file mode 100644 (file)
index 0000000..78c4d7f
--- /dev/null
@@ -0,0 +1,83 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       DWORD                   returned, needed, i;\r
+       PMONITOR_INFO_1 buffer1 = NULL;\r
+       PMONITOR_INFO_2 buffer2 = NULL;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       needed = returned = 0;\r
+       EnumMonitors(argv[1], 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting monitor information for [%s] using NULL buffer.\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for MONITOR_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumMonitors(argv[1], 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting monitor information for [%s].\nSize of buffer = %d\n", \r
+                            argv[1], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Monitor Info Level 1:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_monitor_info_1(&buffer1[i]);\r
+       }\r
+       free (buffer1);\r
+\r
+       /* INFO LEVEL 2 */\r
+       needed = returned = 0;\r
+       EnumMonitors(argv[1], 2, (LPBYTE)buffer2, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting monitor information for [%s] using NULL buffer.\n", argv[1], argv[2]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for MONITOR_INFO_2 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumMonitors(argv[1], 2, (LPBYTE)buffer2, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting monitor information for [%s].\nSize of buffer = %d\n", \r
+                            argv[1], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Monitor Info Level 2:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_monitor_info_2(&buffer2[i]);\r
+       }\r
+       free (buffer2);\r
+\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/EnumPorts.c b/EnumPorts.c
new file mode 100644 (file)
index 0000000..9e8fb3a
--- /dev/null
@@ -0,0 +1,88 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       DWORD                   returned, needed, i;\r
+       PPORT_INFO_1    buffer1 = NULL;\r
+       PPORT_INFO_2    buffer2 = NULL;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       needed = returned = 0;\r
+       EnumPorts(argv[1], 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting port information for [%s] using NULL buffer.\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for PORT_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumPorts(argv[1], 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting port information for [%s].\nSize of buffer = %d\n", \r
+                            argv[1], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Port Info Level 1:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               printf ("\tPort Name\t= %s\n", buffer1[i].pName);\r
+               printf ("\n");\r
+       }\r
+       free (buffer1);\r
+\r
+       /* INFO LEVEL 2 */\r
+       needed = returned = 0;\r
+       EnumPorts(argv[1], 2, (LPBYTE)buffer2, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting port information for [%s] using NULL buffer.\n", argv[1], argv[2]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for PORT_INFO_2 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumPorts(argv[1], 2, (LPBYTE)buffer2, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting port information for [%s].\nSize of buffer = %d\n", \r
+                            argv[1], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Port Info Level 2:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               printf ("\tPort Name\t= %s\n",          buffer2[i].pPortName);\r
+               printf ("\tMonitor Name\t= %s\n",       buffer2[i].pMonitorName);\r
+               printf ("\tDescription\t= %s\n",        buffer2[i].pDescription);\r
+               printf ("\tType\t\t= 0x%x\n",           buffer2[i].fPortType);\r
+               printf ("\tReserved\t= %d\n",           buffer2[i].Reserved);\r
+               printf ("\n");\r
+       }\r
+       free (buffer2);\r
+\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/EnumPrintProcessorDatatypes.c b/EnumPrintProcessorDatatypes.c
new file mode 100644 (file)
index 0000000..671e056
--- /dev/null
@@ -0,0 +1,62 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+#define NUM_ARCH       5\r
+const LPTSTR arch [NUM_ARCH] = {       "Windows 4.0",\r
+                                                       "Windows NT x86",\r
+                                                       "Windows NT R4000",\r
+                                                       "Windows NT PowerPC",\r
+                                                       "Windows NT Alpha_AXP"  };\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       DWORD   needed, returned, j;\r
+       PDATATYPES_INFO_1       buffer1 = NULL;\r
+       \r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername> <print processor>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       needed = returned = 0;\r
+       EnumPrintProcessorDatatypes(argv[1], argv[2], 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error EnumPrintProcessorDatetypes Info Level 1 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 1 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!EnumPrintProcessorDatatypes(argv[1], argv[2], 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error enumerating print processor Info Level 1 for [%s].\nSize of buffer = %d\n", \r
+                                       argv[1], needed);\r
+               }\r
+                       printf ("Datatypes Info Level 1\n");\r
+               for (j=0; j<returned; j++)\r
+               {\r
+                       printf ("\tDatatype \t= %s\n", buffer1[j].pName);\r
+               }\r
+               free (buffer1);\r
+       }\r
+\r
+\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/EnumPrintProcessors.c b/EnumPrintProcessors.c
new file mode 100644 (file)
index 0000000..5a675cf
--- /dev/null
@@ -0,0 +1,63 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+#define NUM_ARCH       5\r
+const LPTSTR arch [NUM_ARCH] = {       "Windows 4.0",\r
+                                                       "Windows NT x86",\r
+                                                       "Windows NT R4000",\r
+                                                       "Windows NT PowerPC",\r
+                                                       "Windows NT Alpha_AXP"  };\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       DWORD   needed, returned, i, j;\r
+       PPRINTPROCESSOR_INFO_1  buffer1 = NULL;\r
+       \r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       for (i=0; i<NUM_ARCH; i++)\r
+       {\r
+               printf ("[%s]\n", arch[i]);\r
+\r
+               needed = 0;\r
+               EnumPrintProcessors(argv[1], arch[i], 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error EnumPrintProcessors Info Level 1 for [%s] using NULL buffer.\n", argv[1]);\r
+                       continue;\r
+               }\r
+\r
+               if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!EnumPrintProcessors(argv[1], arch[i], 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting print processor information for [%s].\nSize of buffer = %d\n", \r
+                                       argv[1], needed);\r
+               }\r
+               printf ("Print Processor Info 1:\n");\r
+               for (j=0; j<returned; j++)\r
+               {\r
+                       print_printprocessor_info_1 (&buffer1[j]);\r
+                       printf ("\n");\r
+               }\r
+               free (buffer1);\r
+       }\r
+\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/EnumPrinterData.c b/EnumPrinterData.c
new file mode 100644 (file)
index 0000000..d50a653
--- /dev/null
@@ -0,0 +1,102 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   dwIndex, pcbValue, type, pcbData;\r
+       DWORD                   pcbMaxValue, pcbMaxData;\r
+       LPTSTR                  pValueName = NULL;\r
+       LPBYTE                  pData = NULL;\r
+       DWORD                   i, status;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+       dwIndex = 0;\r
+       status = ERROR_SUCCESS;\r
+\r
+       pcbMaxValue = pcbMaxData = 0;\r
+       status=EnumPrinterData(printer, dwIndex, pValueName, 0, &pcbMaxValue, &type, pData, 0, &pcbMaxData);\r
+       printf ("\tMax Size of Value = %d\n", pcbMaxValue);\r
+       printf ("\tMax Size of Data  = %d\n", pcbMaxData);\r
+       printf("\n");\r
+       if (status != ERROR_SUCCESS)\r
+       {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+\r
+       if ((pValueName = (LPTSTR)malloc(pcbMaxValue)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for Value Name!\n");\r
+               exit (-1);\r
+       }\r
+       if ((pData = (LPBYTE)malloc(pcbMaxData)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for Value Data!\n");\r
+               exit (-1);\r
+       }\r
+\r
+\r
+       while (status != ERROR_NO_MORE_ITEMS)\r
+       {\r
+               pcbValue = pcbData = 0;\r
+               status = EnumPrinterData(printer, dwIndex, pValueName, pcbMaxValue, &pcbValue, &type, pData, pcbMaxData, &pcbData);\r
+               PrintLastError();\r
+               if (status == ERROR_SUCCESS)\r
+               {\r
+                       printf ("\tValue Name [size] = %s [%d]\n", pValueName, pcbValue);\r
+                       printf ("\tType = %d\n", type);\r
+                       printf ("\tData = 0x%x [%d] bytes\n", pcbData, pcbData);\r
+                       i = 0;\r
+                       while (i < pcbData)\r
+                       {\r
+                               printf ("\t0x%x", *(pData++));\r
+                               if (i%4 == 3)\r
+                                       printf ("\n");\r
+                               i++;\r
+                       }\r
+                       printf ("\n");\r
+               }\r
+\r
+               dwIndex++;\r
+       }\r
+       printf ("\n");\r
+\r
+#if 0\r
+       free (pValueName);\r
+       free (pData);\r
+#endif\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/EnumPrinterDataEx.c b/EnumPrinterDataEx.c
new file mode 100644 (file)
index 0000000..0c18372
--- /dev/null
@@ -0,0 +1,69 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+\r
+#define ENUM_KEY_NAME  "PrinterDriverData"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   i, status, needed, returned;\r
+       PRINTER_ENUM_VALUES     *buffer = NULL;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the server */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+\r
+       needed = returned = 0;\r
+       status = EnumPrinterDataEx(printer, ENUM_KEY_NAME, (LPBYTE)buffer, 0, &needed, &returned);\r
+       if (status == ERROR_MORE_DATA)\r
+       {\r
+               if ((buffer = malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc enough space for [%d] bytes\n", needed);\r
+                       exit (-1);\r
+               }\r
+\r
+               status = EnumPrinterDataEx(printer, ENUM_KEY_NAME, (LPBYTE)buffer, needed, &needed, &returned);\r
+               if (status == ERROR_SUCCESS)\r
+               {\r
+                       printf ("Printer Enum Values :\n");\r
+                       for (i=0; i<returned; i++)\r
+                       {\r
+                               print_printer_enum_values (&buffer[i]);\r
+                               printf ("\n");\r
+                       }\r
+               }\r
+               free (buffer);\r
+       }\r
+       else if (status != ERROR_SUCCESS)\r
+               PrintLastError();\r
+\r
+\r
+       /* close the server */\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/EnumPrinterDrivers.c b/EnumPrinterDrivers.c
new file mode 100644 (file)
index 0000000..7ba58e5
--- /dev/null
@@ -0,0 +1,160 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+#define NUM_ARCH       5\r
+const LPTSTR arch [NUM_ARCH] = {       "Windows 4.0",\r
+                                                       "Windows NT x86",\r
+                                                       "Windows NT R4000",\r
+                                                       "Windows NT PowerPC",\r
+                                                       "Windows NT Alpha_AXP"  };\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       DWORD   needed, returned, i, j;\r
+       PDRIVER_INFO_1  buffer1 = NULL;\r
+       PDRIVER_INFO_2  buffer2 = NULL;\r
+       PDRIVER_INFO_3  buffer3 = NULL;\r
+       \r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       for (i=0; i<NUM_ARCH; i++)\r
+       {\r
+               printf ("\n\n[%s]\n", arch[i]);\r
+\r
+               /* INFO LEVEL 1 */\r
+               needed = returned = 0;\r
+               EnumPrinterDrivers(argv[1], arch[i], 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       if (needed != 0)\r
+                               fprintf (stderr, "Error EnumPrinterDrivers Info Level 1 for [%s] using NULL buffer.\n", argv[1]);\r
+                       else\r
+                               printf ("Info level 1 returned no information\n");\r
+               }\r
+               else\r
+               {\r
+                       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+                       {\r
+                               fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                               exit (-1);\r
+                       }\r
+                       if (!EnumPrinterDrivers(argv[1], arch[i], 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+                       {\r
+                               fprintf (stderr, "Error enumerating printer drivers Info Level 1 for [%s].\nSize of buffer = %d\n", \r
+                                               argv[1], needed);\r
+                       }\r
+\r
+                       printf ("Driver Info Level 1\n");\r
+                       for (j=0; j<returned; j++)\r
+                       {\r
+                               printf ("\tDriver Name\t= %s\n\n", buffer1[j].pName);\r
+                               printf ("\n");\r
+                       }\r
+                       free (buffer1);\r
+               }\r
+\r
+               /* INFO LEVEL 2 */\r
+               needed = returned = 0;\r
+               EnumPrinterDrivers(argv[1], arch[i], 2, (LPBYTE)buffer2, 0, &needed, &returned);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       if (needed != 0)\r
+                               fprintf (stderr, "Error EnumPrinterDrivers Info Level 2 for [%s] using NULL buffer.\n", argv[1]);\r
+                       else\r
+                               printf ("Info level 2 returned no information\n");\r
+               }\r
+               else\r
+               {\r
+                       if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+                       {\r
+                               fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                               exit (-1);\r
+                       }\r
+                       if (!EnumPrinterDrivers(argv[1], arch[i], 2, (LPBYTE)buffer2, needed, &needed, &returned))\r
+                       {\r
+                               fprintf (stderr, "Error enumerating printer drivers Info Level 2 for [%s].\nSize of buffer = %d\n", \r
+                                               argv[1], needed);\r
+                       }\r
+\r
+                       printf ("\nDriver Info Level 2\n");\r
+                       for (j=0; j<returned; j++)\r
+                       {\r
+                               printf ("\tDriver Name\t= %s\n",        buffer2[j].pName);\r
+                               printf ("\tEnvironment\t= %s\n",        buffer2[j].pEnvironment);\r
+                               printf ("\tVersion\t\t= %d\n",          buffer2[j].cVersion);\r
+                               printf ("\tDriver Path\t= %s\n",        buffer2[j].pDriverPath);\r
+                               printf ("\tData File\t= %s\n",          buffer2[j].pDataFile);\r
+                               printf ("\tConfig File\t= %s\n\n",      buffer2[j].pConfigFile);\r
+                               printf ("\n");\r
+                       }\r
+                       free (buffer2);\r
+               }\r
+\r
+               /* INFO LEVEL 3 */\r
+               needed = returned = 0;\r
+               EnumPrinterDrivers(argv[1], arch[i], 3, (LPBYTE)buffer3, 0, &needed, &returned);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       if (needed != 0)\r
+                               fprintf (stderr, "Error EnumPrinterDrivers Info Level 3 for [%s] using NULL buffer.\n", argv[1]);\r
+                       else\r
+                               printf ("Info level 3 returned no information\n");\r
+               }\r
+               else\r
+               {\r
+                       if ((buffer3 = (LPBYTE)malloc(needed)) == NULL)\r
+                       {\r
+                               fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                               exit (-1);\r
+                       }\r
+                       if (!EnumPrinterDrivers(argv[1], arch[i], 3, (LPBYTE)buffer3, needed, &needed, &returned))\r
+                       {\r
+                               fprintf (stderr, "Error enumerating printer drivers Info Level 3 for [%s].\nSize of buffer = %d\n", \r
+                                               argv[1], needed);\r
+                       }\r
+\r
+                       printf ("\nDriver Info Level 3\n");\r
+                       for (j=0; j<returned; j++)\r
+                       {\r
+                               char*   ptr;\r
+\r
+                               printf ("\tDriver Name\t= %s\n",        buffer3[j].pName);\r
+                               printf ("\tEnvironment\t= %s\n",        buffer3[j].pEnvironment);\r
+                               printf ("\tVersion\t\t= %d\n",          buffer3[j].cVersion);\r
+                               printf ("\tDriver Path\t= %s\n",        buffer3[j].pDriverPath);\r
+                               printf ("\tData File\t= %s\n",          buffer3[j].pDataFile);\r
+                               printf ("\tConfig File\t= %s\n",        buffer3[j].pConfigFile);\r
+                               printf ("\tHelp Path\t= %s\n",          buffer3[j].pHelpFile);\r
+                               printf ("\tMonitor Name\t= %s\n",       buffer3[j].pMonitorName);\r
+                               printf ("\tData Type\t= %s\n",          buffer3[j].pDefaultDataType);\r
+                               ptr = (char*)buffer3->pDependentFiles;\r
+                               while (*ptr != '\0')\r
+                               {\r
+                                       printf ("\tDependent Files\t= %s\n", ptr);\r
+                                       for (;*ptr != '\0'; ptr++)\r
+                                               /* printf ("%s\n", ptr); */\r
+                                               ;\r
+                                       ptr++;\r
+                               }\r
+\r
+                               printf ("\n");\r
+                       }\r
+                       free (buffer3);\r
+               }\r
+\r
+       }\r
+\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/EnumPrinterKey.c b/EnumPrinterKey.c
new file mode 100644 (file)
index 0000000..97de8a8
--- /dev/null
@@ -0,0 +1,113 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned=0, \r
+                                       status;\r
+       LPTSTR                  buffer = NULL;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the server */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+\r
+       status = EnumPrinterKey(printer, "", buffer, 0, &returned);\r
+       if (status == ERROR_MORE_DATA)\r
+       {\r
+               if ((buffer = (LPTSTR)malloc(returned)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc enough space for [%d] bytes\n", returned);\r
+                       exit (-1);\r
+               }\r
+\r
+               status = EnumPrinterKey(printer, "", buffer, returned, &returned);\r
+               if (status == ERROR_SUCCESS)\r
+               {\r
+                       LPTSTR  p = NULL;\r
+\r
+                       printf ("Enumurated Key Values : [%d]\n", returned);\r
+\r
+                       p = buffer;     \r
+                       while (*p)\r
+                       { \r
+                               printf ("\t%s\n", p);\r
+                               for (; *p; p=CharNext(p));\r
+                               p=CharNext(p);\r
+                       }\r
+\r
+               }\r
+               free (buffer);\r
+\r
+       }\r
+       else if (status != ERROR_SUCCESS)\r
+               PrintLastError();\r
+       else\r
+               printf ("No data!\n");\r
+\r
+       returned = 0;\r
+       status = EnumPrinterKey(printer, "PrinterDriverData", buffer, 0, &returned);\r
+       if (status == ERROR_MORE_DATA)\r
+       {\r
+               if ((buffer = (LPTSTR)malloc(returned)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc enough space for [%d] bytes\n", returned);\r
+                       exit (-1);\r
+               }\r
+\r
+               status = EnumPrinterKey(printer, "PrinterDriverData", buffer, returned, &returned);\r
+               if (status == ERROR_SUCCESS)\r
+               {\r
+                       LPTSTR  p = NULL;\r
+\r
+                       printf ("Enumurated Key Values : [%d]\n", returned);\r
+\r
+                       p = buffer;     \r
+                       while (*p)\r
+                       { \r
+                               printf ("\t%s\n", p);\r
+                               for (p = buffer; *p; p=CharNext(p));\r
+                               p=CharNext(p);\r
+                       }\r
+\r
+               }\r
+               free (buffer);\r
+\r
+       }\r
+       else if (status != ERROR_SUCCESS)\r
+               PrintLastError();\r
+       else\r
+               printf ("No data!\n");\r
+\r
+\r
+\r
+\r
+\r
+\r
+       /* close the server */\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/EnumPrinters.c b/EnumPrinters.c
new file mode 100644 (file)
index 0000000..46d5a59
--- /dev/null
@@ -0,0 +1,156 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+void TestEnumPrinters (LPTSTR servername, DWORD flags)\r
+{\r
+       DWORD   needed, returned, i;\r
+       PPRINTER_INFO_1 buffer1 = NULL;\r
+       PPRINTER_INFO_2 buffer2 = NULL;\r
+       PPRINTER_INFO_4 buffer4 = NULL;\r
+       PPRINTER_INFO_5 buffer5 = NULL;\r
+\r
+       /* INFO LEVEL 1 */\r
+       needed = returned = 0;\r
+       EnumPrinters(flags, servername, 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error EnumPrinters Info Level 1 for [%s] using NULL buffer.\n", servername);\r
+               else\r
+                       printf ("Info level 1 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       return;\r
+               }\r
+               if (!EnumPrinters(flags, servername, 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error enumerating printers Info Level 1 for [%s].\nSize of buffer = %d\n", \r
+                                       servername, needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 1:\n");\r
+               for (i=0; i<returned; i++)\r
+               {\r
+                       print_printer_info_1 (&buffer1[i]);\r
+                       printf ("\n");\r
+               }\r
+               free (buffer1);\r
+       }\r
+\r
+       /* the following flags are only valid for info level 1 */\r
+       if ((flags == PRINTER_ENUM_REMOTE) || (flags == PRINTER_ENUM_NETWORK))\r
+               return;\r
+\r
+       /* INFO LEVEL 2 */\r
+       needed = returned = 0;\r
+       EnumPrinters(flags, servername, 2, (LPBYTE)buffer2, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error EnumPrinters Info Level 2 for [%s] using NULL buffer.\n", servername);\r
+               else\r
+                       printf ("Info level 2 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       return;\r
+               }\r
+               if (!EnumPrinters(flags, servername, 2, (LPBYTE)buffer2, needed, &needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error enumerating printers Info Level 2 for [%s].\nSize of buffer = %d\n", \r
+                                       servername, needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 2:\n");\r
+               for (i=0; i<returned; i++)\r
+               {\r
+                       print_printer_info_2 (&buffer2[i]);\r
+                       printf ("\n");\r
+               }\r
+               free (buffer2);\r
+       }\r
+\r
+       /* INFO LEVEL 5 */\r
+       needed = returned = 0;\r
+       EnumPrinters(flags, servername, 5, (LPBYTE)buffer5, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error EnumPrinters Info Level 5 for [%s] using NULL buffer.\n", servername);\r
+               else\r
+                       printf ("Info level 5 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer5 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       return;\r
+               }\r
+               if (!EnumPrinters(flags, servername, 5, (LPBYTE)buffer5, needed, &needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error enumerating printers Info Level 5 for [%s].\nSize of buffer = %d\n", \r
+                                       servername, needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 5:\n");\r
+               for (i=0; i<returned; i++)\r
+               {\r
+                       print_printer_info_5 (&buffer5[i]);\r
+                       printf ("\n");\r
+               }\r
+               free (buffer5);\r
+       }\r
+\r
+}\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+#if 0\r
+       printf ("\n\nFlags = PRINTER_ENUM_NAME\n");\r
+       TestEnumPrinters (argv[1], PRINTER_ENUM_NAME);\r
+       printf ("\n");\r
+\r
+       printf ("\n\nFlags = PRINTER_ENUM_NAME | PRINTER_ENUM_SHARED\n");\r
+       TestEnumPrinters (argv[1], PRINTER_ENUM_NAME | PRINTER_ENUM_SHARED);\r
+       printf ("\n");\r
+#endif\r
+\r
+       printf ("\n\nFlags = PRINTER_ENUM_CONNECTIONS\n");\r
+       TestEnumPrinters (argv[1], PRINTER_ENUM_CONNECTIONS);\r
+       printf ("\n");\r
+\r
+       printf ("\n\nFlags = PRINTER_ENUM_NETWORK\n");\r
+       TestEnumPrinters (NULL, PRINTER_ENUM_NETWORK);\r
+       printf ("\n");\r
+\r
+       printf ("\n\nFlags = PRINTER_ENUM_REMOTE\n");\r
+       TestEnumPrinters (NULL, PRINTER_ENUM_REMOTE);\r
+       printf ("\n");\r
+\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/GetForm.c b/GetForm.c
new file mode 100644 (file)
index 0000000..e77c814
--- /dev/null
+++ b/GetForm.c
@@ -0,0 +1,74 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   needed;\r
+       PFORM_INFO_1    buffer1 = NULL;\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <form>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       GetForm(printer, argv[2], 1, (LPBYTE)buffer1, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s] using NULL buffer.\n", argv[2]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for FORM_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!GetForm(printer, argv[2], 1, (LPBYTE)buffer1, needed, &needed))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%2].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Form Info Level 1:\n");\r
+       print_form_info_1 (buffer1);\r
+       printf ("\n");\r
+       free (buffer1);\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/GetJob.c b/GetJob.c
new file mode 100644 (file)
index 0000000..3f0f054
--- /dev/null
+++ b/GetJob.c
@@ -0,0 +1,131 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned, needed, i;\r
+       PJOB_INFO_1             buffer1 = NULL;\r
+       PJOB_INFO_2             buffer2 = NULL;\r
+       DWORD                   dJob = 0;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <job id>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+       dJob = atoi(argv[2]);\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       EnumJobs(printer, START_JOB, MAX_JOBS, 1, (LPBYTE)buffer1, 0, &needed, &returned);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+               {\r
+                       fprintf (stderr, "Error getting job information for [%s] using NULL buffer.\n", argv[2]);\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("No jobs returned for [%s]\n", argv[1]);\r
+                       ClosePrinter (printer);\r
+                       exit (0);\r
+               }\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for JOB_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!EnumJobs(printer, START_JOB, MAX_JOBS, 1, (LPBYTE)buffer1, needed, &needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Job Info Level 1:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_job_info_1 (&buffer1[i]);\r
+       }\r
+       printf ("\n");\r
+       free (buffer1);\r
+\r
+\r
+       /* INFO LEVEL 2 */\r
+       GetJob(printer, dJob, 2, (LPBYTE)buffer2, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+               {\r
+                       fprintf (stderr, "Error getting job information for [%s] using NULL buffer.\n", argv[2]);\r
+                       exit (-1);\r
+               }\r
+               else\r
+               {\r
+                       printf ("No jobs returned for [%s]\n", argv[1]);\r
+                       ClosePrinter (printer);\r
+                       exit (0);\r
+               }\r
+       }\r
+\r
+       if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for JOB_INFO_2 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!GetJob(printer, dJob, 2, (LPBYTE)buffer2, needed, &needed))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Job Info Level 2:\n");\r
+       for (i=0; i<returned; i++)\r
+       {\r
+               print_job_info_2 (&buffer2[i]);\r
+       }\r
+       printf ("\n");\r
+       free (buffer2);\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/GetPrintProcessorDirectory.c b/GetPrintProcessorDirectory.c
new file mode 100644 (file)
index 0000000..06aba61
--- /dev/null
@@ -0,0 +1,59 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+#define NUM_ARCH       5\r
+const LPTSTR arch [NUM_ARCH] = {       "Windows 4.0",\r
+                                                       "Windows NT x86",\r
+                                                       "Windows NT R4000",\r
+                                                       "Windows NT PowerPC",\r
+                                                       "Windows NT Alpha_AXP"  };\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       DWORD   needed, i;\r
+       LPTSTR  buffer1 = NULL;\r
+       \r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       for (i=0; i<NUM_ARCH; i++)\r
+       {\r
+               printf ("[%s]\n", arch[i]);\r
+\r
+               needed = 0;\r
+               GetPrintProcessorDirectory(argv[1], arch[i], 1, (LPBYTE)buffer1, 0, &needed);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error GetPrintProcessorDirectory for [%s] using NULL buffer.\n\n", argv[1]);\r
+                       continue;\r
+               }\r
+\r
+               if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrintProcessorDirectory(argv[1], arch[i], 1, (LPBYTE)buffer1, needed, &needed))\r
+               {\r
+                       fprintf (stderr, "Error getting print processor path for [%s].\nSize of buffer = %d\n\n", \r
+                                       argv[1], needed);\r
+               }\r
+               printf ("\tPrint Processor Path\t= %s\n", buffer1);\r
+               printf ("\n");\r
+\r
+               free (buffer1);\r
+       }\r
+\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/GetPrinter.c b/GetPrinter.c
new file mode 100644 (file)
index 0000000..9820a2b
--- /dev/null
@@ -0,0 +1,179 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       DWORD   needed, returned;\r
+       HANDLE  printer;\r
+       PPRINTER_INFO_1 buffer1 = NULL;\r
+       PPRINTER_INFO_2 buffer2 = NULL;\r
+       PPRINTER_INFO_5 buffer5 = NULL;\r
+       PPRINTER_INFO_7 buffer7 = NULL;\r
+       \r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+\r
+       /* INFO LEVEL 1 */\r
+       needed = returned = 0;\r
+       GetPrinter(printer, 1, (LPBYTE)buffer1, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error GetPrinter Info Level 1 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 1 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinter(printer, 1, (LPBYTE)buffer1, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error enumerating printers Info Level 1 for [%s].\nSize of buffer = %d\n", \r
+                                       argv[1], needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 1:\n");\r
+               print_printer_info_1(buffer1);\r
+               printf ("\n");\r
+               free (buffer1);\r
+       }\r
+\r
+       /* INFO LEVEL 2 */\r
+       needed = returned = 0;\r
+       GetPrinter(printer, 2, (LPBYTE)buffer2, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error GetPrinter Info Level 2 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 2 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer2 = (LPBYTE)malloc(needed*2)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+\r
+               printf("Pass one\n");\r
+               if (!GetPrinter(printer, 2, (LPBYTE)buffer2, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting printers Info Level 2 for [%s].\nSize of buffer = 0x%x [0x%x]\n", \r
+                                       argv[1], needed, returned);\r
+                       PrintLastError();\r
+\r
+                       needed *= 2;\r
+                       returned = 0;\r
+                       printf("Pass Two\n");\r
+                       if (!GetPrinter(printer, 2, (LPBYTE)buffer2, needed, &returned))\r
+                       {\r
+                               fprintf (stderr, "Error getting printers Info Level 2 for [%s].\nSize of buffer = 0x%x [0x%x]\n", \r
+                                               argv[1], needed, returned);     \r
+                               PrintLastError();\r
+                       }\r
+               }\r
+\r
+               printf ("Printer Info Level 2:\n");\r
+               printf ("Returned = 0x%x\n", returned);\r
+               print_printer_info_2(buffer2);\r
+               printf ("\n");\r
+               free (buffer2);\r
+       }\r
+\r
+       /* INFO LEVEL 5 */\r
+       GetPrinter(printer, 5, (LPBYTE)buffer5, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error GetPrinter Info Level 5 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 5 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer5 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinter(printer, 5, (LPBYTE)buffer5, needed, &needed))\r
+               {\r
+                       fprintf (stderr, "Error getting printers Info Level 5 for [%s].\nSize of buffer = %d\n", \r
+                                       argv[1], needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 5:\n");\r
+               print_printer_info_5(buffer5);\r
+               printf ("\n");\r
+               free (buffer5);\r
+       }\r
+\r
+       /* INFO LEVEL 7 */\r
+       GetPrinter(printer, 7, (LPBYTE)buffer7, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error GetPrinter Info Level 7 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 7 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer7 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinter(printer, 7, (LPBYTE)buffer7, needed, &needed))\r
+               {\r
+                       fprintf (stderr, "Error getting printers Info Level 7 for [%s].\nSize of buffer = %d\n", \r
+                                       argv[1], needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 7:\n");\r
+               printf ("flags = %d\n", buffer7->dwAction);\r
+               printf ("\n");\r
+               free (buffer7);\r
+       }\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/GetPrinterData.c b/GetPrinterData.c
new file mode 100644 (file)
index 0000000..dc8dd35
--- /dev/null
@@ -0,0 +1,88 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   type, pcbData;\r
+       LPBYTE                  pData = NULL;\r
+       DWORD                   i, status;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <value name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       status=GetPrinterData(printer, argv[2], &type, pData, 0, &pcbData);\r
+       if ((status != ERROR_SUCCESS) && (status != ERROR_MORE_DATA))\r
+       {\r
+               PrintLastError();\r
+               ClosePrinter (printer);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((pData = (LPBYTE)malloc(pcbData)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for Value Data!\n");\r
+               exit (-1);\r
+       }\r
+       \r
+       status = GetPrinterData(printer, argv[2], &type, pData, pcbData, &pcbData);\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               printf ("\tValue Name = %s\n", argv[2]);\r
+               printf ("\tType = %d\n", type);\r
+               printf ("\tData = 0x%x bytes\n", pcbData);\r
+               i = 0;\r
+               while (i < pcbData)\r
+               {\r
+                       printf ("\t0x%x", *(pData++));\r
+                       if (i%4 == 3)\r
+                               printf ("\n");\r
+                       i++;\r
+               }\r
+               printf ("\n");\r
+       }\r
+       \r
+       printf ("\n");\r
+\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/GetPrinterDataEx.c b/GetPrinterDataEx.c
new file mode 100644 (file)
index 0000000..9fbb1ae
--- /dev/null
@@ -0,0 +1,77 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  server;\r
+       DWORD                   type, pcbData;\r
+       LPBYTE                  pData = NULL;\r
+       DWORD                   i, status;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername> <value name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the server */\r
+       if (!OpenPrinter (argv[1], &server, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Server [%s] opened successfully.\n\n", argv[1]);\r
+\r
+       status=GetPrinterDataEx(server, "PrinterDriverData", argv[2], &type, pData, 0, &pcbData);\r
+       if ((status != ERROR_SUCCESS) && (status != ERROR_MORE_DATA))\r
+       {\r
+               PrintLastError();\r
+       }\r
+       else\r
+       {\r
+               if ((pData = (LPBYTE)malloc(pcbData)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for Value Data!\n");\r
+                       exit (-1);\r
+               }\r
+       \r
+               status = GetPrinterDataEx(server, "PrinterDriverData", argv[2], &type, pData, pcbData, &pcbData);\r
+               if (status == ERROR_SUCCESS)\r
+               {\r
+                       printf ("\tValue Name = %s\n", argv[2]);\r
+                       printf ("\tType = %d\n", type);\r
+                       printf ("\tData = 0x%x bytes\n", pcbData);\r
+                       i = 0;\r
+                       while (i < pcbData)\r
+                       {\r
+                               printf ("\t0x%x", *(pData++));\r
+                               if (i%4 == 3)\r
+                                       printf ("\n");\r
+                               i++;\r
+                       }\r
+                       printf ("\n");\r
+               }\r
+       \r
+               printf ("\n");\r
+       }\r
+\r
+\r
+       /* close the server */\r
+       if (!ClosePrinter(server))\r
+               PrintLastError();\r
+       else\r
+               printf ("Server [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/GetPrinterDriver.c b/GetPrinterDriver.c
new file mode 100644 (file)
index 0000000..446fbe3
--- /dev/null
@@ -0,0 +1,177 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+#define NUM_ARCH       5\r
+const LPTSTR arch [NUM_ARCH] = {       "Windows 4.0",\r
+                                                       "Windows NT x86",\r
+                                                       "Windows NT R4000",\r
+                                                       "Windows NT PowerPC",\r
+                                                       "Windows NT Alpha_AXP"  };\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   returned, needed, i;\r
+       PDRIVER_INFO_1  buffer1 = NULL;\r
+       PDRIVER_INFO_2  buffer2 = NULL;\r
+       PDRIVER_INFO_3  buffer3 = NULL;\r
+       PDRIVER_INFO_4  buffer4 = NULL;\r
+       PDRIVER_INFO_5  buffer5 = NULL;\r
+       PDRIVER_INFO_6  buffer6 = NULL;\r
+\r
+       /* printf ("argc = %d\n", argc);*/\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       for (i=0; i<NUM_ARCH; i++)\r
+       {       \r
+               printf ("Environment = [%s]\n\n", arch[i]);\r
+\r
+               /* INFO LEVEL 1 */\r
+               GetPrinterDriver(printer, arch[i], 1, (LPBYTE)buffer1, 0, &needed);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s] using NULL buffer.\n", argv[1]);\r
+                       PrintLastError();\r
+                       continue;\r
+\r
+               }\r
+\r
+               if ((buffer1 = (LPBYTE)malloc(needed*1024)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for DRIVER_INFO_1 buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               needed *= 1024;\r
+               if (!GetPrinterDriver(printer, arch[i], 1, (LPBYTE)buffer1, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s].\nSize of buffer = %d\n", \r
+                                    argv[1], needed);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               printf ("Printer Driver Info Level 1:\n");\r
+               print_driver_info_1 (buffer1);\r
+               free (buffer1);\r
+\r
+               /* INFO LEVEL 2 */\r
+               GetPrinterDriver(printer, arch[i], 2, (LPBYTE)buffer2, 0, &needed);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s] using NULL buffer.\n", argv[1]);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for DRIVER_INFO_2 buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinterDriver(printer, arch[i], 2, (LPBYTE)buffer2, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s].\nSize of buffer = %d\n", \r
+                                    argv[1], needed);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               printf ("Printer Driver Info Level 2:\n");\r
+               print_driver_info_2 (buffer2);\r
+               free (buffer2);\r
+\r
+\r
+               /* INFO LEVEL 3 */\r
+               GetPrinterDriver(printer, arch[i], 3, (LPBYTE)buffer3, 0, &needed);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s] using NULL buffer.\n", argv[1]);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               if ((buffer3 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+               fprintf (stderr, "Unable to malloc memory for DRIVER_INFO_3 buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinterDriver(printer, arch[i], 3, (LPBYTE)buffer3, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s].\nSize of buffer = %d\n", \r
+                                    argv[1], needed);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               printf ("Printer Driver Info Level 3:\n");\r
+               print_driver_info_3 (buffer3);\r
+               printf ("\n");\r
+               free (buffer3);\r
+\r
+               /* INFO LEVEL 6 */\r
+               GetPrinterDriver(printer, arch[i], 6, (LPBYTE)buffer6, 0, &needed);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s] using NULL buffer.\n", argv[1]);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               if ((buffer6 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for DRIVER_INFO_6 buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinterDriver(printer, arch[i], 6, (LPBYTE)buffer6, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver information for [%s].\nSize of buffer = %d\n", \r
+                                    argv[1], needed);\r
+                       PrintLastError();\r
+                       continue;\r
+               }\r
+\r
+               printf ("Printer Driver Info Level 6:\n");\r
+               print_driver_info_6 (buffer6);\r
+               printf ("\n");\r
+               free (buffer6);\r
+\r
+       }\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               PrintLastError();\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/GetPrinterDriverDirectory.c b/GetPrinterDriverDirectory.c
new file mode 100644 (file)
index 0000000..d9a03f3
--- /dev/null
@@ -0,0 +1,56 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+\r
+#define NUM_ARCH       5\r
+const LPTSTR arch [NUM_ARCH] = {       "Windows 4.0",\r
+                                                       "Windows NT x86",\r
+                                                       "Windows NT R4000",\r
+                                                       "Windows NT PowerPC",\r
+                                                       "Windows NT Alpha_AXP"  };\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       DWORD                   returned, needed, i;\r
+       LPTSTR                  buffer = NULL;\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Printer Driver Directory Info Level 1:\n");\r
+       for (i=0; i<NUM_ARCH; i++)\r
+       {\r
+               GetPrinterDriverDirectory(argv[1], arch[i], 1, (LPBYTE)buffer, 0, &needed);\r
+               if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver directory for [%s] using NULL buffer.\n", argv[1]);\r
+                       exit (-1);\r
+               }\r
+\r
+               if ((buffer = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for directory path!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinterDriverDirectory(argv[1], arch[i], 1, (LPBYTE)buffer, needed, &returned))\r
+               {\r
+                       fprintf (stderr, "Error getting printer driver directory for [%s].\nSize of buffer = %d\n", \r
+                                    argv[1], needed);\r
+                       exit (-1);\r
+               }\r
+\r
+               printf ("\t%s Path\t= %s\n\n", arch[i], buffer);\r
+               free (buffer);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/OpenPrinter.c b/OpenPrinter.c
new file mode 100644 (file)
index 0000000..b78e343
--- /dev/null
@@ -0,0 +1,37 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/PagePrinter.c b/PagePrinter.c
new file mode 100644 (file)
index 0000000..b45bf48
--- /dev/null
@@ -0,0 +1,131 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+#include <io.h>\r
+#include <string.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                          printer;\r
+       int                                     fd;\r
+       BYTE                            buffer[256];\r
+       DWORD                           bytes, wrote;\r
+       DOC_INFO_1                      buffer1;\r
+       PRINTER_DEFAULTS        print_defaults;\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <filename>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("This test program exercises the following win32 functions:\n");\r
+       printf ("\tResetPrinter()\n");\r
+       printf ("\tStartDocPrinter()\n");\r
+       printf ("\tEndDocPrinter()\n");\r
+       printf ("\tStartPagePrinter()\n");\r
+       printf ("\tEndPagePrinter()\n");\r
+       printf ("\tWritePrinter()\n");\r
+       printf ("\n\n");\r
+\r
+       printf ("This test program exercises both the StartPagePrinter()\n");\r
+       printf ("and EndPagePrinter() Win32 functions.\n\n");\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* set the printer defaults */\r
+       print_defaults.pDatatype                = strdup ("RAW");\r
+       print_defaults.DesiredAccess    = NULL;\r
+       print_defaults.pDevMode                 = NULL;\r
+       if (ResetPrinter(printer, &print_defaults))\r
+               printf ("ResetPrinter call succeeded\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+       /* StartDocPrinter */\r
+       buffer1.pDocName        = strdup("Testing Printer");\r
+       buffer1.pDatatype       = strdup("RAW");\r
+       buffer1.pOutputFile     = NULL;\r
+\r
+       printf ("Attempting to call StartDocPrinter() using DOC_INFO_1 :\n");\r
+       print_doc_info_1 (&buffer1);\r
+       printf ("\n");\r
+\r
+       if (StartDocPrinter (printer, 1, (LPBYTE)&buffer1))\r
+               printf ("StartDocPrinter called successfully\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+\r
+       if (StartPagePrinter(printer))\r
+       {\r
+               printf ("StartPagePrinter returned success.\n");\r
+\r
+               if ((fd=_open(argv[2], _O_RDONLY)) == -1)\r
+               {\r
+                       fprintf (stderr, "ERROR: Unable to open [%s] for read access!\n", argv[2]);\r
+                       ClosePrinter (printer);\r
+                       exit (-1);\r
+               }\r
+\r
+               while ((bytes=_read(fd, buffer, 256)) != 0)\r
+               {\r
+                       if (!WritePrinter(printer, (LPVOID)buffer, bytes, &wrote))\r
+                       {\r
+                               fprintf (stderr, "ERROR: WritePrinter failed for [%d] bytes!\n", bytes);\r
+                               PrintLastError();\r
+                       }\r
+                       else\r
+                               printf ("Successfully wrote [%d] bytes to the printer\n", bytes);\r
+               }\r
+               _close (fd);\r
+\r
+               if (EndPagePrinter (printer))\r
+                       printf ("EndPagePrinter returned success.\n");\r
+               else\r
+                       PrintLastError();\r
+       }\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+                       \r
+       printf ("Attempting to call EndDocPrinter\n");\r
+       if (EndDocPrinter (printer))\r
+               printf ("EndDocPrinter called successfully\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+\r
+\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/PrinterChangeNotification.c b/PrinterChangeNotification.c
new file mode 100644 (file)
index 0000000..99017dd
--- /dev/null
@@ -0,0 +1,153 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+void PrintNotifyInfoData(PRINTER_NOTIFY_INFO_DATA *p)\r
+{\r
+       printf("\tType\t=0x%x\n", p->Type);\r
+       printf("\tField\t=0x%x\n", p->Field);\r
+       printf("\tId\t=0x%x\n", p->Id);\r
+       printf("\tdata\t= %s\n", p->NotifyData.Data.pBuf);\r
+\r
+       return;\r
+\r
+}\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  server, change;\r
+       PRINTER_NOTIFY_INFO     *change_info = NULL;\r
+       PRINTER_NOTIFY_OPTIONS watch, *pWatch = NULL;\r
+       PRINTER_NOTIFY_OPTIONS_TYPE data;\r
+       DWORD option = PRINTER_CHANGE_PRINTER_DRIVER;\r
+       BOOL use_notify_options = TRUE;\r
+       DWORD   condition;\r
+       DWORD flags = PRINTER_NOTIFY_OPTIONS_REFRESH;\r
+\r
+\r
+\r
+       if ((argc < 3) || (strcmp(argv[1], "-l") && strcmp(argv[1], "-t")))\r
+       {\r
+               fprintf (stderr, "usage: -l|-t %s <servername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (strcmp(argv[1], "-l") == 0)\r
+               use_notify_options = FALSE;\r
+\r
+\r
+       if (!OpenPrinter (argv[2], &server, NULL))\r
+       {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[2]);\r
+       }\r
+\r
+       printf ("flags = PRINTER_CHANGE_PRINTER\n");\r
+       watch.Version = 2;\r
+       watch.Count = 1;\r
+       watch.pTypes = &data;\r
+       data.Type = PRINTER_NOTIFY_TYPE;\r
+       data.Count = 1;\r
+       data.pFields = &option;\r
+\r
+       if (use_notify_options) {\r
+               pWatch = &watch;\r
+               option = PRINTER_NOTIFY_FIELD_DRIVER_NAME;\r
+       }\r
+\r
+       if ((change=FindFirstPrinterChangeNotification(server, option, 0, pWatch)) == INVALID_HANDLE_VALUE)\r
+       {\r
+               printf ("FindFirstPrinterChangeNotification failed : ");\r
+               PrintLastError();\r
+               ClosePrinter(server);\r
+               exit (-1);\r
+       }\r
+       else\r
+               printf ("FindFirstPrinterChangeNotification succeeded with flags [PRINTER_CHANGE_PRINTER_DRIVER]\n\n");\r
+\r
+       if (pWatch) {\r
+               printf ("Calling FindNextPrinterCangeNotification() with PRINTER_NOTIFY_OPTIONS_REFRESH\n");\r
+               memset(&watch, 0x0, sizeof(watch));\r
+               watch.Flags = PRINTER_NOTIFY_OPTIONS_REFRESH;\r
+               watch.Version = 2;\r
+               if (FindNextPrinterChangeNotification(change, &condition, pWatch, &change_info))\r
+                       printf ("Received change notification of [0x%x]\n", condition);\r
+               else\r
+                       PrintLastError();\r
+\r
+               if (change_info) {\r
+                       int i;\r
+\r
+                       printf("\tVersion\t=0x%x\n", change_info->Version);\r
+                       printf("\tFlags\t=0x%x\n", change_info->Flags);\r
+                       printf("\tCount\t=%d\n", change_info->Count);\r
+\r
+                       for (i=0; i<(int)change_info->Count; i++) {\r
+                               PrintNotifyInfoData(&change_info->aData[i]);\r
+                               printf("\n");\r
+                       }\r
+               }\r
+\r
+               FreePrinterNotifyInfo(change_info);\r
+               printf ("\n");\r
+       }\r
+\r
+       do \r
+       {\r
+\r
+               printf ("Waiting for Printer Change Notification...\n");\r
+\r
+               if (WaitForSingleObject(change, INFINITE) != WAIT_OBJECT_0)\r
+                       continue;\r
+\r
+               if (FindNextPrinterChangeNotification(change, &condition, NULL, &change_info))\r
+                       printf ("Received change notification of [0x%x]\n", condition);\r
+               else\r
+                       PrintLastError();\r
+\r
+               if (change_info) {\r
+                       int i;\r
+\r
+                       printf("\tVersion\t=0x%x\n", change_info->Version);\r
+                       printf("\tFlags\t=0x%x\n", change_info->Flags);\r
+                       printf("\tCount\t=%d\n", change_info->Count);\r
+\r
+                       for (i=0; i<(int)change_info->Count; i++) {\r
+                               PrintNotifyInfoData(&change_info->aData[i]);\r
+                               printf("\n");\r
+                       }\r
+               }\r
+\r
+               FreePrinterNotifyInfo(change_info);\r
+               printf ("\n");\r
+       } while (1);\r
+       \r
+\r
+       if (FindClosePrinterChangeNotification(change))\r
+               printf ("FindClosePrinterChangeNotification call succeeded.\n");\r
+       else\r
+       {\r
+               printf ("FindClosePrinterChangeNotification failed : ");\r
+               PrintLastError();\r
+       }\r
+       printf ("\n");\r
+\r
+       if (!ClosePrinter(server))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[2]);\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/PrinterChangeNotify.c b/PrinterChangeNotify.c
new file mode 100644 (file)
index 0000000..b78e343
--- /dev/null
@@ -0,0 +1,37 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/ResetPrinter.c b/ResetPrinter.c
new file mode 100644 (file)
index 0000000..70cb6da
--- /dev/null
@@ -0,0 +1,75 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE  printer;\r
+       PRINTER_DEFAULTS defaults;\r
+       PPRINTER_INFO_2 buffer2 = NULL;\r
+       DWORD needed, returned;\r
+\r
+       memset(&defaults, 0x0, sizeof(PRINTER_DEFAULTS));\r
+       defaults.pDatatype = strdup("RAW");\r
+\r
+       if (argc < 2)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               PrintLastError();\r
+               exit (-1);\r
+       }\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+       /* INFO LEVEL 2 */\r
+       needed = returned = 0;\r
+       GetPrinter(printer, 2, (LPBYTE)buffer2, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error GetPrinter Info Level 2 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 2 returned no information\n");\r
+\r
+               goto done;\r
+       }\r
+\r
+       if ((buffer2 = (LPBYTE)malloc(needed*2)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+               exit (-1);\r
+       }\r
+\r
+       if (!GetPrinter(printer, 2, (LPBYTE)buffer2, needed, &returned))\r
+       {\r
+               fprintf (stderr, "Error getting printers Info Level 2 for [%s].\nSize of buffer = 0x%x [0x%x]\n", \r
+                               argv[1], needed, returned);\r
+               PrintLastError();\r
+       }\r
+\r
+       \r
+\r
+       defaults.pDevMode = buffer2->pDevMode;\r
+       if (!ResetPrinter(printer, &defaults))\r
+               PrintLastError();\r
+\r
+done:\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/SetForm.c b/SetForm.c
new file mode 100644 (file)
index 0000000..eac0d2c
--- /dev/null
+++ b/SetForm.c
@@ -0,0 +1,94 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   needed;\r
+       PFORM_INFO_1    buffer1 = NULL;\r
+       LPVOID                  lpMsgBuf;\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <form>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 1 */\r
+       GetForm(printer, argv[2], 1, (LPBYTE)buffer1, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%s] using NULL buffer.\n", argv[2]);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((buffer1 = (LPBYTE)malloc(needed)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for FORM_INFO_1 buffer!\n");\r
+               exit (-1);\r
+       }\r
+       if (!GetForm(printer, argv[2], 1, (LPBYTE)buffer1, needed, &needed))\r
+       {\r
+               fprintf (stderr, "Error getting form information for [%2].\nSize of buffer = %d\n", \r
+                            argv[2], needed);\r
+               exit (-1);\r
+       }\r
+\r
+       printf ("Form Info Level 1:\n");\r
+       print_form_info_1 (buffer1);\r
+       printf ("\n");\r
+\r
+       buffer1->Size.cx *= 2;\r
+       buffer1->Size.cy *= 3;\r
+\r
+       if (SetForm(printer, argv[2], 1, (LPBYTE)buffer1))\r
+       {\r
+               printf ("Form [%s] updated successfully.  Size(2x X 3y)\n", argv[2]);\r
+       }\r
+       else\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       printf ("\n");\r
+\r
+\r
+       free (buffer1);\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}
\ No newline at end of file
diff --git a/SetJob.c b/SetJob.c
new file mode 100644 (file)
index 0000000..3158f47
--- /dev/null
+++ b/SetJob.c
@@ -0,0 +1,141 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   dwJobId = 0;\r
+       DOCINFO                 docinfo;\r
+       LPVOID                  lpMsgBuf;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <Job ID>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+#if 0\r
+       docinfo.lpszDocName = strdup (argv[2]);\r
+       docinfo.lpszOutput  = NULL;\r
+       docinfo.lpszDatatype = strdup ("RAW");\r
+       docinfo.fwType = 0;\r
+       docinfo.cbSize = sizeof (docinfo);\r
+\r
+       dwJobId = StartDoc (NULL, &docinfo);\r
+       printf ("JobId = %d\n", dwJobId);\r
+       if (dwJobId < 1)\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       else\r
+       {\r
+               printf ("StartDoc called successfully.  Job ID = %d\n", dwJobId);\r
+       }\r
+#endif\r
+\r
+       dwJobId = atoi (argv[2]);\r
+\r
+       printf ("command = JOB_CONTROL_PAUSE\n");\r
+       if (SetJob(printer, dwJobId, 0, NULL, JOB_CONTROL_PAUSE))\r
+       {\r
+               printf ("Job Id [%d] paused successfully\n", dwJobId);\r
+       }\r
+       else\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       printf ("\n");\r
+\r
+       printf ("command = JOB_CONTROL_RESUME\n");\r
+       if (SetJob(printer, dwJobId, 0, NULL, JOB_CONTROL_RESUME))\r
+       {\r
+               printf ("Job Id [%d] resumed successfully\n", dwJobId);\r
+       }\r
+       else\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       printf ("\n");\r
+\r
+       printf ("command = JOB_CONTROL_RESTART\n");\r
+       if (SetJob(printer, dwJobId, 0, NULL, JOB_CONTROL_RESTART))\r
+       {\r
+               printf ("Job Id [%d] restarted successfully\n", dwJobId);\r
+       }\r
+       else\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       printf ("\n");\r
+\r
+\r
+       printf ("command = JOB_CONTROL_DELETE\n");\r
+       if (SetJob(printer, dwJobId, 0, NULL, JOB_CONTROL_DELETE))\r
+       {\r
+               printf ("Job Id [%d] deleted successfully\n", dwJobId);\r
+       }\r
+       else\r
+       {\r
+               FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+                       FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+                       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+                       (LPTSTR) &lpMsgBuf, 0, NULL);\r
+               printf ("ERROR : %s\n", (char*)lpMsgBuf);\r
+               LocalFree (lpMsgBuf);\r
+       }\r
+       printf ("\n");\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/SetPrinter.c b/SetPrinter.c
new file mode 100644 (file)
index 0000000..473f86a
--- /dev/null
@@ -0,0 +1,134 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+/* we will excercise info level 2 (cange the drivername)\r
+   and info level 3 (security descriptor) */\r
+int main (int argc, char* argv[])\r
+{\r
+       DWORD   needed;\r
+       HANDLE  printer;\r
+       PPRINTER_INFO_2 buffer2 = NULL;\r
+       PRINTER_INFO_3  buffer3;\r
+       \r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <drivername>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       /* INFO LEVEL 2 */\r
+       GetPrinter(printer, 2, (LPBYTE)buffer2, 0, &needed);\r
+       if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)\r
+       {\r
+               if (needed != 0)\r
+                       fprintf (stderr, "Error GetPrinter Info Level 2 for [%s] using NULL buffer.\n", argv[1]);\r
+               else\r
+                       printf ("Info level 2 returned no information\n");\r
+       }\r
+       else\r
+       {\r
+               if ((buffer2 = (LPBYTE)malloc(needed)) == NULL)\r
+               {\r
+                       fprintf (stderr, "Unable to malloc memory for buffer!\n");\r
+                       exit (-1);\r
+               }\r
+               if (!GetPrinter(printer, 2, (LPBYTE)buffer2, needed, &needed))\r
+               {\r
+                       fprintf (stderr, "Error getting printers Info Level 2 for [%s].\nSize of buffer = %d\n", \r
+                                       argv[1], needed);\r
+               }\r
+\r
+               printf ("Printer Info Level 2:\n");\r
+               print_printer_info_2(buffer2);\r
+               printf ("\n");\r
+       }\r
+\r
+       /* set the new drivername */\r
+       buffer2->pDriverName = strdup (argv[2]);\r
+       if (SetPrinter(printer, 2, (LPBYTE)buffer2, 0))\r
+       {\r
+               printf ("Printer driver successfully changed to [%s]\n", argv[2]);\r
+               printf ("Printer Info 2 :\n");\r
+               print_printer_info_2 (buffer2);\r
+               printf ("\n");\r
+       }\r
+       else\r
+               PrintLastError();\r
+\r
+       /* exercise the various command options */\r
+       printf ("command = PRINTER_CONTROL_PAUSE\n");\r
+       if (SetPrinter (printer, 2, (LPBYTE)buffer2, PRINTER_CONTROL_PAUSE))\r
+               printf ("Printer successfully paused.\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+       printf ("command = PRINTER_CONTROL_RESUME\n");\r
+       if (SetPrinter (printer, 2, (LPBYTE)buffer2, PRINTER_CONTROL_RESUME))\r
+               printf ("Printer successfully paused.\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+       printf ("command = PRINTER_CONTROL_PURGE\n");\r
+       if (SetPrinter (printer, 2, (LPBYTE)buffer2, PRINTER_CONTROL_PURGE))\r
+               printf ("Printer successfully paused.\n");\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+\r
+       /* we'll just use the security descriptor from the buffer2 */\r
+       printf ("Testing setting of security descriptor using PRINTER_INFO_3...\n");\r
+       buffer3.pSecurityDescriptor = buffer2->pSecurityDescriptor;\r
+\r
+       printf ("Current security descriptor settings for [%s]:\n", argv[1]);\r
+       /* print_secdesc (buffer3.pSecurityDescriptor); */\r
+       printf ("\n");\r
+\r
+       printf ("no changes to security descriptor...\n\n");\r
+\r
+\r
+       if (SetPrinter (printer, 3, (LPBYTE)&buffer3, 0))\r
+       {\r
+               printf ("Printer descriptor information updated successfully.\n");\r
+               printf ("New security descriptor settings for [%s]:\n", argv[1]);\r
+               /* print_secdesc (buffer3.pSecurityDescriptor); */\r
+               printf ("\n");\r
+       }\r
+       else\r
+               PrintLastError();\r
+       printf ("\n");\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
+\r
diff --git a/SetPrinterData.c b/SetPrinterData.c
new file mode 100644 (file)
index 0000000..3fd7b36
--- /dev/null
@@ -0,0 +1,113 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+#define START_JOB      0\r
+#define MAX_JOBS       100\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   type, pcbData;\r
+       LPBYTE                  pData = NULL;\r
+       DWORD                   i, status;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <value name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the printer */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+       {\r
+               fprintf (stderr, "Unable to open %s!\n", argv[1]);\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+       }\r
+\r
+       status=GetPrinterData(printer, argv[2], &type, pData, 0, &pcbData);\r
+       if ((status != ERROR_SUCCESS) && (status != ERROR_MORE_DATA))\r
+       {\r
+               PrintLastError();\r
+               ClosePrinter (printer);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((pData = (LPBYTE)malloc(pcbData)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for Value Data!\n");\r
+               exit (-1);\r
+       }\r
+       \r
+       status = GetPrinterData(printer, argv[2], &type, pData, pcbData, &pcbData);\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               LPBYTE          ptr = pData;\r
+\r
+               printf ("\tValue Name = %s\n", argv[2]);\r
+               printf ("\tType = %d\n", type);\r
+               printf ("\tData = 0x%x bytes\n", pcbData);\r
+               i = 0;\r
+               while (i < pcbData)\r
+               {\r
+                       printf ("\t0x%x", *(ptr));\r
+                       *ptr = *ptr < 1;\r
+                       ptr++;\r
+                       if (i%4 == 3)\r
+                               printf ("\n");\r
+                       i++;\r
+               }\r
+               printf ("\n");\r
+       }\r
+\r
+       printf ("Shifting everything to the right one bit...\n\n");\r
+\r
+       status = SetPrinterData(printer, argv[2], type, pData, pcbData);\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               printf ("\tValue Name = %s\n", argv[2]);\r
+               printf ("\tType = %d\n", type);\r
+               printf ("\tData = 0x%x bytes\n", pcbData);\r
+               i = 0;\r
+               while (i < pcbData)\r
+               {\r
+                       printf ("\t0x%x", *(pData++));\r
+                       if (i%4 == 3)\r
+                               printf ("\n");\r
+                       i++;\r
+               }\r
+               printf ("\n");\r
+       }\r
+       else\r
+               PrintLastError();\r
+       \r
+       printf ("\n");\r
+\r
+\r
+\r
+       /* close the printer */\r
+       if (!ClosePrinter(printer))\r
+       {\r
+               fprintf (stderr, "Error closing printer!\n");\r
+               exit (-1);\r
+       }\r
+       else\r
+       {\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/SetPrinterDataEx.c b/SetPrinterDataEx.c
new file mode 100644 (file)
index 0000000..c1869ee
--- /dev/null
@@ -0,0 +1,101 @@
+/******************************************************************\r
+ * SPOOLSS regression testing code for Samba print servers\r
+ * \r
+ *****************************************************************/\r
+\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "printlib.h"\r
+\r
+int main (int argc, char* argv[])\r
+{\r
+       \r
+       HANDLE                  printer;\r
+       DWORD                   type, pcbData;\r
+       LPBYTE                  pData = NULL;\r
+       DWORD                   i, status;\r
+\r
+\r
+       if (argc < 3)\r
+       {\r
+               fprintf (stderr, "useage: %s <printername> <value name>\n", argv[0]);\r
+               exit (-1);\r
+       }\r
+\r
+       /* open the server */\r
+       if (!OpenPrinter (argv[1], &printer, NULL))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] opened successfully.\n\n", argv[1]);\r
+\r
+\r
+       status=GetPrinterDataEx(printer, "PrinterDriverData", argv[2], &type, pData, 0, &pcbData);\r
+       if ((status != ERROR_SUCCESS) && (status != ERROR_MORE_DATA))\r
+       {\r
+               PrintLastError();\r
+               ClosePrinter (printer);\r
+               exit (-1);\r
+       }\r
+\r
+       if ((pData = (LPBYTE)malloc(pcbData)) == NULL)\r
+       {\r
+               fprintf (stderr, "Unable to malloc memory for Value Data!\n");\r
+               exit (-1);\r
+       }\r
+       \r
+       status = GetPrinterDataEx(printer, "PrinterDriverData", argv[2], &type, pData, pcbData, &pcbData);\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               LPBYTE          ptr = pData;\r
+\r
+               printf ("\tValue Name = %s\n", argv[2]);\r
+               printf ("\tType = %d\n", type);\r
+               printf ("\tData = 0x%x bytes\n", pcbData);\r
+               i = 0;\r
+               while (i < pcbData)\r
+               {\r
+                       printf ("\t0x%x", *(ptr));\r
+                       *ptr = *ptr < 1;\r
+                       ptr++;\r
+                       if (i%4 == 3)\r
+                               printf ("\n");\r
+                       i++;\r
+               }\r
+               printf ("\n");\r
+       }\r
+\r
+       printf ("Shifting everything to the right one bit...\n\n");\r
+\r
+       status = SetPrinterDataEx(printer, "PrinterDriverData", argv[2], type, pData, pcbData);\r
+       if (status == ERROR_SUCCESS)\r
+       {\r
+               printf ("\tValue Name = %s\n", argv[2]);\r
+               printf ("\tType = %d\n", type);\r
+               printf ("\tData = 0x%x bytes\n", pcbData);\r
+               i = 0;\r
+               while (i < pcbData)\r
+               {\r
+                       printf ("\t0x%x", *(pData++));\r
+                       if (i%4 == 3)\r
+                               printf ("\n");\r
+                       i++;\r
+               }\r
+               printf ("\n");\r
+       }\r
+       else\r
+               PrintLastError();\r
+       \r
+       printf ("\n");\r
+\r
+\r
+\r
+       /* close the server */\r
+       if (!ClosePrinter(printer))\r
+               PrintLastError();\r
+       else\r
+               printf ("Printer [%s] closed successfully.\n", argv[1]);\r
+\r
+       return 0;\r
+\r
+}\r
diff --git a/printlib.c b/printlib.c
new file mode 100644 (file)
index 0000000..542285d
--- /dev/null
@@ -0,0 +1,492 @@
+#include <windows.h>\r
+#include <stdio.h>\r
+#include "printlib.h"\r
+\r
+#define DetectNull(p) (p?p:"NULL")\r
+\r
+void print_devmode (DEVMODE *pDevModeIn)\r
+{\r
+       if (pDevModeIn == NULL)\r
+       {\r
+               printf ("\tDevice Mode\t= (null)\n");\r
+               return;\r
+       }\r
+\r
+       printf( "\tDEVMODE:----------\n" );\r
+       printf( "\tDeviceName:      [%s]\n", DetectNull( pDevModeIn->dmDeviceName ) );\r
+       printf( "\tSpecVersion:     %d\n",   pDevModeIn->dmSpecVersion );\r
+       printf( "\tDriverVersion:   %d\n",   pDevModeIn->dmDriverVersion );\r
+       printf( "\tSize:            %d\n",   pDevModeIn->dmSize );\r
+       printf( "\tDriverExtra:     %d\n",   pDevModeIn->dmDriverExtra );\r
+       printf( "\tFields:          0x%x\n", pDevModeIn->dmFields );\r
+\r
+       if ( pDevModeIn->dmFields & DM_ORIENTATION )\r
+               printf( "\tOrientation:     %d\n", pDevModeIn->dmOrientation );\r
+       if ( pDevModeIn->dmFields & DM_PAPERSIZE )\r
+               printf( "\tPaperSize:       %d\n", pDevModeIn->dmPaperSize);\r
+       if ( pDevModeIn->dmFields & DM_PAPERLENGTH )\r
+               printf( "\tPaperLength:     %d\n", pDevModeIn->dmPaperLength );\r
+       if ( pDevModeIn->dmFields & DM_PAPERWIDTH )\r
+               printf( "\tPaperWidth:      %d\n", pDevModeIn->dmPaperWidth );\r
+//     if ( pDevModeIn->dmFields & DM_POSITION )\r
+//             printf( "\tPosition:        %d\n", pDevModeIn->dmPosition );\r
+       if ( pDevModeIn->dmFields & DM_SCALE )\r
+               printf( "\tScale:           %d\n", pDevModeIn->dmScale );\r
+       if ( pDevModeIn->dmFields & DM_COPIES )\r
+               printf( "\tCopies:          %d\n", pDevModeIn->dmCopies );\r
+       if ( pDevModeIn->dmFields & DM_DEFAULTSOURCE )\r
+               printf( "\tDefaultSource:   %d\n", pDevModeIn->dmDefaultSource );\r
+       if ( pDevModeIn->dmFields & DM_PRINTQUALITY )\r
+               printf( "\tPrintQuality:    %d\n", pDevModeIn->dmPrintQuality );\r
+       if ( pDevModeIn->dmFields & DM_COLOR )\r
+               printf( "\tColor:           %d\n", pDevModeIn->dmColor );\r
+       if ( pDevModeIn->dmFields & DM_DUPLEX )\r
+               printf( "\tDuplex:          %d\n", pDevModeIn->dmDuplex );\r
+       if ( pDevModeIn->dmFields & DM_YRESOLUTION )\r
+               printf( "\tYResolution:     %d\n", pDevModeIn->dmYResolution );\r
+       if ( pDevModeIn->dmFields & DM_TTOPTION )\r
+               printf( "\tTTOption:        %d\n", pDevModeIn->dmTTOption );\r
+       if ( pDevModeIn->dmFields & DM_COLLATE )\r
+               printf( "\tCollate:         %d\n", pDevModeIn->dmCollate );\r
+       if ( pDevModeIn->dmFields & DM_FORMNAME )\r
+               printf( "\tForm:            [%s]\n", pDevModeIn->dmFormName );\r
+       if ( pDevModeIn->dmFields & DM_LOGPIXELS )\r
+               printf( "\tLogPixels:       %d\n", pDevModeIn->dmLogPixels );\r
+       if ( pDevModeIn->dmFields & DM_BITSPERPEL )\r
+               printf( "\tBitsPerPel:      %d\n", pDevModeIn->dmBitsPerPel );\r
+       if ( pDevModeIn->dmFields & DM_PELSWIDTH )\r
+               printf( "\tPelsWidth:       %d\n", pDevModeIn->dmPelsWidth );\r
+       if ( pDevModeIn->dmFields & DM_PELSHEIGHT )\r
+               printf( "\tPelsHeight:      %d\n", pDevModeIn->dmPelsHeight );\r
+       if ( pDevModeIn->dmFields & DM_DISPLAYFLAGS )\r
+               printf( "\tDisplayFlags:    %d\n", pDevModeIn->dmDisplayFlags );\r
+//     if ( pDevModeIn->dmFields & DM_NUP )\r
+//             printf( "\tNup:             %d\n", pDevModeIn->dmNup );\r
+       if ( pDevModeIn->dmFields & DM_DISPLAYFREQUENCY )\r
+               printf( "\tDisplayFrequency:%d\n", pDevModeIn->dmDisplayFrequency );\r
+       if ( pDevModeIn->dmFields & DM_ICMMETHOD )\r
+               printf( "\tICMMethod:       %d\n", pDevModeIn->dmICMMethod );\r
+       if ( pDevModeIn->dmFields & DM_ICMINTENT )\r
+               printf( "\tICMIntent:       %d\n", pDevModeIn->dmICMIntent );\r
+       if ( pDevModeIn->dmFields & DM_MEDIATYPE )\r
+               printf( "\tMediaType:       %d\n", pDevModeIn->dmMediaType );\r
+       if ( pDevModeIn->dmFields & DM_DITHERTYPE )\r
+               printf( "\tDitherType:      %d\n", pDevModeIn->dmDitherType );\r
+//     if ( pDevModeIn->dmFields & DM_PANNINGWIDTH )\r
+//             printf( "\tPanningWidth:    %d\n", pDevModeIn->dmPanningWidth );\r
+//     if ( pDevModeIn->dmFields & DM_PANNINGHEIGHT )\r
+//             printf( "\tPanningHeight:   %d\n", pDevModeIn->dmPanningHeight );\r
+\r
+#if 0\r
+       if ( bForceIn )\r
+       {\r
+               printf( "  DEVMODE\n" );\r
+               Dump( (BYTE*)pDevModeIn, sizeof(DEVMODE), LEADER );\r
+\r
+               if ( pDevModeIn->dmDriverExtra )\r
+               {\r
+                       printf( "  DriverExtra\n" );\r
+                       Dump( (BYTE*)pDevModeIn + sizeof(DEVMODE), pDevModeIn->dmDriverExtra, LEADER );\r
+               }\r
+       }\r
+#endif\r
+\r
+       return;\r
+}\r
+\r
+void print_acl (const char* str, ACL *acl)\r
+{\r
+       printf ("%s\n", str);\r
+       if (acl == NULL)\r
+               return;\r
+\r
+       printf ("\t\tACL Revision \t\t 0x%x\n", acl->AclRevision);\r
+       printf ("\t\tSbz1\t\t 0x%x\n", acl->Sbz1);\r
+       printf ("\t\tSbz2\t\t 0x%x\n", acl->Sbz2);\r
+       printf ("\t\tACL Size\t\t 0x%x\n", acl->AclSize);\r
+       printf ("\t\tACL Count\t\t 0x%x\n", acl->AceCount);\r
+\r
+\r
+       return;\r
+}\r
+\r
+void print_sid (const char* str, SID *sid)\r
+{\r
+       DWORD   i;\r
+\r
+       printf ("%s\n", str);\r
+       printf ("0x%x\n", sid);\r
+       if (sid == NULL)\r
+               return;\r
+       printf ("\t\tRevision\t\t0x%x\n", sid->Revision);\r
+       printf ("\t\tSubAuthorityCount\t0x%x\n", sid->SubAuthorityCount);\r
+       printf ("\t\tSubAuthority\n\t");\r
+       while (i < sid->SubAuthorityCount)\r
+       {\r
+               printf ("\t0x%x", sid->SubAuthority[i]);\r
+               if (i%4 == 3)\r
+                       printf ("\n\t");\r
+               i++;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+void print_secdesc (SECURITY_DESCRIPTOR *secdesc)\r
+{\r
+       if (secdesc == NULL)\r
+       {\r
+               printf ("\tSecurity Descriptor\t= (null)\n");\r
+               return;\r
+       }\r
+\r
+       printf ("\tRevision\t= 0x%x\n", secdesc->Revision);\r
+       printf ("\tSbz1\t\t= 0x%x\n", secdesc->Sbz1);\r
+#if 0\r
+       print_sid ("\tOwner\t\t= ", secdesc->Owner);\r
+       print_sid ("\tGroup\t\t= ",secdesc->Group);\r
+       print_acl ("\tSacl\t\t= ", secdesc->Sacl);\r
+       print_acl ("\tDacl\t\t= ", secdesc->Dacl);\r
+#endif\r
+       return;\r
+}\r
+\r
+void PrintLastError()\r
+{\r
+       LPVOID          lpMsgBuf;\r
+       DWORD           status;\r
+\r
+       status = GetLastError();\r
+\r
+       FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | \r
+               FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),\r
+               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language\r
+               (LPTSTR) &lpMsgBuf, 0, NULL);\r
+       printf ("ERROR  [0x%x] : %s\n", status, (char*)lpMsgBuf);\r
+       LocalFree (lpMsgBuf);\r
+\r
+               return;\r
+}\r
+\r
+\r
+void print_job_info_1(PJOB_INFO_1 info)\r
+{\r
+       printf ("\tJob ID\t\t= %d\n",           info->JobId);\r
+       printf ("\tPrinter Name\t= %s\n",       info->pPrinterName);\r
+       printf ("\tMachine Name\t= %s\n",       info->pMachineName);\r
+       printf ("\tUser Name\t= %s\n",          info->pUserName);\r
+       printf ("\tDocument\t= %s\n",           info->pDocument);\r
+       printf ("\tDatatype\t= %s\n",           info->pDatatype);\r
+       printf ("\tStatus\t\t= %s\n",                   info->pStatus);\r
+       printf ("\tStatus\t= %d\n",             info->Status);\r
+       printf ("\tPriority\t= %d\n",           info->Priority);\r
+       printf ("\tPosition\t= %d\n",           info->Position);\r
+       printf ("\tTotal Pages\t= %d\n",        info->TotalPages);\r
+       printf ("\tPages Printed\t= %d\n",      info->PagesPrinted);\r
+       printf ("\tSubmitted (DD:MM:YY HH:MM:SS)\t= %d:%d:%d %d:%d:%d UTC\n",\r
+                       info->Submitted.wDay, info->Submitted.wMonth,\r
+                       info->Submitted.wYear, info->Submitted.wHour,\r
+                       info->Submitted.wMinute, info->Submitted.wSecond);\r
+\r
+       return;\r
+}\r
+\r
+void print_job_info_2(PJOB_INFO_2 info)\r
+{\r
+       printf ("\tJob ID\t\t= %d\n",           info->JobId);\r
+       printf ("\tPrinter Name\t= %s\n",       info->pPrinterName);\r
+       printf ("\tMachine Name\t= %s\n",       info->pMachineName);\r
+       printf ("\tUser Name\t= %s\n",          info->pUserName);\r
+       printf ("\tDocument\t= %s\n",           info->pDocument);\r
+       printf ("\tDatatype\t= %s\n",           info->pDatatype);\r
+       printf ("\tNotify Name\t= %s\n",        info->pNotifyName);\r
+       printf ("\tPrint Processor\t= %s\n",    info->pPrintProcessor);\r
+       printf ("\tParameters\t= %s\n",         info->pParameters);\r
+       printf ("\tDriver Name\t= %s\n",                info->pDriverName);\r
+       printf ("\tStatus\t\t= %s\n",           info->pStatus);\r
+       printf ("\tStatus\t\t= %d\n",           info->Status);\r
+       printf ("\tPriority\t= %d\n",           info->Priority);\r
+       printf ("\tPosition\t= %d\n",           info->Position);\r
+       printf ("\tTotal Pages\t= %d\n",        info->TotalPages);\r
+       printf ("\tPages Printed\t= %d\n",      info->PagesPrinted);\r
+       printf ("\tStart Time\t= %d\n",         info->StartTime);\r
+       printf ("\tUntil Time\t= %d\n",         info->UntilTime);\r
+       printf ("\tTime\t\t= %d\n",             info->Time);\r
+       printf ("\tSize\t\t= %d\n",                     info->Size);\r
+       printf ("\tSubmitted (DD:MM:YY HH:MM:SS)\t= %d:%d:%d %d:%d:%d UTC\n",\r
+                       info->Submitted.wDay, info->Submitted.wMonth,\r
+                       info->Submitted.wYear, info->Submitted.wHour,\r
+                       info->Submitted.wMinute, info->Submitted.wSecond);\r
+       printf ("\tDevice Mode Information\n");\r
+       printf ("\t-----------------------\n");\r
+       print_devmode (info->pDevMode);\r
+       printf ("\tSecurity Descriptor Information\n");\r
+       printf ("\t-------------------------------\n");\r
+       print_secdesc (info->pSecurityDescriptor);\r
+\r
+       return;\r
+}\r
+\r
+void print_job_info_3(PJOB_INFO_3 info)\r
+{\r
+       printf ("\tJob ID\t\t= %d\n",           info->JobId);\r
+       printf ("\tJob ID Next Job\t= %d\n",    info->NextJobId);\r
+       printf ("\tReserved (must be 0)\t= %d\n",       info->Reserved);\r
+\r
+       return;\r
+}\r
+\r
+void print_monitor_info_1 (PMONITOR_INFO_1 info)\r
+{\r
+               printf ("\tMonitor Name\t= %s\n",       info->pName);\r
+\r
+               return;\r
+}\r
+\r
+void print_monitor_info_2 (PMONITOR_INFO_2 info)\r
+{\r
+               printf ("\tMonitor Name\t= %s\n",       info->pName);\r
+               printf ("\tEnvironment\t= %s\n",        info->pEnvironment);\r
+               printf ("\tDLL Name\t= %s\n",   info->pDLLName);\r
+\r
+               return;\r
+}\r
+\r
+void print_form_info_1 (PFORM_INFO_1 info)\r
+{\r
+\r
+               printf ("\tForm Name\t= %s\n",  info->pName);\r
+               printf ("\tFlags\t\t= 0x%x\n",          info->Flags);\r
+               printf ("\tSize\t\t= %d x %d\n", info->Size.cx, info->Size.cy);\r
+               printf ("\tRectangle\t= [left]%d [right]%d [top]%d [bottom]%d\n", \r
+                               info->ImageableArea.left, info->ImageableArea.right,\r
+                               info->ImageableArea.top,        info->ImageableArea.bottom);\r
+\r
+               return;\r
+}\r
+\r
+void print_printer_info_1 (PPRINTER_INFO_1 info)\r
+{\r
+       \r
+                       printf ("\tPrinter Name\t= %s\n", info->pName);\r
+                       printf ("\tDescription\t= %s\n", info->pDescription);\r
+                       printf ("\tComment\t\t= %s\n", info->pComment);\r
+                       printf ("\tFlags\t\t= 0x%x\n", info->Flags);\r
+\r
+                       return;\r
+}\r
+\r
+void print_printer_info_2 (PPRINTER_INFO_2 info)\r
+{\r
+                       printf ("\tServer Name\t\t= %s\n",      info->pServerName);\r
+                       printf ("\tPrinter Name\t\t= %s\n",     info->pPrinterName);\r
+                       printf ("\tPort Name\t\t= %s\n",                info->pPortName);\r
+                       printf ("\tShare Name\t\t= %s\n",               info->pShareName);\r
+                       printf ("\tDriver Name\t\t= %s\n",      info->pDriverName);\r
+                       printf ("\tComment\t\t\t= %s\n",                info->pComment);\r
+                       printf ("\tLocation\t\t= %s\n",         info->pLocation);\r
+                       printf ("\tSeparator File\t\t= %s\n",           info->pSepFile);\r
+                       printf ("\tDefault Data Type\t= %s\n",  info->pDatatype);\r
+                       printf ("\tPrint Processor\t\t= %s\n",  info->pPrintProcessor);\r
+                       printf ("\tParameters\t\t= %s\n",                       info->pParameters);\r
+\r
+                       printf ("\tAttributes\t\t= 0x%x\n",             info->Attributes);\r
+                       printf ("\tPriority\t\t= 0x%x\n",               info->Priority);\r
+                       printf ("\tDefault Priority\t= 0x%x\n",         info->DefaultPriority);\r
+                       printf ("\tStart Time\t\t= 0x%x\n",             info->StartTime);\r
+                       printf ("\tUntil Time\t\t= 0x%x\n",             info->UntilTime);\r
+                       printf ("\tStatus\t\t\t= 0x%x\n",                       info->Status);\r
+                       printf ("\tcJobs\t\t\t= 0x%x\n",                        info->cJobs);\r
+                       printf ("\tAverage PPM\t\t= 0x%x\n",            info->AveragePPM);\r
+\r
+                       printf ("\tDevice Mode Information\n");\r
+                       printf ("\t-----------------------\n");\r
+                       print_devmode (info->pDevMode);\r
+#if 0\r
+                       printf ("\tSecurity Descriptor Information\n");\r
+                       printf ("\t-------------------------------\n");\r
+                       print_secdesc (info->pSecurityDescriptor);\r
+#endif \r
+                       return;\r
+}\r
+\r
+void print_printer_info_5 (PPRINTER_INFO_5 info)\r
+{\r
+\r
+                       printf ("\tPrinter Name\t\t\t= %s\n",   info->pPrinterName);\r
+                       printf ("\tPort Name\t\t\t= %s\n",              info->pPortName);\r
+                       printf ("\tAttributes\t\t\t= 0x%x\n",           info->Attributes);\r
+                       printf ("\tDev NotSelect Timeout\t= 0x%x\n",    info->DeviceNotSelectedTimeout);\r
+                       printf ("\tTX RetryTimeout\t\t= 0x%x\n",                info->TransmissionRetryTimeout);\r
+\r
+                       return;\r
+\r
+}\r
+\r
+void print_printprocessor_info_1 (PPRINTPROCESSOR_INFO_1 info)\r
+{\r
+\r
+       printf ("\tPrint Processor Name\t= %s\n", info->pName);\r
+\r
+       return;\r
+}\r
+\r
+void print_driver_info_1 (PDRIVER_INFO_1 info)\r
+{\r
+       printf ("\tDriver Name\t= %s\n\n", info->pName);\r
+\r
+       return;\r
+}\r
+\r
+void print_driver_info_2 (PDRIVER_INFO_2 info)\r
+{\r
+               printf ("\tDriver Name\t= %s\n",        info->pName);\r
+               printf ("\tEnvironment\t= %s\n",        info->pEnvironment);\r
+               printf ("\tVersion\t\t= %d\n",          info->cVersion);\r
+               printf ("\tDriver Path\t= %s\n",        info->pDriverPath);\r
+               printf ("\tData File\t= %s\n",          info->pDataFile);\r
+               printf ("\tConfig File\t= %s\n\n",      info->pConfigFile);\r
+\r
+               return;\r
+}\r
+\r
+void print_driver_info_3 (PDRIVER_INFO_3 info)\r
+{\r
+               char            *ptr = NULL;\r
+\r
+               printf ("\tDriver Name\t= %s\n",        info->pName);\r
+               printf ("\tEnvironment\t= %s\n",        info->pEnvironment);\r
+               printf ("\tVersion\t\t= %d\n",          info->cVersion);\r
+               printf ("\tDriver Path\t= %s\n",        info->pDriverPath);\r
+               printf ("\tData File\t= %s\n",          info->pDataFile);\r
+               printf ("\tConfig File\t= %s\n",        info->pConfigFile);\r
+               printf ("\tHelp Path\t= %s\n",          info->pHelpFile);\r
+               printf ("\tMonitor Name\t= %s\n",       info->pMonitorName);\r
+               printf ("\tData Type\t= %s\n",          info->pDefaultDataType);\r
+               ptr = (char*)info->pDependentFiles;\r
+               while ((ptr != NULL) && (*ptr != '\0'))\r
+               {\r
+                       printf ("\tDependent Files\t= %s\n", ptr);\r
+                       for (;*ptr != '\0'; ptr++)\r
+                               /* printf ("%s\n", ptr); */\r
+                               ;\r
+                       ptr++;\r
+               }\r
+\r
+               return;\r
+}\r
+\r
+void print_driver_info_4 (PDRIVER_INFO_4 info)\r
+{\r
+               char            *ptr = NULL;\r
+\r
+               printf ("\tDriver Name\t= %s\n",        info->pName);\r
+               printf ("\tEnvironment\t= %s\n",        info->pEnvironment);\r
+               printf ("\tVersion\t\t= %d\n",          info->cVersion);\r
+               printf ("\tDriver Path\t= %s\n",        info->pDriverPath);\r
+               printf ("\tData File\t= %s\n",          info->pDataFile);\r
+               printf ("\tConfig File\t= %s\n",        info->pConfigFile);\r
+               printf ("\tHelp Path\t= %s\n",          info->pHelpFile);\r
+               printf ("\tMonitor Name\t= %s\n",       info->pMonitorName);\r
+               printf ("\tData Type\t= %s\n",          info->pDefaultDataType);\r
+               printf ("\tPrevious Names\t= %s\n",     info->pszzPreviousNames);\r
+               ptr = (char*)info->pDependentFiles;\r
+               while ((ptr != NULL) && (*ptr != '\0'))\r
+               {\r
+                       printf ("\tDependent Files\t= %s\n", ptr);\r
+                       for (;*ptr != '\0'; ptr++)\r
+                               /* printf ("%s\n", ptr); */\r
+                               ;\r
+                       ptr++;\r
+               }\r
+\r
+               return;\r
+}\r
+\r
+void print_driver_info_6 (PDRIVER_INFO_6 info)\r
+{\r
+               char            *ptr = NULL;\r
+\r
+               printf ("\tDriver Name\t= %s\n",        info->pName);\r
+               printf ("\tEnvironment\t= %s\n",        info->pEnvironment);\r
+               printf ("\tVersion\t\t= %d\n",          info->cVersion);\r
+               printf ("\tDriver Path\t= %s\n",        info->pDriverPath);\r
+               printf ("\tData File\t= %s\n",          info->pDataFile);\r
+               printf ("\tConfig File\t= %s\n",        info->pConfigFile);\r
+               printf ("\tHelp Path\t= %s\n",          info->pHelpFile);\r
+               printf ("\tMonitor Name\t= %s\n",       info->pMonitorName);\r
+               printf ("\tData Type\t= %s\n",          info->pDefaultDataType);\r
+               printf ("\tPrevious Names\t= %s\n",     info->pszzPreviousNames);\r
+               ptr = (char*)info->pDependentFiles;\r
+               if (ptr != NULL)\r
+               {\r
+                       while (*ptr != '\0')\r
+                       {\r
+                               printf ("\tDependent Files\t= %s\n", ptr);\r
+                               for (;*ptr != '\0'; ptr++)\r
+                                       /* printf ("%s\n", ptr); */\r
+                                       ;\r
+                               ptr++;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       printf ("\tPrevious Names\t= (null)\n");\r
+               }\r
+\r
+\r
+               ptr = (char*)info->pszzPreviousNames;\r
+               if (ptr != NULL)\r
+               {\r
+                       while (*ptr != '\0')\r
+                       {\r
+                               printf ("\tPrevious Names\t= %s\n", ptr);\r
+                               for (;*ptr != '\0'; ptr++)\r
+                                       /* printf ("%s\n", ptr); */\r
+                                       ;\r
+                               ptr++;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       printf ("\tPrevious Names\t= (null)\n");\r
+               }\r
+\r
+               printf ("\tDriver Date\t= %d\n", info->ftDriverDate);\r
+               printf ("\tDriver Version\t= %d\n", info->dwlDriverVersion);\r
+               printf ("\tManufacture Name = %s\n", info->pszMfgName);\r
+               printf ("\tOEM URL\t\t= %s\n", info->pszOEMUrl);\r
+               printf ("\tHardware ID\t= %s\n", info->pszHardwareID);\r
+               printf ("\tProvider\t= %s\n", info->pszProvider);\r
+\r
+               return;\r
+}\r
+\r
+void print_doc_info_1 (PDOC_INFO_1 info)\r
+{\r
+       printf ("\tDocument Name\t= %s\n", info->pDocName);\r
+       printf ("\tOutput Filename\t= %s\n", info->pOutputFile);\r
+       printf ("\tDatatype\t= %s\n", info->pDatatype);\r
+\r
+       return;\r
+}\r
+\r
+void print_printer_enum_values (PRINTER_ENUM_VALUES *info)\r
+{\r
+       DWORD   i = 0;;\r
+\r
+       printf ("\tValue Name\t= %s [0x%x]\n", info->pValueName, info->cbValueName);\r
+       printf ("\tType\t\t= 0x%x\n", info->dwType);\r
+       printf ("\tSize\t\t= 0x%x\n", info->cbData);\r
+\r
+       while (i < info->cbData)\r
+       {\r
+               printf ("\t0x%x", *(info->pData++));\r
+               if (i%4 == 3)\r
+                       printf ("\n");\r
+               i++;\r
+       }\r
+       printf ("\n");\r
+\r
+       return;\r
+}
\ No newline at end of file