diff --git a/source4/librpc/idl/wkssvc.idl b/source4/librpc/idl/wkssvc.idl index 40365276213..b7ca97463d8 100644 --- a/source4/librpc/idl/wkssvc.idl +++ b/source4/librpc/idl/wkssvc.idl @@ -7,8 +7,12 @@ pointer_default(unique) ] interface wkssvc { + +#define BOOL uint32 + /******************/ /* Function: 0x00 */ + typedef struct { uint32 platform_id; unistr *server; @@ -36,10 +40,49 @@ uint32 logged_on_users; } wkssvc_Info102; + typedef struct { + uint32 char_wait; + uint32 collection_time; + uint32 maximum_collection_count; + uint32 keep_connection; + uint32 max_commands; + uint32 session_timeout; + uint32 size_char_buf; + uint32 max_threads; + uint32 lock_quota; + uint32 lock_increment; + uint32 lock_maximum; + uint32 pipe_increment; + uint32 pipe_maximum; + uint32 cache_file_timeout; + uint32 dormant_file_limit; + uint32 read_ahead_throughput; + uint32 num_mailslot_buffers; + uint32 num_srv_announce_buffers; + uint32 max_illegal_dgram_events; + uint32 dgram_event_reset_freq; + BOOL log_election_packets; + BOOL use_opportunistic_locking; + BOOL use_unlock_behind; + BOOL use_close_behind; + BOOL buf_named_pipes; + BOOL use_lock_read_unlock; + BOOL utilize_nt_caching; + BOOL use_raw_read; + BOOL use_raw_write; + BOOL use_write_raw_data; + BOOL use_encryption; + BOOL buf_files_deny_write; + BOOL buf_read_only_files; + BOOL force_core_create_mode; + BOOL use_512_byte_max_transfer; + } wkssvc_Info502; + typedef union { case (100) wkssvc_Info100 *info100; case (101) wkssvc_Info101 *info101; case (102) wkssvc_Info102 *info102; + case (502) wkssvc_Info502 *info502; } wkssvc_Info; WERROR wkssvc_QueryInfo( diff --git a/source4/librpc/ndr/ndr_wkssvc.c b/source4/librpc/ndr/ndr_wkssvc.c index 48e63c93e19..47ddbcb9bf8 100644 --- a/source4/librpc/ndr/ndr_wkssvc.c +++ b/source4/librpc/ndr/ndr_wkssvc.c @@ -415,6 +415,53 @@ done: return NT_STATUS_OK; } +NTSTATUS ndr_pull_wkssvc_Info502(struct ndr_pull *ndr, int ndr_flags, struct wkssvc_Info502 *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->char_wait)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->collection_time)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->maximum_collection_count)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->keep_connection)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->max_commands)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->session_timeout)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->size_char_buf)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->max_threads)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->lock_quota)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->lock_increment)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->lock_maximum)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->pipe_increment)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->pipe_maximum)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->cache_file_timeout)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->dormant_file_limit)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->read_ahead_throughput)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->num_mailslot_buffers)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->num_srv_announce_buffers)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->max_illegal_dgram_events)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->dgram_event_reset_freq)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->log_election_packets)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_opportunistic_locking)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_unlock_behind)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_close_behind)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->buf_named_pipes)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_lock_read_unlock)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->utilize_nt_caching)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_raw_read)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_raw_write)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_write_raw_data)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_encryption)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->buf_files_deny_write)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->buf_read_only_files)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->force_core_create_mode)); + NDR_CHECK(ndr_pull_uint32(ndr, &r->use_512_byte_max_transfer)); + ndr_pull_struct_end(ndr); +buffers: + if (!(ndr_flags & NDR_BUFFERS)) goto done; +done: + return NT_STATUS_OK; +} + NTSTATUS ndr_pull_wkssvc_Info(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union wkssvc_Info *r) { if (!(ndr_flags & NDR_SCALARS)) goto buffers; @@ -451,6 +498,16 @@ NTSTATUS ndr_pull_wkssvc_Info(struct ndr_pull *ndr, int ndr_flags, uint16 *level } break; } + case 502: { + uint32 _ptr_info502; + NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_info502)); + if (_ptr_info502) { + NDR_ALLOC(ndr, r->info502); + } else { + r->info502 = NULL; + } + break; } + default: return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level); } @@ -476,6 +533,12 @@ buffers: } break; + case 502: + if (r->info502) { + NDR_CHECK(ndr_pull_wkssvc_Info502(ndr, NDR_SCALARS|NDR_BUFFERS, r->info502)); + } + break; + default: return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level); } @@ -918,6 +981,48 @@ void ndr_print_wkssvc_Info102(struct ndr_print *ndr, const char *name, struct wk ndr->depth--; } +void ndr_print_wkssvc_Info502(struct ndr_print *ndr, const char *name, struct wkssvc_Info502 *r) +{ + ndr_print_struct(ndr, name, "wkssvc_Info502"); + ndr->depth++; + ndr_print_uint32(ndr, "char_wait", r->char_wait); + ndr_print_uint32(ndr, "collection_time", r->collection_time); + ndr_print_uint32(ndr, "maximum_collection_count", r->maximum_collection_count); + ndr_print_uint32(ndr, "keep_connection", r->keep_connection); + ndr_print_uint32(ndr, "max_commands", r->max_commands); + ndr_print_uint32(ndr, "session_timeout", r->session_timeout); + ndr_print_uint32(ndr, "size_char_buf", r->size_char_buf); + ndr_print_uint32(ndr, "max_threads", r->max_threads); + ndr_print_uint32(ndr, "lock_quota", r->lock_quota); + ndr_print_uint32(ndr, "lock_increment", r->lock_increment); + ndr_print_uint32(ndr, "lock_maximum", r->lock_maximum); + ndr_print_uint32(ndr, "pipe_increment", r->pipe_increment); + ndr_print_uint32(ndr, "pipe_maximum", r->pipe_maximum); + ndr_print_uint32(ndr, "cache_file_timeout", r->cache_file_timeout); + ndr_print_uint32(ndr, "dormant_file_limit", r->dormant_file_limit); + ndr_print_uint32(ndr, "read_ahead_throughput", r->read_ahead_throughput); + ndr_print_uint32(ndr, "num_mailslot_buffers", r->num_mailslot_buffers); + ndr_print_uint32(ndr, "num_srv_announce_buffers", r->num_srv_announce_buffers); + ndr_print_uint32(ndr, "max_illegal_dgram_events", r->max_illegal_dgram_events); + ndr_print_uint32(ndr, "dgram_event_reset_freq", r->dgram_event_reset_freq); + ndr_print_uint32(ndr, "log_election_packets", r->log_election_packets); + ndr_print_uint32(ndr, "use_opportunistic_locking", r->use_opportunistic_locking); + ndr_print_uint32(ndr, "use_unlock_behind", r->use_unlock_behind); + ndr_print_uint32(ndr, "use_close_behind", r->use_close_behind); + ndr_print_uint32(ndr, "buf_named_pipes", r->buf_named_pipes); + ndr_print_uint32(ndr, "use_lock_read_unlock", r->use_lock_read_unlock); + ndr_print_uint32(ndr, "utilize_nt_caching", r->utilize_nt_caching); + ndr_print_uint32(ndr, "use_raw_read", r->use_raw_read); + ndr_print_uint32(ndr, "use_raw_write", r->use_raw_write); + ndr_print_uint32(ndr, "use_write_raw_data", r->use_write_raw_data); + ndr_print_uint32(ndr, "use_encryption", r->use_encryption); + ndr_print_uint32(ndr, "buf_files_deny_write", r->buf_files_deny_write); + ndr_print_uint32(ndr, "buf_read_only_files", r->buf_read_only_files); + ndr_print_uint32(ndr, "force_core_create_mode", r->force_core_create_mode); + ndr_print_uint32(ndr, "use_512_byte_max_transfer", r->use_512_byte_max_transfer); + ndr->depth--; +} + void ndr_print_wkssvc_Info(struct ndr_print *ndr, const char *name, uint16 level, union wkssvc_Info *r) { ndr_print_union(ndr, name, level, "wkssvc_Info"); @@ -949,6 +1054,15 @@ void ndr_print_wkssvc_Info(struct ndr_print *ndr, const char *name, uint16 level ndr->depth--; break; + case 502: + ndr_print_ptr(ndr, "info502", r->info502); + ndr->depth++; + if (r->info502) { + ndr_print_wkssvc_Info502(ndr, "info502", r->info502); + } + ndr->depth--; + break; + default: ndr_print_bad_level(ndr, name, level); } diff --git a/source4/librpc/ndr/ndr_wkssvc.h b/source4/librpc/ndr/ndr_wkssvc.h index 805903620bb..d4930e3baeb 100644 --- a/source4/librpc/ndr/ndr_wkssvc.h +++ b/source4/librpc/ndr/ndr_wkssvc.h @@ -64,10 +64,49 @@ struct wkssvc_Info102 { uint32 logged_on_users; }; +struct wkssvc_Info502 { + uint32 char_wait; + uint32 collection_time; + uint32 maximum_collection_count; + uint32 keep_connection; + uint32 max_commands; + uint32 session_timeout; + uint32 size_char_buf; + uint32 max_threads; + uint32 lock_quota; + uint32 lock_increment; + uint32 lock_maximum; + uint32 pipe_increment; + uint32 pipe_maximum; + uint32 cache_file_timeout; + uint32 dormant_file_limit; + uint32 read_ahead_throughput; + uint32 num_mailslot_buffers; + uint32 num_srv_announce_buffers; + uint32 max_illegal_dgram_events; + uint32 dgram_event_reset_freq; + uint32 log_election_packets; + uint32 use_opportunistic_locking; + uint32 use_unlock_behind; + uint32 use_close_behind; + uint32 buf_named_pipes; + uint32 use_lock_read_unlock; + uint32 utilize_nt_caching; + uint32 use_raw_read; + uint32 use_raw_write; + uint32 use_write_raw_data; + uint32 use_encryption; + uint32 buf_files_deny_write; + uint32 buf_read_only_files; + uint32 force_core_create_mode; + uint32 use_512_byte_max_transfer; +}; + union wkssvc_Info { /* [case(100)] */ struct wkssvc_Info100 *info100; /* [case(101)] */ struct wkssvc_Info101 *info101; /* [case(102)] */ struct wkssvc_Info102 *info102; +/* [case(502)] */ struct wkssvc_Info502 *info502; }; struct wkssvc_QueryInfo { diff --git a/source4/torture/rpc/wkssvc.c b/source4/torture/rpc/wkssvc.c index b8ae3de2020..13af1184e9d 100644 --- a/source4/torture/rpc/wkssvc.c +++ b/source4/torture/rpc/wkssvc.c @@ -27,7 +27,7 @@ static BOOL test_QueryInfo(struct dcerpc_pipe *p, { NTSTATUS status; struct wkssvc_QueryInfo r; - uint16 levels[] = {100, 101, 102}; + uint16 levels[] = {100, 101, 102, 502}; int i; BOOL ret = True;