1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 use ctypes::{c_char, c_int};
7 use shared::minwindef::{BOOL, DWORD, INT, LPDWORD, LPINT, LPVOID, ULONG};
8 use shared::mswsockdef::{PRIORESULT, PRIO_BUF, RIO_BUFFERID, RIO_CQ, RIO_RQ};
9 use shared::ws2def::{IOC_VENDOR, IOC_WS2, LPWSAMSG, SOCKADDR};
10 use um::minwinbase::LPOVERLAPPED;
11 use um::winnt::{CHAR, HANDLE, LARGE_INTEGER, PCHAR, PVOID, WCHAR};
12 use um::winsock2::{
13     LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE, LPWSAPOLLFD, SOCKET, WSAESETSERVICEOP,
14     WSAPOLLFD,
15 };
16 pub const SO_CONNDATA: c_int = 0x7000;
17 pub const SO_CONNOPT: c_int = 0x7001;
18 pub const SO_DISCDATA: c_int = 0x7002;
19 pub const SO_DISCOPT: c_int = 0x7003;
20 pub const SO_CONNDATALEN: c_int = 0x7004;
21 pub const SO_CONNOPTLEN: c_int = 0x7005;
22 pub const SO_DISCDATALEN: c_int = 0x7006;
23 pub const SO_DISCOPTLEN: c_int = 0x7007;
24 pub const SO_OPENTYPE: c_int = 0x7008;
25 pub const SO_SYNCHRONOUS_ALERT: DWORD = 0x10;
26 pub const SO_SYNCHRONOUS_NONALERT: DWORD = 0x20;
27 pub const SO_MAXDG: c_int = 0x7009;
28 pub const SO_MAXPATHDG: c_int = 0x700A;
29 pub const SO_UPDATE_ACCEPT_CONTEXT: c_int = 0x700B;
30 pub const SO_CONNECT_TIME: c_int = 0x700C;
31 pub const SO_UPDATE_CONNECT_CONTEXT: c_int = 0x7010;
32 pub const TCP_BSDURGENT: c_int = 0x7000;
33 pub const SIO_UDP_CONNRESET: DWORD = _WSAIOW!(IOC_VENDOR, 12);
34 pub const SIO_SOCKET_CLOSE_NOTIFY: DWORD = _WSAIOW!(IOC_VENDOR, 13);
35 pub const SIO_UDP_NETRESET: DWORD = _WSAIOW!(IOC_VENDOR, 15);
36 extern "system" {
WSARecvEx( s: SOCKET, buf: *mut c_char, len: c_int, flags: *mut c_int, ) -> c_int37     pub fn WSARecvEx(
38         s: SOCKET,
39         buf: *mut c_char,
40         len: c_int,
41         flags: *mut c_int,
42     ) -> c_int;
43 }
44 STRUCT!{struct TRANSMIT_FILE_BUFFERS {
45     Head: LPVOID,
46     HeadLength: DWORD,
47     Tail: LPVOID,
48     TailLength: DWORD,
49 }}
50 pub type PTRANSMIT_FILE_BUFFERS = *mut TRANSMIT_FILE_BUFFERS;
51 pub type LPTRANSMIT_FILE_BUFFERS = *mut TRANSMIT_FILE_BUFFERS;
52 pub const TF_DISCONNECT: DWORD = 0x01;
53 pub const TF_REUSE_SOCKET: DWORD = 0x02;
54 pub const TF_WRITE_BEHIND: DWORD = 0x04;
55 pub const TF_USE_DEFAULT_WORKER: DWORD = 0x00;
56 pub const TF_USE_SYSTEM_THREAD: DWORD = 0x10;
57 pub const TF_USE_KERNEL_APC: DWORD = 0x20;
58 extern "system" {
TransmitFile( hSocket: SOCKET, hFile: HANDLE, nNumberOfBytesToWrite: DWORD, nNumberOfBytesPerSend: DWORD, lpOverlapped: LPOVERLAPPED, lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS, dwReserved: DWORD, ) -> BOOL59     pub fn TransmitFile(
60         hSocket: SOCKET,
61         hFile: HANDLE,
62         nNumberOfBytesToWrite: DWORD,
63         nNumberOfBytesPerSend: DWORD,
64         lpOverlapped: LPOVERLAPPED,
65         lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS,
66         dwReserved: DWORD,
67     ) -> BOOL;
AcceptEx( sListenSocket: SOCKET, sAcceptSocket: SOCKET, lpOutputBuffer: PVOID, dwReceiveDataLength: DWORD, dwLocalAddressLength: DWORD, dwRemoteAddressLength: DWORD, lpdwBytesReceived: LPDWORD, lpOverlapped: LPOVERLAPPED, ) -> BOOL68     pub fn AcceptEx(
69         sListenSocket: SOCKET,
70         sAcceptSocket: SOCKET,
71         lpOutputBuffer: PVOID,
72         dwReceiveDataLength: DWORD,
73         dwLocalAddressLength: DWORD,
74         dwRemoteAddressLength: DWORD,
75         lpdwBytesReceived: LPDWORD,
76         lpOverlapped: LPOVERLAPPED,
77     ) -> BOOL;
GetAcceptExSockaddrs( lpOutputBuffer: PVOID, dwReceiveDataLength: DWORD, dwLocalAddressLength: DWORD, dwRemoteAddressLength: DWORD, LocalSockaddr: *mut *mut SOCKADDR, LocalSockaddrLength: LPINT, RemoteSockaddr: *mut *mut SOCKADDR, RemoteSockaddrLength: LPINT, )78     pub fn GetAcceptExSockaddrs(
79         lpOutputBuffer: PVOID,
80         dwReceiveDataLength: DWORD,
81         dwLocalAddressLength: DWORD,
82         dwRemoteAddressLength: DWORD,
83         LocalSockaddr: *mut *mut SOCKADDR,
84         LocalSockaddrLength: LPINT,
85         RemoteSockaddr: *mut *mut SOCKADDR,
86         RemoteSockaddrLength: LPINT,
87     );
88 }
89 FN!{stdcall LPFN_TRANSMITFILE(
90     hSocket: SOCKET,
91     hFile: HANDLE,
92     nNumberOfBytesToWrite: DWORD,
93     nNumberOfBytesPerSend: DWORD,
94     lpOverlapped: LPOVERLAPPED,
95     lpTransmitBuffers: LPTRANSMIT_FILE_BUFFERS,
96     dwReserved: DWORD,
97 ) -> BOOL}
98 DEFINE_GUID!{WSAID_TRANSMITFILE,
99     0xb5367df0, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}
100 FN!{stdcall LPFN_ACCEPTEX(
101     sListenSocket: SOCKET,
102     sAcceptSocket: SOCKET,
103     lpOutputBuffer: PVOID,
104     dwReceiveDataLength: DWORD,
105     dwLocalAddressLength: DWORD,
106     dwRemoteAddressLength: DWORD,
107     lpdwBytesReceived: LPDWORD,
108     lpOverlapped: LPOVERLAPPED,
109 ) -> BOOL}
110 DEFINE_GUID!{WSAID_ACCEPTEX,
111     0xb5367df1, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}
112 FN!{stdcall LPFN_GETACCEPTEXSOCKADDRS(
113     lpOutputBuffer: PVOID,
114     dwReceiveDataLength: DWORD,
115     dwLocalAddressLength: DWORD,
116     dwRemoteAddressLength: DWORD,
117     LocalSockaddr: *mut *mut SOCKADDR,
118     LocalSockaddrLength: LPINT,
119     RemoteSockaddr: *mut *mut SOCKADDR,
120     RemoteSockaddrLength: LPINT,
121 ) -> ()}
122 DEFINE_GUID!{WSAID_GETACCEPTEXSOCKADDRS,
123     0xb5367df2, 0xcbac, 0x11cf, 0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}
124 pub const TP_ELEMENT_MEMORY: ULONG = 1;
125 pub const TP_ELEMENT_FILE: ULONG = 2;
126 pub const TP_ELEMENT_EOP: ULONG = 4;
127 STRUCT!{struct TRANSMIT_PACKETS_ELEMENT_u_s {
128     nFileOffset: LARGE_INTEGER,
129     hFile: HANDLE,
130 }}
131 UNION!{union TRANSMIT_PACKETS_ELEMENT_u {
132     [u64; 2],
133     s s_mut: TRANSMIT_PACKETS_ELEMENT_u_s,
134     pBuffer pBuffer_mut: PVOID,
135 }}
136 STRUCT!{struct TRANSMIT_PACKETS_ELEMENT {
137     dwElFlags: ULONG,
138     cLength: ULONG,
139     u: TRANSMIT_PACKETS_ELEMENT_u,
140 }}
141 pub type PTRANSMIT_PACKETS_ELEMENT = *mut TRANSMIT_PACKETS_ELEMENT;
142 pub type LPTRANSMIT_PACKETS_ELEMENT = *mut TRANSMIT_PACKETS_ELEMENT;
143 pub const TP_DISCONNECT: DWORD = TF_DISCONNECT;
144 pub const TP_REUSE_SOCKET: DWORD = TF_REUSE_SOCKET;
145 pub const TP_USE_DEFAULT_WORKER: DWORD = TF_USE_DEFAULT_WORKER;
146 pub const TP_USE_SYSTEM_THREAD: DWORD = TF_USE_SYSTEM_THREAD;
147 pub const TP_USE_KERNEL_APC: DWORD = TF_USE_KERNEL_APC;
148 FN!{stdcall LPFN_TRANSMITPACKETS(
149     hSocket: SOCKET,
150     lpPacketArray: LPTRANSMIT_PACKETS_ELEMENT,
151     nElementCount: DWORD,
152     nSendSize: DWORD,
153     lpOverlapped: LPOVERLAPPED,
154     dwFlags: DWORD,
155 ) -> BOOL}
156 DEFINE_GUID!{WSAID_TRANSMITPACKETS,
157     0xd9689da0, 0x1f90, 0x11d3, 0x99, 0x71, 0x00, 0xc0, 0x4f, 0x68, 0xc8, 0x76}
158 FN!{stdcall LPFN_CONNECTEX(
159     s: SOCKET,
160     name: *const SOCKADDR,
161     namelen: c_int,
162     lpSendBuffer: PVOID,
163     dwSendDataLength: DWORD,
164     lpdwBytesSent: LPDWORD,
165     lpOverlapped: LPOVERLAPPED,
166 ) -> BOOL}
167 DEFINE_GUID!{WSAID_CONNECTEX,
168     0x25a207b9, 0xddf3, 0x4660, 0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}
169 FN!{stdcall LPFN_DISCONNECTEX(
170     s: SOCKET,
171     lpOverlapped: LPOVERLAPPED,
172     dwFlags: DWORD,
173     dwReserved: DWORD,
174 ) -> BOOL}
175 DEFINE_GUID!{WSAID_DISCONNECTEX,
176     0x7fda2e11, 0x8630, 0x436f, 0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}
177 pub const DE_REUSE_SOCKET: DWORD = TF_REUSE_SOCKET;
178 DEFINE_GUID!{NLA_NAMESPACE_GUID,
179     0x6642243a, 0x3ba8, 0x4aa6, 0xba, 0xa5, 0x2e, 0xb, 0xd7, 0x1f, 0xdd, 0x83}
180 DEFINE_GUID!{NLA_SERVICE_CLASS_GUID,
181     0x37e515, 0xb5c9, 0x4a43, 0xba, 0xda, 0x8b, 0x48, 0xa8, 0x7a, 0xd2, 0x39}
182 pub const NLA_ALLUSERS_NETWORK: WSAESETSERVICEOP = 0x00000001;
183 pub const NLA_FRIENDLY_NAME: WSAESETSERVICEOP = 0x00000002;
184 ENUM!{enum NLA_BLOB_DATA_TYPE {
185     NLA_RAW_DATA = 0,
186     NLA_INTERFACE = 1,
187     NLA_802_1X_LOCATION = 2,
188     NLA_CONNECTIVITY = 3,
189     NLA_ICS = 4,
190 }}
191 pub type PNLA_BLOB_DATA_TYPE = *mut NLA_BLOB_DATA_TYPE;
192 ENUM!{enum NLA_CONNECTIVITY_TYPE {
193     NLA_NETWORK_AD_HOC = 0,
194     NLA_NETWORK_MANAGED = 1,
195     NLA_NETWORK_UNMANAGED = 2,
196     NLA_NETWORK_UNKNOWN = 3,
197 }}
198 pub type PNLA_CONNECTIVITY_TYPE = *mut NLA_CONNECTIVITY_TYPE;
199 ENUM!{enum NLA_INTERNET {
200     NLA_INTERNET_UNKNOWN = 0,
201     NLA_INTERNET_NO = 1,
202     NLA_INTERNET_YES = 2,
203 }}
204 pub type PNLA_INTERNET = *mut NLA_INTERNET;
205 STRUCT!{struct NLA_BLOB_s {
206     type_: NLA_BLOB_DATA_TYPE,
207     dwSize: DWORD,
208     nextOffset: DWORD,
209 }}
210 STRUCT!{struct NLA_BLOB_u_s1 {
211     dwType: DWORD,
212     dwSpeed: DWORD,
213     adapterName: [CHAR; 1],
214 }}
215 STRUCT!{struct NLA_BLOB_u_s2 {
216     information: [CHAR; 1],
217 }}
218 STRUCT!{struct NLA_BLOB_u_s3 {
219     type_: NLA_CONNECTIVITY_TYPE,
220     internet: NLA_INTERNET,
221 }}
222 STRUCT!{struct NLA_BLOB_u_s4_s {
223     speed: DWORD,
224     type_: DWORD,
225     state: DWORD,
226     machineName: [WCHAR; 256],
227     sharedAdapterName: [WCHAR; 256],
228 }}
229 STRUCT!{struct NLA_BLOB_u_s4 {
230     remote: NLA_BLOB_u_s4_s,
231 }}
232 UNION!{union NLA_BLOB_u {
233     [u32; 259],
234     rawData rawData_mut: [CHAR; 1],
235     interfaceData interfaceData_mut: NLA_BLOB_u_s1,
236     locationData locationData_mut: NLA_BLOB_u_s2,
237     connectivity connectivity_mut: NLA_BLOB_u_s3,
238     ICS ICS_mut: NLA_BLOB_u_s4,
239 }}
240 STRUCT!{struct NLA_BLOB {
241     header: NLA_BLOB_s,
242     data: NLA_BLOB_u,
243 }}
244 pub type PNLA_BLOB = *mut NLA_BLOB;
245 pub type LPNLA_BLOB = *mut NLA_BLOB;
246 FN!{stdcall LPFN_WSARECVMSG(
247     s: SOCKET,
248     lpMsg: LPWSAMSG,
249     lpdwNumberOfBytesRecvd: LPDWORD,
250     lpOverlapped: LPWSAOVERLAPPED,
251     lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
252 ) -> INT}
253 DEFINE_GUID!{WSAID_WSARECVMSG,
254     0xf689d7c8, 0x6f1f, 0x436b, 0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22}
255 pub const SIO_BSP_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 27);
256 pub const SIO_BSP_HANDLE_SELECT: DWORD = _WSAIOR!(IOC_WS2, 28);
257 pub const SIO_BSP_HANDLE_POLL: DWORD = _WSAIOR!(IOC_WS2, 29);
258 pub const SIO_BASE_HANDLE: DWORD = _WSAIOR!(IOC_WS2, 34);
259 pub const SIO_EXT_SELECT: DWORD = _WSAIORW!(IOC_WS2, 30);
260 pub const SIO_EXT_POLL: DWORD = _WSAIORW!(IOC_WS2, 31);
261 pub const SIO_EXT_SENDMSG: DWORD = _WSAIORW!(IOC_WS2, 32);
262 STRUCT!{struct WSAPOLLDATA {
263     result: c_int,
264     fds: ULONG,
265     timeout: INT,
266     fdArray: *mut WSAPOLLFD,
267 }}
268 pub type LPWSAPOLLDATA = *mut WSAPOLLDATA;
269 STRUCT!{struct WSASENDMSG {
270     lpMsg: LPWSAMSG,
271     dwFlags: DWORD,
272     lpNumberOfBytesSent: LPDWORD,
273     lpOverlapped: LPWSAOVERLAPPED,
274     lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
275 }}
276 pub type LPWSASENDMSG = *mut WSASENDMSG;
277 FN!{stdcall LPFN_WSASENDMSG(
278     s: SOCKET,
279     lpMsg: LPWSAMSG,
280     dwFlags: DWORD,
281     lpNumberOfBytesSent: LPDWORD,
282     lpOverlapped: LPWSAOVERLAPPED,
283     lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE,
284 ) -> INT}
285 DEFINE_GUID!{WSAID_WSASENDMSG,
286     0xa441e712, 0x754f, 0x43ca, 0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d}
287 FN!{stdcall LPFN_WSAPOLL(
288     fdarray: LPWSAPOLLFD,
289     nfds: ULONG,
290     timeout: INT,
291 ) -> INT}
292 DEFINE_GUID!{WSAID_WSAPOLL,
293     0x18C76F85, 0xDC66, 0x4964, 0x97, 0x2E, 0x23, 0xC2, 0x72, 0x38, 0x31, 0x2B}
294 FN!{stdcall LPFN_RIORECEIVE(
295     SocketQueue: RIO_RQ,
296     pData: PRIO_BUF,
297     DataBufferCount: ULONG,
298     Flags: DWORD,
299     RequestContext: PVOID,
300 ) -> BOOL}
301 FN!{stdcall LPFN_RIORECEIVEEX(
302     SocketQueue: RIO_RQ,
303     pData: PRIO_BUF,
304     DataBufferCount: ULONG,
305     pLocalAddress: PRIO_BUF,
306     pRemoteAddress: PRIO_BUF,
307     pControlContext: PRIO_BUF,
308     pFlags: PRIO_BUF,
309     Flags: DWORD,
310     RequestContext: PVOID,
311 ) -> c_int}
312 FN!{stdcall LPFN_RIOSEND(
313     SocketQueue: RIO_RQ,
314     pData: PRIO_BUF,
315     DataBufferCount: ULONG,
316     Flags: DWORD,
317     RequestContext: PVOID,
318 ) -> BOOL}
319 FN!{stdcall LPFN_RIOSENDEX(
320     SocketQueue: RIO_RQ,
321     pData: PRIO_BUF,
322     DataBufferCount: ULONG,
323     pLocalAddress: PRIO_BUF,
324     pRemoteAddress: PRIO_BUF,
325     pControlContext: PRIO_BUF,
326     pFlags: PRIO_BUF,
327     Flags: DWORD,
328     RequestContext: PVOID,
329 ) -> BOOL}
330 FN!{stdcall LPFN_RIOCLOSECOMPLETIONQUEUE(
331     CQ: RIO_CQ,
332 ) -> ()}
333 ENUM!{enum RIO_NOTIFICATION_COMPLETION_TYPE {
334     RIO_EVENT_COMPLETION = 1,
335     RIO_IOCP_COMPLETION = 2,
336 }}
337 pub type PRIO_NOTIFICATION_COMPLETION_TYPE = *mut RIO_NOTIFICATION_COMPLETION_TYPE;
338 STRUCT!{struct RIO_NOTIFICATION_COMPLETION_u_s1 {
339     EventHandle: HANDLE,
340     NotifyReset: BOOL,
341 }}
342 STRUCT!{struct RIO_NOTIFICATION_COMPLETION_u_s2 {
343     IocpHandle: HANDLE,
344     CompletionKey: PVOID,
345     Overlapped: PVOID,
346 }}
347 UNION!{union RIO_NOTIFICATION_COMPLETION_u {
348     [u32; 3] [u64; 3],
349     Event Event_mut: RIO_NOTIFICATION_COMPLETION_u_s1,
350     Iocp Iocp_mut: RIO_NOTIFICATION_COMPLETION_u_s2,
351 }}
352 STRUCT!{struct RIO_NOTIFICATION_COMPLETION {
353     Type: RIO_NOTIFICATION_COMPLETION_TYPE,
354     u: RIO_NOTIFICATION_COMPLETION_u,
355 }}
356 pub type PRIO_NOTIFICATION_COMPLETION = *mut RIO_NOTIFICATION_COMPLETION;
357 FN!{stdcall LPFN_RIOCREATECOMPLETIONQUEUE(
358     QueueSize: DWORD,
359     NotificationCompletion: PRIO_NOTIFICATION_COMPLETION,
360 ) -> RIO_CQ}
361 FN!{stdcall LPFN_RIOCREATEREQUESTQUEUE(
362     Socket: SOCKET,
363     MaxOutstandingReceive: ULONG,
364     MaxReceiveDataBuffers: ULONG,
365     MaxOutstandingSend: ULONG,
366     MaxSendDataBuffers: ULONG,
367     ReceiveCQ: RIO_CQ,
368     SendCQ: RIO_CQ,
369     SocketContext: PVOID,
370 ) -> RIO_RQ}
371 FN!{stdcall LPFN_RIODEQUEUECOMPLETION(
372     CQ: RIO_CQ,
373     Array: PRIORESULT,
374     ArraySize: ULONG,
375 ) -> ULONG}
376 FN!{stdcall LPFN_RIODEREGISTERBUFFER(
377     BufferId: RIO_BUFFERID,
378 ) -> ()}
379 FN!{stdcall LPFN_RIONOTIFY(
380     CQ: RIO_CQ,
381 ) -> INT}
382 FN!{stdcall LPFN_RIOREGISTERBUFFER(
383     DataBuffer: PCHAR,
384     DataLength: DWORD,
385 ) -> RIO_BUFFERID}
386 FN!{stdcall LPFN_RIORESIZECOMPLETIONQUEUE(
387     CQ: RIO_CQ,
388     QueueSize: DWORD,
389 ) -> BOOL}
390 FN!{stdcall LPFN_RIORESIZEREQUESTQUEUE(
391     RQ: RIO_RQ,
392     MaxOutstandingReceive: DWORD,
393     MaxOutstandingSend: DWORD,
394 ) -> BOOL}
395 STRUCT!{struct RIO_EXTENSION_FUNCTION_TABLE {
396     cbSize: DWORD,
397     RIOReceive: LPFN_RIORECEIVE,
398     RIOReceiveEx: LPFN_RIORECEIVEEX,
399     RIOSend: LPFN_RIOSEND,
400     RIOSendEx: LPFN_RIOSENDEX,
401     RIOCloseCompletionQueue: LPFN_RIOCLOSECOMPLETIONQUEUE,
402     RIOCreateCompletionQueue: LPFN_RIOCREATECOMPLETIONQUEUE,
403     RIOCreateRequestQueue: LPFN_RIOCREATEREQUESTQUEUE,
404     RIODequeueCompletion: LPFN_RIODEQUEUECOMPLETION,
405     RIODeregisterBuffer: LPFN_RIODEREGISTERBUFFER,
406     RIONotify: LPFN_RIONOTIFY,
407     RIORegisterBuffer: LPFN_RIOREGISTERBUFFER,
408     RIOResizeCompletionQueue: LPFN_RIORESIZECOMPLETIONQUEUE,
409     RIOResizeRequestQueue: LPFN_RIORESIZEREQUESTQUEUE,
410 }}
411 pub type PRIO_EXTENSION_FUNCTION_TABLE = *mut RIO_EXTENSION_FUNCTION_TABLE;
412 DEFINE_GUID!{WSAID_MULTIPLE_RIO,
413     0x8509e081, 0x96dd, 0x4005, 0xb1, 0x65, 0x9e, 0x2e, 0xe8, 0xc7, 0x9e, 0x3f}
414