int main (int argc, char* argv[]) { HANDLE printer; DWORD i, status, needed, returned; PRINTER_ENUM_VALUES *buffer = NULL; if (argc < 2) { fprintf (stderr, "useage: %s <printername>\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]); needed = returned = 0; status = EnumPrinterDataEx(printer, ENUM_KEY_NAME, (LPBYTE)buffer, 0, &needed, &returned); if (status == ERROR_MORE_DATA) { if ((buffer = malloc(needed)) == NULL) { fprintf (stderr, "Unable to malloc enough space for [%d] bytes\n", needed); exit (-1); } status = EnumPrinterDataEx(printer, ENUM_KEY_NAME, (LPBYTE)buffer, needed, &needed, &returned); if (status == ERROR_SUCCESS) { printf ("Printer Enum Values :\n"); for (i=0; i<returned; i++) { print_printer_enum_values (&buffer[i]); printf ("\n"); } } free (buffer); } else if (status != ERROR_SUCCESS) PrintLastError(); /* close the server */ if (!ClosePrinter(printer)) PrintLastError(); else printf ("Printer [%s] closed successfully.\n", argv[1]); return 0; }
static BOOL test_EnumPrinterDataEx(struct torture_context *tctx, LPSTR servername, LPSTR keyname, HANDLE handle, LPBYTE *buffer_p, DWORD *returned_p) { LPBYTE buffer = NULL; DWORD needed = 0; DWORD returned = 0; DWORD err = 0; char tmp[1024]; torture_comment(tctx, "Testing EnumPrinterDataEx(%s)", keyname); err = EnumPrinterDataEx(handle, keyname, NULL, 0, &needed, &returned); if (err == ERROR_MORE_DATA) { buffer = malloc(needed); torture_assert(tctx, buffer, "malloc failed"); err = EnumPrinterDataEx(handle, keyname, buffer, needed, &needed, &returned); } if (err) { sprintf(tmp, "EnumPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n", keyname, servername, needed, errstr(err)); torture_fail(tctx, tmp); } if (tctx->print) { DWORD i; LPPRINTER_ENUM_VALUES v = (LPPRINTER_ENUM_VALUES)buffer; for (i=0; i < returned; i++) { print_printer_enum_values(&v[i]); } } if (returned_p) { *returned_p = returned; } if (buffer_p) { *buffer_p = buffer; } else { free(buffer); } return TRUE; }