package org.krakenapps.pcap.decoder.smb.comparser; import org.krakenapps.pcap.decoder.smb.SmbSession; import org.krakenapps.pcap.decoder.smb.request.LockingANDXRequest; import org.krakenapps.pcap.decoder.smb.response.LockingANDXResponse; import org.krakenapps.pcap.decoder.smb.structure.LockingANDXRange32; import org.krakenapps.pcap.decoder.smb.structure.LockingANDXRange64; import org.krakenapps.pcap.decoder.smb.structure.SmbData; import org.krakenapps.pcap.decoder.smb.structure.SmbHeader; import org.krakenapps.pcap.util.Buffer; import org.krakenapps.pcap.util.ByteOrderConverter; //0x24 public class LockingANDXParser implements SmbDataParser{ @Override public SmbData parseRequest(SmbHeader h , Buffer b , SmbSession session) { LockingANDXRequest data = new LockingANDXRequest(); data.setWordCount(b.get()); if(data.getWordCount() == 0x08){ data.setAndxCommand(b.get()); data.setAndxReserved(b.get()); data.setAndxOffset(ByteOrderConverter.swap(b.getShort())); data.setFid(ByteOrderConverter.swap(b.getShort())); data.setTypeOfLock(b.get()); data.setNewOpLockLevel(b.get()); data.setTimeout(b.getInt()); data.setNumberOfreqedUnlocks(ByteOrderConverter.swap(b.getShort())); data.setNumberOfreqedLocks(ByteOrderConverter.swap(b.getShort())); } else { data.setMalformed(true); } data.setByteCount(ByteOrderConverter.swap(b.getShort())); if(b.readableBytes() != data.getByteCount()){ data.setMalformed(true); return data; } if( data.getByteCount() == ( data.getNumberOfreqedLocks()*10) + ( data.getNumberOfreqedUnlocks()*10 )){ LockingANDXRange32 []locks; LockingANDXRange32 []unlocks; locks = new LockingANDXRange32[data.getNumberOfreqedLocks()]; for(int i=0;i<data.getNumberOfreqedLocks();i++) { locks[i] = new LockingANDXRange32(); locks[i].parse(b); } data.setLocks32(locks); unlocks = new LockingANDXRange32[data.getNumberOfreqedUnlocks()]; for(int i=0;i<data.getNumberOfreqedUnlocks();i++) { unlocks[i] = new LockingANDXRange32(); unlocks[i].parse(b); } data.setUnlocks32(unlocks); } else{ LockingANDXRange64 []locks; LockingANDXRange64 []unlocks; locks = new LockingANDXRange64[data.getNumberOfreqedLocks()]; unlocks = new LockingANDXRange64[data.getNumberOfreqedUnlocks()]; for(int i=0;i<data.getNumberOfreqedLocks();i++) { locks[i] = new LockingANDXRange64(); locks[i].parse(b); } data.setLocks64(locks); unlocks = new LockingANDXRange64[data.getNumberOfreqedUnlocks()]; for(int i=0;i<data.getNumberOfreqedUnlocks();i++) { unlocks[i] = new LockingANDXRange64(); unlocks[i].parse(b); } data.setUnlocks64(unlocks); } return data; } @Override public SmbData parseResponse(SmbHeader h , Buffer b ,SmbSession session) { LockingANDXResponse data = new LockingANDXResponse(); data.setWordCount(b.get()); if(data.getWordCount() ==0x02){ data.setAndxCommand(b.get()); data.setAndxReserved(b.get()); data.setAndxOffset(b.get()); } else { data.setMalformed(true); } data.setByteCount(ByteOrderConverter.swap(b.getShort())); return data; } }