| 3461 | |
| 3462 | |
| 3463 | class SMB2_Write_Request(_SMB2_Payload, _NTLMPayloadPacket): |
| 3464 | name = "SMB2 WRITE Request" |
| 3465 | Command = 0x0009 |
| 3466 | OFFSET = 48 + 64 |
| 3467 | _NTLM_PAYLOAD_FIELD_NAME = "Buffer" |
| 3468 | fields_desc = [ |
| 3469 | XLEShortField("StructureSize", 0x31), |
| 3470 | LEShortField("DataBufferOffset", None), |
| 3471 | LEIntField("DataLen", None), |
| 3472 | LELongField("Offset", 0), |
| 3473 | PacketField("FileId", SMB2_FILEID(), SMB2_FILEID), |
| 3474 | LEIntEnumField( |
| 3475 | "Channel", |
| 3476 | 0, |
| 3477 | { |
| 3478 | 0x00000000: "SMB2_CHANNEL_NONE", |
| 3479 | 0x00000001: "SMB2_CHANNEL_RDMA_V1", |
| 3480 | 0x00000002: "SMB2_CHANNEL_RDMA_V1_INVALIDATE", |
| 3481 | 0x00000003: "SMB2_CHANNEL_RDMA_TRANSFORM", |
| 3482 | }, |
| 3483 | ), |
| 3484 | LEIntField("RemainingBytes", 0), |
| 3485 | LEShortField("WriteChannelInfoBufferOffset", None), |
| 3486 | LEShortField("WriteChannelInfoLen", None), |
| 3487 | FlagsField( |
| 3488 | "Flags", |
| 3489 | 0, |
| 3490 | -32, |
| 3491 | { |
| 3492 | 0x00000001: "SMB2_WRITEFLAG_WRITE_THROUGH", |
| 3493 | 0x00000002: "SMB2_WRITEFLAG_WRITE_UNBUFFERED", |
| 3494 | }, |
| 3495 | ), |
| 3496 | _NTLMPayloadField( |
| 3497 | "Buffer", |
| 3498 | OFFSET, |
| 3499 | [ |
| 3500 | StrLenField("Data", b"", length_from=lambda pkt: pkt.DataLen), |
| 3501 | StrLenField( |
| 3502 | "WriteChannelInfo", |
| 3503 | b"", |
| 3504 | length_from=lambda pkt: pkt.WriteChannelInfoLen, |
| 3505 | ), |
| 3506 | ], |
| 3507 | ), |
| 3508 | ] |
| 3509 | |
| 3510 | def post_build(self, pkt, pay): |
| 3511 | # type: (bytes, bytes) -> bytes |
| 3512 | return ( |
| 3513 | _SMB2_post_build( |
| 3514 | self, |
| 3515 | pkt, |
| 3516 | self.OFFSET, |
| 3517 | { |
| 3518 | "Data": 2, |
| 3519 | "WriteChannelInfo": 40, |
| 3520 | }, |
no test coverage detected