Ejemplo n.º 1
0
        private static int EncodingMultiByteArrayHelper(BerSafeHandle berElement, byte[][] tempValue, char fmt)
        {
            IntPtr intPtr;
            IntPtr intPtr1 = (IntPtr)0;

            SafeBerval[] safeBerval = null;
            int          num        = 0;

            try
            {
                if (tempValue != null)
                {
                    int i = 0;
                    intPtr1 = Utility.AllocHGlobalIntPtrArray((int)tempValue.Length + 1);
                    int num1 = Marshal.SizeOf(typeof(SafeBerval));
                    safeBerval = new SafeBerval[(int)tempValue.Length];
                    for (i = 0; i < (int)tempValue.Length; i++)
                    {
                        byte[] numArray = tempValue[i];
                        safeBerval[i] = new SafeBerval();
                        if (numArray != null)
                        {
                            safeBerval[i].bv_len = (int)numArray.Length;
                            safeBerval[i].bv_val = Marshal.AllocHGlobal((int)numArray.Length);
                            Marshal.Copy(numArray, 0, safeBerval[i].bv_val, (int)numArray.Length);
                        }
                        else
                        {
                            safeBerval[i].bv_len = 0;
                            safeBerval[i].bv_val = (IntPtr)0;
                        }
                        IntPtr intPtr2 = Marshal.AllocHGlobal(num1);
                        Marshal.StructureToPtr(safeBerval[i], intPtr2, false);
                        intPtr = (IntPtr)((long)intPtr1 + (long)(Marshal.SizeOf(typeof(IntPtr)) * i));
                        Marshal.WriteIntPtr(intPtr, intPtr2);
                    }
                    intPtr = (IntPtr)((long)intPtr1 + (long)(Marshal.SizeOf(typeof(IntPtr)) * i));
                    Marshal.WriteIntPtr(intPtr, (IntPtr)0);
                }
                num = Wldap32.ber_printf_berarray(berElement, new string(fmt, 1), intPtr1);
                GC.KeepAlive(safeBerval);
            }
            finally
            {
                if (intPtr1 != (IntPtr)0)
                {
                    for (int j = 0; j < (int)tempValue.Length; j++)
                    {
                        IntPtr intPtr3 = Marshal.ReadIntPtr(intPtr1, Marshal.SizeOf(typeof(IntPtr)) * j);
                        if (intPtr3 != (IntPtr)0)
                        {
                            Marshal.FreeHGlobal(intPtr3);
                        }
                    }
                    Marshal.FreeHGlobal(intPtr1);
                }
            }
            return(num);
        }
Ejemplo n.º 2
0
        private static int EncodingMultiByteArrayHelper(BerSafeHandle berElement, byte[][] tempValue, char fmt)
        {
            IntPtr berValArray = IntPtr.Zero;
            IntPtr tempPtr     = IntPtr.Zero;

            SafeBerval[] managedBerVal = null;
            int          error         = 0;

            try
            {
                if (tempValue != null)
                {
                    int i = 0;
                    berValArray = Utility.AllocHGlobalIntPtrArray(tempValue.Length + 1);
                    int structSize = Marshal.SizeOf(typeof(SafeBerval));
                    managedBerVal = new SafeBerval[tempValue.Length];

                    for (i = 0; i < tempValue.Length; i++)
                    {
                        byte[] byteArray = tempValue[i];

                        // construct the managed berval
                        managedBerVal[i] = new SafeBerval();

                        if (byteArray == null)
                        {
                            managedBerVal[i].bv_len = 0;
                            managedBerVal[i].bv_val = IntPtr.Zero;
                        }
                        else
                        {
                            managedBerVal[i].bv_len = byteArray.Length;
                            managedBerVal[i].bv_val = Marshal.AllocHGlobal(byteArray.Length);
                            Marshal.Copy(byteArray, 0, managedBerVal[i].bv_val, byteArray.Length);
                        }

                        // allocate memory for the unmanaged structure
                        IntPtr valPtr = Marshal.AllocHGlobal(structSize);
                        Marshal.StructureToPtr(managedBerVal[i], valPtr, false);

                        tempPtr = (IntPtr)((long)berValArray + IntPtr.Size * i);
                        Marshal.WriteIntPtr(tempPtr, valPtr);
                    }

                    tempPtr = (IntPtr)((long)berValArray + IntPtr.Size * i);
                    Marshal.WriteIntPtr(tempPtr, IntPtr.Zero);
                }

                error = Wldap32.ber_printf_berarray(berElement, new string(fmt, 1), berValArray);

                GC.KeepAlive(managedBerVal);
            }
            finally
            {
                if (berValArray != IntPtr.Zero)
                {
                    for (int i = 0; i < tempValue.Length; i++)
                    {
                        IntPtr ptr = Marshal.ReadIntPtr(berValArray, IntPtr.Size * i);
                        if (ptr != IntPtr.Zero)
                        {
                            Marshal.FreeHGlobal(ptr);
                        }
                    }
                    Marshal.FreeHGlobal(berValArray);
                }
            }

            return(error);
        }
        private static int EncodingMultiByteArrayHelper(BerSafeHandle berElement, byte[][] tempValue, char fmt)
        {
            IntPtr zero = IntPtr.Zero;
            IntPtr ptr  = IntPtr.Zero;

            SafeBerval[] bervalArray = null;
            int          num         = 0;

            try
            {
                if (tempValue != null)
                {
                    int index = 0;
                    zero = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(IntPtr)) * (tempValue.Length + 1)));
                    int cb = Marshal.SizeOf(typeof(SafeBerval));
                    bervalArray = new SafeBerval[tempValue.Length];
                    index       = 0;
                    while (index < tempValue.Length)
                    {
                        byte[] source = tempValue[index];
                        bervalArray[index] = new SafeBerval();
                        if (source == null)
                        {
                            bervalArray[index].bv_len = 0;
                            bervalArray[index].bv_val = IntPtr.Zero;
                        }
                        else
                        {
                            bervalArray[index].bv_len = source.Length;
                            bervalArray[index].bv_val = Marshal.AllocHGlobal(source.Length);
                            Marshal.Copy(source, 0, bervalArray[index].bv_val, source.Length);
                        }
                        IntPtr ptr3 = Marshal.AllocHGlobal(cb);
                        Marshal.StructureToPtr(bervalArray[index], ptr3, false);
                        ptr = (IntPtr)(((long)zero) + (Marshal.SizeOf(typeof(IntPtr)) * index));
                        Marshal.WriteIntPtr(ptr, ptr3);
                        index++;
                    }
                    ptr = (IntPtr)(((long)zero) + (Marshal.SizeOf(typeof(IntPtr)) * index));
                    Marshal.WriteIntPtr(ptr, IntPtr.Zero);
                }
                num = Wldap32.ber_printf_berarray(berElement, new string(fmt, 1), zero);
                GC.KeepAlive(bervalArray);
            }
            finally
            {
                if (zero != IntPtr.Zero)
                {
                    for (int i = 0; i < tempValue.Length; i++)
                    {
                        IntPtr hglobal = Marshal.ReadIntPtr(zero, Marshal.SizeOf(typeof(IntPtr)) * i);
                        if (hglobal != IntPtr.Zero)
                        {
                            Marshal.FreeHGlobal(hglobal);
                        }
                    }
                    Marshal.FreeHGlobal(zero);
                }
            }
            return(num);
        }