1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

more aparser stuff - we now handle everything but the idl headers in srvsvc.idl

(This used to be commit 5f1e8422d0ebc589cdfe95f1001a8e55cb60af4a)
This commit is contained in:
Andrew Tridgell 2000-05-22 09:09:37 +00:00
parent 74d677ec59
commit 943340a5a3
8 changed files with 696 additions and 137 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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
);
struct R_NetrCharDevEnum {
CHARDEV_ENUM *pCharDevEnum;
DWORD *dwEntries;
DWORD *hResume;
.trailer;
STATUS status;
};
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;
# STATUS NetrCharDevGetInfo( /* Function 0x01 */
# [in,unique] LPWSTR pszServer,
# [in,ref] LPWSTR pszDevice,
# [in] DWORD dwLevel,
# [out] CHARDEV_INFO* pCharDevInfo
# );
typedef struct _CHARDEVQ_INFO_1 {
LPWSTR pszName;
DWORD dwPriority;
LPWSTR pszDevices;
DWORD dwNumUsers;
DWORD dwNumAhead;
} CHARDEVQ_INFO_1;
# STATUS NetrCharDevControl( /* Function 0x02 */
# [in,unique] LPWSTR pszServer,
# [in,ref] LPWSTR pszDevice,
# [in] DWORD dwOpcode
# );
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;
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;
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;
};
STATUS NetrShareAdd( /* Function 0x0E */
[in,unique] LPWSTR pszServer,
[in] DWORD dwLevel,
[out] SHARE_INFO* pShareInfo,
[in,out] DWORD* dwParmError
);
struct R_NetrShareEnum {
DWORD level;
SHARE_ENUM pShareEnum;
DWORD *dwEntries;
DWORD *hResume;
.trailer;
STATUS status;
};
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
);
struct R_NetrServerGetInfo {
SERVER_INFO pServerInfo;
.trailer;
STATUS status;
};
STATUS NetrServerSetInfo( /* Function 0x16 */
[in,unique] LPWSTR pszServerName,
[in] DWORD dwLevel,
[in] SERVER_INFO* pServerInfo,
[in] DWORD dwReserved
);
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
);
struct Q_NetrServerTransportEnum {
.trailer;
LPWSTR pszServer;
TRANSPORT_ENUM pTransportEnum;
DWORD dwMaxLen;
LPWSTR server2;
DWORD *hResume;
DWORD preferred_length;
STATUS *status;
};
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 R_NetrServerTransportEnum {
DWORD level;
TRANSPORT_ENUM pTransportEnum;
DWORD *dwEntries;
DWORD *hResume;
.trailer;
STATUS status;
};

View File

@ -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:

View File

@ -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.");
}

View File

@ -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;