module srvsvc

typedef uint32 LONG;
typedef uint32 *ENUM_HND;

typedef struct _UNISTR2 {
       uint32 max_len;
       uint32 undoc;
       uint32 str_len;
       wchar  buffer[str_len];
} UNISTR2;

typedef UNISTR2 *LPWSTR;

/* function 8 */
struct CONN_INFO_0 {
	uint32 id; /* connection id. */
};

struct CONN_INFO_1 {
	uint32 id; 
	uint32 type;
	uint32 num_opens;
	uint32 num_users;
	uint32 open_time;
	LPWSTR usr_name;
	LPWSTR net_name; 
};

struct CONN_ENUM_CTR {
	uint32 level;
	uint32 level2;
	uint32 num_entries;
	uint32 num_entries2;
	union *info[level] {
		case 0 CONN_INFO_0 info0[num_entries]; 
		case 1 CONN_INFO_1 info1[num_entries]; 
	}
};

struct SRV_R_NET_CONN_ENUM {
        .trailer;
	CONN_ENUM_CTR ctr;
        uint32 num_entries;
        ENUM_HND handle;
        uint32 status2;
};

struct SRV_Q_NET_CONN_ENUM {
       .trailer;
       LPWSTR dest_srv;
       LPWSTR qual_srv;
       uint32 level;
       uint32 level2;
       CONN_ENUM_CTR *ctr;
       uint32 max_len;
       ENUM_HND handle;
};

/* function 9 */
struct FILE_INFO_3 {
	uint32 id;            /* file index */
	uint32 perms;         /* file permissions. don't know what format */
	uint32 num_locks;     /* file locks */
	LPWSTR path_name; /* file name */
	LPWSTR user_name; /* file owner */
};

struct SRV_FILE_INFO_CTR {
	uint32 level;
	uint32 num_entries;
	uint32 dummy;
	union *file[level] {
	      case 3 FILE_INFO_3 info3[num_entries];
	}
};

struct SRV_Q_NET_FILE_ENUM {
       .trailer;
       LPWSTR srv_name;
       LPWSTR qual_name;
       uint32 dummy;
       uint32 level;
       SRV_FILE_INFO_CTR ctr;
       uint32 *status;
       uint32 preferred_len;
       ENUM_HND enum_hnd;
};


struct SRV_R_NET_FILE_ENUM {
       .trailer;
       uint32 level;
       uint32 dummy;
       SRV_FILE_INFO_CTR *ctr;
       uint32 total_entries;                    /* total number of files */
       ENUM_HND enum_hnd;
       uint32 status;        /* return status */
};


/* function 15 */
struct SRV_SHARE_INFO_1 {
	LPWSTR uni_netname;
	uint32 type;
	LPWSTR uni_remark;
};

struct SRV_SHARE_INFO_2 {
	LPWSTR uni_netname;
	uint32 type;
	LPWSTR uni_remark;
	uint32 perms;
	uint32 max_uses;
	uint32 num_uses;
	LPWSTR path;
	LPWSTR passwd;
};

struct SRV_R_NET_SHARE_ENUM {
       uint32 level;
       uint32 level2;
       uint32 *ret_count;
       uint32 num_entries;
       union *info[level] {
              case 1 SRV_SHARE_INFO_1 info1[num_entries];
              case 2 SRV_SHARE_INFO_2 info2[num_entries];
       }
       .trailer;
       uint32 count;
       ENUM_HND handle;
       uint32 status;
};



/* function 21 */
struct SERVER_INFO_100 {
	uint32  dwPlatformID;
	LPWSTR pszName;
};

struct SERVER_INFO_101 {
	    uint32  dwPlatformID;
	    LPWSTR pszName;
	    uint32  dwVerMajor;
	    uint32  dwVerMinor;
	    uint32  dwType;
	    LPWSTR pszComment;
};

struct SERVER_INFO_102 {
    uint32 dwPlatformID;
    LPWSTR pszName;
    uint32 dwVerMajor;
    uint32 dwVerMinor;
    uint32 dwType;
    LPWSTR pszComment;
    uint32 dwUsers;
    uint32 lDisc;
    uint32 bHidden;
    uint32 dwAnnounce;
    uint32 dwAnnDelta;
    uint32 dwLicenses;
    LPWSTR pszUserPath;
};

struct SRV_R_NET_SERVER_INFO {
       .trailer;
       uint32 level;
       union *info[level] {
		case 100 SERVER_INFO_100 sv100;
		case 101 SERVER_INFO_101 sv101;
		case 102 SERVER_INFO_102 sv102;
       }
       uint32 status;
};

struct SRV_Q_NET_SERVER_INFO {
       .trailer;
       LPWSTR server;
       uint32 level;
};