add SetPrinterDataExW.exe. master
authorGünther Deschner <gd@samba.org>
Wed, 3 Mar 2010 16:28:56 +0000 (17:28 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 3 Mar 2010 16:28:56 +0000 (17:28 +0100)
Guenther

Makefile
SetPrinterDataExW.c [new file with mode: 0644]

index be3a5e1bdc170ea6e630bbf3fdbe588ed3efff7b..7df243724d816525748f38439b30433bfd005264 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ LIBS = kernel32.lib gdi32.lib user32.lib shell32.lib \
        advapi32.lib ole32.lib ws2_32.lib rpcrt4.lib
 WINSPOOL_LIBS = winspool.lib
 
-all: AbortPrinter.exe AddForm.exe AddJob.exe AddPrinter.exe AddPrinterConnection.exe AddPrinterDriver.exe AddPrinterDriverEx.exe AddPrinterEx.exe DeleteForm.exe DeletePrinter.exe DeletePrinterConnection.exe DeletePrinterData.exe DeletePrinterDataEx.exe DeletePrinterDriver.exe DeletePrinterDriverEx.exe DeletePrinterKey.exe DocPrinter.exe EnumForms.exe EnumJobs.exe EnumMonitors.exe EnumPorts.exe EnumPrinterData.exe EnumPrinterDataEx.exe EnumPrinterDrivers.exe EnumPrinterKey.exe EnumPrinters.exe EnumPrintProcessorDatatypes.exe EnumPrintProcessors.exe GetForm.exe GetJob.exe GetPrinter.exe GetPrinterData.exe GetPrinterDataEx.exe GetPrinterDriver.exe GetPrinterDriverDirectory.exe GetPrintProcessorDirectory.exe OpenPrinter.exe PagePrinter.exe PrinterChangeNotification.exe PrinterChangeNotify.exe ResetPrinter.exe SetForm.exe SetJob.exe SetPrinter.exe SetPrinterData.exe SetPrinterDataEx.exe
+all: AbortPrinter.exe AddForm.exe AddJob.exe AddPrinter.exe AddPrinterConnection.exe AddPrinterDriver.exe AddPrinterDriverEx.exe AddPrinterEx.exe DeleteForm.exe DeletePrinter.exe DeletePrinterConnection.exe DeletePrinterData.exe DeletePrinterDataEx.exe DeletePrinterDriver.exe DeletePrinterDriverEx.exe DeletePrinterKey.exe DocPrinter.exe EnumForms.exe EnumJobs.exe EnumMonitors.exe EnumPorts.exe EnumPrinterData.exe EnumPrinterDataEx.exe EnumPrinterDrivers.exe EnumPrinterKey.exe EnumPrinters.exe EnumPrintProcessorDatatypes.exe EnumPrintProcessors.exe GetForm.exe GetJob.exe GetPrinter.exe GetPrinterData.exe GetPrinterDataEx.exe GetPrinterDriver.exe GetPrinterDriverDirectory.exe GetPrintProcessorDirectory.exe OpenPrinter.exe PagePrinter.exe PrinterChangeNotification.exe PrinterChangeNotify.exe ResetPrinter.exe SetForm.exe SetJob.exe SetPrinter.exe SetPrinterData.exe SetPrinterDataEx.exe SetPrinterDataExW.exe
 
 .cpp.obj:
        cl /c $(CFLAGS) $*.cpp
@@ -304,3 +304,8 @@ SetPrinterDataEx.exe: SetPrinterDataEx.obj printlib.obj
        cl $(CFLAGS) /Fe$@ SetPrinterDataEx.obj printlib.obj \
        /link /incremental:no /subsystem:console $(LIBS) $(WINSPOOL_LIBS)
 
+SetPrinterDataExW.obj: SetPrinterDataExW.c
+
+SetPrinterDataExW.exe: SetPrinterDataExW.obj printlib.obj
+       cl $(CFLAGS) /Fe$@ SetPrinterDataExW.obj printlib.obj \
+       /link /incremental:no /subsystem:console $(LIBS) $(WINSPOOL_LIBS)
diff --git a/SetPrinterDataExW.c b/SetPrinterDataExW.c
new file mode 100644 (file)
index 0000000..074810b
--- /dev/null
@@ -0,0 +1,107 @@
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int __cdecl wmain(int argc, WCHAR *argv[])
+{
+       HANDLE printer;
+       DWORD type, cbData;
+       DWORD type_ex, cbData_ex;
+       LPBYTE pData = NULL;
+       LPBYTE pData_ex = NULL;
+       DWORD i, status;
+       LPCWSTR pKeyName;
+       LPCWSTR pValueName;
+       PRINTER_DEFAULTSW defaults;
+       LPCSTR str = "abcdefghijklmnopqrstuvwxzy";
+       DWORD s;
+
+       if (argc < 3) {
+               fprintf(stderr, "usage: %s <printername> <keyname> <valuename>\n", argv[0]);
+               exit(-1);
+       }
+
+       defaults.pDatatype = NULL;
+       defaults.pDevMode = NULL;
+       defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER;
+
+       if (!OpenPrinterW(argv[1], &printer, &defaults)) {
+               exit(-1);
+       }
+
+       printf ("Printer [%s] opened successfully.\n\n", argv[1]);
+
+       pKeyName = argv[2];
+       pValueName = argv[3];
+
+       type = REG_SZ;
+
+       for (s=0; s < strlen(str); s++) {
+#if 0
+               DWORD k = 0;
+
+               cbData = s * 2 + 2;
+               pData = malloc(cbData);
+               memset(pData, '\0', cbData);
+
+               for (i=0; i < cbData; i += 2) {
+                       memcpy(&pData[i], &str[k], 1);
+                       k++;
+               }
+#else
+               cbData = s;
+               pData = malloc(cbData);
+               memcpy(pData, str, s);
+#endif
+               printf("Testing SetPrinterDataExW with REG_SZ len: %d\n", cbData);
+#if 0
+               for (i=0; i < cbData; i++) {
+                       printf("0x%02x ", pData[i]);
+               }
+               printf("\n");
+#endif
+               status = SetPrinterDataExW(printer, pKeyName, pValueName, type, pData, cbData);
+               if (status) {
+                       printf("SetPrinterDataExW failed with 0x%08x\n", status);
+                       ClosePrinter(printer);
+                       exit(-1);
+               }
+
+               status = GetPrinterDataExW(printer, pKeyName, pValueName, &type_ex, NULL, 0, &cbData_ex);
+               if (status == ERROR_MORE_DATA) {
+                       pData_ex = malloc(cbData_ex);
+                       status = GetPrinterDataExW(printer, pKeyName, pValueName, &type_ex, pData_ex, cbData_ex, &cbData_ex);
+               }
+               if (status) {
+                       printf("GetPrinterDataExW failed with 0x%08x\n", status);
+                       ClosePrinter(printer);
+                       exit(-1);
+               }
+
+               printf("did set %d of data\n", cbData);
+               for (i=0; i < cbData; i++) {
+                       printf("0x%02x ", pData[i]);
+               }
+               printf("\n");
+
+               printf("received %d of data\n", cbData_ex);
+               for (i=0; i < cbData_ex; i++) {
+                       printf("0x%02x ", pData_ex[i]);
+               }
+               printf("\n");
+
+               DeletePrinterDataExW(printer, pKeyName, pValueName);
+               DeletePrinterKeyW(printer, pKeyName);
+
+               free(pData);
+               pData = NULL;
+               free(pData_ex);
+               pData_ex = NULL;
+       }
+
+       if (!ClosePrinter(printer)) {
+               exit(-1);
+       }
+
+       return 0;
+}