1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

* more info levels for EnumPrinter

* use WERROR return type in spoolss EnumPrinter
This commit is contained in:
Andrew Tridgell 0001-01-01 00:00:00 +00:00
parent 5832a1447c
commit 8301a6b6ad
7 changed files with 426 additions and 44 deletions

View File

@ -53,7 +53,7 @@
[relative] nstring name;
[relative] nstring description;
[relative] nstring comment;
} spoolss_PrinterEnum1;
} spoolss_PrinterInfo1;
typedef struct {
[relative] nstring servername;
@ -77,14 +77,47 @@
uint32 status;
uint32 cjobs;
uint32 averageppm;
} spoolss_PrinterEnum2;
} spoolss_PrinterInfo2;
typedef struct {
uint32 flags;
[relative] security_descriptor *secdesc;
} spoolss_PrinterInfo3;
typedef struct {
[relative] nstring printername;
[relative] nstring servername;
uint32 attributes;
} spoolss_PrinterInfo4;
typedef struct {
[relative] nstring printername;
[relative] nstring portname;
uint32 attributes;
uint32 device_not_selected_timeout;
uint32 transmission_retry_timeout;
} spoolss_PrinterInfo5;
typedef struct {
uint32 foo;
} spoolss_PrinterInfo6;
typedef struct {
[relative] nstring guid; /* text form of printer guid */
uint32 action;
} spoolss_PrinterInfo7;
typedef [nodiscriminant,public] union {
case(1) spoolss_PrinterEnum1 info1;
case(2) spoolss_PrinterEnum2 info2;
case(1) spoolss_PrinterInfo1 info1;
case(2) spoolss_PrinterInfo2 info2;
case(3) spoolss_PrinterInfo3 info3;
case(4) spoolss_PrinterInfo4 info4;
case(5) spoolss_PrinterInfo5 info5;
case(6) spoolss_PrinterInfo6 info6;
case(7) spoolss_PrinterInfo7 info7;
} spoolss_PrinterEnum;
NTSTATUS spoolss_EnumPrinters(
WERROR spoolss_EnumPrinters(
[in] uint32 flags,
[in] unistr *server,
[in] uint32 level,

View File

@ -182,4 +182,3 @@ typedef void (*ndr_print_union_fn_t)(struct ndr_print *, const char *, uint16, v
#include "librpc/ndr/ndr_spoolss.h"
#include "librpc/ndr/ndr_spoolss_buf.h"
#include "librpc/ndr/ndr_samr.h"

View File

@ -83,6 +83,17 @@ NTSTATUS ndr_pull_NTSTATUS(struct ndr_pull *ndr, NTSTATUS *status)
return NT_STATUS_OK;
}
/*
pull a WERROR
*/
NTSTATUS ndr_pull_WERROR(struct ndr_pull *ndr, WERROR *status)
{
uint32 v;
NDR_CHECK(ndr_pull_uint32(ndr, &v));
*status = W_ERROR(v);
return NT_STATUS_OK;
}
/*
parse a set of bytes
*/

View File

@ -50,7 +50,7 @@ done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterEnum1(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterEnum1 *r)
NTSTATUS ndr_push_spoolss_PrinterInfo1(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo1 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
@ -69,7 +69,7 @@ done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterEnum2(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterEnum2 *r)
NTSTATUS ndr_push_spoolss_PrinterInfo2(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo2 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
@ -119,17 +119,118 @@ done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterInfo3(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo3 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_uint32(ndr, r->flags));
NDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, r->secdesc, (ndr_push_const_fn_t) ndr_push_security_descriptor));
ndr_push_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
if (r->secdesc) {
NDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, r->secdesc, (ndr_push_const_fn_t) ndr_push_security_descriptor));
}
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterInfo4(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo4 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, r->printername, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, r->servername, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_uint32(ndr, r->attributes));
ndr_push_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
NDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, &r->printername, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, &r->servername, (ndr_push_const_fn_t) ndr_push_nstring));
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterInfo5(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo5 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, r->printername, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, r->portname, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_uint32(ndr, r->attributes));
NDR_CHECK(ndr_push_uint32(ndr, r->device_not_selected_timeout));
NDR_CHECK(ndr_push_uint32(ndr, r->transmission_retry_timeout));
ndr_push_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
NDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, &r->printername, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, &r->portname, (ndr_push_const_fn_t) ndr_push_nstring));
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterInfo6(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo6 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_uint32(ndr, r->foo));
ndr_push_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterInfo7(struct ndr_push *ndr, int ndr_flags, struct spoolss_PrinterInfo7 *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
NDR_CHECK(ndr_push_align(ndr, 4));
NDR_CHECK(ndr_push_relative(ndr, NDR_SCALARS, r->guid, (ndr_push_const_fn_t) ndr_push_nstring));
NDR_CHECK(ndr_push_uint32(ndr, r->action));
ndr_push_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
NDR_CHECK(ndr_push_relative(ndr, NDR_BUFFERS, &r->guid, (ndr_push_const_fn_t) ndr_push_nstring));
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_push_spoolss_PrinterEnum(struct ndr_push *ndr, int ndr_flags, uint16 level, union spoolss_PrinterEnum *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_push_struct_start(ndr));
switch (level) {
case 1:
NDR_CHECK(ndr_push_spoolss_PrinterEnum1(ndr, NDR_SCALARS, &r->info1));
NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, NDR_SCALARS, &r->info1));
break;
case 2:
NDR_CHECK(ndr_push_spoolss_PrinterEnum2(ndr, NDR_SCALARS, &r->info2));
NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, NDR_SCALARS, &r->info2));
break;
case 3:
NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, NDR_SCALARS, &r->info3));
break;
case 4:
NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, NDR_SCALARS, &r->info4));
break;
case 5:
NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
break;
case 6:
NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
break;
case 7:
NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
break;
default:
@ -140,11 +241,31 @@ buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
switch (level) {
case 1:
NDR_CHECK(ndr_push_spoolss_PrinterEnum1(ndr, ndr_flags, &r->info1));
NDR_CHECK(ndr_push_spoolss_PrinterInfo1(ndr, ndr_flags, &r->info1));
break;
case 2:
NDR_CHECK(ndr_push_spoolss_PrinterEnum2(ndr, ndr_flags, &r->info2));
NDR_CHECK(ndr_push_spoolss_PrinterInfo2(ndr, ndr_flags, &r->info2));
break;
case 3:
NDR_CHECK(ndr_push_spoolss_PrinterInfo3(ndr, ndr_flags, &r->info3));
break;
case 4:
NDR_CHECK(ndr_push_spoolss_PrinterInfo4(ndr, ndr_flags, &r->info4));
break;
case 5:
NDR_CHECK(ndr_push_spoolss_PrinterInfo5(ndr, ndr_flags, &r->info5));
break;
case 6:
NDR_CHECK(ndr_push_spoolss_PrinterInfo6(ndr, ndr_flags, &r->info6));
break;
case 7:
NDR_CHECK(ndr_push_spoolss_PrinterInfo7(ndr, ndr_flags, &r->info7));
break;
default:
@ -909,7 +1030,7 @@ done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterEnum1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterEnum1 *r)
NTSTATUS ndr_pull_spoolss_PrinterInfo1(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo1 *r)
{
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
@ -925,7 +1046,7 @@ done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterEnum2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterEnum2 *r)
NTSTATUS ndr_pull_spoolss_PrinterInfo2(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo2 *r)
{
uint32 _ptr_devmode;
uint32 _ptr_secdesc;
@ -960,17 +1081,111 @@ done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterInfo3(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo3 *r)
{
uint32 _ptr_secdesc;
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_uint32(ndr, &r->flags));
NDR_CHECK(ndr_pull_relative(ndr, (const void **)&r->secdesc, sizeof(*r->secdesc), (ndr_pull_flags_fn_t)ndr_pull_security_descriptor));
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterInfo4(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo4 *r)
{
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_relative(ndr, (const void **)&r->printername, sizeof(*r->printername), (ndr_pull_flags_fn_t)ndr_pull_nstring));
NDR_CHECK(ndr_pull_relative(ndr, (const void **)&r->servername, sizeof(*r->servername), (ndr_pull_flags_fn_t)ndr_pull_nstring));
NDR_CHECK(ndr_pull_uint32(ndr, &r->attributes));
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterInfo5(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo5 *r)
{
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_relative(ndr, (const void **)&r->printername, sizeof(*r->printername), (ndr_pull_flags_fn_t)ndr_pull_nstring));
NDR_CHECK(ndr_pull_relative(ndr, (const void **)&r->portname, sizeof(*r->portname), (ndr_pull_flags_fn_t)ndr_pull_nstring));
NDR_CHECK(ndr_pull_uint32(ndr, &r->attributes));
NDR_CHECK(ndr_pull_uint32(ndr, &r->device_not_selected_timeout));
NDR_CHECK(ndr_pull_uint32(ndr, &r->transmission_retry_timeout));
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterInfo6(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo6 *r)
{
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_uint32(ndr, &r->foo));
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterInfo7(struct ndr_pull *ndr, int ndr_flags, struct spoolss_PrinterInfo7 *r)
{
NDR_CHECK(ndr_pull_struct_start(ndr));
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_align(ndr, 4));
NDR_CHECK(ndr_pull_relative(ndr, (const void **)&r->guid, sizeof(*r->guid), (ndr_pull_flags_fn_t)ndr_pull_nstring));
NDR_CHECK(ndr_pull_uint32(ndr, &r->action));
ndr_pull_struct_end(ndr);
buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
done:
return NT_STATUS_OK;
}
NTSTATUS ndr_pull_spoolss_PrinterEnum(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union spoolss_PrinterEnum *r)
{
if (!(ndr_flags & NDR_SCALARS)) goto buffers;
NDR_CHECK(ndr_pull_struct_start(ndr));
switch (*level) {
case 1: {
NDR_CHECK(ndr_pull_spoolss_PrinterEnum1(ndr, NDR_SCALARS, &r->info1));
NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_SCALARS, &r->info1));
break; }
case 2: {
NDR_CHECK(ndr_pull_spoolss_PrinterEnum2(ndr, NDR_SCALARS, &r->info2));
NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_SCALARS, &r->info2));
break; }
case 3: {
NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_SCALARS, &r->info3));
break; }
case 4: {
NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_SCALARS, &r->info4));
break; }
case 5: {
NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_SCALARS, &r->info5));
break; }
case 6: {
NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_SCALARS, &r->info6));
break; }
case 7: {
NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_SCALARS, &r->info7));
break; }
default:
@ -981,11 +1196,31 @@ buffers:
if (!(ndr_flags & NDR_BUFFERS)) goto done;
switch (*level) {
case 1:
NDR_CHECK(ndr_pull_spoolss_PrinterEnum1(ndr, NDR_BUFFERS, &r->info1));
NDR_CHECK(ndr_pull_spoolss_PrinterInfo1(ndr, NDR_BUFFERS, &r->info1));
break;
case 2:
NDR_CHECK(ndr_pull_spoolss_PrinterEnum2(ndr, NDR_BUFFERS, &r->info2));
NDR_CHECK(ndr_pull_spoolss_PrinterInfo2(ndr, NDR_BUFFERS, &r->info2));
break;
case 3:
NDR_CHECK(ndr_pull_spoolss_PrinterInfo3(ndr, NDR_BUFFERS, &r->info3));
break;
case 4:
NDR_CHECK(ndr_pull_spoolss_PrinterInfo4(ndr, NDR_BUFFERS, &r->info4));
break;
case 5:
NDR_CHECK(ndr_pull_spoolss_PrinterInfo5(ndr, NDR_BUFFERS, &r->info5));
break;
case 6:
NDR_CHECK(ndr_pull_spoolss_PrinterInfo6(ndr, NDR_BUFFERS, &r->info6));
break;
case 7:
NDR_CHECK(ndr_pull_spoolss_PrinterInfo7(ndr, NDR_BUFFERS, &r->info7));
break;
default:
@ -1009,7 +1244,7 @@ NTSTATUS ndr_pull_spoolss_EnumPrinters(struct ndr_pull *ndr, struct spoolss_Enum
}
NDR_CHECK(ndr_pull_uint32(ndr, r->out.buf_size));
NDR_CHECK(ndr_pull_uint32(ndr, &r->out.count));
NDR_CHECK(ndr_pull_NTSTATUS(ndr, &r->out.result));
NDR_CHECK(ndr_pull_WERROR(ndr, &r->out.result));
return NT_STATUS_OK;
}
@ -1761,9 +1996,9 @@ void ndr_print_spoolss_DeviceMode(struct ndr_print *ndr, const char *name, struc
ndr->depth--;
}
void ndr_print_spoolss_PrinterEnum1(struct ndr_print *ndr, const char *name, struct spoolss_PrinterEnum1 *r)
void ndr_print_spoolss_PrinterInfo1(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo1 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterEnum1");
ndr_print_struct(ndr, name, "spoolss_PrinterInfo1");
ndr->depth++;
ndr_print_uint32(ndr, "flags", r->flags);
ndr_print_nstring(ndr, "name", &r->name);
@ -1772,9 +2007,9 @@ void ndr_print_spoolss_PrinterEnum1(struct ndr_print *ndr, const char *name, str
ndr->depth--;
}
void ndr_print_spoolss_PrinterEnum2(struct ndr_print *ndr, const char *name, struct spoolss_PrinterEnum2 *r)
void ndr_print_spoolss_PrinterInfo2(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo2 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterEnum2");
ndr_print_struct(ndr, name, "spoolss_PrinterInfo2");
ndr->depth++;
ndr_print_nstring(ndr, "servername", &r->servername);
ndr_print_nstring(ndr, "printername", &r->printername);
@ -1810,16 +2045,89 @@ void ndr_print_spoolss_PrinterEnum2(struct ndr_print *ndr, const char *name, str
ndr->depth--;
}
void ndr_print_spoolss_PrinterInfo3(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo3 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterInfo3");
ndr->depth++;
ndr_print_uint32(ndr, "flags", r->flags);
ndr_print_ptr(ndr, "secdesc", r->secdesc);
ndr->depth++;
if (r->secdesc) {
ndr_print_security_descriptor(ndr, "secdesc", r->secdesc);
}
ndr->depth--;
ndr->depth--;
}
void ndr_print_spoolss_PrinterInfo4(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo4 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterInfo4");
ndr->depth++;
ndr_print_nstring(ndr, "printername", &r->printername);
ndr_print_nstring(ndr, "servername", &r->servername);
ndr_print_uint32(ndr, "attributes", r->attributes);
ndr->depth--;
}
void ndr_print_spoolss_PrinterInfo5(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo5 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterInfo5");
ndr->depth++;
ndr_print_nstring(ndr, "printername", &r->printername);
ndr_print_nstring(ndr, "portname", &r->portname);
ndr_print_uint32(ndr, "attributes", r->attributes);
ndr_print_uint32(ndr, "device_not_selected_timeout", r->device_not_selected_timeout);
ndr_print_uint32(ndr, "transmission_retry_timeout", r->transmission_retry_timeout);
ndr->depth--;
}
void ndr_print_spoolss_PrinterInfo6(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo6 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterInfo6");
ndr->depth++;
ndr_print_uint32(ndr, "foo", r->foo);
ndr->depth--;
}
void ndr_print_spoolss_PrinterInfo7(struct ndr_print *ndr, const char *name, struct spoolss_PrinterInfo7 *r)
{
ndr_print_struct(ndr, name, "spoolss_PrinterInfo7");
ndr->depth++;
ndr_print_nstring(ndr, "guid", &r->guid);
ndr_print_uint32(ndr, "action", r->action);
ndr->depth--;
}
void ndr_print_spoolss_PrinterEnum(struct ndr_print *ndr, const char *name, uint16 level, union spoolss_PrinterEnum *r)
{
ndr_print_union(ndr, name, level, "spoolss_PrinterEnum");
switch (level) {
case 1:
ndr_print_spoolss_PrinterEnum1(ndr, "info1", &r->info1);
ndr_print_spoolss_PrinterInfo1(ndr, "info1", &r->info1);
break;
case 2:
ndr_print_spoolss_PrinterEnum2(ndr, "info2", &r->info2);
ndr_print_spoolss_PrinterInfo2(ndr, "info2", &r->info2);
break;
case 3:
ndr_print_spoolss_PrinterInfo3(ndr, "info3", &r->info3);
break;
case 4:
ndr_print_spoolss_PrinterInfo4(ndr, "info4", &r->info4);
break;
case 5:
ndr_print_spoolss_PrinterInfo5(ndr, "info5", &r->info5);
break;
case 6:
ndr_print_spoolss_PrinterInfo6(ndr, "info6", &r->info6);
break;
case 7:
ndr_print_spoolss_PrinterInfo7(ndr, "info7", &r->info7);
break;
default:

View File

@ -37,14 +37,14 @@ struct spoolss_DeviceMode {
uint32 panningheight;
};
struct spoolss_PrinterEnum1 {
struct spoolss_PrinterInfo1 {
uint32 flags;
const char * name;
const char * description;
const char * comment;
};
struct spoolss_PrinterEnum2 {
struct spoolss_PrinterInfo2 {
const char * servername;
const char * printername;
const char * sharename;
@ -68,9 +68,42 @@ struct spoolss_PrinterEnum2 {
uint32 averageppm;
};
struct spoolss_PrinterInfo3 {
uint32 flags;
struct security_descriptor *secdesc;
};
struct spoolss_PrinterInfo4 {
const char * printername;
const char * servername;
uint32 attributes;
};
struct spoolss_PrinterInfo5 {
const char * printername;
const char * portname;
uint32 attributes;
uint32 device_not_selected_timeout;
uint32 transmission_retry_timeout;
};
struct spoolss_PrinterInfo6 {
uint32 foo;
};
struct spoolss_PrinterInfo7 {
const char * guid;
uint32 action;
};
union spoolss_PrinterEnum {
/* [case(1)] */ struct spoolss_PrinterEnum1 info1;
/* [case(2)] */ struct spoolss_PrinterEnum2 info2;
/* [case(1)] */ struct spoolss_PrinterInfo1 info1;
/* [case(2)] */ struct spoolss_PrinterInfo2 info2;
/* [case(3)] */ struct spoolss_PrinterInfo3 info3;
/* [case(4)] */ struct spoolss_PrinterInfo4 info4;
/* [case(5)] */ struct spoolss_PrinterInfo5 info5;
/* [case(6)] */ struct spoolss_PrinterInfo6 info6;
/* [case(7)] */ struct spoolss_PrinterInfo7 info7;
};
struct spoolss_EnumPrinters {
@ -86,7 +119,7 @@ struct spoolss_EnumPrinters {
DATA_BLOB *buffer;
uint32 *buf_size;
uint32 count;
NTSTATUS result;
WERROR result;
} out;
};

View File

@ -5,16 +5,10 @@
NTSTATUS dcerpc_spoolss_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_EnumPrinters *r)
{
NTSTATUS status;
status = dcerpc_ndr_request(p, DCERPC_SPOOLSS_ENUMPRINTERS, mem_ctx,
(ndr_push_fn_t) ndr_push_spoolss_EnumPrinters,
(ndr_pull_fn_t) ndr_pull_spoolss_EnumPrinters,
r);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
return r->out.result;
return dcerpc_ndr_request(p, DCERPC_SPOOLSS_ENUMPRINTERS, mem_ctx,
(ndr_push_fn_t) ndr_push_spoolss_EnumPrinters,
(ndr_pull_fn_t) ndr_pull_spoolss_EnumPrinters,
r);
}
NTSTATUS dcerpc_spoolss_01(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct spoolss_01 *r)

View File

@ -25,7 +25,7 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
{
struct spoolss_EnumPrinters r;
NTSTATUS status;
uint16 levels[] = {1, 2};
uint16 levels[] = {1, 2, 3, 4, 5, 6, 7};
int i;
BOOL ret = True;
@ -50,20 +50,24 @@ static BOOL test_EnumPrinters(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
continue;
}
if (NT_STATUS_V(status) == ERRinsufficientbuffer) {
if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, buf_size);
data_blob_clear(&blob);
r.in.buffer = &blob;
status = dcerpc_spoolss_EnumPrinters(p, mem_ctx, &r);
}
if (!NT_STATUS_IS_OK(status)) {
printf("EnumPrinters failed - %s\n", nt_errstr(status));
if (!NT_STATUS_IS_OK(status) ||
!W_ERROR_IS_OK(r.out.result)) {
printf("EnumPrinters failed - %s/%s\n",
nt_errstr(status), win_errstr(r.out.result));
continue;
}
status = pull_spoolss_PrinterEnumArray(r.out.buffer, mem_ctx, r.in.level, r.out.count, &info);
if (!NT_STATUS_IS_OK(status)) {
printf("EnumPrintersArray parse failed - %s\n", nt_errstr(status));
continue;
}
for (j=0;j<r.out.count;j++) {