| 3336 | |
| 3337 | |
| 3338 | class SMB2_Read_Request(_SMB2_Payload, _NTLMPayloadPacket): |
| 3339 | name = "SMB2 READ Request" |
| 3340 | Command = 0x0008 |
| 3341 | OFFSET = 48 + 64 |
| 3342 | _NTLM_PAYLOAD_FIELD_NAME = "Buffer" |
| 3343 | fields_desc = [ |
| 3344 | XLEShortField("StructureSize", 0x31), |
| 3345 | ByteField("Padding", 0x00), |
| 3346 | FlagsField( |
| 3347 | "Flags", |
| 3348 | 0, |
| 3349 | -8, |
| 3350 | { |
| 3351 | 0x01: "SMB2_READFLAG_READ_UNBUFFERED", |
| 3352 | 0x02: "SMB2_READFLAG_REQUEST_COMPRESSED", |
| 3353 | }, |
| 3354 | ), |
| 3355 | LEIntField("Length", 4280), |
| 3356 | LELongField("Offset", 0), |
| 3357 | PacketField("FileId", SMB2_FILEID(), SMB2_FILEID), |
| 3358 | LEIntField("MinimumCount", 0), |
| 3359 | LEIntEnumField( |
| 3360 | "Channel", |
| 3361 | 0, |
| 3362 | { |
| 3363 | 0x00000000: "SMB2_CHANNEL_NONE", |
| 3364 | 0x00000001: "SMB2_CHANNEL_RDMA_V1", |
| 3365 | 0x00000002: "SMB2_CHANNEL_RDMA_V1_INVALIDATE", |
| 3366 | 0x00000003: "SMB2_CHANNEL_RDMA_TRANSFORM", |
| 3367 | }, |
| 3368 | ), |
| 3369 | LEIntField("RemainingBytes", 0), |
| 3370 | LEShortField("ReadChannelInfoBufferOffset", None), |
| 3371 | LEShortField("ReadChannelInfoLen", None), |
| 3372 | _NTLMPayloadField( |
| 3373 | "Buffer", |
| 3374 | OFFSET, |
| 3375 | [ |
| 3376 | StrLenField( |
| 3377 | "ReadChannelInfo", |
| 3378 | b"", |
| 3379 | length_from=lambda pkt: pkt.ReadChannelInfoLen, |
| 3380 | ) |
| 3381 | ], |
| 3382 | ), |
| 3383 | ] |
| 3384 | |
| 3385 | def post_build(self, pkt, pay): |
| 3386 | # type: (bytes, bytes) -> bytes |
| 3387 | if len(pkt) == 0x30: |
| 3388 | # 'The first byte of the Buffer field MUST be set to 0.' |
| 3389 | pkt += b"\x00" |
| 3390 | return ( |
| 3391 | _SMB2_post_build( |
| 3392 | self, |
| 3393 | pkt, |
| 3394 | self.OFFSET, |
| 3395 | { |
no test coverage detected