1 18 19 package com.knowgate.jcifs.smb; 20 21 import java.util.Enumeration ; 22 import com.knowgate.jcifs.Config; 23 import com.knowgate.misc.Gadgets; 24 25 abstract class SmbComTransaction extends ServerMessageBlock implements Enumeration { 26 27 private static final int DEFAULT_MAX_DATA_COUNT = 28 Config.getInt( "jcifs.smb.client.transaction_buf_size", 29 SmbComTransaction.TRANSACTION_BUF_SIZE ) - 512; 30 31 private static final int PRIMARY_SETUP_OFFSET = 61; 33 private static final int SECONDARY_PARAMETER_OFFSET = 51; 34 35 private static final int DISCONNECT_TID = 0x01; 36 private static final int ONE_WAY_TRANSACTION = 0x02; 37 38 private static final int PADDING_SIZE = 2; 39 40 private int flags = 0x00; 41 private int parameterCount; 42 private int parameterOffset; 43 private int parameterDisplacement; 44 private int dataCount; 45 private int dataOffset; 46 private int dataDisplacement; 47 private int fid; 48 private int pad = 0; 49 private int pad1 = 0; 50 private boolean hasMore = true; 51 private boolean isPrimary = true; 52 private int bufParameterOffset; 53 private int bufDataOffset; 54 55 static final int TRANSACTION_BUF_SIZE = 0xFFFF; 56 57 static final byte TRANS2_FIND_FIRST2 = (byte)0x01; 58 static final byte TRANS2_FIND_NEXT2 = (byte)0x02; 59 static final byte TRANS2_QUERY_FS_INFORMATION = (byte)0x03; 60 static final byte TRANS2_QUERY_PATH_INFORMATION = (byte)0x05; 61 static final byte TRANS2_GET_DFS_REFERRAL = (byte)0x10; 62 static final byte TRANS2_SET_FILE_INFORMATION = (byte)0x08; 63 64 static final int NET_SHARE_ENUM = 0x0000; 65 static final int NET_SERVER_ENUM2 = 0x0068; 66 static final int NET_SERVER_ENUM3 = 0x00D7; 67 68 static final byte TRANS_PEEK_NAMED_PIPE = (byte)0x23; 69 static final byte TRANS_WAIT_NAMED_PIPE = (byte)0x53; 70 static final byte TRANS_CALL_NAMED_PIPE = (byte)0x54; 71 static final byte TRANS_TRANSACT_NAMED_PIPE = (byte)0x26; 72 73 int totalParameterCount; 74 int totalDataCount; 75 int maxParameterCount; 76 int maxDataCount = DEFAULT_MAX_DATA_COUNT; 77 byte maxSetupCount; 78 int timeout = 0; 79 int setupCount = 1; 80 byte subCommand; 81 String name = ""; 82 int maxBufferSize; 84 byte[] txn_buf; 85 86 SmbComTransaction() { 87 maxParameterCount = 1024; 88 } 89 90 void reset() { 91 isPrimary = hasMore = true; 92 } 93 void reset( int key, String lastName ) { 94 reset(); 95 } 96 public boolean hasMoreElements() { 97 return hasMore; 98 } 99 public Object nextElement() { 100 if( isPrimary ) { 101 isPrimary = false; 102 103 parameterOffset = PRIMARY_SETUP_OFFSET + ( setupCount * 2 ) + 2; 104 if( command == SMB_COM_TRANSACTION && isResponse() == false ) { 105 parameterOffset += stringWireLength( name, parameterOffset ); 106 } 107 pad = parameterOffset % PADDING_SIZE; 108 pad = pad == 0 ? 0 : PADDING_SIZE - pad; 109 parameterOffset += pad; 110 111 totalParameterCount = writeParametersWireFormat( txn_buf, bufParameterOffset ); 112 bufDataOffset = totalParameterCount; 114 int available = maxBufferSize - parameterOffset; 115 parameterCount = Math.min( totalParameterCount, available ); 116 available -= parameterCount; 117 118 dataOffset = parameterOffset + parameterCount; 119 pad1 = dataOffset % PADDING_SIZE; 120 pad1 = pad1 == 0 ? 0 : PADDING_SIZE - pad1; 121 dataOffset += pad1; 122 123 totalDataCount = writeDataWireFormat( txn_buf, bufDataOffset ); 124 125 dataCount = Math.min( totalDataCount, available ); 126 } else { 127 command = SMB_COM_TRANSACTION_SECONDARY; 128 130 parameterOffset = SECONDARY_PARAMETER_OFFSET; 131 if(( totalParameterCount - parameterDisplacement ) > 0 ) { 132 pad = parameterOffset % PADDING_SIZE; 133 pad = pad == 0 ? 0 : PADDING_SIZE - pad; 134 parameterOffset += pad; 135 } 136 137 parameterDisplacement += parameterCount; 139 140 int available = maxBufferSize - parameterOffset - pad; 141 parameterCount = Math.min( totalParameterCount - parameterDisplacement, available); 142 available -= parameterCount; 143 144 dataOffset = parameterOffset + parameterCount; 145 pad1 = dataOffset % PADDING_SIZE; 146 pad1 = pad1 == 0 ? 0 : PADDING_SIZE - pad1; 147 dataOffset += pad1; 148 149 dataDisplacement += dataCount; 150 151 available -= pad1; 152 dataCount = Math.min( totalDataCount - dataDisplacement, available ); 153 } 154 if(( parameterDisplacement + parameterCount ) >= totalParameterCount && 155 ( dataDisplacement + dataCount ) >= totalDataCount ) { 156 hasMore = false; 157 } 158 return this; 159 } 160 int writeParameterWordsWireFormat( byte[] dst, int dstIndex ) { 161 int start = dstIndex; 162 163 writeInt2( totalParameterCount, dst, dstIndex ); 164 dstIndex += 2; 165 writeInt2( totalDataCount, dst, dstIndex ); 166 dstIndex += 2; 167 if( command != SMB_COM_TRANSACTION_SECONDARY ) { 168 writeInt2( maxParameterCount, dst, dstIndex ); 169 dstIndex += 2; 170 writeInt2( maxDataCount, dst, dstIndex ); 171 dstIndex += 2; 172 dst[dstIndex++] = maxSetupCount; 173 dst[dstIndex++] = (byte)0x00; writeInt2( flags, dst, dstIndex ); 175 dstIndex += 2; 176 writeInt4( timeout, dst, dstIndex ); 177 dstIndex += 4; 178 dst[dstIndex++] = (byte)0x00; dst[dstIndex++] = (byte)0x00; 180 } 181 writeInt2( parameterCount, dst, dstIndex ); 182 dstIndex += 2; 183 writeInt2(( parameterCount == 0 ? 0 : parameterOffset ), dst, dstIndex ); 184 dstIndex += 2; 185 if( command == SMB_COM_TRANSACTION_SECONDARY ) { 186 writeInt2( parameterDisplacement, dst, dstIndex ); 187 dstIndex += 2; 188 } 189 writeInt2( dataCount, dst, dstIndex ); 190 dstIndex += 2; 191 writeInt2(( dataCount == 0 ? 0 : dataOffset ), dst, dstIndex ); 192 dstIndex += 2; 193 if( command == SMB_COM_TRANSACTION_SECONDARY ) { 194 writeInt2( dataDisplacement, dst, dstIndex ); 195 dstIndex += 2; 196 } else { 197 dst[dstIndex++] = (byte)setupCount; 198 dst[dstIndex++] = (byte)0x00; dstIndex += writeSetupWireFormat( dst, dstIndex ); 200 } 201 202 return dstIndex - start; 203 } 204 int writeBytesWireFormat( byte[] dst, int dstIndex ) { 205 int start = dstIndex; 206 int p = pad; 207 208 if( command == SMB_COM_TRANSACTION && isResponse() == false ) { 209 dstIndex += writeString( name, dst, dstIndex ); 210 } 211 212 if( parameterCount > 0 ) { 213 while( p-- > 0 ) { 214 dst[dstIndex++] = (byte)0x00; } 216 217 System.arraycopy( txn_buf, bufParameterOffset, dst, dstIndex, parameterCount ); 218 dstIndex += parameterCount; 219 } 220 221 if( dataCount > 0 ) { 222 p = pad1; 223 while( p-- > 0 ) { 224 dst[dstIndex++] = (byte)0x00; } 226 System.arraycopy( txn_buf, bufDataOffset, dst, dstIndex, dataCount ); 227 bufDataOffset += dataCount; 228 dstIndex += dataCount; 229 } 230 231 return dstIndex - start; 232 } 233 int readParameterWordsWireFormat( byte[] buffer, int bufferIndex ) { 234 return 0; 235 } 236 int readBytesWireFormat( byte[] buffer, int bufferIndex ) { 237 return 0; 238 } 239 240 abstract int writeSetupWireFormat( byte[] dst, int dstIndex ); 241 abstract int writeParametersWireFormat( byte[] dst, int dstIndex ); 242 abstract int writeDataWireFormat( byte[] dst, int dstIndex ); 243 abstract int readSetupWireFormat( byte[] buffer, int bufferIndex, int len ); 244 abstract int readParametersWireFormat( byte[] buffer, int bufferIndex, int len ); 245 abstract int readDataWireFormat( byte[] buffer, int bufferIndex, int len ); 246 247 public String toString() { 248 return new String ( super.toString() + 249 ",totalParameterCount=" + totalParameterCount + 250 ",totalDataCount=" + totalDataCount + 251 ",maxParameterCount=" + maxParameterCount + 252 ",maxDataCount=" + maxDataCount + 253 ",maxSetupCount=" + (int)maxSetupCount + 254 ",flags=0x" + Gadgets.toHexString( flags, 2 ) + 255 ",timeout=" + timeout + 256 ",parameterCount=" + parameterCount + 257 ",parameterOffset=" + parameterOffset + 258 ",parameterDisplacement=" + parameterDisplacement + 259 ",dataCount=" + dataCount + 260 ",dataOffset=" + dataOffset + 261 ",dataDisplacement=" + dataDisplacement + 262 ",setupCount=" + setupCount + 263 ",pad=" + pad + 264 ",pad1=" + pad1 ); 265 } 266 } 267 | Popular Tags |