summaryrefslogtreecommitdiff
path: root/librpc/idl/cab.idl
blob: 2174bce73343a11cefaafa109c053719b9c6b569 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "idl_types.h"

import "misc.idl";

/*
   IDL structures defining Cabinet files

   more info can be found at:
   https://msdn.microsoft.com/en-us/library/bb267310.aspx#cabinet_format
*/

[
	pointer_default(unique),
	helper("../librpc/ndr/ndr_cab.h"),
	helpstring("Cabinet structure"),
	uuid("12345678-0000-0000-0000-00000000")
]
	interface cab
{

	/*
	 * flags.cfhdrPREV_CABINET is set if this cabinet file is not the first in
	 * a set of cabinet files. When this bit is set, the szCabinetPrev and
	 * szDiskPrev fields are present in this CFHEADER.
	 *
	 * flags.cfhdrNEXT_CABINET is set if this cabinet file is not the last in a
	 * set of cabinet files. When this bit is set, the szCabinetNext and
	 * szDiskNext fields are present in this CFHEADER.
	 *
	 * flags.cfhdrRESERVE_PRESENT is set if this cabinet file contains any
	 * reserved fields. When this bit is set, the cbCFHeader, cbCFFolder, and
	 * cbCFData fields are present in this CFHEADER.
	 */

	typedef [bitmap16bit] bitmap {
		cfhdrPREV_CABINET	= 0x0001,
		cfhdrNEXT_CABINET	= 0x0002,
		cfhdrRESERVE_PRESENT	= 0x0004
	} cf_flags;

	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
		[charset(DOS),value("MSCF")] uint8 signature[4];
		[value(0)] uint32 reserved1;	/* reserved */
		uint32 cbCabinet;		/* size of this cabinet file in bytes */
		[value(0)] uint32 reserved2;	/* reserved */
		[value(cFolders*8+36)] uint32 coffFiles;		/* offset of the first CFFILE entry */
		[value(0)] uint32 reserved3;	/* reserved */
		[value(3)] uint8 versionMinor;	/* cabinet file format version, minor */
		[value(1)] uint8 versionMajor;	/* cabinet file format version, major */
		uint16 cFolders;		/* number of CFFOLDER entries in this cabinet */
		uint16 cFiles;			/* number of CFFILE entries in this cabinet */
		cf_flags flags;			/* cabinet file option indicators */
		uint16 setID;			/* must be the same for all cabinets in a set */
		uint16 iCabinet;		/* number of this cabinet file in a set */
#if 0
		[range(0,60000)] uint16 cbCFHeader;	/* (optional) size of per-cabinet reserved area */
		[range(0,255)] uint8 cbCFFolder;	/* (optional) size of per-folder reserved area */
		[range(0,255)] uint8 cbCFData;		/* (optional) size of per-datablock reserved area */
		uint8 abReserve[];		/* (optional) per-cabinet reserved area */
		uint8 szCabinetPrev[];		/* (optional) name of previous cabinet file */
		uint8 szDiskPrev[];		/* (optional) name of previous disk */
		uint8 szCabinetNext[];		/* (optional) name of next cabinet file */
		uint8 szDiskNext[];		/* (optional) name of next disk */
#endif
	} CFHEADER;

	typedef enum {
		CF_COMPRESS_NONE = 0,
		CF_COMPRESS_MSZIP = 1,
		CF_COMPRESS_LZX = 4611
	} cf_compress_type;

	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
		uint32 coffCabStart;	/* offset of the first CFDATA block in this folder */
		uint16 cCFData;		/* number of CFDATA blocks in this folder */
		cf_compress_type typeCompress;	/* compression type indicator */
#if 0
		uint8 abReserve[];	/* (optional) per-folder reserved area */
#endif
	} CFFOLDER;

	const int ifoldCONTINUED_FROM_PREV	= 0xFFFD;
	const int ifoldCONTINUED_TO_NEXT	= 0xFFFE;
	const int ifoldCONTINUED_PREV_AND_NEXT	= 0xFFFF;

	typedef [bitmap16bit] bitmap {
		_A_RDONLY	= 0x01,  /* file is read-only */
		_A_HIDDEN	= 0x02,  /* file is hidden */
		_A_SYSTEM	= 0x04,  /* file is a system file */
		_A_ARCH		= 0x20,  /* file modified since last backup */
		_A_EXEC		= 0x40,  /* run after extraction */
		_A_NAME_IS_UTF	= 0x80  /* szName[] contains UTF */
	} cf_attributes;

	typedef [noprint,flag(NDR_NOALIGN)] struct {
		uint16 date;
	} cf_date;

	typedef [noprint,flag(NDR_NOALIGN)] struct {
		uint16 time;
	} cf_time;

	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN),gensize] struct {
		uint32 cbFile;		/* uncompressed size of this file in bytes */
		uint32 uoffFolderStart;	/* uncompressed offset of this file in the folder */
		uint16 iFolder;		/* index into the CFFOLDER area */
		cf_date date;		/* date stamp for this file */
		cf_time time;		/* time stamp for this file */
		cf_attributes attribs;	/* attribute flags for this file */
		[flag(r->attribs & _A_NAME_IS_UTF ? STR_UTF8|STR_NULLTERM : STR_ASCII|STR_NULLTERM)] string szName;
	} CFFILE;

	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
		[value(ndr_cab_generate_checksum(r))] uint32 csum;		/* checksum of this CFDATA entry */
		uint16 cbData;		/* number of compressed bytes in this block */
		uint16 cbUncomp;	/* number of uncompressed bytes in this block */
#if 0
		uint8 abReserve[];	/* (optional) per-datablock reserved area */
#endif
		uint8 ab[cbData];	/* compressed data bytes */
	} CFDATA;

	typedef [nopush,nopull,public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
		CFHEADER cfheader;
		CFFOLDER cffolders[cfheader.cFolders];
		CFFILE cffiles[cfheader.cFiles];
		[noprint,value(ndr_count_cfdata(r))] uint32 cfdata_count;
		CFDATA cfdata[cfdata_count];
	} cab_file;

	void decode_cab_file(
		[in] cab_file file
		);

}