public void Dispose() { if (pBuffers != IntPtr.Zero) { if (cBuffers == 1) { SecBuffer ThisSecBuffer = (SecBuffer)Marshal.PtrToStructure(pBuffers, typeof(SecBuffer)); ThisSecBuffer.Dispose(); } else { // Since we aren't sending any messages using the kerberos encrypt/decrypt. // The 1st buffer is going to be empty. We can skip it. for (int Index = 1; Index < cBuffers; Index++) { //The bits were written out the following order: //int cbBuffer; //int BufferType; //pvBuffer; //What we need to do here is to grab a hold of the pvBuffer allocate by the individual //SecBuffer and release it... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); int totalLength = CurrentOffset + Marshal.SizeOf(typeof(int)) + Marshal.SizeOf(typeof(int)); IntPtr SecBufferpvBuffer = Marshal.ReadIntPtr(pBuffers, totalLength); Marshal.FreeHGlobal(SecBufferpvBuffer); } } Marshal.FreeHGlobal(pBuffers); pBuffers = IntPtr.Zero; } }
public SecBufferDesc(byte[] secBufferBytes) { ulVersion = (int)SecBufferType.SECBUFFER_VERSION; cBuffers = 1; SecBuffer ThisSecBuffer = new SecBuffer(secBufferBytes); pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(ThisSecBuffer)); Marshal.StructureToPtr(ThisSecBuffer, pBuffers, false); }
public byte[] GetSecBufferByteArray() { byte[] Buffer = null; if (pBuffers == IntPtr.Zero) { throw new InvalidOperationException("Object has already been disposed!!!"); } if (cBuffers == 1) { SecBuffer ThisSecBuffer = (SecBuffer)Marshal.PtrToStructure(pBuffers, typeof(SecBuffer)); if (ThisSecBuffer.cbBuffer > 0) { Buffer = new byte[ThisSecBuffer.cbBuffer]; Marshal.Copy(ThisSecBuffer.pvBuffer, Buffer, 0, ThisSecBuffer.cbBuffer); } } else { int BytesToAllocate = 0; for (int Index = 0; Index < cBuffers; Index++) { //The bits were written out the following order: //int cbBuffer; //int BufferType; //pvBuffer; //What we need to do here calculate the total number of bytes we need to copy... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); BytesToAllocate += Marshal.ReadInt32(pBuffers, CurrentOffset); } Buffer = new byte[BytesToAllocate]; for (int Index = 0, BufferIndex = 0; Index < cBuffers; Index++) { //The bits were written out the following order: //int cbBuffer; //int BufferType; //pvBuffer; //Now iterate over the individual buffers and put them together into a //byte array... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); int BytesToCopy = Marshal.ReadInt32(pBuffers, CurrentOffset); int length = CurrentOffset + Marshal.SizeOf(typeof(int)) + Marshal.SizeOf(typeof(int)); IntPtr SecBufferpvBuffer = Marshal.ReadIntPtr(pBuffers, length); Marshal.Copy(SecBufferpvBuffer, Buffer, BufferIndex, BytesToCopy); BufferIndex += BytesToCopy; } } return(Buffer); }
internal SecBufferDesc(MultipleSecBufferHelper[] secBufferBytesArray) { if (secBufferBytesArray == null || secBufferBytesArray.Length == 0) { throw new ArgumentException("secBufferBytesArray cannot be null or 0 length"); } ulVersion = (int)SecBufferType.SECBUFFER_VERSION; cBuffers = secBufferBytesArray.Length; //Allocate memory for SecBuffer Array.... pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SecBuffer)) * cBuffers); for (int Index = 0; Index < secBufferBytesArray.Length; Index++) { //Super hack: Now allocate memory for the individual SecBuffers //and just copy the bit values to the SecBuffer array!!! SecBuffer ThisSecBuffer = new SecBuffer(secBufferBytesArray[Index].Buffer, secBufferBytesArray[Index].BufferType); //We will write out bits in the following order: //int cbBuffer; //int BufferType; //pvBuffer; //Note: that we won't be releasing the memory allocated by ThisSecBuffer until we //are disposed... int CurrentOffset = Index * Marshal.SizeOf(typeof(SecBuffer)); Marshal.WriteInt32(pBuffers, CurrentOffset, ThisSecBuffer.cbBuffer); int length = CurrentOffset + Marshal.SizeOf(ThisSecBuffer.cbBuffer); Marshal.WriteInt32(pBuffers, length, ThisSecBuffer.BufferType); length = CurrentOffset + Marshal.SizeOf(ThisSecBuffer.cbBuffer) + Marshal.SizeOf(ThisSecBuffer.BufferType); Marshal.WriteIntPtr(pBuffers, length, ThisSecBuffer.pvBuffer); } }