呵呵
代码如下:
1
using System;
2
using System.Text;
3
using System.Runtime.InteropServices;
4![](/Images/OutliningIndicators/None.gif)
5
namespace JillZhang.Security
6
{
7
public enum Store
8
{
9
USE_NACHINE_STORE=1,USE_USER_STORE
10
};
11
public class DataProtector
12
{
13
14
[DllImport("Crypt32.dll",SetLastError=true,CharSet=System.Runtime.InteropServices.CharSet.Auto)]
15
private static extern bool CryptProtectData
16
(
17
ref DATA_BLOB pDataIn,
18
String szDataDecr,
19
ref DATA_BLOB pOptionEntropy,
20
IntPtr pvReserved,
21
ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct,
22
int dwFlags,
23
ref DATA_BLOB pDataOut
24
);
25![](/Images/OutliningIndicators/InBlock.gif)
26
[DllImport("Crypt32.dll",SetLastError=true,CharSet=System.Runtime.InteropServices.CharSet.Auto)]
27
private static extern bool CryptUnprotectData
28
(
29
ref DATA_BLOB pDataIn,
30
String szDataDecr,
31
ref DATA_BLOB pOptionEntropy,
32
IntPtr pvReserved,
33
ref CRYPTPROTECT_PROMPTSTRUCT pPromptStruct,
34
int dwFlags,
35
ref DATA_BLOB pDataOut
36
);
37![](/Images/OutliningIndicators/InBlock.gif)
38
[DllImport("kernel32.dll",CharSet=System.Runtime.InteropServices.CharSet.Auto)]
39
private unsafe static extern int FormatMessage
40
(
41
int dwFlags,
42
ref IntPtr lpSource,
43
int dwMessageId,
44
int dwLanguageId,
45
ref String lpBuffer,
46
int nSize,
47
IntPtr *Arguments
48
);
49
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
50
internal struct DATA_BLOB
51
{
52
public int cbData;
53
public IntPtr pbData;
54
}
55
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
56
internal struct CRYPTPROTECT_PROMPTSTRUCT
57
{
58
public int cbSize;
59
public int dwPromptFlags;
60
public IntPtr hwndApp;
61
public String szPrompt;
62
}
63
static private IntPtr NullPtr=((IntPtr)((int)(0)));
64
private const int CRYPTPROTECT_UI_FORBIDDEN=0x1;
65
private const int CRYPTPROTECT_LOCAL_MACHINE=0x4;
66
67
private Store store;
68
public DataProtector(Store tempStore)
69
{
70
store=tempStore;
71
}
72
public byte[] Encrypt(byte[] plainText,byte[] optionalEntropy)
73
{
74
bool reVal=false;
75
DATA_BLOB plainTextBlob = new DATA_BLOB();
76
DATA_BLOB cipherTextBlob=new DATA_BLOB();
77
DATA_BLOB entropyBlob = new DATA_BLOB();
78
CRYPTPROTECT_PROMPTSTRUCT prompt=new CRYPTPROTECT_PROMPTSTRUCT();
79
InitPromptstruct(ref prompt);
80
int dwFlags;
81
try
82
{
83
try
84
{
85
int byteSize=plainText.Length;
86
plainTextBlob.pbData=Marshal.AllocHGlobal(byteSize);
87
if(IntPtr.Zero==plainTextBlob.pbData)
88
{
89
throw new Exception("Unable to allocate plaintext buffer:");
90
}
91
plainTextBlob.cbData=byteSize;
92
Marshal.Copy(plainText,0,plainTextBlob.pbData,byteSize);
93
}
94
catch(Exception ex)
95
{
96
throw new Exception("Exception marshalling data.:"+ex.Message);
97
}
98
if(Store.USE_NACHINE_STORE==store)
99
{
100
//计算机存储区
101
dwFlags=CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN;
102
if(null==optionalEntropy)
103
{
104
optionalEntropy=new byte[0];
105
}
106
try
107
{
108
int byteSize=optionalEntropy.Length;
109
entropyBlob.pbData=Marshal.AllocHGlobal(optionalEntropy.Length);
110
if(IntPtr.Zero==entropyBlob.pbData)
111
{
112
throw new Exception("Unable to allocate entropy data buffer.");
113
}
114
Marshal.Copy(optionalEntropy,0,entropyBlob.pbData,byteSize);
115
entropyBlob.cbData=byteSize;
116
}
117
catch(Exception ex)
118
{
119
throw new Exception("Exception entropy marshalling data."+ex.Message);
120
}
121
}
122
else
123
{
124
dwFlags=CRYPTPROTECT_UI_FORBIDDEN;
125
}
126
reVal=CryptProtectData(ref plainTextBlob,"",ref entropyBlob,IntPtr.Zero,ref prompt,dwFlags,ref cipherTextBlob);
127
if(false == reVal)
128
{
129
throw new Exception("Encryption failed."+GetErrorMessage(Marshal.GetLastWin32Error()));
130
}
131
}
132
catch(Exception ex)
133
{
134
throw new Exception("Exception encrypting:"+ex.Message);
135
}
136
byte[] cipherText = new byte[cipherTextBlob.cbData];
137
Marshal.Copy(cipherTextBlob.pbData,cipherText,0,cipherTextBlob.cbData);
138
return cipherText;
139
}
140
public byte[] Decrypt(byte[] ciperText,byte[] optionalEntropy)
141
{
142
bool reVal=false;
143
DATA_BLOB plainTextBlob=new DATA_BLOB();
144
DATA_BLOB cipherBlob=new DATA_BLOB();
145
CRYPTPROTECT_PROMPTSTRUCT prompt=new CRYPTPROTECT_PROMPTSTRUCT();
146
InitPromptstruct(ref prompt);
147
try
148
{
149
try
150
{
151
int cipherTextSize=ciperText.Length;
152
cipherBlob.pbData=Marshal.AllocHGlobal(cipherTextSize);
153
if(IntPtr.Zero==cipherBlob.pbData)
154
{
155
throw new Exception("unable to allocate cipherText buffer.");
156
}
157
cipherBlob.cbData=cipherTextSize;
158
Marshal.Copy(ciperText,0,cipherBlob.pbData,cipherBlob.cbData);
159
}
160
catch(Exception ex)
161
{
162
throw new Exception("Exception marshalling data."+ex.Message);
163
}
164
DATA_BLOB entropyBlob=new DATA_BLOB();
165
int dwFlags;
166
if(Store.USE_NACHINE_STORE==store)
167
{
168
dwFlags=CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN;
169
if(null==optionalEntropy)
170
{
171
optionalEntropy=new byte[0];
172
}
173
try
174
{
175
int byteSize=optionalEntropy.Length;
176
entropyBlob.pbData=Marshal.AllocHGlobal(byteSize);
177
if(IntPtr.Zero==entropyBlob.pbData)
178
{
179
throw new Exception("Unable to allocate entropy buffer.");
180
}
181
entropyBlob.cbData=byteSize;
182
Marshal.Copy(optionalEntropy,0,entropyBlob.pbData,byteSize);
183
}
184
catch(Exception ex)
185
{
186
throw new Exception("Exception entropy marshalling data."+ex.Message);
187
}
188
}
189
else
190
{
191
dwFlags=CRYPTPROTECT_UI_FORBIDDEN;
192
}
193
reVal=CryptUnprotectData(ref cipherBlob,null,ref entropyBlob,IntPtr.Zero,ref prompt,dwFlags,ref plainTextBlob);
194
if(false==reVal)
195
{
196
throw new Exception("Decryption failed."+GetErrorMessage(Marshal.GetLastWin32Error()));
197
}
198
if(IntPtr.Zero!=cipherBlob.pbData)
199
{
200
Marshal.FreeHGlobal(cipherBlob.pbData);
201
}
202
if(IntPtr.Zero!=entropyBlob.pbData)
203
{
204
Marshal.FreeHGlobal(entropyBlob.pbData);
205
}
206
207
}
208
catch(Exception ex)
209
{
210
throw new Exception("Exception decrypting."+ex.Message);
211
}
212
byte[] plainText=new byte[plainTextBlob.cbData];
213
Marshal.Copy(plainTextBlob.pbData,plainText,0,plainTextBlob.cbData);
214
return plainText;
215
}
216![](/Images/OutliningIndicators/InBlock.gif)
217
private void InitPromptstruct(ref CRYPTPROTECT_PROMPTSTRUCT ps)
218
{
219
ps.cbSize=Marshal.SizeOf(typeof(CRYPTPROTECT_PROMPTSTRUCT));
220
ps.dwPromptFlags=0;
221
ps.hwndApp=NullPtr;
222
ps.szPrompt=null;
223
}
224
private unsafe static String GetErrorMessage(int errorCode)
225
{
226
int FORMAT_MESSAGE_ALLOCATE_BUFFER=0x00000100;
227
int FORMAT_MESSAGE_IGNORE_INSERTS=0x00000200;
228
int FORMAT_MESSAGE_FROM_SYSTEM=0x00001000;
229
int messageSize=255;
230
String lpMsgBuf="";
231
int dwFlags=FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS;
232
IntPtr ptrlpSource=new IntPtr();
233
IntPtr ptrArgument=new IntPtr();
234
int retVal=FormatMessage(dwFlags,ref ptrlpSource,errorCode,0,ref lpMsgBuf,messageSize,&ptrArgument);
235
if(0==retVal)
236
{
237
throw new Exception("Failed to format message for error code"+errorCode+".");
238
}
239
return lpMsgBuf;
240
}
241![](/Images/OutliningIndicators/InBlock.gif)
242
}
243
}
244![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
119
![](/Images/OutliningIndicators/InBlock.gif)
120
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
121
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/InBlock.gif)
128
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
131
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
132
![](/Images/OutliningIndicators/InBlock.gif)
133
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
151
![](/Images/OutliningIndicators/InBlock.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/InBlock.gif)
167
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
168
![](/Images/OutliningIndicators/InBlock.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
171
![](/Images/OutliningIndicators/InBlock.gif)
172
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
173
![](/Images/OutliningIndicators/InBlock.gif)
174
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
175
![](/Images/OutliningIndicators/InBlock.gif)
176
![](/Images/OutliningIndicators/InBlock.gif)
177
![](/Images/OutliningIndicators/InBlock.gif)
178
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
179
![](/Images/OutliningIndicators/InBlock.gif)
180
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
181
![](/Images/OutliningIndicators/InBlock.gif)
182
![](/Images/OutliningIndicators/InBlock.gif)
183
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
184
![](/Images/OutliningIndicators/InBlock.gif)
185
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
186
![](/Images/OutliningIndicators/InBlock.gif)
187
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
188
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
191
![](/Images/OutliningIndicators/InBlock.gif)
192
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/InBlock.gif)
195
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
200
![](/Images/OutliningIndicators/InBlock.gif)
201
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
202
![](/Images/OutliningIndicators/InBlock.gif)
203
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
204
![](/Images/OutliningIndicators/InBlock.gif)
205
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
206
![](/Images/OutliningIndicators/InBlock.gif)
207
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
210
![](/Images/OutliningIndicators/InBlock.gif)
211
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
212
![](/Images/OutliningIndicators/InBlock.gif)
213
![](/Images/OutliningIndicators/InBlock.gif)
214
![](/Images/OutliningIndicators/InBlock.gif)
215
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
216
![](/Images/OutliningIndicators/InBlock.gif)
217
![](/Images/OutliningIndicators/InBlock.gif)
218
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
219
![](/Images/OutliningIndicators/InBlock.gif)
220
![](/Images/OutliningIndicators/InBlock.gif)
221
![](/Images/OutliningIndicators/InBlock.gif)
222
![](/Images/OutliningIndicators/InBlock.gif)
223
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
224
![](/Images/OutliningIndicators/InBlock.gif)
225
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
226
![](/Images/OutliningIndicators/InBlock.gif)
227
![](/Images/OutliningIndicators/InBlock.gif)
228
![](/Images/OutliningIndicators/InBlock.gif)
229
![](/Images/OutliningIndicators/InBlock.gif)
230
![](/Images/OutliningIndicators/InBlock.gif)
231
![](/Images/OutliningIndicators/InBlock.gif)
232
![](/Images/OutliningIndicators/InBlock.gif)
233
![](/Images/OutliningIndicators/InBlock.gif)
234
![](/Images/OutliningIndicators/InBlock.gif)
235
![](/Images/OutliningIndicators/InBlock.gif)
236
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
237
![](/Images/OutliningIndicators/InBlock.gif)
238
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
239
![](/Images/OutliningIndicators/InBlock.gif)
240
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
241
![](/Images/OutliningIndicators/InBlock.gif)
242
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
243
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
244
![](/Images/OutliningIndicators/None.gif)