diff options
-rwxr-xr-x | source3/aparser/build | 2 | ||||
-rw-r--r-- | source3/aparser/parser.c | 17 | ||||
-rw-r--r-- | source3/aparser/parser.h | 5 | ||||
-rw-r--r-- | source3/aparser/parsetree.awk | 115 | ||||
-rw-r--r-- | source3/aparser/srvsvc2.struct | 631 | ||||
-rw-r--r-- | source3/aparser/templates/fn_end.tpl | 4 | ||||
-rw-r--r-- | source3/aparser/token.awk | 63 | ||||
-rw-r--r-- | source3/aparser/vluke.c | 2 |
8 files changed, 699 insertions, 140 deletions
diff --git a/source3/aparser/build b/source3/aparser/build index a8b49451f6b..3c212cfe413 100755 --- a/source3/aparser/build +++ b/source3/aparser/build @@ -8,6 +8,6 @@ if ! igawk -f main.awk $file; then fi echo compiling vluke -gcc -Wall -g -o vluke parser.c vluke.c +gcc -Wall -o vluke parser.c vluke.c echo done. diff --git a/source3/aparser/parser.c b/source3/aparser/parser.c index bcd317b57e6..0e5f29b2bc5 100644 --- a/source3/aparser/parser.c +++ b/source3/aparser/parser.c @@ -129,12 +129,11 @@ char *prs_mem_get(prs_struct *ps, uint32 extra_size) Initialise a parse structure - malloc the data if requested. ********************************************************************/ -BOOL prs_init(prs_struct *ps, uint32 size, uint8 align, BOOL io) +BOOL prs_init(prs_struct *ps, uint32 size, BOOL io) { ZERO_STRUCTP(ps); ps->io = io; ps->bigendian_data = False; - ps->align = align; ps->is_dynamic = False; ps->data_offset = 0; ps->buffer_size = 0; @@ -168,12 +167,12 @@ void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name) zeros. ********************************************************************/ -BOOL prs_align(prs_struct *ps) +BOOL prs_align(prs_struct *ps, int align) { - uint32 mod = ps->data_offset & (ps->align-1); + uint32 mod = ps->data_offset & (align-1); - if (ps->align != 0 && mod != 0) { - uint32 extra_space = (ps->align - mod); + if (align != 0 && mod != 0) { + uint32 extra_space = (align - mod); if(!prs_grow(ps, extra_space)) return False; memset(&ps->data_p[ps->data_offset], '\0', (size_t)extra_space); @@ -257,6 +256,8 @@ BOOL io_uint32(char *name, prs_struct *ps, int depth, uint32 *data32, unsigned f if (!(flags & PARSE_SCALARS)) return True; + if (!prs_align(ps, 4)) return False; + q = prs_mem_get(ps, sizeof(uint32)); if (q == NULL) return False; @@ -275,6 +276,8 @@ BOOL io_uint16(char *name, prs_struct *ps, int depth, uint16 *data16, unsigned f if (!(flags & PARSE_SCALARS)) return True; + if (!prs_align(ps, 2)) return False; + q = prs_mem_get(ps, sizeof(uint16)); if (q == NULL) return False; @@ -326,6 +329,8 @@ BOOL io_wstring(char *name, prs_struct *ps, int depth, uint16 *data16s, int len, if (!(flags & PARSE_SCALARS)) return True; + if (!prs_align(ps, 2)) return False; + q = prs_mem_get(ps, len * sizeof(uint16)); if (q == NULL) return False; diff --git a/source3/aparser/parser.h b/source3/aparser/parser.h index 5c3a14c66fe..52d1b839414 100644 --- a/source3/aparser/parser.h +++ b/source3/aparser/parser.h @@ -48,7 +48,6 @@ typedef struct _prs_struct * always little-endian. */ BOOL bigendian_data; - uint8 align; /* data alignment */ BOOL is_dynamic; /* Do we own this memory or not ? */ uint32 data_offset; /* Current working offset into data. */ uint32 buffer_size; /* Current size of the buffer. */ @@ -58,9 +57,9 @@ typedef struct _prs_struct char *prs_mem_get(prs_struct *ps, uint32 extra_size); -BOOL prs_init(prs_struct *ps, uint32 size, uint8 align, BOOL io); +BOOL prs_init(prs_struct *ps, uint32 size, BOOL io); void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name); -BOOL prs_align(prs_struct *ps); +BOOL prs_align(prs_struct *ps, int align); void print_asc(int level, unsigned char *buf,int len); BOOL prs_read(prs_struct *ps, int fd, size_t len, int timeout); void dump_data(int level,char *buf1,int len); diff --git a/source3/aparser/parsetree.awk b/source3/aparser/parsetree.awk index 6fee6e2a4a6..832cd5f2e8d 100644 --- a/source3/aparser/parsetree.awk +++ b/source3/aparser/parsetree.awk @@ -1,5 +1,14 @@ # build the parse tree for a struct file +function find_structure(name, + LOCAL, i) +{ + for (i=0;i<num_structs;i++) { + if (structs[i, "name"] == name) return i; + } + return "-1"; +} + function start_module(name) { module=name; @@ -81,15 +90,119 @@ function start_union(elem) unions[current_union, "num_elems"] = 0; } +function start_union_notencap(switch) +{ + add_struct_elem("uint32", "switch_"switch); + start_union("UNKNOWN[switch_"switch"]"); +} + +function start_union_encap(struct, type, switch, union) +{ + start_struct(struct); + add_struct_elem(type, switch); + add_struct_elem(type, "switch_"switch); + start_union(union"[switch_"switch"]"); + encap_union="1"; +} + function parse_case(case, type, elem, LOCAL, elem_num) { + split(case, a, "[:]"); + case = a[1]; elem_num = unions[current_union, "num_elems"]; unions[current_union, elem_num] = add_element(type, elem, case); unions[current_union, "num_elems"]++; } -function end_union() +function end_union(name) { + if (name!="") { + elements[current_union, "elem"] = name; + } current_union=""; + if (encap_union=="1") { + end_struct(name); + encap_union="0"; + } +} + +function delete_element(struct, elnum, + LOCAL, i) +{ + for (i=elnum;i<structs[struct,"num_elems"]-1;i++) { + structs[struct, i] = structs[struct, i+1]; + } + structs[struct, "num_elems"]--; +} + +function copy_struct(from, to, + LOCAL, i) +{ + for (i=0;i<structs[from,"num_elems"];i++) { + structs[to, i] = structs[from, i]; + } + structs[to, "name"] = structs[from, "name"]; + structs[to, "num_elems"] = structs[from, "num_elems"]; + structs[to, "num_unions"] = structs[from, "num_unions"]; } + +function add_sizeis_array(count, type, elem) +{ + copy_struct(current_struct, current_struct+1); + elem=substr(elem,2); + start_struct("array_"current_struct"_"elem); + add_struct_elem("uint32", count); + add_struct_elem(type, elem"["count"]"); + end_struct(""); + current_struct=num_structs; + add_struct_elem("array_"current_struct-1"_"elem, "*"elem"_ptr"); +} + + +function start_function(type, fname) +{ + start_struct(fname); + add_function_param("[in,out]",".trailer", ""); +} + +function end_function(LOCAL, i) +{ + copy_struct(num_structs, num_structs+1); + structs[num_structs, "name"] = "Q_"structs[num_structs, "name"]; + for (i=0;i<structs[num_structs, "num_elems"];i++) { + if (match(elements[structs[num_structs, i], "properties"], "in") == 0) { + delete_element(num_structs, i); + i--; + } + } + end_struct(); + current_struct=num_structs; + structs[num_structs, "name"] = "R_"structs[num_structs, "name"]; + for (i=0;i<structs[num_structs, "num_elems"];i++) { + if (match(elements[structs[num_structs, i], "properties"], "out") == 0) { + delete_element(num_structs, i); + i--; + } + } + add_function_param("[out]", "STATUS", "status"); + end_struct(); +} + +function add_function_param(properties, type, elem, + LOCAL, elnum, len) +{ + len=length(type); + if (substr(type, len) == "*") { + type=substr(type, 1, len-1); + elem="*"elem; + } + if (substr(elem,1,1) == "*" && + (match(properties,"in") == 0 || + find_structure(type) != "-1")) { + elem=substr(elem, 2); + } + elnum = add_struct_elem(type, elem); + elements[elnum, "properties"] = properties; +} + diff --git a/source3/aparser/srvsvc2.struct b/source3/aparser/srvsvc2.struct index 8c7c2e4155f..bc80d3bc050 100644 --- a/source3/aparser/srvsvc2.struct +++ b/source3/aparser/srvsvc2.struct @@ -1,9 +1,9 @@ module srvsvc -#define BOOL uint32; -#define LONG uint32; -#define DWORD uint32; -#define STATUS uint32; +#define BOOL uint32 +#define LONG uint32 +#define DWORD uint32 +#define STATUS uint32 typedef struct _UNISTR2 { uint32 max_len; @@ -16,6 +16,8 @@ struct LPWSTR { UNISTR2 *str; }; + + /* -- CHARACTER DEVICE INFORMATION -- */ typedef struct _CHARDEV_INFO_0 { @@ -29,64 +31,289 @@ struct LPWSTR { DWORD dwTime; } CHARDEV_INFO_1; - typedef struct _CHARDEV_INFO { - DWORD dwLevel; - union ctr[dwLevel] { - case 1 CHARDEV_INFO_0 *ci0; - case 2 CHARDEV_INFO_1 *ci1; - } + typedef union _CHARDEV_INFO switch (DWORD dwLevel) ctr { + case 1: CHARDEV_INFO_0 *ci0; + case 2: CHARDEV_INFO_1 *ci1; } CHARDEV_INFO; typedef struct _CHARDEV_ENUM_0 { DWORD dwEntries; - CHARDEV_INFO_0 ci0[dwEntries]; + [size_is(dwEntries)] CHARDEV_INFO_0 *ci0; } CHARDEV_ENUM_0; typedef struct _CHARDEV_ENUM_1 { DWORD dwEntries; - CHARDEV_INFO_1 ci1[dwEntries]; + [size_is(dwEntries)] CHARDEV_INFO_1 *ci1; } CHARDEV_ENUM_1; typedef struct _CHARDEV_ENUM { DWORD dwLevel; - union ctr[dwLevel] { - case 0 CHARDEV_ENUM_0 *ce0; - case 1 CHARDEV_ENUM_1 *ce1; - } + [switch_is(dwLevel)] union { + [case(0)] CHARDEV_ENUM_0 *ce0; + [case(1)] CHARDEV_ENUM_1 *ce1; + } ctr; } CHARDEV_ENUM; - struct Q_NetrCharDevEnum { - .trailer; - LPWSTR pszServer; - CHARDEV_ENUM *pCharDevEnum; - DWORD dwMaxLen; - DWORD *hResume; - }; + STATUS NetrCharDevEnum( /* Function 0x00 */ + [in,unique] LPWSTR pszServer, + [in,out] CHARDEV_ENUM* pCharDevEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrCharDevGetInfo( /* Function 0x01 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszDevice, + [in] DWORD dwLevel, + [out] CHARDEV_INFO* pCharDevInfo + ); + + STATUS NetrCharDevControl( /* Function 0x02 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszDevice, + [in] DWORD dwOpcode + ); + + /* -- CHARACTER DEVICE QUEUE INFORMATION -- */ + + typedef struct _CHARDEVQ_INFO_0 { + LPWSTR pszName; + } CHARDEVQ_INFO_0; - struct R_NetrCharDevEnum { - CHARDEV_ENUM *pCharDevEnum; - DWORD *dwEntries; - DWORD *hResume; - .trailer; - STATUS status; - }; + typedef struct _CHARDEVQ_INFO_1 { + LPWSTR pszName; + DWORD dwPriority; + LPWSTR pszDevices; + DWORD dwNumUsers; + DWORD dwNumAhead; + } CHARDEVQ_INFO_1; + + typedef union _CHARDEVQ_INFO switch (DWORD dwLevel) ctr { + case 1: CHARDEVQ_INFO_0 *ci0; + case 2: CHARDEVQ_INFO_1 *ci1; + } CHARDEVQ_INFO; + + typedef struct _CHARDEVQ_ENUM_0 { + DWORD dwEntries; + [size_is(dwEntries)] CHARDEVQ_INFO_0 *ci0; + } CHARDEVQ_ENUM_0; + typedef struct _CHARDEVQ_ENUM_1 { + DWORD dwEntries; + [size_is(dwEntries)] CHARDEVQ_INFO_1 *ci1; + } CHARDEVQ_ENUM_1; + typedef struct _CHARDEVQ_ENUM { + DWORD dwLevel; + [switch_is(dwLevel)] union { + [case(0)] CHARDEVQ_ENUM_0 *ce0; + [case(1)] CHARDEVQ_ENUM_1 *ce1; + } ctr; + } CHARDEVQ_ENUM; + + STATUS NetrCharDevQEnum( /* Function 0x03 */ + [in,unique] LPWSTR pszServer, + [in,unique] LPWSTR pszUser, + [in,out] CHARDEVQ_ENUM* pCharDevQEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrCharDevQGetInfo( /* Function 0x04 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszQueue, + [in,ref] LPWSTR pszUser, + [in] DWORD dwLevel, + [out] CHARDEVQ_INFO* pCharDevQInfo + ); + + STATUS NetrCharDevQSetInfo( /* Function 0x05 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszQueue, + [in] DWORD dwLevel, + [in] CHARDEVQ_INFO* pCharDevQInfo, + [in,out] DWORD* dwParmError + ); + + STATUS NetrCharDevQPurge( /* Function 0x06 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszQueue + ); + + STATUS NetrCharDevQPurgeSelf( /* Function 0x07 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszQueue, + [in,ref] LPWSTR pszComputer + ); + + /* -- CONNECTION INFORMATION -- */ + + typedef struct _CONNECTION_INFO_0 { + DWORD dwConnID; + } CONNECTION_INFO_0; + + typedef struct _CONNECTION_INFO_1 { + DWORD dwConnID; + DWORD dwType; + DWORD dwNumOpens; + DWORD dwNumUsers; + DWORD dwTime; + LPWSTR pszUser; + LPWSTR pszShare; + } CONNECTION_INFO_1; + + typedef struct _CONNECTION_ENUM_0 { + DWORD dwEntries; + [size_is(dwEntries)] CONNECTION_INFO_0 *ci0; + } CONNECTION_ENUM_0; + typedef struct _CONNECTION_ENUM_1 { + DWORD dwEntries; + [size_is(dwEntries)] CONNECTION_INFO_1 *ci1; + } CONNECTION_ENUM_1; -# STATUS NetrCharDevGetInfo( /* Function 0x01 */ -# [in,unique] LPWSTR pszServer, -# [in,ref] LPWSTR pszDevice, -# [in] DWORD dwLevel, -# [out] CHARDEV_INFO* pCharDevInfo -# ); + typedef struct _CONNECTION_ENUM { + DWORD dwLevel; + [switch_is(dwLevel)] union { + [case(0)] CONNECTION_ENUM_0 *ce0; + [case(1)] CONNECTION_ENUM_1 *ce1; + } ctr; + } CONNECTION_ENUM; + + STATUS NetrConnectionEnum( /* Function 0x08 */ + [in,unique] LPWSTR pszServer, + [in,unique] LPWSTR pszClient, + [in,out] CONNECTION_ENUM* pConnectionEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + /* -- FILE INFORMATION -- */ + + typedef struct _FILE_INFO_2 { + DWORD dwFileID; + } FILE_INFO_2; + + typedef struct _FILE_INFO_3 { + DWORD dwFileID; + DWORD dwPermissions; + DWORD dwNumLocks; + LPWSTR pszPath; + LPWSTR pszUser; + } FILE_INFO_3; + + typedef union _FILE_INFO switch (DWORD dwLevel) ctr { + case 2: FILE_INFO_2 *fi2; + case 3: FILE_INFO_3 *fi3; + } FILE_INFO; + + typedef struct _FILE_ENUM_2 { + DWORD dwEntries; + [size_is(dwEntries)] FILE_INFO_2 *fi2; + } FILE_ENUM_2; -# STATUS NetrCharDevControl( /* Function 0x02 */ -# [in,unique] LPWSTR pszServer, -# [in,ref] LPWSTR pszDevice, -# [in] DWORD dwOpcode -# ); + typedef struct _FILE_ENUM_3 { + DWORD dwEntries; + [size_is(dwEntries)] FILE_INFO_3 *fi3; + } FILE_ENUM_3; + typedef struct _FILE_ENUM { + DWORD dwLevel; + [switch_is(dwLevel)] union { + [case(2)] FILE_ENUM_2 *fe2; + [case(3)] FILE_ENUM_3 *fe3; + } ctr; + } FILE_ENUM; + + STATUS NetrFileEnum( /* Function 0x09 */ + [in,unique] LPWSTR pszServer, + [in,unique] LPWSTR pszBasePath, + [in,unique] LPWSTR pszUser, + [in,out] FILE_ENUM* pFileEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrFileGetInfo( /* Function 0x0A */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwFileID, + [in] DWORD dwLevel, + [out] FILE_INFO* pFileInfo + ); + + STATUS NetrFileClose( /* Function 0x0B */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwFileID + ); + + /* -- SESSION INFORMATION -- */ + + typedef struct _SESSION_INFO_0 { + LPWSTR pszClient; + } SESSION_INFO_0; + + typedef struct _SESSION_INFO_1 { + LPWSTR pszClient; + LPWSTR pszUser; + DWORD dwOpens; + DWORD dwTime; + DWORD dwIdleTime; + DWORD dwUserFlags; + } SESSION_INFO_1; + + typedef struct _SESSION_INFO_2 { + LPWSTR pszClient; + LPWSTR pszUser; + DWORD dwOpens; + DWORD dwTime; + DWORD dwIdleTime; + DWORD dwUserFlags; + LPWSTR pszClientType; + } SESSION_INFO_2; + + typedef struct _SESSION_ENUM_0 { + DWORD dwEntries; + [size_is(dwEntries)] SESSION_INFO_0 *si0; + } SESSION_ENUM_0; + + typedef struct _SESSION_ENUM_1 { + DWORD dwEntries; + [size_is(dwEntries)] SESSION_INFO_1 *si1; + } SESSION_ENUM_1; + + typedef struct _SESSION_ENUM_2 { + DWORD dwEntries; + [size_is(dwEntries)] SESSION_INFO_2 *si2; + } SESSION_ENUM_2; + + typedef struct _SESSION_ENUM { + DWORD dwLevel; + [switch_is(dwLevel)] union { + [case(0)] SESSION_ENUM_0 *se0; + [case(1)] SESSION_ENUM_1 *se1; + [case(2)] SESSION_ENUM_2 *se2; + } ctr; + } SESSION_ENUM; + + STATUS NetrSessionEnum( /* Function 0x0C */ + [in,unique] LPWSTR pszServer, + [in,unique] LPWSTR pszClient, + [in,unique] LPWSTR pszUser, + [in,out] SESSION_ENUM* pFileEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrSessionDel( /* Function 0x0D */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszClient, + [in,ref] LPWSTR pszUser + ); /* -- SHARE INFORMATION -- */ @@ -111,58 +338,83 @@ struct LPWSTR { LPWSTR pszPasswd; } SHARE_INFO_2; - typedef struct _SHARE_INFO { - DWORD dwLevel; - union ctr[dwLevel] { - case 0 SHARE_INFO_0 *si0; - case 1 SHARE_INFO_1 *si1; - case 2 SHARE_INFO_2 *si2; - } + typedef union _SHARE_INFO switch (DWORD dwLevel) ctr { + case 0: SHARE_INFO_0 *si0; + case 1: SHARE_INFO_1 *si1; + case 2: SHARE_INFO_2 *si2; } SHARE_INFO; typedef struct _SHARE_ENUM_0 { DWORD dwEntries; - SHARE_INFO_0 si0[dwEntries]; + [size_is(dwEntries)] SHARE_INFO_0 *si0; } SHARE_ENUM_0; typedef struct _SHARE_ENUM_1 { DWORD dwEntries; - SHARE_INFO_1 si1[dwEntries]; + [size_is(dwEntries)] SHARE_INFO_1 *si1; } SHARE_ENUM_1; typedef struct _SHARE_ENUM_2 { DWORD dwEntries; - SHARE_INFO_2 si2[dwEntries]; + [size_is(dwEntries)] SHARE_INFO_2 *si2; } SHARE_ENUM_2; typedef struct _SHARE_ENUM { DWORD dwLevel; - union ctr[dwLevel] { - case 0 SHARE_ENUM_0 *se0; - case 1 SHARE_ENUM_1 *se1; - case 2 SHARE_ENUM_2 *se2; - } + [switch_is(dwLevel)] union { + [case(0)] SHARE_ENUM_0 *se0; + [case(1)] SHARE_ENUM_1 *se1; + [case(2)] SHARE_ENUM_2 *se2; + } ctr; } SHARE_ENUM; - struct Q_NetrShareEnum { - .trailer; - LPWSTR pszServer; - uint32 level; - SHARE_ENUM pShareEnum; - DWORD *hResume; - DWORD dwMaxLen; - DWORD dummy; - }; - - struct R_NetrShareEnum { - DWORD level; - SHARE_ENUM pShareEnum; - DWORD *dwEntries; - DWORD *hResume; - .trailer; - STATUS status; - }; - + STATUS NetrShareAdd( /* Function 0x0E */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwLevel, + [out] SHARE_INFO* pShareInfo, + [in,out] DWORD* dwParmError + ); + + STATUS NetrShareEnum( /* Function 0x0F */ + [in,unique] LPWSTR pszServer, + [in,out] SHARE_ENUM* pShareEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrShareGetInfo( /* Function 0x10 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszShare, + [in] DWORD dwLevel, + [out] SHARE_INFO* pShareInfo + ); + + STATUS NetrShareSetInfo( /* Function 0x11 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszShare, + [in] DWORD dwLevel, + [in] SHARE_INFO* pShareInfo, + [in] DWORD dwReserved + ); + + STATUS NetrShareDel( /* Function 0x12 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszShare, + [in] DWORD dwReserved + ); + + STATUS NetrShareDelSticky( /* Function 0x13 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszShare, + [in] DWORD dwReserved + ); + + STATUS NetrShareCheck( /* Function 0x14 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszDevice, + [out] DWORD* dwType + ); /* --- SERVER INFORMATION --- */ @@ -196,70 +448,203 @@ struct LPWSTR { LPWSTR pszUserPath; } SERVER_INFO_102; - typedef struct _SERVER_INFO { - DWORD dwLevel; - union ctr[dwLevel] { - case 100 SERVER_INFO_100 *sv100; - case 101 SERVER_INFO_101 *sv101; - case 102 SERVER_INFO_102 *sv102; - } + typedef union _SERVER_INFO switch (DWORD dwLevel) ctr { + case 100: SERVER_INFO_100 *sv100; + case 101: SERVER_INFO_101 *sv101; + case 102: SERVER_INFO_102 *sv102; } SERVER_INFO; - struct Q_NetrServerGetInfo { - .trailer; - LPWSTR pszServerName; - DWORD dwLevel; - }; + STATUS NetrServerGetInfo( /* Function 0x15 */ + [in,unique] LPWSTR pszServerName, + [in] DWORD dwLevel, + [out] SERVER_INFO* pServerInfo + ); + + STATUS NetrServerSetInfo( /* Function 0x16 */ + [in,unique] LPWSTR pszServerName, + [in] DWORD dwLevel, + [in] SERVER_INFO* pServerInfo, + [in] DWORD dwReserved + ); - struct R_NetrServerGetInfo { - SERVER_INFO pServerInfo; - .trailer; - STATUS status; - }; + typedef struct _DISK_INFO { + LPWSTR pszName; + } DISK_INFO; + typedef struct _DISK_ENUM { + DWORD dwEntries; + [size_is(dwEntries)] DISK_INFO *di; + } DISK_ENUM; + + STATUS NetrServerDiskEnum( /* Function 0x17 */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwLevel, + [in,out] DISK_ENUM* pDiskEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + typedef struct _STAT_SERVER { + DWORD dwStart; + DWORD dwFOpens; + DWORD dwDevOpens; + DWORD dwJobsQueued; + DWORD dwSOpens; + DWORD dwSTimedOut; + DWORD dwSErrors; + DWORD dwPWErrors; + DWORD dwPermErrors; + DWORD dwSysErrors; + DWORD dwBytesSentLow; + DWORD dwBytesSentHigh; + DWORD dwBytesRcvdLow; + DWORD dwBytesRcvdHigh; + DWORD dwAVResponse; + DWORD dwReqBufNeed; + DWORD dwBigBufNeed; + } STAT_SERVER; + + STATUS NetrServerStatisticsGet( /* Function 0x18 */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwLevel, + [in] DWORD dwOptions, + [out] STAT_SERVER* pStatServer + ); typedef struct _TRANSPORT_INFO_0 { LPWSTR pszName; } TRANSPORT_INFO_0; - typedef struct _TRANSPORT_INFO { - DWORD dwLevel; - union ctr[dwLevel] { - case 0 TRANSPORT_INFO_0 *ti0; - } + typedef union _TRANSPORT_INFO switch (DWORD dwLevel) ctr { + case 0: TRANSPORT_INFO_0 *ti0; } TRANSPORT_INFO; typedef struct _TRANSPORT_ENUM_0 { - DWORD level; - DWORD dwEntries; - TRANSPORT_INFO_0 ti0[dwEntries]; + DWORD dwEntries; + [size_is(dwEntries)] TRANSPORT_INFO_0 *ti0; } TRANSPORT_ENUM_0; typedef struct _TRANSPORT_ENUM { DWORD dwLevel; - DWORD dummy; - union ctr[dwLevel] { - case 0 TRANSPORT_ENUM_0 *te0; - } + [switch_is(dwLevel)] union { + [case(0)] TRANSPORT_ENUM_0 *te0; + } ctr; } TRANSPORT_ENUM; + STATUS NetrServerTransportAdd( /* Function 0x19 */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwLevel, + [out] TRANSPORT_INFO* pTransportInfo + ); + + STATUS NetrServerTransportEnum( /* Function 0x1a */ + [in,unique] LPWSTR pszServer, + [in,out] TRANSPORT_ENUM* pTransportEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrServerTransportDel( /* Function 0x1b */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwLevel, + [out] TRANSPORT_INFO* pTransportInfo + ); + + typedef struct _TIME_OF_DAY { + DWORD dwElapsedTime; + DWORD dwMsecs; + DWORD dwHours; + DWORD dwMins; + DWORD dwSecs; + DWORD dwHunds; + LONG lTimeZone; + DWORD dwInterval; + DWORD dwDay; + DWORD dwMonth; + DWORD dwYear; + DWORD dwWeekday; + } TIME_OF_DAY; + + STATUS NetrRemoteTOD( /* Function 0x1c */ + [in,unique] LPWSTR pszServer, + [out] TIME_OF_DAY* pTOD + ); + + STATUS NetrServerSetServiceBits( /* Function 0x1d */ + [in,unique] LPWSTR pszServer, + [in] DWORD hServiceStatus, /* ?? */ + [in] DWORD dwServiceBits, + [in] BOOL bSetBitsOn, + [in] BOOL bUpdateImmediately + ); + + /* --- PATH INFORMATION --- */ + + STATUS NetprPathType( /* Function 0x1e */ + void /* Not known */ + ); + + STATUS NetprPathCanonicalize( /* Function 0x1f */ + void /* Not known */ + ); + + STATUS NetprPathCompare( /* Function 0x20 */ + void /* Not known */ + ); + + STATUS NetprNameValidate( /* Function 0x21 */ + void /* Not known */ + ); + + STATUS NetprNameCanonicalize( /* Function 0x22 */ + void /* Not known */ + ); + + STATUS NetprNameCompare( /* Function 0x23 */ + void /* Not known */ + ); + + /* --- LATER ADDITIONS --- */ + + STATUS NetrShareEnumSticky( /* Function 0x24 */ + [in,unique] LPWSTR pszServer, + [in,out] SHARE_ENUM* pShareEnum, + [in] DWORD dwMaxLen, + [out] DWORD* dwEntries, + [in,out] DWORD* hResume + ); + + STATUS NetrShareDelStart( /* Function 0x25 */ + [in,unique] LPWSTR pszServer, + [in,ref] LPWSTR pszShare, + [in] DWORD dwReserved /* ? */ + ); + + STATUS NetrShareDelCommit( /* Function 0x26 */ + [in,unique] LPWSTR pszServer + ); + + STATUS NetrpGetFileSecurity( /* Function 0x27 */ + void /* Not known */ + ); + + STATUS NetrpSetFileSecurity( /* Function 0x28 */ + void /* Not known */ + ); + + STATUS NetrServerTransportAddEx( /* Function 0x29 */ + [in,unique] LPWSTR pszServer, + [in] DWORD dwLevel, + [out] TRANSPORT_INFO* pTransportInfo + ); + + STATUS NetrServerSetServiceBitsEx( /* Function 0x30 */ + [in,unique] LPWSTR pszServer, + [in] DWORD hServiceStatus, /* ?? */ + [in] DWORD dwServiceBits, + [in] BOOL bSetBitsOn, + [in] BOOL bUpdateImmediately + ); - struct Q_NetrServerTransportEnum { - .trailer; - LPWSTR pszServer; - TRANSPORT_ENUM pTransportEnum; - DWORD dwMaxLen; - LPWSTR server2; - DWORD *hResume; - DWORD preferred_length; - STATUS *status; - }; - - struct R_NetrServerTransportEnum { - DWORD level; - TRANSPORT_ENUM pTransportEnum; - DWORD *dwEntries; - DWORD *hResume; - .trailer; - STATUS status; - }; diff --git a/source3/aparser/templates/fn_end.tpl b/source3/aparser/templates/fn_end.tpl index 38cf10d1b20..df62f6c0ac7 100644 --- a/source3/aparser/templates/fn_end.tpl +++ b/source3/aparser/templates/fn_end.tpl @@ -1,8 +1,6 @@ end: - /* the parse is OK, just align and end */ - if (!prs_align(ps)) goto fail; - + /* the parse is OK */ return True; fail: diff --git a/source3/aparser/token.awk b/source3/aparser/token.awk index d0703439e99..0c4c7f65b19 100644 --- a/source3/aparser/token.awk +++ b/source3/aparser/token.awk @@ -10,7 +10,7 @@ function parse_error(msg) { next; } -/^\#define.*;/ { +/^\#define.*/ { split($0,a,"[ \t;]*"); parse_define(a[2], a[3]); next; @@ -46,6 +46,20 @@ function parse_error(msg) { next; } +/^[ \t]*typedef union.*\{/ { + {if (current_struct!="") parse_error("this cannot appear inside a structure");} + split($0,a,"[ \t;()]*"); + start_union_encap(a[4], a[6], a[7], a[8]); + next; +} + +/^[ \t]*STATUS.*\(/ { + {if (current_struct!="") parse_error("you cannot have nested structures");} + split($0,a,"[ \t;()]*"); + start_function(a[2], a[3]); + next; +} + {if (current_struct=="") parse_error("this must appear inside a structure");} /^[ \t]*union.*\{/ { @@ -54,6 +68,13 @@ function parse_error(msg) { next; } +/^[ \t]*\[switch_is.*union.*\{/ { + {if (current_union!="") parse_error("you cannot have nested unions");} + split($0,a,"[ \t;()]*"); + start_union_notencap(a[3]); + next; +} + /^[ \t]*case.*;/ { {if (current_union=="") parse_error("this must appear inide a union");} split($0,a,"[ \t;]*"); @@ -61,12 +82,27 @@ function parse_error(msg) { next; } +/^[ \t]*\[case(.*)\].*;/ { + {if (current_union=="") parse_error("this must appear inide a union");} + split($0,a,"[ \t;()[\]]*"); + parse_case(a[6],a[8],a[9]); + next; +} + /^[ \t]*\}$/ { {if (current_union=="") parse_error("this must appear inside a union");} - end_union(); + end_union(""); next; } +/^[ \t]*\} .*;/ { + if (current_union!="") { + split($2,a,"[ \t;]*"); + end_union(a[1]); + next; + } +} + {if (current_union!="") parse_error("this cannot appear inside a union");} /^[ \t]*\};/ { @@ -80,12 +116,35 @@ function parse_error(msg) { next; } +/^[ \t]*\);/ { + end_function(); + next; +} + +/^.*size_is.*\*.*;/ { + split($0,a,"[ \t;()]*"); + add_sizeis_array(a[3], a[5], a[6]); + next; +} + /^.*;/ { split($0,a,"[ \t;]*"); add_struct_elem(a[2], a[3]); next; } +/^[\t ]*void/ { + next; +} + +/^[ \t]*\[.*\].*/ { + split($0,a,"[ \t;]*"); + split(a[4], b, "[,]"); + add_function_param(a[2], a[3], b[1]); + next; +} + { parse_error("Unknown construct."); } + diff --git a/source3/aparser/vluke.c b/source3/aparser/vluke.c index d26d1d04de6..15608ae01ab 100644 --- a/source3/aparser/vluke.c +++ b/source3/aparser/vluke.c @@ -31,7 +31,7 @@ int main(int argc, char *argv[]) } fstat(fd, &st); - prs_init(&ps, 0, 4, MARSHALL); + prs_init(&ps, 0, MARSHALL); ps.is_dynamic=True; prs_read(&ps, fd, st.st_size, 0); ps.data_offset = 0; |