References: =========== - [MS-CIFS]: 2.2.4.33.1
| 680 | |
| 681 | |
| 682 | class ComTransactionRequest(Payload): |
| 683 | """ |
| 684 | References: |
| 685 | =========== |
| 686 | - [MS-CIFS]: 2.2.4.33.1 |
| 687 | """ |
| 688 | |
| 689 | PAYLOAD_STRUCT_FORMAT = '<HHHHBBHIHHHHHH' |
| 690 | PAYLOAD_STRUCT_SIZE = struct.calcsize(PAYLOAD_STRUCT_FORMAT) |
| 691 | |
| 692 | def __init__(self, max_params_count, max_data_count, max_setup_count, |
| 693 | total_params_count = 0, total_data_count = 0, |
| 694 | params_bytes = b'', data_bytes = b'', setup_bytes = b'', |
| 695 | flags = 0, timeout = 0, name = "\\PIPE\\"): |
| 696 | self.total_params_count = total_params_count or len(params_bytes) |
| 697 | self.total_data_count = total_data_count or len(data_bytes) |
| 698 | self.max_params_count = max_params_count |
| 699 | self.max_data_count = max_data_count |
| 700 | self.max_setup_count = max_setup_count |
| 701 | self.flags = flags |
| 702 | self.timeout = timeout |
| 703 | self.params_bytes = params_bytes |
| 704 | self.data_bytes = data_bytes |
| 705 | self.setup_bytes = setup_bytes |
| 706 | self.name = name |
| 707 | |
| 708 | def initMessage(self, message): |
| 709 | Payload.initMessage(self, message) |
| 710 | message.command = SMB_COM_TRANSACTION |
| 711 | |
| 712 | def prepare(self, message): |
| 713 | name = (self.name + '\0').encode('UTF-16LE') |
| 714 | name_len = len(name) |
| 715 | setup_bytes_len = len(self.setup_bytes) |
| 716 | params_bytes_len = len(self.params_bytes) |
| 717 | data_bytes_len = len(self.data_bytes) |
| 718 | |
| 719 | padding0 = b'' |
| 720 | offset = message.HEADER_STRUCT_SIZE + self.PAYLOAD_STRUCT_SIZE + setup_bytes_len + 2 # constant 2 is for the ByteCount field in the SMB header (i.e. field which indicates number of data bytes after the SMB parameters) |
| 721 | if offset % 2 != 0: |
| 722 | padding0 = b'\0' |
| 723 | offset += 1 |
| 724 | |
| 725 | offset += name_len # For the name field |
| 726 | padding1 = b'' |
| 727 | if offset % 4 != 0: |
| 728 | padding1 = b'\0'*(4-offset%4) |
| 729 | offset += (4-offset%4) |
| 730 | |
| 731 | if params_bytes_len > 0: |
| 732 | params_bytes_offset = offset |
| 733 | offset += params_bytes_len |
| 734 | else: |
| 735 | params_bytes_offset = 0 |
| 736 | |
| 737 | padding2 = b'' |
| 738 | if offset % 4 != 0: |
| 739 | padding2 = b'\0'*(4-offset%4) |
no outgoing calls
no test coverage detected