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