package org.krakenapps.pcap.decoder.smb.ntparser; import org.krakenapps.pcap.decoder.netbios.NetBiosNameCodec; import org.krakenapps.pcap.decoder.smb.SmbSession; import org.krakenapps.pcap.decoder.smb.TransData; import org.krakenapps.pcap.decoder.smb.ntreq.NtTransactNotifyChangeRequest; import org.krakenapps.pcap.decoder.smb.ntresp.NtTransactNotifyChangeResponse; import org.krakenapps.pcap.decoder.smb.structure.FileNotifyInformation; import org.krakenapps.pcap.decoder.smb.transparser.TransParser; import org.krakenapps.pcap.util.Buffer; import org.krakenapps.pcap.util.ByteOrderConverter; public class NtTransactNotifyChangeParser implements TransParser{ @Override public TransData parseRequest(Buffer setupBuffer , Buffer parameterBuffer, Buffer dataBuffer) { NtTransactNotifyChangeRequest transData = new NtTransactNotifyChangeRequest(); //start setupBuffer parse transData.setCompletionFiler(ByteOrderConverter.swap(setupBuffer.getInt())); transData.setFid(ByteOrderConverter.swap(setupBuffer.getShort())); transData.setWatchTree(setupBuffer.get()); transData.setReserved(setupBuffer.get()); // end of setupBuffer //there is no use of parameter and data Buffer return transData; } @Override public TransData parseResponse(Buffer setupBuffer , Buffer parameterBuffer, Buffer dataBuffer , SmbSession session) { NtTransactNotifyChangeResponse transData = new NtTransactNotifyChangeResponse(); FileNotifyInformation []fileNotifyInformation; byte []buff; byte []pad; int length =0; int i=0; // thereis no use of setup and data Buffers parameterBuffer.mark(); while(true){ // count fileNotifyInformation structure i++; if(ByteOrderConverter.swap(parameterBuffer.getInt()) == 0x00000000){ break; } parameterBuffer.skip(4); parameterBuffer.skip(ByteOrderConverter.swap(parameterBuffer.getInt())); } parameterBuffer.reset(); fileNotifyInformation = new FileNotifyInformation[i]; for(int j=0;j<i ;j++){ fileNotifyInformation[j] = new FileNotifyInformation(); fileNotifyInformation[j].setNextEntryoffset(ByteOrderConverter.swap(parameterBuffer.getInt())); fileNotifyInformation[j].setAction(ByteOrderConverter.swap(parameterBuffer.getInt())); fileNotifyInformation[j].setFileNameLength(ByteOrderConverter.swap(parameterBuffer.getInt())); buff = new byte[fileNotifyInformation[j].getFileNameLength()]; parameterBuffer.gets(buff); fileNotifyInformation[j].setFileName(NetBiosNameCodec.SmbNameConvertToString(buff)); length = length+(fileNotifyInformation[j].getFileNameLength()) + 4+4+4; pad = new byte[fileNotifyInformation[j].getNextEntryoffset()-length]; parameterBuffer.gets(pad); } transData.setFileNotifyInformation(fileNotifyInformation); return transData; } }