s3: Do not reference ndr_table when calling rpc_srv_register
[kai/samba-autobuild/.git] / librpc / gen_ndr / srv_spoolss.c
index 64af1c4a1678ff1cb279345f22e67e2b9170ebb1..97e84a13e1cb4d4e61c0865cc1dc421964960423 100644 (file)
@@ -15,7 +15,7 @@ static bool api_spoolss_EnumPrinters(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrinters *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTERS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTERS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrinters);
        if (r == NULL) {
@@ -45,7 +45,13 @@ static bool api_spoolss_EnumPrinters(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_PrinterInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_PrinterInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -101,7 +107,7 @@ static bool api_spoolss_OpenPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_OpenPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_OPENPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_OPENPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_OpenPrinter);
        if (r == NULL) {
@@ -181,7 +187,7 @@ static bool api_spoolss_SetJob(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_SetJob *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SETJOB];
+       call = &p->interface->calls[NDR_SPOOLSS_SETJOB];
 
        r = talloc(talloc_tos(), struct spoolss_SetJob);
        if (r == NULL) {
@@ -254,7 +260,7 @@ static bool api_spoolss_GetJob(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetJob *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETJOB];
+       call = &p->interface->calls[NDR_SPOOLSS_GETJOB];
 
        r = talloc(talloc_tos(), struct spoolss_GetJob);
        if (r == NULL) {
@@ -340,7 +346,7 @@ static bool api_spoolss_EnumJobs(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumJobs *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMJOBS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMJOBS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumJobs);
        if (r == NULL) {
@@ -370,7 +376,13 @@ static bool api_spoolss_EnumJobs(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_JobInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_JobInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -426,7 +438,7 @@ static bool api_spoolss_AddPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrinter);
        if (r == NULL) {
@@ -455,6 +467,13 @@ static bool api_spoolss_AddPrinter(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_AddPrinter, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.handle = talloc_zero(r, struct policy_handle);
+       if (r->out.handle == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_AddPrinter(p, r);
 
        if (p->rng_fault_state) {
@@ -499,7 +518,7 @@ static bool api_spoolss_DeletePrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinter);
        if (r == NULL) {
@@ -572,7 +591,7 @@ static bool api_spoolss_SetPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_SetPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SETPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_SETPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_SetPrinter);
        if (r == NULL) {
@@ -645,7 +664,7 @@ static bool api_spoolss_GetPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrinter);
        if (r == NULL) {
@@ -731,7 +750,7 @@ static bool api_spoolss_AddPrinterDriver(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrinterDriver *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTERDRIVER];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTERDRIVER];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrinterDriver);
        if (r == NULL) {
@@ -804,7 +823,7 @@ static bool api_spoolss_EnumPrinterDrivers(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrinterDrivers *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTERDRIVERS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTERDRIVERS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrinterDrivers);
        if (r == NULL) {
@@ -834,7 +853,13 @@ static bool api_spoolss_EnumPrinterDrivers(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_DriverInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_DriverInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -890,7 +915,7 @@ static bool api_spoolss_GetPrinterDriver(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrinterDriver *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTERDRIVER];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTERDRIVER];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrinterDriver);
        if (r == NULL) {
@@ -919,6 +944,19 @@ static bool api_spoolss_GetPrinterDriver(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_GetPrinterDriver, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.info = talloc_zero(r, union spoolss_DriverInfo);
+       if (r->out.info == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_GetPrinterDriver(p, r);
 
        if (p->rng_fault_state) {
@@ -963,7 +1001,7 @@ static bool api_spoolss_GetPrinterDriverDirectory(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrinterDriverDirectory *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTERDRIVERDIRECTORY];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTERDRIVERDIRECTORY];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrinterDriverDirectory);
        if (r == NULL) {
@@ -1049,7 +1087,7 @@ static bool api_spoolss_DeletePrinterDriver(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterDriver *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERDRIVER];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERDRIVER];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterDriver);
        if (r == NULL) {
@@ -1122,7 +1160,7 @@ static bool api_spoolss_AddPrintProcessor(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrintProcessor *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTPROCESSOR];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTPROCESSOR];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrintProcessor);
        if (r == NULL) {
@@ -1195,7 +1233,7 @@ static bool api_spoolss_EnumPrintProcessors(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrintProcessors *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTPROCESSORS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTPROCESSORS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrintProcessors);
        if (r == NULL) {
@@ -1225,7 +1263,13 @@ static bool api_spoolss_EnumPrintProcessors(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_PrintProcessorInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_PrintProcessorInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -1281,7 +1325,7 @@ static bool api_spoolss_GetPrintProcessorDirectory(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrintProcessorDirectory *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTPROCESSORDIRECTORY];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTPROCESSORDIRECTORY];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrintProcessorDirectory);
        if (r == NULL) {
@@ -1310,6 +1354,19 @@ static bool api_spoolss_GetPrintProcessorDirectory(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_GetPrintProcessorDirectory, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.info = talloc_zero(r, union spoolss_PrintProcessorDirectoryInfo);
+       if (r->out.info == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_GetPrintProcessorDirectory(p, r);
 
        if (p->rng_fault_state) {
@@ -1354,7 +1411,7 @@ static bool api_spoolss_StartDocPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_StartDocPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_STARTDOCPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_STARTDOCPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_StartDocPrinter);
        if (r == NULL) {
@@ -1434,7 +1491,7 @@ static bool api_spoolss_StartPagePrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_StartPagePrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_STARTPAGEPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_STARTPAGEPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_StartPagePrinter);
        if (r == NULL) {
@@ -1507,7 +1564,7 @@ static bool api_spoolss_WritePrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_WritePrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_WRITEPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_WRITEPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_WritePrinter);
        if (r == NULL) {
@@ -1587,7 +1644,7 @@ static bool api_spoolss_EndPagePrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EndPagePrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENDPAGEPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_ENDPAGEPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_EndPagePrinter);
        if (r == NULL) {
@@ -1660,7 +1717,7 @@ static bool api_spoolss_AbortPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AbortPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ABORTPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_ABORTPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_AbortPrinter);
        if (r == NULL) {
@@ -1733,7 +1790,7 @@ static bool api_spoolss_ReadPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ReadPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_READPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_READPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_ReadPrinter);
        if (r == NULL) {
@@ -1819,7 +1876,7 @@ static bool api_spoolss_EndDocPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EndDocPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENDDOCPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_ENDDOCPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_EndDocPrinter);
        if (r == NULL) {
@@ -1892,7 +1949,7 @@ static bool api_spoolss_AddJob(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddJob *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDJOB];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDJOB];
 
        r = talloc(talloc_tos(), struct spoolss_AddJob);
        if (r == NULL) {
@@ -1921,6 +1978,14 @@ static bool api_spoolss_AddJob(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_AddJob, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.buffer = r->in.buffer;
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_AddJob(p, r);
 
        if (p->rng_fault_state) {
@@ -1965,7 +2030,7 @@ static bool api_spoolss_ScheduleJob(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ScheduleJob *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SCHEDULEJOB];
+       call = &p->interface->calls[NDR_SPOOLSS_SCHEDULEJOB];
 
        r = talloc(talloc_tos(), struct spoolss_ScheduleJob);
        if (r == NULL) {
@@ -2038,7 +2103,7 @@ static bool api_spoolss_GetPrinterData(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrinterData *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTERDATA];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTERDATA];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrinterData);
        if (r == NULL) {
@@ -2068,12 +2133,18 @@ static bool api_spoolss_GetPrinterData(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.type = talloc_zero(r, enum spoolss_PrinterDataType);
+       r->out.type = talloc_zero(r, enum winreg_Type);
        if (r->out.type == NULL) {
                talloc_free(r);
                return false;
        }
 
+       r->out.data = talloc_zero(r, union spoolss_PrinterData);
+       if (r->out.data == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.needed = talloc_zero(r, uint32_t);
        if (r->out.needed == NULL) {
                talloc_free(r);
@@ -2124,7 +2195,7 @@ static bool api_spoolss_SetPrinterData(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_SetPrinterData *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SETPRINTERDATA];
+       call = &p->interface->calls[NDR_SPOOLSS_SETPRINTERDATA];
 
        r = talloc(talloc_tos(), struct spoolss_SetPrinterData);
        if (r == NULL) {
@@ -2197,7 +2268,7 @@ static bool api_spoolss_WaitForPrinterChange(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_WaitForPrinterChange *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_WAITFORPRINTERCHANGE];
+       call = &p->interface->calls[NDR_SPOOLSS_WAITFORPRINTERCHANGE];
 
        r = talloc(talloc_tos(), struct spoolss_WaitForPrinterChange);
        if (r == NULL) {
@@ -2270,7 +2341,7 @@ static bool api_spoolss_ClosePrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ClosePrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_CLOSEPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_CLOSEPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_ClosePrinter);
        if (r == NULL) {
@@ -2345,7 +2416,7 @@ static bool api_spoolss_AddForm(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddForm *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDFORM];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDFORM];
 
        r = talloc(talloc_tos(), struct spoolss_AddForm);
        if (r == NULL) {
@@ -2418,7 +2489,7 @@ static bool api_spoolss_DeleteForm(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeleteForm *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEFORM];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEFORM];
 
        r = talloc(talloc_tos(), struct spoolss_DeleteForm);
        if (r == NULL) {
@@ -2491,7 +2562,7 @@ static bool api_spoolss_GetForm(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetForm *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETFORM];
+       call = &p->interface->calls[NDR_SPOOLSS_GETFORM];
 
        r = talloc(talloc_tos(), struct spoolss_GetForm);
        if (r == NULL) {
@@ -2577,7 +2648,7 @@ static bool api_spoolss_SetForm(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_SetForm *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SETFORM];
+       call = &p->interface->calls[NDR_SPOOLSS_SETFORM];
 
        r = talloc(talloc_tos(), struct spoolss_SetForm);
        if (r == NULL) {
@@ -2650,7 +2721,7 @@ static bool api_spoolss_EnumForms(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumForms *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMFORMS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMFORMS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumForms);
        if (r == NULL) {
@@ -2680,7 +2751,13 @@ static bool api_spoolss_EnumForms(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_FormInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_FormInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -2736,7 +2813,7 @@ static bool api_spoolss_EnumPorts(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPorts *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPORTS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPORTS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPorts);
        if (r == NULL) {
@@ -2766,7 +2843,13 @@ static bool api_spoolss_EnumPorts(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_PortInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_PortInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -2822,7 +2905,7 @@ static bool api_spoolss_EnumMonitors(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumMonitors *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMMONITORS];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMMONITORS];
 
        r = talloc(talloc_tos(), struct spoolss_EnumMonitors);
        if (r == NULL) {
@@ -2852,7 +2935,13 @@ static bool api_spoolss_EnumMonitors(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero_array(r, union spoolss_MonitorInfo, r->out.count);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_MonitorInfo *);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -2908,7 +2997,7 @@ static bool api_spoolss_AddPort(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPort *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPORT];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPORT];
 
        r = talloc(talloc_tos(), struct spoolss_AddPort);
        if (r == NULL) {
@@ -2981,7 +3070,7 @@ static bool api_spoolss_ConfigurePort(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ConfigurePort *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_CONFIGUREPORT];
+       call = &p->interface->calls[NDR_SPOOLSS_CONFIGUREPORT];
 
        r = talloc(talloc_tos(), struct spoolss_ConfigurePort);
        if (r == NULL) {
@@ -3054,7 +3143,7 @@ static bool api_spoolss_DeletePort(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePort *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPORT];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPORT];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePort);
        if (r == NULL) {
@@ -3127,7 +3216,7 @@ static bool api_spoolss_CreatePrinterIC(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_CreatePrinterIC *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_CREATEPRINTERIC];
+       call = &p->interface->calls[NDR_SPOOLSS_CREATEPRINTERIC];
 
        r = talloc(talloc_tos(), struct spoolss_CreatePrinterIC);
        if (r == NULL) {
@@ -3156,6 +3245,13 @@ static bool api_spoolss_CreatePrinterIC(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_CreatePrinterIC, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.gdi_handle = talloc_zero(r, struct policy_handle);
+       if (r->out.gdi_handle == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_CreatePrinterIC(p, r);
 
        if (p->rng_fault_state) {
@@ -3200,7 +3296,7 @@ static bool api_spoolss_PlayGDIScriptOnPrinterIC(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_PlayGDIScriptOnPrinterIC *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_PLAYGDISCRIPTONPRINTERIC];
+       call = &p->interface->calls[NDR_SPOOLSS_PLAYGDISCRIPTONPRINTERIC];
 
        r = talloc(talloc_tos(), struct spoolss_PlayGDIScriptOnPrinterIC);
        if (r == NULL) {
@@ -3273,7 +3369,7 @@ static bool api_spoolss_DeletePrinterIC(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterIC *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERIC];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERIC];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterIC);
        if (r == NULL) {
@@ -3302,6 +3398,8 @@ static bool api_spoolss_DeletePrinterIC(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_DeletePrinterIC, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.gdi_handle = r->in.gdi_handle;
        r->out.result = _spoolss_DeletePrinterIC(p, r);
 
        if (p->rng_fault_state) {
@@ -3346,7 +3444,7 @@ static bool api_spoolss_AddPrinterConnection(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrinterConnection *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTERCONNECTION];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTERCONNECTION];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrinterConnection);
        if (r == NULL) {
@@ -3419,7 +3517,7 @@ static bool api_spoolss_DeletePrinterConnection(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterConnection *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERCONNECTION];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERCONNECTION];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterConnection);
        if (r == NULL) {
@@ -3492,7 +3590,7 @@ static bool api_spoolss_PrinterMessageBox(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_PrinterMessageBox *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_PRINTERMESSAGEBOX];
+       call = &p->interface->calls[NDR_SPOOLSS_PRINTERMESSAGEBOX];
 
        r = talloc(talloc_tos(), struct spoolss_PrinterMessageBox);
        if (r == NULL) {
@@ -3565,7 +3663,7 @@ static bool api_spoolss_AddMonitor(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddMonitor *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDMONITOR];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDMONITOR];
 
        r = talloc(talloc_tos(), struct spoolss_AddMonitor);
        if (r == NULL) {
@@ -3638,7 +3736,7 @@ static bool api_spoolss_DeleteMonitor(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeleteMonitor *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEMONITOR];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEMONITOR];
 
        r = talloc(talloc_tos(), struct spoolss_DeleteMonitor);
        if (r == NULL) {
@@ -3711,7 +3809,7 @@ static bool api_spoolss_DeletePrintProcessor(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrintProcessor *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTPROCESSOR];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTPROCESSOR];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrintProcessor);
        if (r == NULL) {
@@ -3784,7 +3882,7 @@ static bool api_spoolss_AddPrintProvidor(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrintProvidor *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTPROVIDOR];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTPROVIDOR];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrintProvidor);
        if (r == NULL) {
@@ -3857,7 +3955,7 @@ static bool api_spoolss_DeletePrintProvidor(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrintProvidor *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTPROVIDOR];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTPROVIDOR];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrintProvidor);
        if (r == NULL) {
@@ -3930,7 +4028,7 @@ static bool api_spoolss_EnumPrintProcDataTypes(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrintProcDataTypes *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTPROCDATATYPES];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTPROCDATATYPES];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrintProcDataTypes);
        if (r == NULL) {
@@ -3959,6 +4057,25 @@ static bool api_spoolss_EnumPrintProcDataTypes(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_EnumPrintProcDataTypes, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.info = talloc_zero(r, union spoolss_PrintProcDataTypesInfo *);
+       if (r->out.info == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_EnumPrintProcDataTypes(p, r);
 
        if (p->rng_fault_state) {
@@ -4003,7 +4120,7 @@ static bool api_spoolss_ResetPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ResetPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_RESETPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_RESETPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_ResetPrinter);
        if (r == NULL) {
@@ -4076,7 +4193,7 @@ static bool api_spoolss_GetPrinterDriver2(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrinterDriver2 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTERDRIVER2];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTERDRIVER2];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrinterDriver2);
        if (r == NULL) {
@@ -4106,7 +4223,7 @@ static bool api_spoolss_GetPrinterDriver2(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.info = talloc_zero(r, DATA_BLOB);
+       r->out.info = talloc_zero(r, union spoolss_DriverInfo);
        if (r->out.info == NULL) {
                talloc_free(r);
                return false;
@@ -4174,7 +4291,7 @@ static bool api_spoolss_FindFirstPrinterChangeNotification(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_FindFirstPrinterChangeNotification *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION];
+       call = &p->interface->calls[NDR_SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION];
 
        r = talloc(talloc_tos(), struct spoolss_FindFirstPrinterChangeNotification);
        if (r == NULL) {
@@ -4247,7 +4364,7 @@ static bool api_spoolss_FindNextPrinterChangeNotification(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_FindNextPrinterChangeNotification *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION];
+       call = &p->interface->calls[NDR_SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION];
 
        r = talloc(talloc_tos(), struct spoolss_FindNextPrinterChangeNotification);
        if (r == NULL) {
@@ -4320,7 +4437,7 @@ static bool api_spoolss_FindClosePrinterNotify(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_FindClosePrinterNotify *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_FINDCLOSEPRINTERNOTIFY];
+       call = &p->interface->calls[NDR_SPOOLSS_FINDCLOSEPRINTERNOTIFY];
 
        r = talloc(talloc_tos(), struct spoolss_FindClosePrinterNotify);
        if (r == NULL) {
@@ -4393,7 +4510,7 @@ static bool api_spoolss_RouterFindFirstPrinterChangeNotificationOld(pipes_struct
        DATA_BLOB blob;
        struct spoolss_RouterFindFirstPrinterChangeNotificationOld *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATIONOLD];
+       call = &p->interface->calls[NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATIONOLD];
 
        r = talloc(talloc_tos(), struct spoolss_RouterFindFirstPrinterChangeNotificationOld);
        if (r == NULL) {
@@ -4466,7 +4583,7 @@ static bool api_spoolss_ReplyOpenPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ReplyOpenPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_REPLYOPENPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_REPLYOPENPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_ReplyOpenPrinter);
        if (r == NULL) {
@@ -4546,7 +4663,7 @@ static bool api_spoolss_RouterReplyPrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_RouterReplyPrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ROUTERREPLYPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_ROUTERREPLYPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_RouterReplyPrinter);
        if (r == NULL) {
@@ -4619,7 +4736,7 @@ static bool api_spoolss_ReplyClosePrinter(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ReplyClosePrinter *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_REPLYCLOSEPRINTER];
+       call = &p->interface->calls[NDR_SPOOLSS_REPLYCLOSEPRINTER];
 
        r = talloc(talloc_tos(), struct spoolss_ReplyClosePrinter);
        if (r == NULL) {
@@ -4694,7 +4811,7 @@ static bool api_spoolss_AddPortEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPortEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPORTEX];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPORTEX];
 
        r = talloc(talloc_tos(), struct spoolss_AddPortEx);
        if (r == NULL) {
@@ -4767,7 +4884,7 @@ static bool api_spoolss_RouterFindFirstPrinterChangeNotification(pipes_struct *p
        DATA_BLOB blob;
        struct spoolss_RouterFindFirstPrinterChangeNotification *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATION];
+       call = &p->interface->calls[NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATION];
 
        r = talloc(talloc_tos(), struct spoolss_RouterFindFirstPrinterChangeNotification);
        if (r == NULL) {
@@ -4840,7 +4957,7 @@ static bool api_spoolss_SpoolerInit(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_SpoolerInit *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SPOOLERINIT];
+       call = &p->interface->calls[NDR_SPOOLSS_SPOOLERINIT];
 
        r = talloc(talloc_tos(), struct spoolss_SpoolerInit);
        if (r == NULL) {
@@ -4913,7 +5030,7 @@ static bool api_spoolss_ResetPrinterEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_ResetPrinterEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_RESETPRINTEREX];
+       call = &p->interface->calls[NDR_SPOOLSS_RESETPRINTEREX];
 
        r = talloc(talloc_tos(), struct spoolss_ResetPrinterEx);
        if (r == NULL) {
@@ -4986,7 +5103,7 @@ static bool api_spoolss_RemoteFindFirstPrinterChangeNotifyEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_RemoteFindFirstPrinterChangeNotifyEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFYEX];
+       call = &p->interface->calls[NDR_SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFYEX];
 
        r = talloc(talloc_tos(), struct spoolss_RemoteFindFirstPrinterChangeNotifyEx);
        if (r == NULL) {
@@ -5050,18 +5167,18 @@ static bool api_spoolss_RemoteFindFirstPrinterChangeNotifyEx(pipes_struct *p)
        return true;
 }
 
-static bool api_spoolss_RouterRefreshPrinterChangeNotification(pipes_struct *p)
+static bool api_spoolss_RouterReplyPrinterEx(pipes_struct *p)
 {
        const struct ndr_interface_call *call;
        struct ndr_pull *pull;
        struct ndr_push *push;
        enum ndr_err_code ndr_err;
        DATA_BLOB blob;
-       struct spoolss_RouterRefreshPrinterChangeNotification *r;
+       struct spoolss_RouterReplyPrinterEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFICATION];
+       call = &p->interface->calls[NDR_SPOOLSS_ROUTERREPLYPRINTEREX];
 
-       r = talloc(talloc_tos(), struct spoolss_RouterRefreshPrinterChangeNotification);
+       r = talloc(talloc_tos(), struct spoolss_RouterReplyPrinterEx);
        if (r == NULL) {
                return false;
        }
@@ -5085,10 +5202,17 @@ static bool api_spoolss_RouterRefreshPrinterChangeNotification(pipes_struct *p)
        }
 
        if (DEBUGLEVEL >= 10) {
-               NDR_PRINT_IN_DEBUG(spoolss_RouterRefreshPrinterChangeNotification, r);
+               NDR_PRINT_IN_DEBUG(spoolss_RouterReplyPrinterEx, r);
+       }
+
+       ZERO_STRUCT(r->out);
+       r->out.reply_result = talloc_zero(r, uint32_t);
+       if (r->out.reply_result == NULL) {
+               talloc_free(r);
+               return false;
        }
 
-       r->out.result = _spoolss_RouterRefreshPrinterChangeNotification(p, r);
+       r->out.result = _spoolss_RouterReplyPrinterEx(p, r);
 
        if (p->rng_fault_state) {
                talloc_free(r);
@@ -5097,7 +5221,7 @@ static bool api_spoolss_RouterRefreshPrinterChangeNotification(pipes_struct *p)
        }
 
        if (DEBUGLEVEL >= 10) {
-               NDR_PRINT_OUT_DEBUG(spoolss_RouterRefreshPrinterChangeNotification, r);
+               NDR_PRINT_OUT_DEBUG(spoolss_RouterReplyPrinterEx, r);
        }
 
        push = ndr_push_init_ctx(r, NULL);
@@ -5123,18 +5247,18 @@ static bool api_spoolss_RouterRefreshPrinterChangeNotification(pipes_struct *p)
        return true;
 }
 
-static bool api_spoolss_RemoteFindNextPrinterChangeNotifyEx(pipes_struct *p)
+static bool api_spoolss_RouterRefreshPrinterChangeNotify(pipes_struct *p)
 {
        const struct ndr_interface_call *call;
        struct ndr_pull *pull;
        struct ndr_push *push;
        enum ndr_err_code ndr_err;
        DATA_BLOB blob;
-       struct spoolss_RemoteFindNextPrinterChangeNotifyEx *r;
+       struct spoolss_RouterRefreshPrinterChangeNotify *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_REMOTEFINDNEXTPRINTERCHANGENOTIFYEX];
+       call = &p->interface->calls[NDR_SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFY];
 
-       r = talloc(talloc_tos(), struct spoolss_RemoteFindNextPrinterChangeNotifyEx);
+       r = talloc(talloc_tos(), struct spoolss_RouterRefreshPrinterChangeNotify);
        if (r == NULL) {
                return false;
        }
@@ -5158,7 +5282,7 @@ static bool api_spoolss_RemoteFindNextPrinterChangeNotifyEx(pipes_struct *p)
        }
 
        if (DEBUGLEVEL >= 10) {
-               NDR_PRINT_IN_DEBUG(spoolss_RemoteFindNextPrinterChangeNotifyEx, r);
+               NDR_PRINT_IN_DEBUG(spoolss_RouterRefreshPrinterChangeNotify, r);
        }
 
        ZERO_STRUCT(r->out);
@@ -5168,7 +5292,7 @@ static bool api_spoolss_RemoteFindNextPrinterChangeNotifyEx(pipes_struct *p)
                return false;
        }
 
-       r->out.result = _spoolss_RemoteFindNextPrinterChangeNotifyEx(p, r);
+       r->out.result = _spoolss_RouterRefreshPrinterChangeNotify(p, r);
 
        if (p->rng_fault_state) {
                talloc_free(r);
@@ -5177,7 +5301,7 @@ static bool api_spoolss_RemoteFindNextPrinterChangeNotifyEx(pipes_struct *p)
        }
 
        if (DEBUGLEVEL >= 10) {
-               NDR_PRINT_OUT_DEBUG(spoolss_RemoteFindNextPrinterChangeNotifyEx, r);
+               NDR_PRINT_OUT_DEBUG(spoolss_RouterRefreshPrinterChangeNotify, r);
        }
 
        push = ndr_push_init_ctx(r, NULL);
@@ -5212,7 +5336,7 @@ static bool api_spoolss_44(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_44 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_44];
+       call = &p->interface->calls[NDR_SPOOLSS_44];
 
        r = talloc(talloc_tos(), struct spoolss_44);
        if (r == NULL) {
@@ -5285,7 +5409,7 @@ static bool api_spoolss_OpenPrinterEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_OpenPrinterEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_OPENPRINTEREX];
+       call = &p->interface->calls[NDR_SPOOLSS_OPENPRINTEREX];
 
        r = talloc(talloc_tos(), struct spoolss_OpenPrinterEx);
        if (r == NULL) {
@@ -5365,7 +5489,7 @@ static bool api_spoolss_AddPrinterEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrinterEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTEREX];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTEREX];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrinterEx);
        if (r == NULL) {
@@ -5394,6 +5518,13 @@ static bool api_spoolss_AddPrinterEx(pipes_struct *p)
                NDR_PRINT_IN_DEBUG(spoolss_AddPrinterEx, r);
        }
 
+       ZERO_STRUCT(r->out);
+       r->out.handle = talloc_zero(r, struct policy_handle);
+       if (r->out.handle == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
        r->out.result = _spoolss_AddPrinterEx(p, r);
 
        if (p->rng_fault_state) {
@@ -5438,7 +5569,7 @@ static bool api_spoolss_47(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_47 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_47];
+       call = &p->interface->calls[NDR_SPOOLSS_47];
 
        r = talloc(talloc_tos(), struct spoolss_47);
        if (r == NULL) {
@@ -5511,7 +5642,7 @@ static bool api_spoolss_EnumPrinterData(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrinterData *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTERDATA];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTERDATA];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrinterData);
        if (r == NULL) {
@@ -5553,14 +5684,14 @@ static bool api_spoolss_EnumPrinterData(pipes_struct *p)
                return false;
        }
 
-       r->out.printerdata_type = talloc_zero(r, uint32_t);
-       if (r->out.printerdata_type == NULL) {
+       r->out.type = talloc_zero(r, enum winreg_Type);
+       if (r->out.type == NULL) {
                talloc_free(r);
                return false;
        }
 
-       r->out.buffer = talloc_zero(r, DATA_BLOB);
-       if (r->out.buffer == NULL) {
+       r->out.data = talloc_zero_array(r, uint8_t, r->in.data_offered);
+       if (r->out.data == NULL) {
                talloc_free(r);
                return false;
        }
@@ -5615,7 +5746,7 @@ static bool api_spoolss_DeletePrinterData(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterData *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERDATA];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERDATA];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterData);
        if (r == NULL) {
@@ -5688,7 +5819,7 @@ static bool api_spoolss_4a(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_4a *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_4A];
+       call = &p->interface->calls[NDR_SPOOLSS_4A];
 
        r = talloc(talloc_tos(), struct spoolss_4a);
        if (r == NULL) {
@@ -5761,7 +5892,7 @@ static bool api_spoolss_4b(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_4b *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_4B];
+       call = &p->interface->calls[NDR_SPOOLSS_4B];
 
        r = talloc(talloc_tos(), struct spoolss_4b);
        if (r == NULL) {
@@ -5834,7 +5965,7 @@ static bool api_spoolss_4c(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_4c *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_4C];
+       call = &p->interface->calls[NDR_SPOOLSS_4C];
 
        r = talloc(talloc_tos(), struct spoolss_4c);
        if (r == NULL) {
@@ -5907,7 +6038,7 @@ static bool api_spoolss_SetPrinterDataEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_SetPrinterDataEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_SETPRINTERDATAEX];
+       call = &p->interface->calls[NDR_SPOOLSS_SETPRINTERDATAEX];
 
        r = talloc(talloc_tos(), struct spoolss_SetPrinterDataEx);
        if (r == NULL) {
@@ -5980,7 +6111,7 @@ static bool api_spoolss_GetPrinterDataEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_GetPrinterDataEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_GETPRINTERDATAEX];
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTERDATAEX];
 
        r = talloc(talloc_tos(), struct spoolss_GetPrinterDataEx);
        if (r == NULL) {
@@ -6010,7 +6141,7 @@ static bool api_spoolss_GetPrinterDataEx(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.type = talloc_zero(r, uint32_t);
+       r->out.type = talloc_zero(r, enum winreg_Type);
        if (r->out.type == NULL) {
                talloc_free(r);
                return false;
@@ -6072,7 +6203,7 @@ static bool api_spoolss_EnumPrinterDataEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrinterDataEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTERDATAEX];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTERDATAEX];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrinterDataEx);
        if (r == NULL) {
@@ -6102,20 +6233,20 @@ static bool api_spoolss_EnumPrinterDataEx(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.buffer = talloc_zero_array(r, uint8_t, r->in.offered);
-       if (r->out.buffer == NULL) {
+       r->out.count = talloc_zero(r, uint32_t);
+       if (r->out.count == NULL) {
                talloc_free(r);
                return false;
        }
 
-       r->out.needed = talloc_zero(r, uint32_t);
-       if (r->out.needed == NULL) {
+       r->out.info = talloc_zero(r, struct spoolss_PrinterEnumValues *);
+       if (r->out.info == NULL) {
                talloc_free(r);
                return false;
        }
 
-       r->out.count = talloc_zero(r, uint32_t);
-       if (r->out.count == NULL) {
+       r->out.needed = talloc_zero(r, uint32_t);
+       if (r->out.needed == NULL) {
                talloc_free(r);
                return false;
        }
@@ -6164,7 +6295,7 @@ static bool api_spoolss_EnumPrinterKey(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_EnumPrinterKey *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ENUMPRINTERKEY];
+       call = &p->interface->calls[NDR_SPOOLSS_ENUMPRINTERKEY];
 
        r = talloc(talloc_tos(), struct spoolss_EnumPrinterKey);
        if (r == NULL) {
@@ -6194,7 +6325,7 @@ static bool api_spoolss_EnumPrinterKey(pipes_struct *p)
        }
 
        ZERO_STRUCT(r->out);
-       r->out.key_buffer = talloc_zero_array(r, uint16_t, r->in.key_buffer_size / 2);
+       r->out.key_buffer = talloc_zero(r, const char **);
        if (r->out.key_buffer == NULL) {
                talloc_free(r);
                return false;
@@ -6250,7 +6381,7 @@ static bool api_spoolss_DeletePrinterDataEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterDataEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERDATAEX];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERDATAEX];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterDataEx);
        if (r == NULL) {
@@ -6323,7 +6454,7 @@ static bool api_spoolss_DeletePrinterKey(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterKey *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERKEY];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERKEY];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterKey);
        if (r == NULL) {
@@ -6396,7 +6527,7 @@ static bool api_spoolss_53(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_53 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_53];
+       call = &p->interface->calls[NDR_SPOOLSS_53];
 
        r = talloc(talloc_tos(), struct spoolss_53);
        if (r == NULL) {
@@ -6469,7 +6600,7 @@ static bool api_spoolss_DeletePrinterDriverEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_DeletePrinterDriverEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_DELETEPRINTERDRIVEREX];
+       call = &p->interface->calls[NDR_SPOOLSS_DELETEPRINTERDRIVEREX];
 
        r = talloc(talloc_tos(), struct spoolss_DeletePrinterDriverEx);
        if (r == NULL) {
@@ -6542,7 +6673,7 @@ static bool api_spoolss_55(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_55 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_55];
+       call = &p->interface->calls[NDR_SPOOLSS_55];
 
        r = talloc(talloc_tos(), struct spoolss_55);
        if (r == NULL) {
@@ -6615,7 +6746,7 @@ static bool api_spoolss_56(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_56 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_56];
+       call = &p->interface->calls[NDR_SPOOLSS_56];
 
        r = talloc(talloc_tos(), struct spoolss_56);
        if (r == NULL) {
@@ -6688,7 +6819,7 @@ static bool api_spoolss_57(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_57 *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_57];
+       call = &p->interface->calls[NDR_SPOOLSS_57];
 
        r = talloc(talloc_tos(), struct spoolss_57);
        if (r == NULL) {
@@ -6761,7 +6892,7 @@ static bool api_spoolss_XcvData(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_XcvData *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_XCVDATA];
+       call = &p->interface->calls[NDR_SPOOLSS_XCVDATA];
 
        r = talloc(talloc_tos(), struct spoolss_XcvData);
        if (r == NULL) {
@@ -6848,7 +6979,7 @@ static bool api_spoolss_AddPrinterDriverEx(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_AddPrinterDriverEx *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_ADDPRINTERDRIVEREX];
+       call = &p->interface->calls[NDR_SPOOLSS_ADDPRINTERDRIVEREX];
 
        r = talloc(talloc_tos(), struct spoolss_AddPrinterDriverEx);
        if (r == NULL) {
@@ -6921,7 +7052,7 @@ static bool api_spoolss_5a(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_5a *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_5A];
+       call = &p->interface->calls[NDR_SPOOLSS_5A];
 
        r = talloc(talloc_tos(), struct spoolss_5a);
        if (r == NULL) {
@@ -6994,7 +7125,7 @@ static bool api_spoolss_5b(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_5b *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_5B];
+       call = &p->interface->calls[NDR_SPOOLSS_5B];
 
        r = talloc(talloc_tos(), struct spoolss_5b);
        if (r == NULL) {
@@ -7067,7 +7198,7 @@ static bool api_spoolss_5c(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_5c *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_5C];
+       call = &p->interface->calls[NDR_SPOOLSS_5C];
 
        r = talloc(talloc_tos(), struct spoolss_5c);
        if (r == NULL) {
@@ -7140,7 +7271,7 @@ static bool api_spoolss_5d(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_5d *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_5D];
+       call = &p->interface->calls[NDR_SPOOLSS_5D];
 
        r = talloc(talloc_tos(), struct spoolss_5d);
        if (r == NULL) {
@@ -7213,7 +7344,7 @@ static bool api_spoolss_5e(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_5e *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_5E];
+       call = &p->interface->calls[NDR_SPOOLSS_5E];
 
        r = talloc(talloc_tos(), struct spoolss_5e);
        if (r == NULL) {
@@ -7286,7 +7417,7 @@ static bool api_spoolss_5f(pipes_struct *p)
        DATA_BLOB blob;
        struct spoolss_5f *r;
 
-       call = &ndr_table_spoolss.calls[NDR_SPOOLSS_5F];
+       call = &p->interface->calls[NDR_SPOOLSS_5F];
 
        r = talloc(talloc_tos(), struct spoolss_5f);
        if (r == NULL) {
@@ -7350,129 +7481,1185 @@ static bool api_spoolss_5f(pipes_struct *p)
        return true;
 }
 
-
-/* Tables */
-static struct api_struct api_spoolss_cmds[] = 
+static bool api_spoolss_60(pipes_struct *p)
 {
-       {"SPOOLSS_ENUMPRINTERS", NDR_SPOOLSS_ENUMPRINTERS, api_spoolss_EnumPrinters},
-       {"SPOOLSS_OPENPRINTER", NDR_SPOOLSS_OPENPRINTER, api_spoolss_OpenPrinter},
-       {"SPOOLSS_SETJOB", NDR_SPOOLSS_SETJOB, api_spoolss_SetJob},
-       {"SPOOLSS_GETJOB", NDR_SPOOLSS_GETJOB, api_spoolss_GetJob},
-       {"SPOOLSS_ENUMJOBS", NDR_SPOOLSS_ENUMJOBS, api_spoolss_EnumJobs},
-       {"SPOOLSS_ADDPRINTER", NDR_SPOOLSS_ADDPRINTER, api_spoolss_AddPrinter},
-       {"SPOOLSS_DELETEPRINTER", NDR_SPOOLSS_DELETEPRINTER, api_spoolss_DeletePrinter},
-       {"SPOOLSS_SETPRINTER", NDR_SPOOLSS_SETPRINTER, api_spoolss_SetPrinter},
-       {"SPOOLSS_GETPRINTER", NDR_SPOOLSS_GETPRINTER, api_spoolss_GetPrinter},
-       {"SPOOLSS_ADDPRINTERDRIVER", NDR_SPOOLSS_ADDPRINTERDRIVER, api_spoolss_AddPrinterDriver},
-       {"SPOOLSS_ENUMPRINTERDRIVERS", NDR_SPOOLSS_ENUMPRINTERDRIVERS, api_spoolss_EnumPrinterDrivers},
-       {"SPOOLSS_GETPRINTERDRIVER", NDR_SPOOLSS_GETPRINTERDRIVER, api_spoolss_GetPrinterDriver},
-       {"SPOOLSS_GETPRINTERDRIVERDIRECTORY", NDR_SPOOLSS_GETPRINTERDRIVERDIRECTORY, api_spoolss_GetPrinterDriverDirectory},
-       {"SPOOLSS_DELETEPRINTERDRIVER", NDR_SPOOLSS_DELETEPRINTERDRIVER, api_spoolss_DeletePrinterDriver},
-       {"SPOOLSS_ADDPRINTPROCESSOR", NDR_SPOOLSS_ADDPRINTPROCESSOR, api_spoolss_AddPrintProcessor},
-       {"SPOOLSS_ENUMPRINTPROCESSORS", NDR_SPOOLSS_ENUMPRINTPROCESSORS, api_spoolss_EnumPrintProcessors},
-       {"SPOOLSS_GETPRINTPROCESSORDIRECTORY", NDR_SPOOLSS_GETPRINTPROCESSORDIRECTORY, api_spoolss_GetPrintProcessorDirectory},
-       {"SPOOLSS_STARTDOCPRINTER", NDR_SPOOLSS_STARTDOCPRINTER, api_spoolss_StartDocPrinter},
-       {"SPOOLSS_STARTPAGEPRINTER", NDR_SPOOLSS_STARTPAGEPRINTER, api_spoolss_StartPagePrinter},
-       {"SPOOLSS_WRITEPRINTER", NDR_SPOOLSS_WRITEPRINTER, api_spoolss_WritePrinter},
-       {"SPOOLSS_ENDPAGEPRINTER", NDR_SPOOLSS_ENDPAGEPRINTER, api_spoolss_EndPagePrinter},
-       {"SPOOLSS_ABORTPRINTER", NDR_SPOOLSS_ABORTPRINTER, api_spoolss_AbortPrinter},
-       {"SPOOLSS_READPRINTER", NDR_SPOOLSS_READPRINTER, api_spoolss_ReadPrinter},
-       {"SPOOLSS_ENDDOCPRINTER", NDR_SPOOLSS_ENDDOCPRINTER, api_spoolss_EndDocPrinter},
-       {"SPOOLSS_ADDJOB", NDR_SPOOLSS_ADDJOB, api_spoolss_AddJob},
-       {"SPOOLSS_SCHEDULEJOB", NDR_SPOOLSS_SCHEDULEJOB, api_spoolss_ScheduleJob},
-       {"SPOOLSS_GETPRINTERDATA", NDR_SPOOLSS_GETPRINTERDATA, api_spoolss_GetPrinterData},
-       {"SPOOLSS_SETPRINTERDATA", NDR_SPOOLSS_SETPRINTERDATA, api_spoolss_SetPrinterData},
-       {"SPOOLSS_WAITFORPRINTERCHANGE", NDR_SPOOLSS_WAITFORPRINTERCHANGE, api_spoolss_WaitForPrinterChange},
-       {"SPOOLSS_CLOSEPRINTER", NDR_SPOOLSS_CLOSEPRINTER, api_spoolss_ClosePrinter},
-       {"SPOOLSS_ADDFORM", NDR_SPOOLSS_ADDFORM, api_spoolss_AddForm},
-       {"SPOOLSS_DELETEFORM", NDR_SPOOLSS_DELETEFORM, api_spoolss_DeleteForm},
-       {"SPOOLSS_GETFORM", NDR_SPOOLSS_GETFORM, api_spoolss_GetForm},
-       {"SPOOLSS_SETFORM", NDR_SPOOLSS_SETFORM, api_spoolss_SetForm},
-       {"SPOOLSS_ENUMFORMS", NDR_SPOOLSS_ENUMFORMS, api_spoolss_EnumForms},
-       {"SPOOLSS_ENUMPORTS", NDR_SPOOLSS_ENUMPORTS, api_spoolss_EnumPorts},
-       {"SPOOLSS_ENUMMONITORS", NDR_SPOOLSS_ENUMMONITORS, api_spoolss_EnumMonitors},
-       {"SPOOLSS_ADDPORT", NDR_SPOOLSS_ADDPORT, api_spoolss_AddPort},
-       {"SPOOLSS_CONFIGUREPORT", NDR_SPOOLSS_CONFIGUREPORT, api_spoolss_ConfigurePort},
-       {"SPOOLSS_DELETEPORT", NDR_SPOOLSS_DELETEPORT, api_spoolss_DeletePort},
-       {"SPOOLSS_CREATEPRINTERIC", NDR_SPOOLSS_CREATEPRINTERIC, api_spoolss_CreatePrinterIC},
-       {"SPOOLSS_PLAYGDISCRIPTONPRINTERIC", NDR_SPOOLSS_PLAYGDISCRIPTONPRINTERIC, api_spoolss_PlayGDIScriptOnPrinterIC},
-       {"SPOOLSS_DELETEPRINTERIC", NDR_SPOOLSS_DELETEPRINTERIC, api_spoolss_DeletePrinterIC},
-       {"SPOOLSS_ADDPRINTERCONNECTION", NDR_SPOOLSS_ADDPRINTERCONNECTION, api_spoolss_AddPrinterConnection},
-       {"SPOOLSS_DELETEPRINTERCONNECTION", NDR_SPOOLSS_DELETEPRINTERCONNECTION, api_spoolss_DeletePrinterConnection},
-       {"SPOOLSS_PRINTERMESSAGEBOX", NDR_SPOOLSS_PRINTERMESSAGEBOX, api_spoolss_PrinterMessageBox},
-       {"SPOOLSS_ADDMONITOR", NDR_SPOOLSS_ADDMONITOR, api_spoolss_AddMonitor},
-       {"SPOOLSS_DELETEMONITOR", NDR_SPOOLSS_DELETEMONITOR, api_spoolss_DeleteMonitor},
-       {"SPOOLSS_DELETEPRINTPROCESSOR", NDR_SPOOLSS_DELETEPRINTPROCESSOR, api_spoolss_DeletePrintProcessor},
-       {"SPOOLSS_ADDPRINTPROVIDOR", NDR_SPOOLSS_ADDPRINTPROVIDOR, api_spoolss_AddPrintProvidor},
-       {"SPOOLSS_DELETEPRINTPROVIDOR", NDR_SPOOLSS_DELETEPRINTPROVIDOR, api_spoolss_DeletePrintProvidor},
-       {"SPOOLSS_ENUMPRINTPROCDATATYPES", NDR_SPOOLSS_ENUMPRINTPROCDATATYPES, api_spoolss_EnumPrintProcDataTypes},
-       {"SPOOLSS_RESETPRINTER", NDR_SPOOLSS_RESETPRINTER, api_spoolss_ResetPrinter},
-       {"SPOOLSS_GETPRINTERDRIVER2", NDR_SPOOLSS_GETPRINTERDRIVER2, api_spoolss_GetPrinterDriver2},
-       {"SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION, api_spoolss_FindFirstPrinterChangeNotification},
-       {"SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION, api_spoolss_FindNextPrinterChangeNotification},
-       {"SPOOLSS_FINDCLOSEPRINTERNOTIFY", NDR_SPOOLSS_FINDCLOSEPRINTERNOTIFY, api_spoolss_FindClosePrinterNotify},
-       {"SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATIONOLD", NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATIONOLD, api_spoolss_RouterFindFirstPrinterChangeNotificationOld},
-       {"SPOOLSS_REPLYOPENPRINTER", NDR_SPOOLSS_REPLYOPENPRINTER, api_spoolss_ReplyOpenPrinter},
-       {"SPOOLSS_ROUTERREPLYPRINTER", NDR_SPOOLSS_ROUTERREPLYPRINTER, api_spoolss_RouterReplyPrinter},
-       {"SPOOLSS_REPLYCLOSEPRINTER", NDR_SPOOLSS_REPLYCLOSEPRINTER, api_spoolss_ReplyClosePrinter},
-       {"SPOOLSS_ADDPORTEX", NDR_SPOOLSS_ADDPORTEX, api_spoolss_AddPortEx},
-       {"SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATION, api_spoolss_RouterFindFirstPrinterChangeNotification},
-       {"SPOOLSS_SPOOLERINIT", NDR_SPOOLSS_SPOOLERINIT, api_spoolss_SpoolerInit},
-       {"SPOOLSS_RESETPRINTEREX", NDR_SPOOLSS_RESETPRINTEREX, api_spoolss_ResetPrinterEx},
-       {"SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFYEX", NDR_SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFYEX, api_spoolss_RemoteFindFirstPrinterChangeNotifyEx},
-       {"SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFICATION, api_spoolss_RouterRefreshPrinterChangeNotification},
-       {"SPOOLSS_REMOTEFINDNEXTPRINTERCHANGENOTIFYEX", NDR_SPOOLSS_REMOTEFINDNEXTPRINTERCHANGENOTIFYEX, api_spoolss_RemoteFindNextPrinterChangeNotifyEx},
-       {"SPOOLSS_44", NDR_SPOOLSS_44, api_spoolss_44},
-       {"SPOOLSS_OPENPRINTEREX", NDR_SPOOLSS_OPENPRINTEREX, api_spoolss_OpenPrinterEx},
-       {"SPOOLSS_ADDPRINTEREX", NDR_SPOOLSS_ADDPRINTEREX, api_spoolss_AddPrinterEx},
-       {"SPOOLSS_47", NDR_SPOOLSS_47, api_spoolss_47},
-       {"SPOOLSS_ENUMPRINTERDATA", NDR_SPOOLSS_ENUMPRINTERDATA, api_spoolss_EnumPrinterData},
-       {"SPOOLSS_DELETEPRINTERDATA", NDR_SPOOLSS_DELETEPRINTERDATA, api_spoolss_DeletePrinterData},
-       {"SPOOLSS_4A", NDR_SPOOLSS_4A, api_spoolss_4a},
-       {"SPOOLSS_4B", NDR_SPOOLSS_4B, api_spoolss_4b},
-       {"SPOOLSS_4C", NDR_SPOOLSS_4C, api_spoolss_4c},
-       {"SPOOLSS_SETPRINTERDATAEX", NDR_SPOOLSS_SETPRINTERDATAEX, api_spoolss_SetPrinterDataEx},
-       {"SPOOLSS_GETPRINTERDATAEX", NDR_SPOOLSS_GETPRINTERDATAEX, api_spoolss_GetPrinterDataEx},
-       {"SPOOLSS_ENUMPRINTERDATAEX", NDR_SPOOLSS_ENUMPRINTERDATAEX, api_spoolss_EnumPrinterDataEx},
-       {"SPOOLSS_ENUMPRINTERKEY", NDR_SPOOLSS_ENUMPRINTERKEY, api_spoolss_EnumPrinterKey},
-       {"SPOOLSS_DELETEPRINTERDATAEX", NDR_SPOOLSS_DELETEPRINTERDATAEX, api_spoolss_DeletePrinterDataEx},
-       {"SPOOLSS_DELETEPRINTERKEY", NDR_SPOOLSS_DELETEPRINTERKEY, api_spoolss_DeletePrinterKey},
-       {"SPOOLSS_53", NDR_SPOOLSS_53, api_spoolss_53},
-       {"SPOOLSS_DELETEPRINTERDRIVEREX", NDR_SPOOLSS_DELETEPRINTERDRIVEREX, api_spoolss_DeletePrinterDriverEx},
-       {"SPOOLSS_55", NDR_SPOOLSS_55, api_spoolss_55},
-       {"SPOOLSS_56", NDR_SPOOLSS_56, api_spoolss_56},
-       {"SPOOLSS_57", NDR_SPOOLSS_57, api_spoolss_57},
-       {"SPOOLSS_XCVDATA", NDR_SPOOLSS_XCVDATA, api_spoolss_XcvData},
-       {"SPOOLSS_ADDPRINTERDRIVEREX", NDR_SPOOLSS_ADDPRINTERDRIVEREX, api_spoolss_AddPrinterDriverEx},
-       {"SPOOLSS_5A", NDR_SPOOLSS_5A, api_spoolss_5a},
-       {"SPOOLSS_5B", NDR_SPOOLSS_5B, api_spoolss_5b},
-       {"SPOOLSS_5C", NDR_SPOOLSS_5C, api_spoolss_5c},
-       {"SPOOLSS_5D", NDR_SPOOLSS_5D, api_spoolss_5d},
-       {"SPOOLSS_5E", NDR_SPOOLSS_5E, api_spoolss_5e},
-       {"SPOOLSS_5F", NDR_SPOOLSS_5F, api_spoolss_5f},
-};
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_60 *r;
 
-void spoolss_get_pipe_fns(struct api_struct **fns, int *n_fns)
-{
-       *fns = api_spoolss_cmds;
-       *n_fns = sizeof(api_spoolss_cmds) / sizeof(struct api_struct);
-}
+       call = &p->interface->calls[NDR_SPOOLSS_60];
 
-NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const struct ndr_interface_table *table, uint32_t opnum, void *_r)
-{
-       if (cli->pipes_struct == NULL) {
-               return NT_STATUS_INVALID_PARAMETER;
+       r = talloc(talloc_tos(), struct spoolss_60);
+       if (r == NULL) {
+               return false;
        }
 
-       switch (opnum)
-       {
-               case NDR_SPOOLSS_ENUMPRINTERS: {
-                       struct spoolss_EnumPrinters *r = (struct spoolss_EnumPrinters *)_r;
-                       ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_PrinterInfo, r->out.count);
-                       if (r->out.info == NULL) {
-                       return NT_STATUS_NO_MEMORY;
-                       }
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_60, r);
+       }
+
+       r->out.result = _spoolss_60(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_60, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_61(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_61 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_61];
+
+       r = talloc(talloc_tos(), struct spoolss_61);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_61, r);
+       }
+
+       r->out.result = _spoolss_61(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_61, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_62(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_62 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_62];
+
+       r = talloc(talloc_tos(), struct spoolss_62);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_62, r);
+       }
+
+       r->out.result = _spoolss_62(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_62, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_63(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_63 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_63];
+
+       r = talloc(talloc_tos(), struct spoolss_63);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_63, r);
+       }
+
+       r->out.result = _spoolss_63(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_63, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_64(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_64 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_64];
+
+       r = talloc(talloc_tos(), struct spoolss_64);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_64, r);
+       }
+
+       r->out.result = _spoolss_64(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_64, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_65(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_65 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_65];
+
+       r = talloc(talloc_tos(), struct spoolss_65);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_65, r);
+       }
+
+       r->out.result = _spoolss_65(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_65, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_GetCorePrinterDrivers(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_GetCorePrinterDrivers *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_GETCOREPRINTERDRIVERS];
+
+       r = talloc(talloc_tos(), struct spoolss_GetCorePrinterDrivers);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_GetCorePrinterDrivers, r);
+       }
+
+       ZERO_STRUCT(r->out);
+       r->out.core_printer_drivers = talloc_zero_array(r, struct spoolss_CorePrinterDriver, r->in.core_printer_driver_count);
+       if (r->out.core_printer_drivers == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.result = _spoolss_GetCorePrinterDrivers(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_GetCorePrinterDrivers, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_67(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_67 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_67];
+
+       r = talloc(talloc_tos(), struct spoolss_67);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_67, r);
+       }
+
+       r->out.result = _spoolss_67(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_67, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_GetPrinterDriverPackagePath(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_GetPrinterDriverPackagePath *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_GETPRINTERDRIVERPACKAGEPATH];
+
+       r = talloc(talloc_tos(), struct spoolss_GetPrinterDriverPackagePath);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_GetPrinterDriverPackagePath, r);
+       }
+
+       ZERO_STRUCT(r->out);
+       r->out.driver_package_cab = r->in.driver_package_cab;
+       r->out.required = talloc_zero(r, uint32_t);
+       if (r->out.required == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       r->out.result = _spoolss_GetPrinterDriverPackagePath(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_GetPrinterDriverPackagePath, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_69(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_69 *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_69];
+
+       r = talloc(talloc_tos(), struct spoolss_69);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_69, r);
+       }
+
+       r->out.result = _spoolss_69(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_69, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_6a(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_6a *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_6A];
+
+       r = talloc(talloc_tos(), struct spoolss_6a);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_6a, r);
+       }
+
+       r->out.result = _spoolss_6a(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_6a, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_6b(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_6b *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_6B];
+
+       r = talloc(talloc_tos(), struct spoolss_6b);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_6b, r);
+       }
+
+       r->out.result = _spoolss_6b(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_6b, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_6c(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_6c *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_6C];
+
+       r = talloc(talloc_tos(), struct spoolss_6c);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_6c, r);
+       }
+
+       r->out.result = _spoolss_6c(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_6c, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+static bool api_spoolss_6d(pipes_struct *p)
+{
+       const struct ndr_interface_call *call;
+       struct ndr_pull *pull;
+       struct ndr_push *push;
+       enum ndr_err_code ndr_err;
+       DATA_BLOB blob;
+       struct spoolss_6d *r;
+
+       call = &p->interface->calls[NDR_SPOOLSS_6D];
+
+       r = talloc(talloc_tos(), struct spoolss_6d);
+       if (r == NULL) {
+               return false;
+       }
+
+       if (!prs_data_blob(&p->in_data.data, &blob, r)) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull = ndr_pull_init_blob(&blob, r, NULL);
+       if (pull == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       pull->flags |= LIBNDR_FLAG_REF_ALLOC;
+       ndr_err = call->ndr_pull(pull, NDR_IN, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_IN_DEBUG(spoolss_6d, r);
+       }
+
+       r->out.result = _spoolss_6d(p, r);
+
+       if (p->rng_fault_state) {
+               talloc_free(r);
+               /* Return true here, srv_pipe_hnd.c will take care */
+               return true;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               NDR_PRINT_OUT_DEBUG(spoolss_6d, r);
+       }
+
+       push = ndr_push_init_ctx(r, NULL);
+       if (push == NULL) {
+               talloc_free(r);
+               return false;
+       }
+
+       ndr_err = call->ndr_push(push, NDR_OUT, r);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               talloc_free(r);
+               return false;
+       }
+
+       blob = ndr_push_blob(push);
+       if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {
+               talloc_free(r);
+               return false;
+       }
+
+       talloc_free(r);
+
+       return true;
+}
+
+
+/* Tables */
+static struct api_struct api_spoolss_cmds[] = 
+{
+       {"SPOOLSS_ENUMPRINTERS", NDR_SPOOLSS_ENUMPRINTERS, api_spoolss_EnumPrinters},
+       {"SPOOLSS_OPENPRINTER", NDR_SPOOLSS_OPENPRINTER, api_spoolss_OpenPrinter},
+       {"SPOOLSS_SETJOB", NDR_SPOOLSS_SETJOB, api_spoolss_SetJob},
+       {"SPOOLSS_GETJOB", NDR_SPOOLSS_GETJOB, api_spoolss_GetJob},
+       {"SPOOLSS_ENUMJOBS", NDR_SPOOLSS_ENUMJOBS, api_spoolss_EnumJobs},
+       {"SPOOLSS_ADDPRINTER", NDR_SPOOLSS_ADDPRINTER, api_spoolss_AddPrinter},
+       {"SPOOLSS_DELETEPRINTER", NDR_SPOOLSS_DELETEPRINTER, api_spoolss_DeletePrinter},
+       {"SPOOLSS_SETPRINTER", NDR_SPOOLSS_SETPRINTER, api_spoolss_SetPrinter},
+       {"SPOOLSS_GETPRINTER", NDR_SPOOLSS_GETPRINTER, api_spoolss_GetPrinter},
+       {"SPOOLSS_ADDPRINTERDRIVER", NDR_SPOOLSS_ADDPRINTERDRIVER, api_spoolss_AddPrinterDriver},
+       {"SPOOLSS_ENUMPRINTERDRIVERS", NDR_SPOOLSS_ENUMPRINTERDRIVERS, api_spoolss_EnumPrinterDrivers},
+       {"SPOOLSS_GETPRINTERDRIVER", NDR_SPOOLSS_GETPRINTERDRIVER, api_spoolss_GetPrinterDriver},
+       {"SPOOLSS_GETPRINTERDRIVERDIRECTORY", NDR_SPOOLSS_GETPRINTERDRIVERDIRECTORY, api_spoolss_GetPrinterDriverDirectory},
+       {"SPOOLSS_DELETEPRINTERDRIVER", NDR_SPOOLSS_DELETEPRINTERDRIVER, api_spoolss_DeletePrinterDriver},
+       {"SPOOLSS_ADDPRINTPROCESSOR", NDR_SPOOLSS_ADDPRINTPROCESSOR, api_spoolss_AddPrintProcessor},
+       {"SPOOLSS_ENUMPRINTPROCESSORS", NDR_SPOOLSS_ENUMPRINTPROCESSORS, api_spoolss_EnumPrintProcessors},
+       {"SPOOLSS_GETPRINTPROCESSORDIRECTORY", NDR_SPOOLSS_GETPRINTPROCESSORDIRECTORY, api_spoolss_GetPrintProcessorDirectory},
+       {"SPOOLSS_STARTDOCPRINTER", NDR_SPOOLSS_STARTDOCPRINTER, api_spoolss_StartDocPrinter},
+       {"SPOOLSS_STARTPAGEPRINTER", NDR_SPOOLSS_STARTPAGEPRINTER, api_spoolss_StartPagePrinter},
+       {"SPOOLSS_WRITEPRINTER", NDR_SPOOLSS_WRITEPRINTER, api_spoolss_WritePrinter},
+       {"SPOOLSS_ENDPAGEPRINTER", NDR_SPOOLSS_ENDPAGEPRINTER, api_spoolss_EndPagePrinter},
+       {"SPOOLSS_ABORTPRINTER", NDR_SPOOLSS_ABORTPRINTER, api_spoolss_AbortPrinter},
+       {"SPOOLSS_READPRINTER", NDR_SPOOLSS_READPRINTER, api_spoolss_ReadPrinter},
+       {"SPOOLSS_ENDDOCPRINTER", NDR_SPOOLSS_ENDDOCPRINTER, api_spoolss_EndDocPrinter},
+       {"SPOOLSS_ADDJOB", NDR_SPOOLSS_ADDJOB, api_spoolss_AddJob},
+       {"SPOOLSS_SCHEDULEJOB", NDR_SPOOLSS_SCHEDULEJOB, api_spoolss_ScheduleJob},
+       {"SPOOLSS_GETPRINTERDATA", NDR_SPOOLSS_GETPRINTERDATA, api_spoolss_GetPrinterData},
+       {"SPOOLSS_SETPRINTERDATA", NDR_SPOOLSS_SETPRINTERDATA, api_spoolss_SetPrinterData},
+       {"SPOOLSS_WAITFORPRINTERCHANGE", NDR_SPOOLSS_WAITFORPRINTERCHANGE, api_spoolss_WaitForPrinterChange},
+       {"SPOOLSS_CLOSEPRINTER", NDR_SPOOLSS_CLOSEPRINTER, api_spoolss_ClosePrinter},
+       {"SPOOLSS_ADDFORM", NDR_SPOOLSS_ADDFORM, api_spoolss_AddForm},
+       {"SPOOLSS_DELETEFORM", NDR_SPOOLSS_DELETEFORM, api_spoolss_DeleteForm},
+       {"SPOOLSS_GETFORM", NDR_SPOOLSS_GETFORM, api_spoolss_GetForm},
+       {"SPOOLSS_SETFORM", NDR_SPOOLSS_SETFORM, api_spoolss_SetForm},
+       {"SPOOLSS_ENUMFORMS", NDR_SPOOLSS_ENUMFORMS, api_spoolss_EnumForms},
+       {"SPOOLSS_ENUMPORTS", NDR_SPOOLSS_ENUMPORTS, api_spoolss_EnumPorts},
+       {"SPOOLSS_ENUMMONITORS", NDR_SPOOLSS_ENUMMONITORS, api_spoolss_EnumMonitors},
+       {"SPOOLSS_ADDPORT", NDR_SPOOLSS_ADDPORT, api_spoolss_AddPort},
+       {"SPOOLSS_CONFIGUREPORT", NDR_SPOOLSS_CONFIGUREPORT, api_spoolss_ConfigurePort},
+       {"SPOOLSS_DELETEPORT", NDR_SPOOLSS_DELETEPORT, api_spoolss_DeletePort},
+       {"SPOOLSS_CREATEPRINTERIC", NDR_SPOOLSS_CREATEPRINTERIC, api_spoolss_CreatePrinterIC},
+       {"SPOOLSS_PLAYGDISCRIPTONPRINTERIC", NDR_SPOOLSS_PLAYGDISCRIPTONPRINTERIC, api_spoolss_PlayGDIScriptOnPrinterIC},
+       {"SPOOLSS_DELETEPRINTERIC", NDR_SPOOLSS_DELETEPRINTERIC, api_spoolss_DeletePrinterIC},
+       {"SPOOLSS_ADDPRINTERCONNECTION", NDR_SPOOLSS_ADDPRINTERCONNECTION, api_spoolss_AddPrinterConnection},
+       {"SPOOLSS_DELETEPRINTERCONNECTION", NDR_SPOOLSS_DELETEPRINTERCONNECTION, api_spoolss_DeletePrinterConnection},
+       {"SPOOLSS_PRINTERMESSAGEBOX", NDR_SPOOLSS_PRINTERMESSAGEBOX, api_spoolss_PrinterMessageBox},
+       {"SPOOLSS_ADDMONITOR", NDR_SPOOLSS_ADDMONITOR, api_spoolss_AddMonitor},
+       {"SPOOLSS_DELETEMONITOR", NDR_SPOOLSS_DELETEMONITOR, api_spoolss_DeleteMonitor},
+       {"SPOOLSS_DELETEPRINTPROCESSOR", NDR_SPOOLSS_DELETEPRINTPROCESSOR, api_spoolss_DeletePrintProcessor},
+       {"SPOOLSS_ADDPRINTPROVIDOR", NDR_SPOOLSS_ADDPRINTPROVIDOR, api_spoolss_AddPrintProvidor},
+       {"SPOOLSS_DELETEPRINTPROVIDOR", NDR_SPOOLSS_DELETEPRINTPROVIDOR, api_spoolss_DeletePrintProvidor},
+       {"SPOOLSS_ENUMPRINTPROCDATATYPES", NDR_SPOOLSS_ENUMPRINTPROCDATATYPES, api_spoolss_EnumPrintProcDataTypes},
+       {"SPOOLSS_RESETPRINTER", NDR_SPOOLSS_RESETPRINTER, api_spoolss_ResetPrinter},
+       {"SPOOLSS_GETPRINTERDRIVER2", NDR_SPOOLSS_GETPRINTERDRIVER2, api_spoolss_GetPrinterDriver2},
+       {"SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_FINDFIRSTPRINTERCHANGENOTIFICATION, api_spoolss_FindFirstPrinterChangeNotification},
+       {"SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_FINDNEXTPRINTERCHANGENOTIFICATION, api_spoolss_FindNextPrinterChangeNotification},
+       {"SPOOLSS_FINDCLOSEPRINTERNOTIFY", NDR_SPOOLSS_FINDCLOSEPRINTERNOTIFY, api_spoolss_FindClosePrinterNotify},
+       {"SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATIONOLD", NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATIONOLD, api_spoolss_RouterFindFirstPrinterChangeNotificationOld},
+       {"SPOOLSS_REPLYOPENPRINTER", NDR_SPOOLSS_REPLYOPENPRINTER, api_spoolss_ReplyOpenPrinter},
+       {"SPOOLSS_ROUTERREPLYPRINTER", NDR_SPOOLSS_ROUTERREPLYPRINTER, api_spoolss_RouterReplyPrinter},
+       {"SPOOLSS_REPLYCLOSEPRINTER", NDR_SPOOLSS_REPLYCLOSEPRINTER, api_spoolss_ReplyClosePrinter},
+       {"SPOOLSS_ADDPORTEX", NDR_SPOOLSS_ADDPORTEX, api_spoolss_AddPortEx},
+       {"SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATION", NDR_SPOOLSS_ROUTERFINDFIRSTPRINTERCHANGENOTIFICATION, api_spoolss_RouterFindFirstPrinterChangeNotification},
+       {"SPOOLSS_SPOOLERINIT", NDR_SPOOLSS_SPOOLERINIT, api_spoolss_SpoolerInit},
+       {"SPOOLSS_RESETPRINTEREX", NDR_SPOOLSS_RESETPRINTEREX, api_spoolss_ResetPrinterEx},
+       {"SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFYEX", NDR_SPOOLSS_REMOTEFINDFIRSTPRINTERCHANGENOTIFYEX, api_spoolss_RemoteFindFirstPrinterChangeNotifyEx},
+       {"SPOOLSS_ROUTERREPLYPRINTEREX", NDR_SPOOLSS_ROUTERREPLYPRINTEREX, api_spoolss_RouterReplyPrinterEx},
+       {"SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFY", NDR_SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFY, api_spoolss_RouterRefreshPrinterChangeNotify},
+       {"SPOOLSS_44", NDR_SPOOLSS_44, api_spoolss_44},
+       {"SPOOLSS_OPENPRINTEREX", NDR_SPOOLSS_OPENPRINTEREX, api_spoolss_OpenPrinterEx},
+       {"SPOOLSS_ADDPRINTEREX", NDR_SPOOLSS_ADDPRINTEREX, api_spoolss_AddPrinterEx},
+       {"SPOOLSS_47", NDR_SPOOLSS_47, api_spoolss_47},
+       {"SPOOLSS_ENUMPRINTERDATA", NDR_SPOOLSS_ENUMPRINTERDATA, api_spoolss_EnumPrinterData},
+       {"SPOOLSS_DELETEPRINTERDATA", NDR_SPOOLSS_DELETEPRINTERDATA, api_spoolss_DeletePrinterData},
+       {"SPOOLSS_4A", NDR_SPOOLSS_4A, api_spoolss_4a},
+       {"SPOOLSS_4B", NDR_SPOOLSS_4B, api_spoolss_4b},
+       {"SPOOLSS_4C", NDR_SPOOLSS_4C, api_spoolss_4c},
+       {"SPOOLSS_SETPRINTERDATAEX", NDR_SPOOLSS_SETPRINTERDATAEX, api_spoolss_SetPrinterDataEx},
+       {"SPOOLSS_GETPRINTERDATAEX", NDR_SPOOLSS_GETPRINTERDATAEX, api_spoolss_GetPrinterDataEx},
+       {"SPOOLSS_ENUMPRINTERDATAEX", NDR_SPOOLSS_ENUMPRINTERDATAEX, api_spoolss_EnumPrinterDataEx},
+       {"SPOOLSS_ENUMPRINTERKEY", NDR_SPOOLSS_ENUMPRINTERKEY, api_spoolss_EnumPrinterKey},
+       {"SPOOLSS_DELETEPRINTERDATAEX", NDR_SPOOLSS_DELETEPRINTERDATAEX, api_spoolss_DeletePrinterDataEx},
+       {"SPOOLSS_DELETEPRINTERKEY", NDR_SPOOLSS_DELETEPRINTERKEY, api_spoolss_DeletePrinterKey},
+       {"SPOOLSS_53", NDR_SPOOLSS_53, api_spoolss_53},
+       {"SPOOLSS_DELETEPRINTERDRIVEREX", NDR_SPOOLSS_DELETEPRINTERDRIVEREX, api_spoolss_DeletePrinterDriverEx},
+       {"SPOOLSS_55", NDR_SPOOLSS_55, api_spoolss_55},
+       {"SPOOLSS_56", NDR_SPOOLSS_56, api_spoolss_56},
+       {"SPOOLSS_57", NDR_SPOOLSS_57, api_spoolss_57},
+       {"SPOOLSS_XCVDATA", NDR_SPOOLSS_XCVDATA, api_spoolss_XcvData},
+       {"SPOOLSS_ADDPRINTERDRIVEREX", NDR_SPOOLSS_ADDPRINTERDRIVEREX, api_spoolss_AddPrinterDriverEx},
+       {"SPOOLSS_5A", NDR_SPOOLSS_5A, api_spoolss_5a},
+       {"SPOOLSS_5B", NDR_SPOOLSS_5B, api_spoolss_5b},
+       {"SPOOLSS_5C", NDR_SPOOLSS_5C, api_spoolss_5c},
+       {"SPOOLSS_5D", NDR_SPOOLSS_5D, api_spoolss_5d},
+       {"SPOOLSS_5E", NDR_SPOOLSS_5E, api_spoolss_5e},
+       {"SPOOLSS_5F", NDR_SPOOLSS_5F, api_spoolss_5f},
+       {"SPOOLSS_60", NDR_SPOOLSS_60, api_spoolss_60},
+       {"SPOOLSS_61", NDR_SPOOLSS_61, api_spoolss_61},
+       {"SPOOLSS_62", NDR_SPOOLSS_62, api_spoolss_62},
+       {"SPOOLSS_63", NDR_SPOOLSS_63, api_spoolss_63},
+       {"SPOOLSS_64", NDR_SPOOLSS_64, api_spoolss_64},
+       {"SPOOLSS_65", NDR_SPOOLSS_65, api_spoolss_65},
+       {"SPOOLSS_GETCOREPRINTERDRIVERS", NDR_SPOOLSS_GETCOREPRINTERDRIVERS, api_spoolss_GetCorePrinterDrivers},
+       {"SPOOLSS_67", NDR_SPOOLSS_67, api_spoolss_67},
+       {"SPOOLSS_GETPRINTERDRIVERPACKAGEPATH", NDR_SPOOLSS_GETPRINTERDRIVERPACKAGEPATH, api_spoolss_GetPrinterDriverPackagePath},
+       {"SPOOLSS_69", NDR_SPOOLSS_69, api_spoolss_69},
+       {"SPOOLSS_6A", NDR_SPOOLSS_6A, api_spoolss_6a},
+       {"SPOOLSS_6B", NDR_SPOOLSS_6B, api_spoolss_6b},
+       {"SPOOLSS_6C", NDR_SPOOLSS_6C, api_spoolss_6c},
+       {"SPOOLSS_6D", NDR_SPOOLSS_6D, api_spoolss_6d},
+};
+
+void spoolss_get_pipe_fns(struct api_struct **fns, int *n_fns)
+{
+       *fns = api_spoolss_cmds;
+       *n_fns = sizeof(api_spoolss_cmds) / sizeof(struct api_struct);
+}
+
+NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const char *interface, uint32_t interface_version, uint32_t opnum, void *_r)
+{
+       if (cli->pipes_struct == NULL) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       switch (opnum)
+       {
+               case NDR_SPOOLSS_ENUMPRINTERS: {
+                       struct spoolss_EnumPrinters *r = (struct spoolss_EnumPrinters *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrinterInfo *);
+                       if (r->out.info == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
 
                        r->out.needed = talloc_zero(mem_ctx, uint32_t);
                        if (r->out.needed == NULL) {
@@ -7521,7 +8708,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMJOBS: {
                        struct spoolss_EnumJobs *r = (struct spoolss_EnumJobs *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_JobInfo, r->out.count);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_JobInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7537,6 +8729,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_ADDPRINTER: {
                        struct spoolss_AddPrinter *r = (struct spoolss_AddPrinter *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.handle = talloc_zero(mem_ctx, struct policy_handle);
+                       if (r->out.handle == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_AddPrinter(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7579,7 +8777,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPRINTERDRIVERS: {
                        struct spoolss_EnumPrinterDrivers *r = (struct spoolss_EnumPrinterDrivers *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_DriverInfo, r->out.count);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_DriverInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7595,6 +8798,17 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_GETPRINTERDRIVER: {
                        struct spoolss_GetPrinterDriver *r = (struct spoolss_GetPrinterDriver *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_DriverInfo);
+                       if (r->out.info == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_GetPrinterDriver(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7631,7 +8845,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPRINTPROCESSORS: {
                        struct spoolss_EnumPrintProcessors *r = (struct spoolss_EnumPrintProcessors *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_PrintProcessorInfo, r->out.count);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrintProcessorInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7647,6 +8866,17 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_GETPRINTPROCESSORDIRECTORY: {
                        struct spoolss_GetPrintProcessorDirectory *r = (struct spoolss_GetPrintProcessorDirectory *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrintProcessorDirectoryInfo);
+                       if (r->out.info == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_GetPrintProcessorDirectory(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7718,6 +8948,13 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_ADDJOB: {
                        struct spoolss_AddJob *r = (struct spoolss_AddJob *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.buffer = r->in.buffer;
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_AddJob(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7731,11 +8968,16 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_GETPRINTERDATA: {
                        struct spoolss_GetPrinterData *r = (struct spoolss_GetPrinterData *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.type = talloc_zero(mem_ctx, enum spoolss_PrinterDataType);
+                       r->out.type = talloc_zero(mem_ctx, enum winreg_Type);
                        if (r->out.type == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
+                       r->out.data = talloc_zero(mem_ctx, union spoolss_PrinterData);
+                       if (r->out.data == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.needed = talloc_zero(mem_ctx, uint32_t);
                        if (r->out.needed == NULL) {
                        return NT_STATUS_NO_MEMORY;
@@ -7803,7 +9045,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMFORMS: {
                        struct spoolss_EnumForms *r = (struct spoolss_EnumForms *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_FormInfo, r->out.count);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_FormInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7820,7 +9067,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPORTS: {
                        struct spoolss_EnumPorts *r = (struct spoolss_EnumPorts *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_PortInfo, r->out.count);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PortInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7837,7 +9089,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMMONITORS: {
                        struct spoolss_EnumMonitors *r = (struct spoolss_EnumMonitors *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero_array(mem_ctx, union spoolss_MonitorInfo, r->out.count);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_MonitorInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -7871,6 +9128,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_CREATEPRINTERIC: {
                        struct spoolss_CreatePrinterIC *r = (struct spoolss_CreatePrinterIC *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.gdi_handle = talloc_zero(mem_ctx, struct policy_handle);
+                       if (r->out.gdi_handle == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_CreatePrinterIC(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7883,6 +9146,8 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_DELETEPRINTERIC: {
                        struct spoolss_DeletePrinterIC *r = (struct spoolss_DeletePrinterIC *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.gdi_handle = r->in.gdi_handle;
                        r->out.result = _spoolss_DeletePrinterIC(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7937,6 +9202,22 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_ENUMPRINTPROCDATATYPES: {
                        struct spoolss_EnumPrintProcDataTypes *r = (struct spoolss_EnumPrintProcDataTypes *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_PrintProcDataTypesInfo *);
+                       if (r->out.info == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_EnumPrintProcDataTypes(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -7950,7 +9231,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_GETPRINTERDRIVER2: {
                        struct spoolss_GetPrinterDriver2 *r = (struct spoolss_GetPrinterDriver2 *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.info = talloc_zero(mem_ctx, DATA_BLOB);
+                       r->out.info = talloc_zero(mem_ctx, union spoolss_DriverInfo);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8054,21 +9335,27 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_OK;
                }
 
-               case NDR_SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFICATION: {
-                       struct spoolss_RouterRefreshPrinterChangeNotification *r = (struct spoolss_RouterRefreshPrinterChangeNotification *)_r;
-                       r->out.result = _spoolss_RouterRefreshPrinterChangeNotification(cli->pipes_struct, r);
+               case NDR_SPOOLSS_ROUTERREPLYPRINTEREX: {
+                       struct spoolss_RouterReplyPrinterEx *r = (struct spoolss_RouterReplyPrinterEx *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.reply_result = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.reply_result == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.result = _spoolss_RouterReplyPrinterEx(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
 
-               case NDR_SPOOLSS_REMOTEFINDNEXTPRINTERCHANGENOTIFYEX: {
-                       struct spoolss_RemoteFindNextPrinterChangeNotifyEx *r = (struct spoolss_RemoteFindNextPrinterChangeNotifyEx *)_r;
+               case NDR_SPOOLSS_ROUTERREFRESHPRINTERCHANGENOTIFY: {
+                       struct spoolss_RouterRefreshPrinterChangeNotify *r = (struct spoolss_RouterRefreshPrinterChangeNotify *)_r;
                        ZERO_STRUCT(r->out);
                        r->out.info = talloc_zero(mem_ctx, struct spoolss_NotifyInfo *);
                        if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.result = _spoolss_RemoteFindNextPrinterChangeNotifyEx(cli->pipes_struct, r);
+                       r->out.result = _spoolss_RouterRefreshPrinterChangeNotify(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
 
@@ -8092,6 +9379,12 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
                case NDR_SPOOLSS_ADDPRINTEREX: {
                        struct spoolss_AddPrinterEx *r = (struct spoolss_AddPrinterEx *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.handle = talloc_zero(mem_ctx, struct policy_handle);
+                       if (r->out.handle == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
                        r->out.result = _spoolss_AddPrinterEx(cli->pipes_struct, r);
                        return NT_STATUS_OK;
                }
@@ -8115,13 +9408,13 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.printerdata_type = talloc_zero(mem_ctx, uint32_t);
-                       if (r->out.printerdata_type == NULL) {
+                       r->out.type = talloc_zero(mem_ctx, enum winreg_Type);
+                       if (r->out.type == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.buffer = talloc_zero(mem_ctx, DATA_BLOB);
-                       if (r->out.buffer == NULL) {
+                       r->out.data = talloc_zero_array(mem_ctx, uint8_t, r->in.data_offered);
+                       if (r->out.data == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
@@ -8167,7 +9460,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_GETPRINTERDATAEX: {
                        struct spoolss_GetPrinterDataEx *r = (struct spoolss_GetPrinterDataEx *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.type = talloc_zero(mem_ctx, uint32_t);
+                       r->out.type = talloc_zero(mem_ctx, enum winreg_Type);
                        if (r->out.type == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8189,18 +9482,18 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPRINTERDATAEX: {
                        struct spoolss_EnumPrinterDataEx *r = (struct spoolss_EnumPrinterDataEx *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.buffer = talloc_zero_array(mem_ctx, uint8_t, r->in.offered);
-                       if (r->out.buffer == NULL) {
+                       r->out.count = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.count == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
-                       if (r->out.needed == NULL) {
+                       r->out.info = talloc_zero(mem_ctx, struct spoolss_PrinterEnumValues *);
+                       if (r->out.info == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
-                       r->out.count = talloc_zero(mem_ctx, uint32_t);
-                       if (r->out.count == NULL) {
+                       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.needed == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
 
@@ -8211,7 +9504,7 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                case NDR_SPOOLSS_ENUMPRINTERKEY: {
                        struct spoolss_EnumPrinterKey *r = (struct spoolss_EnumPrinterKey *)_r;
                        ZERO_STRUCT(r->out);
-                       r->out.key_buffer = talloc_zero_array(mem_ctx, uint16_t, r->in.key_buffer_size / 2);
+                       r->out.key_buffer = talloc_zero(mem_ctx, const char **);
                        if (r->out.key_buffer == NULL) {
                        return NT_STATUS_NO_MEMORY;
                        }
@@ -8327,6 +9620,103 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
                        return NT_STATUS_OK;
                }
 
+               case NDR_SPOOLSS_60: {
+                       struct spoolss_60 *r = (struct spoolss_60 *)_r;
+                       r->out.result = _spoolss_60(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_61: {
+                       struct spoolss_61 *r = (struct spoolss_61 *)_r;
+                       r->out.result = _spoolss_61(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_62: {
+                       struct spoolss_62 *r = (struct spoolss_62 *)_r;
+                       r->out.result = _spoolss_62(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_63: {
+                       struct spoolss_63 *r = (struct spoolss_63 *)_r;
+                       r->out.result = _spoolss_63(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_64: {
+                       struct spoolss_64 *r = (struct spoolss_64 *)_r;
+                       r->out.result = _spoolss_64(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_65: {
+                       struct spoolss_65 *r = (struct spoolss_65 *)_r;
+                       r->out.result = _spoolss_65(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_GETCOREPRINTERDRIVERS: {
+                       struct spoolss_GetCorePrinterDrivers *r = (struct spoolss_GetCorePrinterDrivers *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.core_printer_drivers = talloc_zero_array(mem_ctx, struct spoolss_CorePrinterDriver, r->in.core_printer_driver_count);
+                       if (r->out.core_printer_drivers == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.result = _spoolss_GetCorePrinterDrivers(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_67: {
+                       struct spoolss_67 *r = (struct spoolss_67 *)_r;
+                       r->out.result = _spoolss_67(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_GETPRINTERDRIVERPACKAGEPATH: {
+                       struct spoolss_GetPrinterDriverPackagePath *r = (struct spoolss_GetPrinterDriverPackagePath *)_r;
+                       ZERO_STRUCT(r->out);
+                       r->out.driver_package_cab = r->in.driver_package_cab;
+                       r->out.required = talloc_zero(mem_ctx, uint32_t);
+                       if (r->out.required == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+                       }
+
+                       r->out.result = _spoolss_GetPrinterDriverPackagePath(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_69: {
+                       struct spoolss_69 *r = (struct spoolss_69 *)_r;
+                       r->out.result = _spoolss_69(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_6A: {
+                       struct spoolss_6a *r = (struct spoolss_6a *)_r;
+                       r->out.result = _spoolss_6a(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_6B: {
+                       struct spoolss_6b *r = (struct spoolss_6b *)_r;
+                       r->out.result = _spoolss_6b(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_6C: {
+                       struct spoolss_6c *r = (struct spoolss_6c *)_r;
+                       r->out.result = _spoolss_6c(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
+               case NDR_SPOOLSS_6D: {
+                       struct spoolss_6d *r = (struct spoolss_6d *)_r;
+                       r->out.result = _spoolss_6d(cli->pipes_struct, r);
+                       return NT_STATUS_OK;
+               }
+
                default:
                        return NT_STATUS_NOT_IMPLEMENTED;
        }
@@ -8334,5 +9724,5 @@ NTSTATUS rpc_spoolss_dispatch(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
 
 NTSTATUS rpc_spoolss_init(void)
 {
-       return rpc_srv_register(SMB_RPC_INTERFACE_VERSION, "spoolss", "spoolss", &ndr_table_spoolss, api_spoolss_cmds, sizeof(api_spoolss_cmds) / sizeof(struct api_struct));
+       return rpc_srv_register(SMB_RPC_INTERFACE_VERSION, "spoolss", "spoolss", NDR_SPOOLSS_UUID, NDR_SPOOLSS_VERSION, api_spoolss_cmds, sizeof(api_spoolss_cmds) / sizeof(struct api_struct));
 }