static BOOL test_GetPrinterDataEx(struct torture_context *tctx, LPSTR servername, LPSTR keyname, LPSTR valuename, HANDLE handle, DWORD *type_p, LPBYTE *buffer_p, DWORD *size_p) { LPBYTE buffer = NULL; DWORD needed = 0; DWORD type; DWORD err = 0; char tmp[1024]; torture_comment(tctx, "Testing GetPrinterDataEx(%s - %s)", keyname, valuename); err = GetPrinterDataEx(handle, keyname, valuename, &type, NULL, 0, &needed); if (err == ERROR_MORE_DATA) { buffer = (LPBYTE)malloc(needed); torture_assert(tctx, buffer, "malloc failed"); err = GetPrinterDataEx(handle, keyname, valuename, &type, buffer, needed, &needed); } if (err) { sprintf(tmp, "GetPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n", valuename, servername, needed, errstr(err)); torture_fail(tctx, tmp); } if (tctx->print) { print_printer_data(keyname, valuename, needed, buffer, type); } if (type_p) { *type_p = type; } if (size_p) { *size_p = needed; } if (buffer_p) { *buffer_p = buffer; } else { free(buffer); } return TRUE; }
int main (int argc, char* argv[]) { HANDLE printer; DWORD type, pcbData; LPBYTE pData = NULL; DWORD i, status; if (argc < 3) { fprintf (stderr, "useage: %s <printername> <value name>\n", argv[0]); exit (-1); } /* open the server */ if (!OpenPrinter (argv[1], &printer, NULL)) PrintLastError(); else printf ("Printer [%s] opened successfully.\n\n", argv[1]); status=GetPrinterDataEx(printer, "PrinterDriverData", argv[2], &type, pData, 0, &pcbData); if ((status != ERROR_SUCCESS) && (status != ERROR_MORE_DATA)) { PrintLastError(); ClosePrinter (printer); exit (-1); } if ((pData = (LPBYTE)malloc(pcbData)) == NULL) { fprintf (stderr, "Unable to malloc memory for Value Data!\n"); exit (-1); } status = GetPrinterDataEx(printer, "PrinterDriverData", argv[2], &type, pData, pcbData, &pcbData); if (status == ERROR_SUCCESS) { LPBYTE ptr = pData; printf ("\tValue Name = %s\n", argv[2]); printf ("\tType = %d\n", type); printf ("\tData = 0x%x bytes\n", pcbData); i = 0; while (i < pcbData) { printf ("\t0x%x", *(ptr)); *ptr = *ptr < 1; ptr++; if (i%4 == 3) printf ("\n"); i++; } printf ("\n"); } printf ("Shifting everything to the right one bit...\n\n"); status = SetPrinterDataEx(printer, "PrinterDriverData", argv[2], type, pData, pcbData); if (status == ERROR_SUCCESS) { printf ("\tValue Name = %s\n", argv[2]); printf ("\tType = %d\n", type); printf ("\tData = 0x%x bytes\n", pcbData); i = 0; while (i < pcbData) { printf ("\t0x%x", *(pData++)); if (i%4 == 3) printf ("\n"); i++; } printf ("\n"); } else PrintLastError(); printf ("\n"); /* close the server */ if (!ClosePrinter(printer)) PrintLastError(); else printf ("Printer [%s] closed successfully.\n", argv[1]); return 0; }