void smb2srv_write_recv(struct smb2srv_request *req) { union smb_write *io; SMB2SRV_CHECK_BODY_SIZE(req, 0x30, True); SMB2SRV_TALLOC_IO_PTR(io, union smb_write); SMB2SRV_SETUP_NTVFS_REQUEST(smb2srv_write_send, NTVFS_ASYNC_STATE_MAY_ASYNC); /* TODO: avoid the memcpy */ io->smb2.level = RAW_WRITE_SMB2; SMB2SRV_CHECK(smb2_pull_o16s32_blob(&req->in, io, req->in.body+0x02, &io->smb2.in.data)); io->smb2.in.offset = BVAL(req->in.body, 0x08); io->smb2.in.file.ntvfs = smb2srv_pull_handle(req, req->in.body, 0x10); io->smb2.in.unknown1 = BVAL(req->in.body, 0x20); io->smb2.in.unknown2 = BVAL(req->in.body, 0x28); SMB2SRV_CHECK_FILE_HANDLE(io->smb2.in.file.ntvfs); SMB2SRV_CALL_NTVFS_BACKEND(ntvfs_write(req->ntvfs, io)); }
/* recv a find reply */ NTSTATUS smb2_find_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct smb2_find *io) { NTSTATUS status; if (!smb2_request_receive(req) || smb2_request_is_error(req)) { return smb2_request_destroy(req); } SMB2_CHECK_PACKET_RECV(req, 0x08, true); status = smb2_pull_o16s32_blob(&req->in, mem_ctx, req->in.body+0x02, &io->out.blob); if (!NT_STATUS_IS_OK(status)) { return status; } return smb2_request_destroy(req); }
/* recv a read reply */ NTSTATUS smb2_read_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct smb2_read *io) { NTSTATUS status; if (!smb2_request_receive(req) || !smb2_request_is_ok(req)) { return smb2_request_destroy(req); } SMB2_CHECK_PACKET_RECV(req, 0x10, true); status = smb2_pull_o16s32_blob(&req->in, mem_ctx, req->in.body+0x02, &io->out.data); if (!NT_STATUS_IS_OK(status)) { smb2_request_destroy(req); return status; } io->out.remaining = IVAL(req->in.body, 0x08); io->out.reserved = IVAL(req->in.body, 0x0C); return smb2_request_destroy(req); }