smbd: Ensure we grant owner sid in check_parent_access_fsp()
[samba.git] / librpc / idl / nbt.idl
1 #include "idl_types.h"
2
3 /*
4    IDL structures for NBT operations
5
6    NBT is not traditionally encoded using IDL/NDR. This is a bit of an
7    experiment, and I may well switch us back to a more traditional
8    encoding if it doesn't work out
9 */
10
11 import "misc.idl", "security.idl";
12 [
13         helper("../librpc/ndr/ndr_nbt.h"),
14         helpstring("NBT messages"),
15         uuid("6def41b6-86e4-4c32-997c-ed33af7bcd8e")
16 ]
17 interface nbt
18 {
19         const int NBT_NAME_SERVICE_PORT  = 137;
20         const int NBT_DGRAM_SERVICE_PORT = 138;
21
22         typedef [bitmap16bit] bitmap {
23                 NBT_RCODE                   = 0x000F,
24                 NBT_FLAG_BROADCAST          = 0x0010,
25                 NBT_FLAG_RECURSION_AVAIL    = 0x0080,
26                 NBT_FLAG_RECURSION_DESIRED  = 0x0100,
27                 NBT_FLAG_TRUNCATION         = 0x0200,
28                 NBT_FLAG_AUTHORITATIVE      = 0x0400,
29                 NBT_OPCODE                  = 0x7800,
30                 NBT_FLAG_REPLY              = 0x8000
31         } nbt_operation;
32
33         /* the opcodes are in the operation field, masked with
34            NBT_OPCODE */
35         typedef enum {
36                 NBT_OPCODE_QUERY          =  (0x0<<11),
37                 NBT_OPCODE_REGISTER       =  (0x5<<11),
38                 NBT_OPCODE_RELEASE        =  (0x6<<11),
39                 NBT_OPCODE_WACK           =  (0x7<<11),
40                 NBT_OPCODE_REFRESH        =  (0x8<<11),
41                 NBT_OPCODE_REFRESH2       =  (0x9<<11),
42                 NBT_OPCODE_MULTI_HOME_REG =  (0xf<<11)
43         } nbt_opcode;
44
45         /* rcode values */
46         typedef enum {
47                 NBT_RCODE_OK  = 0x0,
48                 NBT_RCODE_FMT = 0x1,
49                 NBT_RCODE_SVR = 0x2,
50                 NBT_RCODE_NAM = 0x3,
51                 NBT_RCODE_IMP = 0x4,
52                 NBT_RCODE_RFS = 0x5,
53                 NBT_RCODE_ACT = 0x6,
54                 NBT_RCODE_CFT = 0x7
55         } nbt_rcode;
56
57         /* we support any 8bit name type, but by defining the common
58            ones here we get better debug displays */
59         typedef [enum8bit] enum {
60                 NBT_NAME_CLIENT   = 0x00,
61                 NBT_NAME_MS       = 0x01,
62                 NBT_NAME_USER     = 0x03,
63                 NBT_NAME_SERVER   = 0x20,
64                 NBT_NAME_PDC      = 0x1B,
65                 NBT_NAME_LOGON    = 0x1C,
66                 NBT_NAME_MASTER   = 0x1D,
67                 NBT_NAME_BROWSER  = 0x1E
68         } nbt_name_type;
69
70         /* the ndr parser for nbt_name is separately defined in
71            nbtname.c (along with the parsers for nbt_string) */
72         typedef [public,nopull,nopush] struct {
73                 string        name;
74                 string        scope;
75                 nbt_name_type type;
76         } nbt_name;
77
78         typedef [public,enum16bit] enum {
79                 NBT_QCLASS_IP = 0x01
80         } nbt_qclass;
81
82         typedef [public,enum16bit,nopush] enum {
83                 NBT_QTYPE_ADDRESS     = 0x0001,
84                 NBT_QTYPE_NAMESERVICE = 0x0002,
85                 NBT_QTYPE_NULL        = 0x000A,
86                 NBT_QTYPE_NETBIOS     = 0x0020,
87                 NBT_QTYPE_STATUS      = 0x0021,
88                 /*
89                  * Indicates that this is a WACK packet. As long as the size of
90                  * ‘int’ is larger than 16 bits, this value cannot appear on the
91                  * wire. We’ll encode it instead as NBT_QTYPE_NETBIOS.
92                  */
93                 NBT_QTYPE_WACK        = -1
94         } nbt_qtype;
95
96         typedef struct {
97                 nbt_name   name;
98                 nbt_qtype  question_type;
99                 nbt_qclass question_class;
100         } nbt_name_question;
101
102         /* these are the possible values of the NBT_NM_OWNER_TYPE
103            field */
104         typedef enum {
105                 NBT_NODE_B = 0x0000,
106                 NBT_NODE_P = 0x2000,
107                 NBT_NODE_M = 0x4000,
108                 NBT_NODE_H = 0x6000
109         } nbt_node_type;
110
111         typedef [bitmap16bit] bitmap {
112                 NBT_NM_PERMANENT        = 0x0200,
113                 NBT_NM_ACTIVE           = 0x0400,
114                 NBT_NM_CONFLICT         = 0x0800,
115                 NBT_NM_DEREGISTER       = 0x1000,
116                 NBT_NM_OWNER_TYPE       = 0x6000,
117                 NBT_NM_GROUP            = 0x8000
118         } nb_flags;
119
120         typedef struct {
121                 nb_flags nb_flags;
122                 ipv4address ipaddr;
123         } nbt_rdata_address;
124
125         typedef struct {
126                 uint16 length;
127                 nbt_rdata_address addresses[length/6];
128         } nbt_rdata_netbios;
129
130         typedef struct {
131                 uint8 unit_id[6];
132                 uint8 jumpers;
133                 uint8 test_result;
134                 uint16 version_number;
135                 uint16 period_of_statistics;
136                 uint16 number_of_crcs;
137                 uint16 number_alignment_errors;
138                 uint16 number_of_collisions;
139                 uint16 number_send_aborts;
140                 uint32 number_good_sends;
141                 uint32 number_good_receives;
142                 uint16 number_retransmits;
143                 uint16 number_no_resource_conditions;
144                 uint16 number_free_command_blocks;
145                 uint16 total_number_command_blocks;
146                 uint16 max_total_number_command_blocks;
147                 uint16 number_pending_sessions;
148                 uint16 max_number_pending_sessions;
149                 uint16 max_total_sessions_possible;
150                 uint16 session_data_packet_size;
151         } nbt_statistics;
152
153         typedef struct {
154                 [charset(DOS)] uint8 name[15];
155                 nbt_name_type type;
156                 nb_flags  nb_flags;
157         } nbt_status_name;
158
159         typedef struct {
160                 [value(num_names * 18 + 47)] uint16 length;
161                 uint8 num_names;
162                 nbt_status_name names[num_names];
163                 nbt_statistics  statistics;
164         } nbt_rdata_status;
165
166         typedef struct {
167                 uint16 length;
168                 uint8  data[length];
169         } nbt_rdata_data;
170
171         typedef [nodiscriminant,public] union {
172                 [case(NBT_QTYPE_NETBIOS)] nbt_rdata_netbios netbios;
173                 [case(NBT_QTYPE_STATUS)]  nbt_rdata_status status;
174                 [default]                 nbt_rdata_data   data;
175         } nbt_rdata;
176
177         typedef [flag(LIBNDR_PRINT_ARRAY_HEX)] struct {
178                 nbt_name   name;
179                 nbt_qtype  rr_type;
180                 nbt_qclass rr_class;
181                 uint32     ttl;
182                 [switch_is(rr_type)] nbt_rdata rdata;
183         } nbt_res_rec;
184
185         typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
186                 uint16            name_trn_id;
187                 nbt_operation     operation;
188                 uint16            qdcount;
189                 uint16            ancount;
190                 uint16            nscount;
191                 uint16            arcount;
192                 nbt_name_question questions[qdcount];
193                 nbt_res_rec       answers[ancount];
194                 nbt_res_rec       nsrecs[nscount];
195                 nbt_res_rec       additional[arcount];
196                 [flag(NDR_REMAINING)] DATA_BLOB padding;
197         } nbt_name_packet;
198
199
200         /*
201           NBT DGRAM packets (UDP/138)
202         */
203
204         typedef [enum8bit] enum {
205                 DGRAM_DIRECT_UNIQUE  = 0x10,
206                 DGRAM_DIRECT_GROUP   = 0x11,
207                 DGRAM_BCAST          = 0x12,
208                 DGRAM_ERROR          = 0x13,
209                 DGRAM_QUERY          = 0x14,
210                 DGRAM_QUERY_POSITIVE = 0x15,
211                 DGRAM_QUERY_NEGATIVE = 0x16
212         } dgram_msg_type;
213
214         typedef [bitmap8bit] bitmap {
215                 DGRAM_FLAG_MORE         = 0x01,
216                 DGRAM_FLAG_FIRST        = 0x02,
217                 DGRAM_FLAG_NODE_TYPE    = 0x0C
218         } dgram_flags;
219
220         typedef [enum8bit] enum {
221                 DGRAM_NODE_B    = 0x00,
222                 DGRAM_NODE_P    = 0x04,
223                 DGRAM_NODE_M    = 0x08,
224                 DGRAM_NODE_NBDD = 0x0C
225         } dgram_node_type;
226
227         /* a dgram_message is the main dgram body in general use */
228
229         /* the most common datagram type is a SMB_TRANSACTION
230            operation, where a SMB packet is used in the data section
231            of a dgram_message to hold a trans request, which in turn
232            holds a small command structure. It's a very strange beast
233            indeed. To make the code cleaner we define a basic SMB
234            packet in IDL here. This is not a general purpose SMB
235            packet, and won't be used in the core SMB client/server
236            code, but it does make working with these types of dgrams
237            easier */
238
239         const string NBT_MAILSLOT_NETLOGON = "\\MAILSLOT\\NET\\NETLOGON";
240         const string NBT_MAILSLOT_NTLOGON  = "\\MAILSLOT\\NET\\NTLOGON";
241         const string NBT_MAILSLOT_GETDC    = "\\MAILSLOT\\NET\\GETDC";
242         const string NBT_MAILSLOT_BROWSE   = "\\MAILSLOT\\BROWSE";
243
244         typedef [enum8bit] enum {
245                 SMB_TRANSACTION = 0x25
246         } smb_command;
247
248         typedef struct {
249                 [range(17,17),value(17)] uint8 wct;
250                 uint16                      total_param_count;
251                 uint16                      total_data_count;
252                 uint16                      max_param_count;
253                 uint16                      max_data_count;
254                 uint8                       max_setup_count;
255                 uint8                       pad;
256                 uint16                      trans_flags;
257                 uint32                      timeout;
258                 uint16                      reserved;
259                 uint16                      param_count;
260                 uint16                      param_offset;
261                 uint16                      data_count;
262                 uint16                      data_offset;
263                 [range(3,3),value(3)] uint8 setup_count;
264                 uint8                       pad2;
265                 uint16                      opcode;
266                 uint16                      priority;
267                 uint16                      _class;
268                 [value(strlen(mailslot_name)+1+data.length)]
269                       uint16                byte_count;
270                 astring                     mailslot_name;
271                 [flag(NDR_REMAINING)]       DATA_BLOB data;
272         } smb_trans_body;
273
274         typedef [nodiscriminant] union {
275                 [case(SMB_TRANSACTION)] smb_trans_body trans;
276         } smb_body;
277
278
279         typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN|NDR_PAHEX),public] struct {
280                 smb_command                smb_command;
281                 uint8                      err_class;
282                 uint8                      pad;
283                 uint16                     err_code;
284                 uint8                      flags;
285                 uint16                     flags2;
286                 uint16                     pid_high;
287                 uint8                      signature[8];
288                 uint16                     reserved;
289                 uint16                     tid;
290                 uint16                     pid;
291                 uint16                     vuid;
292                 uint16                     mid;
293                 [switch_is(smb_command)]   smb_body body;
294         } dgram_smb_packet;
295
296         const uint32 DGRAM_SMB = 0xff534d42; /* 0xffSMB */
297
298         typedef [nodiscriminant] union {
299                 [case(DGRAM_SMB)] dgram_smb_packet smb;
300         } dgram_message_body;
301
302         typedef struct {
303                 uint16          length;
304                 uint16          offset;
305                 nbt_name        source_name;
306                 nbt_name        dest_name;
307                 uint32          dgram_body_type;
308                 [switch_is(dgram_body_type)] dgram_message_body body;
309         } dgram_message;
310
311         typedef [enum8bit] enum {
312                 DGRAM_ERROR_NAME_NOT_PRESENT = 0x82,
313                 DGRAM_ERROR_INVALID_SOURCE   = 0x83,
314                 DGRAM_ERROR_INVALID_DEST     = 0x84
315         } dgram_err_code;
316
317         typedef [nodiscriminant] union {
318                 [case(DGRAM_DIRECT_UNIQUE)]   dgram_message  msg;
319                 [case(DGRAM_DIRECT_GROUP)]    dgram_message  msg;
320                 [case(DGRAM_BCAST)]           dgram_message  msg;
321                 [case(DGRAM_ERROR)]           dgram_err_code error;
322                 [case(DGRAM_QUERY)]           nbt_name       dest_name;
323                 [case(DGRAM_QUERY_POSITIVE)]  nbt_name       dest_name;
324                 [case(DGRAM_QUERY_NEGATIVE)]  nbt_name       dest_name;
325         } dgram_data;
326
327         typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct {
328                 dgram_msg_type msg_type;
329                 dgram_flags    flags;
330                 uint16         dgram_id;
331                 ipv4address    src_addr;
332                 uint16         src_port;
333                 [switch_is(msg_type)] dgram_data data;
334         } nbt_dgram_packet;
335
336
337         /******************************************
338          * \MAILSLOT\NET\NETLOGON mailslot requests
339          * and
340          * \MAILSLOT\NET\NTLOGON mailslot requests
341          */
342
343         typedef [public,gensize] struct {
344                 uint32                  sockaddr_family;
345                 [flag(NDR_BIG_ENDIAN)]  ipv4address pdc_ip;
346                 [flag(NDR_REMAINING)]   DATA_BLOB remaining;
347         } nbt_sockaddr;
348
349         typedef [bitmap32bit,public] bitmap {
350                 NBT_SERVER_PDC                          = 0x00000001,
351                 NBT_SERVER_GC                           = 0x00000004,
352                 NBT_SERVER_LDAP                         = 0x00000008,
353                 NBT_SERVER_DS                           = 0x00000010,
354                 NBT_SERVER_KDC                          = 0x00000020,
355                 NBT_SERVER_TIMESERV                     = 0x00000040,
356                 NBT_SERVER_CLOSEST                      = 0x00000080,
357                 NBT_SERVER_WRITABLE                     = 0x00000100,
358                 NBT_SERVER_GOOD_TIMESERV                = 0x00000200,
359                 NBT_SERVER_NDNC                         = 0x00000400,
360                 NBT_SERVER_SELECT_SECRET_DOMAIN_6       = 0x00000800, /* 2008 / RODC */
361                 NBT_SERVER_FULL_SECRET_DOMAIN_6         = 0x00001000, /* 2008 */
362                 NBT_SERVER_ADS_WEB_SERVICE              = 0x00002000,
363                 NBT_SERVER_DS_8                         = 0x00004000, /* 2012 */
364                 NBT_SERVER_DS_9                         = 0x00008000, /* 2012R2 */
365                 NBT_SERVER_DS_10                        = 0x00010000, /* 2016 */
366                 NBT_SERVER_HAS_DNS_NAME                 = 0x20000000,
367                 NBT_SERVER_IS_DEFAULT_NC                = 0x40000000,
368                 NBT_SERVER_FOREST_ROOT                  = 0x80000000
369         } nbt_server_type;
370
371         typedef [bitmap32bit,public] bitmap {
372                 NETLOGON_NT_VERSION_1                   = 0x00000001,
373                 NETLOGON_NT_VERSION_5                   = 0x00000002,
374                 NETLOGON_NT_VERSION_5EX                 = 0x00000004,
375                 NETLOGON_NT_VERSION_5EX_WITH_IP         = 0x00000008,
376                 NETLOGON_NT_VERSION_WITH_CLOSEST_SITE   = 0x00000010,
377                 NETLOGON_NT_VERSION_AVOID_NT4EMUL       = 0x01000000,
378                 NETLOGON_NT_VERSION_PDC                 = 0x10000000,
379                 NETLOGON_NT_VERSION_IP                  = 0x20000000,
380                 NETLOGON_NT_VERSION_LOCAL               = 0x40000000,
381                 NETLOGON_NT_VERSION_GC                  = 0x80000000
382         } netlogon_nt_version_flags;
383
384         typedef [enum16bit,public] enum {
385                 LOGON_REQUEST                     = 0,
386                 LOGON_RESPONSE2                   = 6,
387                 LOGON_PRIMARY_QUERY               = 7,  /* Was also NETLOGON_QUERY_FOR_PDC */
388                 NETLOGON_ANNOUNCE_UAS             = 10,
389                 NETLOGON_RESPONSE_FROM_PDC        = 12,
390                 LOGON_SAM_LOGON_REQUEST           = 18, /* Was also NETLOGON_QUERY_FOR_PDC2, NTLOGON_SAM_LOGON */
391                 LOGON_SAM_LOGON_RESPONSE          = 19, /* Was also NTLOGON_SAM_LOGON_REPLY */
392                 LOGON_SAM_LOGON_PAUSE_RESPONSE    = 20,
393                 LOGON_SAM_LOGON_USER_UNKNOWN      = 21, /* Was also NTLOGON_SAM_LOGON_REPLY15 */
394                 LOGON_SAM_LOGON_RESPONSE_EX       = 23,  /* was NETLOGON_RESPONSE_FROM_PDC2     */
395                 LOGON_SAM_LOGON_PAUSE_RESPONSE_EX = 24,
396                 LOGON_SAM_LOGON_USER_UNKNOWN_EX   = 25 /* was NETLOGON_RESPONSE_FROM_PDC_USER */
397         } netlogon_command;
398
399         /* query to dc hand marshaled, as it has 'optional'
400          * parts */
401         typedef [nopull,nopush] struct {
402                 uint16               request_count;
403                 nstring              computer_name;
404                 nstring              user_name;
405                 astring              mailslot_name;
406                 uint32               acct_control;
407                 /* samr_AcctFlags       acct_control; */
408                 [value(ndr_size_dom_sid0(&sid, ndr->flags))] uint32 sid_size;
409                 /* The manual alignment is required because this
410                  * structure is marked flag(NDR_NOALIGN) via the
411                  * nbt_netlogon_packet below.
412                  *
413                  * However, both MUST only be present if sid_size > 0
414                  */
415                 [flag(NDR_ALIGN4)]   DATA_BLOB _pad;
416                 [subcontext(0),subcontext_size(sid_size)] dom_sid0 sid;
417                 netlogon_nt_version_flags               nt_version;
418                 uint16               lmnt_token;
419                 uint16               lm20_token;
420         } NETLOGON_SAM_LOGON_REQUEST;
421
422         typedef struct {
423                 astring              computer_name;
424                 astring              user_name;
425                 astring              mailslot_name;
426                 uint8                request_count;
427                 uint16               lmnt_token;
428                 uint16               lm20_token;
429         } NETLOGON_LOGON_REQUEST;
430
431         typedef [flag(NDR_NOALIGN),public] struct {
432                 netlogon_command command;
433                 nstring              pdc_name;
434                 nstring              user_name;
435                 nstring              domain_name;
436                 netlogon_nt_version_flags               nt_version;
437                 uint16               lmnt_token;
438                 uint16               lm20_token;
439         } NETLOGON_SAM_LOGON_RESPONSE_NT40;
440
441         typedef [flag(NDR_NOALIGN),public] struct {
442                 netlogon_command command;
443                 nstring              pdc_name;
444                 nstring              user_name;
445                 nstring              domain_name;
446                 GUID                 domain_uuid;
447                 GUID                 zero_uuid;
448                 nbt_string           forest;
449                 nbt_string           dns_domain;
450                 nbt_string           pdc_dns_name;
451                 ipv4address          pdc_ip;
452                 nbt_server_type      server_type;
453                 netlogon_nt_version_flags    nt_version;
454                 uint16               lmnt_token;
455                 uint16               lm20_token;
456         } NETLOGON_SAM_LOGON_RESPONSE;
457
458         /* response from pdc hand marshaled (we have an additional
459          * function that uses this structure), as it has 'optional'
460          * parts */
461         typedef [flag(NDR_NOALIGN),public] struct {
462                 netlogon_command command;
463                 uint16               sbz; /* From the docs */
464                 nbt_server_type      server_type;
465                 GUID                 domain_uuid;
466                 nbt_string           forest;
467                 nbt_string           dns_domain;
468                 nbt_string           pdc_dns_name;
469                 nbt_string           domain_name;
470                 nbt_string           pdc_name;
471                 nbt_string           user_name;
472                 nbt_string           server_site;
473                 nbt_string           client_site;
474
475                 /* Optional on NETLOGON_NT_VERSION_5EX_WITH_IP */
476                 [value(ndr_size_nbt_sockaddr(&sockaddr, ndr->flags))] uint8 sockaddr_size;
477                 [subcontext(0),subcontext_size(sockaddr_size)] nbt_sockaddr sockaddr;
478
479                 /* Optional on NETLOGON_NT_VERSION_WITH_CLOSEST_SITE */
480                 nbt_string           next_closest_site;
481
482                 netlogon_nt_version_flags               nt_version;
483                 uint16               lmnt_token;
484                 uint16               lm20_token;
485         } NETLOGON_SAM_LOGON_RESPONSE_EX;
486
487         typedef [nopush,nopull] union {
488                 [case(NETLOGON_NT_VERSION_1)] NETLOGON_SAM_LOGON_RESPONSE_NT40 nt4;
489                 [case(NETLOGON_NT_VERSION_5)] NETLOGON_SAM_LOGON_RESPONSE nt5;
490                 [case(NETLOGON_NT_VERSION_5EX)] NETLOGON_SAM_LOGON_RESPONSE_EX nt5_ex;
491         } netlogon_samlogon_response_union;
492
493         typedef [nopush,nopull,noprint,public] struct {
494                 uint32 ntver;
495                 [switch_is(ntver)] netlogon_samlogon_response_union data;
496         } netlogon_samlogon_response;
497
498         /* query for pdc request */
499         typedef struct {
500                 astring              computer_name;
501                 astring              mailslot_name;
502                 [flag(NDR_ALIGN2)]   DATA_BLOB _pad;
503                 nstring              unicode_name;
504                 netlogon_nt_version_flags               nt_version;
505                 uint16               lmnt_token;
506                 uint16               lm20_token;
507         } nbt_netlogon_query_for_pdc;
508
509         /* response from pdc */
510         typedef [public] struct {
511                 netlogon_command command;
512                 astring pdc_name;
513                 [flag(NDR_ALIGN2)]   DATA_BLOB _pad;
514                 nstring              unicode_pdc_name;
515                 nstring              domain_name;
516                 netlogon_nt_version_flags               nt_version;
517                 uint16               lmnt_token;
518                 uint16               lm20_token;
519         } nbt_netlogon_response_from_pdc;
520
521         typedef [flag(NDR_NOALIGN),public] struct {
522                 netlogon_command command;
523                 astring pdc_name;
524                 uint16 lm20_token;
525         } nbt_netlogon_response2;
526
527         /* used to announce SAM changes - MS-NRPC 2.2.1.5.1 */
528         typedef struct {
529                 netr_SamDatabaseID   db_index;
530                 hyper                serial;
531                 NTTIME               timestamp;
532         } nbt_db_change_info;
533
534         typedef struct {
535                 uint32           serial_lo;
536                 time_t           timestamp;
537                 uint32           pulse;
538                 uint32           random;
539                 astring          pdc_name;
540                 astring          domain;
541                 [flag(NDR_ALIGN2)] DATA_BLOB _pad;
542                 nstring          unicode_pdc_name;
543                 nstring          unicode_domain;
544                 uint32           db_count;
545                 nbt_db_change_info    dbchange[db_count];
546                 [value(ndr_size_dom_sid0(&sid, ndr->flags))] uint32 sid_size;
547                 [subcontext(0),subcontext_size(sid_size)] dom_sid0 sid;
548                 uint32           message_format_version;
549                 uint32           message_token;
550         } NETLOGON_DB_CHANGE;
551
552         typedef [nodiscriminant] union {
553                 [case(LOGON_REQUEST)]  NETLOGON_LOGON_REQUEST logon0;
554                 [case(LOGON_SAM_LOGON_REQUEST)]       NETLOGON_SAM_LOGON_REQUEST logon;
555                 [case(LOGON_PRIMARY_QUERY)] nbt_netlogon_query_for_pdc pdc;
556                 [case(NETLOGON_ANNOUNCE_UAS)] NETLOGON_DB_CHANGE uas;
557         } nbt_netlogon_request;
558
559 #if 0 
560         /* These responses are all handled manually, as they cannot be encoded in IDL fully
561            
562            See push_nbt_netlogon_response()
563         */
564                 [case(NETLOGON_RESPONSE_FROM_PDC)] nbt_netlogon_response_from_pdc response;
565                 [case(NETLOGON_RESPONSE_FROM_PDC_USER)] nbt_netlogon_response_from_pdc2 response2;
566
567                 [case(LOGON_SAM_LOGON_PAUSE_RESPONSE)] NETLOGON_SAM_LOGON_RESPONSE reply;
568                 [case(LOGON_SAM_LOGON_RESPONSE)] NETLOGON_SAM_LOGON_RESPONSE reply;
569                 [case(LOGON_SAM_LOGON_USER_UNKNOWN)] NETLOGON_SAM_LOGON_RESPONSE reply;
570                 [case(LOGON_SAM_LOGON_RESPONSE_EX)] NETLOGON_SAM_LOGON_RESPONSE_EX reply_ex;
571                 [case(LOGON_SAM_LOGON_PAUSE_RESPONSE_EX)] NETLOGON_SAM_LOGON_RESPONSE_EX reply_ex;
572                 [case(LOGON_SAM_LOGON_USER_UNKNOWN_EX)] NETLOGON_SAM_LOGON_RESPONSE_EX reply_ex;
573 #endif
574
575         typedef [flag(NDR_NOALIGN),public] struct {
576                 netlogon_command command;
577                 [switch_is(command)] nbt_netlogon_request req;
578         } nbt_netlogon_packet;
579
580         /********************************************************/
581         /* \MAILSLOT\BROWSE mailslot requests                   */
582         /* for details see http://ubiqx.org/cifs/Browsing.html  */
583         /********************************************************/
584         typedef bitmap svcctl_ServerType svcctl_ServerType;
585
586         typedef [enum8bit] enum {
587                 HostAnnouncement        = 1,
588                 AnnouncementRequest     = 2,
589                 Election                = 8,
590                 GetBackupListReq        = 9,
591                 GetBackupListResp       = 10,
592                 BecomeBackup            = 11,
593                 DomainAnnouncement      = 12,
594                 MasterAnnouncement      = 13,
595                 ResetBrowserState       = 14,
596                 LocalMasterAnnouncement = 15
597         } nbt_browse_opcode;
598
599         typedef struct {
600                 uint8 UpdateCount;
601                 uint32 Periodicity;
602                 [charset(DOS)] uint8 ServerName[16];
603                 uint8 OSMajor;
604                 uint8 OSMinor;
605                 svcctl_ServerType ServerType;
606                 uint8 BroMajorVer;
607                 uint8 BroMinorVer;
608                 uint16 Signature;
609                 astring Comment;
610         } nbt_browse_host_announcement;
611
612         typedef struct {
613                 uint8 Unused;
614                 astring ResponseName;
615         } nbt_browse_announcement_request;
616
617         typedef struct {
618                 uint8 Version;
619                 uint32 Criteria;
620                 uint32 UpTime; /* In milliseconds */
621                 uint32 Reserved; /* Must be zero */
622                 astring ServerName;
623         } nbt_browse_election_request;
624
625         typedef struct {
626                 uint8 ReqCount;
627                 uint32 Token;
628         } nbt_browse_backup_list_request;
629
630         typedef struct {
631                 uint8 BackupCount;
632                 uint32 Token;
633                 nbt_name BackupServerList[BackupCount];/* TODO: this is wrong */
634         } nbt_browse_backup_list_response;
635
636         typedef struct {
637                 astring BrowserName;
638         } nbt_browse_become_backup;
639
640         typedef struct {
641                 uint8 UpdateCount;
642                 uint32 Periodicity;
643                 [charset(DOS)] uint8 ServerName[16];
644                 uint8 OSMajor;
645                 uint8 OSMinor;
646                 svcctl_ServerType ServerType;
647                 uint32 MysteriousField;
648                 astring Comment;
649         } nbt_browse_domain_announcement;
650
651         typedef struct {
652                 astring ServerName;
653         } nbt_browse_master_announcement;
654
655         typedef struct {
656                 uint8 Command;
657         } nbt_browse_reset_state;
658
659         typedef struct {
660                 uint8 UpdateCount;
661                 uint32 Periodicity;
662                 [charset(DOS)] uint8 ServerName[16];
663                 uint8 OSMajor;
664                 uint8 OSMinor;
665                 svcctl_ServerType ServerType;
666                 uint8 BroMajorVer;
667                 uint8 BroMinorVer;
668                 uint16 Signature;
669                 astring Comment;
670         } nbt_browse_local_master_announcement;
671
672         typedef [nodiscriminant] union {
673                 [case(HostAnnouncement)] nbt_browse_host_announcement host_annoucement;
674                 [case(AnnouncementRequest)] nbt_browse_announcement_request announcement_request;
675                 [case(Election)] nbt_browse_election_request election_request;
676                 [case(GetBackupListReq)] nbt_browse_backup_list_request backup_list_request;
677                 [case(GetBackupListResp)] nbt_browse_backup_list_response backup_list_response;
678                 [case(BecomeBackup)] nbt_browse_become_backup become_backup;
679                 [case(DomainAnnouncement)] nbt_browse_domain_announcement domain_announcement;
680                 [case(MasterAnnouncement)] nbt_browse_master_announcement master_announcement;
681                 [case(ResetBrowserState)] nbt_browse_reset_state reset_browser_state;
682                 [case(LocalMasterAnnouncement)] nbt_browse_local_master_announcement local_master_announcement;
683         } nbt_browse_payload;
684
685         typedef [public,flag(NDR_NOALIGN)] struct {
686                 nbt_browse_opcode opcode;
687                 [switch_is(opcode)] nbt_browse_payload payload;
688         } nbt_browse_packet;
689 }