Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2010, 23:23   #1
Alex217Vish
Пользователь
 
Регистрация: 07.02.2009
Сообщений: 31
Восклицание C#, проблема с получением указателя через Marshal.GetFunctionPointerForDelega te

Итак, есть код:
Код:
public static class HookDrive
    {
        ///<summary>
        /// Initialize hook
        ///</summary>
        public static void Hook()
        {
            _core = LoadLibraryEx(
                Directory.GetParent((Assembly.GetExecutingAssembly().FullName)) +
                ((IntPtr.Size == 8) ? "HookDriveCore64.dll" : "HookDriveCore32.dll"),
                IntPtr.Zero, 0);
            _dllProcessAttach = (DllProcessAttachDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(_core, "DllProcessAttach"),
                                                                                                typeof(DllProcessAttachDelegate));
            Callback = new CallbackDelegate(CallbackFunction);
            _dllProcessAttach(Marshal.GetFunctionPointerForDelegate(Callback));
        }

        ///<summary>
        /// Finalize hook
        ///</summary>
        public static void UnHook()
        {
            FreeLibrary(_core);
        }

        ///<summary>
        /// This is delegate for provide callback-function
        ///</summary>
        ///<param name="lpFileName"></param>
        ///<param name="dwDesiredAccess"></param>
        ///<param name="dwShareMode"></param>
        ///<param name="lpSecurityAttributes"></param>
        ///<param name="dwCreationDisposition"></param>
        ///<param name="dwFlagsAndAttributes"></param>
        ///<param name="hTemplateFile"></param>
        public delegate SafeFileHandle CallbackDelegate(string lpFileName, uint dwDesiredAccess,
                                                        uint dwShareMode, IntPtr lpSecurityAttributes,
                                                        uint dwCreationDisposition,
                                                        uint dwFlagsAndAttributes, IntPtr hTemplateFile);

        ///<summary>
        /// This is delegate for provide entry point of hook dll
        ///</summary>
        ///<param name="callback"></param>
        private delegate void DllProcessAttachDelegate(IntPtr callback);

        ///<summary>
        /// This is callback-function
        ///</summary>
        ///<param name="lpFileName"></param>
        ///<param name="dwDesiredAccess"></param>
        ///<param name="dwShareMode"></param>
        ///<param name="lpSecurityAttributes"></param>
        ///<param name="dwCreationDisposition"></param>
        ///<param name="dwFlagsAndAttributes"></param>
        ///<param name="hTemplateFile"></param>
        ///<returns></returns>
        private static SafeFileHandle CallbackFunction(string lpFileName, uint dwDesiredAccess,
                                               uint dwShareMode, IntPtr lpSecurityAttributes,
                                               uint dwCreationDisposition,
                                               uint dwFlagsAndAttributes, IntPtr hTemplateFile)
        {
            MessageBox.Show("Hooked");
            return null;
        }

        ///<summary>
        /// Pointer to core of hook library
        ///</summary>
        private static IntPtr _core;
        ///<summary>
        /// This is a realization of entry point of dll
        ///</summary>
        private static DllProcessAttachDelegate _dllProcessAttach;
        ///<summary>
        /// This is realization of callback-function
        ///</summary>
        public static CallbackDelegate Callback;

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);

        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool FreeLibrary(IntPtr hModule);
    }
Собственно, есть некая функция DllProcessAttach экспортируемая из dll (это не функция загрузки dll, функция обьявлена в dll в разделе exports; fpc).
Данный код вываливается ещё при вызове GetFunctionPointerForDelegate с исключением ArgumentNullException. MSDN говорит что нужно как-то специально управлять памятью при работе в делегатом функции (DllProcessAttach). Однако как MSDN умалчивает...
Собственно, какое решение проблемы посоветуете?

Последний раз редактировалось Alex217Vish; 15.09.2010 в 23:27.
Alex217Vish вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с получением страницы lukinjj PHP 2 18.07.2010 21:03
Проблема с получением имени zumm Общие вопросы Delphi 3 14.05.2010 13:06
Проблема получением сообщения WM_COPYDATA kleop Win Api 0 12.03.2010 21:58
Проблема с получением текста в tclientsocket zver777 Работа с сетью в Delphi 1 24.09.2009 22:50
Проблема с получением хэндла модуля Боевой Пингвин Общие вопросы C/C++ 3 09.11.2008 17:06