public byte[] BuildRequestBufferWithoutRop()
{
// Only RopSize field (2 bytes) exists in the payload of request without ROPs.
int payloadLen = 2;
ushort ropSize = 2;
int rpcHeaderExtlength = Marshal.SizeOf(typeof(RPC_HEADER_EXT));
byte[] requestBuffer = new byte[rpcHeaderExtlength + payloadLen];
int index = 0;
// Constructs RPC header ext buffer
RPC_HEADER_EXT rpcHeaderExt = new RPC_HEADER_EXT
{
// According to Open Specification, Version filed MUST be set to 0x0000.
Version = 0,
Flags = (byte)RpcHeaderExtFlags.Last,
Size = (ushort)payloadLen,
SizeActual = (ushort)payloadLen
};
// No compression and No obfuscation
IntPtr ptr = Marshal.AllocHGlobal(rpcHeaderExtlength);
// Release ptr in final sub-statement to make sure the resources will be released even if an exception occurs
try
{
Marshal.StructureToPtr(rpcHeaderExt, ptr, true);
Marshal.Copy(ptr, requestBuffer, index, rpcHeaderExtlength);
index += rpcHeaderExtlength;
}
catch (ArgumentException e)
{
// Marshal.StructureToPtr or Marshal.Copy throw exception.
throw new NotImplementedException(e.Message);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
Array.Copy(BitConverter.GetBytes(ropSize), 0, requestBuffer, index, sizeof(ushort));
return requestBuffer;
}