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:
parent
5832a1447c
commit
8301a6b6ad
@ -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,
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
@ -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)
|
||||
|
@ -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++) {
|
||||
|
Loading…
Reference in New Issue
Block a user