Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 08.08.2009
Сообщений: 14
1

Получение указателя через Marshal.GetFunctionPointerForDelegate

15.09.2010, 23:26. Показов 3903. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Итак, есть код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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 умалчивает...
Собственно, какое решение проблемы посоветуете?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2010, 23:26
Ответы с готовыми решениями:

Получение указателя на объект .Net. Как это правильно реализовать?
Не понятно с первой же строки Как это всё заложить в компилятор?...

Программа падает на Marshal.Copy при попытке сделать скриншот через WinAPI
Доброго, требуется &quot;грабить&quot; экран, задача вроде тривиальная но все же есть косяки: Одно из...

Получение указателя на CListCtrl
Проблема такова. Я создал панель на основе класса CPaneDialog которая использует шаблон диалога с...

Получение указателя на родителя
имеется такая структура: основная форма, в которой есть CheckBox'ы настроек (сворачивать в трей,...

2
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
16.09.2010, 02:24 2
Цитата Сообщение от Alex217Vish Посмотреть сообщение
ArgumentNullException
говорит о том что GetFunctionPointerForDelegate принимает параметр равный null.
Цитата Сообщение от Alex217Vish Посмотреть сообщение
MSDN говорит что нужно как-то специально управлять памятью при работе в делегатом функции
C#
1
2
3
4
5
6
7
8
9
10
11
12
        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));
            GC.KeepAlive(_dllProcessAttach); // <-- Для того чтобы GC не удалил ссылку на _dllProcessAttach
        }
0
0 / 0 / 1
Регистрация: 08.08.2009
Сообщений: 14
21.09.2010, 00:55  [ТС] 3
Проблема оказалась в неправильном указании на путь файла.
Надо было вот так:
C#
1
2
3
                string.Format("{0}\\HookDriveCore\\{1}", Directory.GetParent(
                    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)),
                              ((IntPtr.Size == 8) ? "HookDriveCore64.dll" : "HookDriveCore32.dll")),
0
21.09.2010, 00:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2010, 00:55
Помогаю со студенческими работами здесь

Получение содержимого указателя.
Есть функция MouseProc (nCode: integer; wParam: WPARAM; lParam: LPARAM)...

Получение указателя на данные в векторе
есть вектор std::vector&lt;char&gt; vLeftBuf(bs); есть ф-я которая в качестве параметра принимает const...

Получение указателя на функцию из dll
Доброго времени суток! Столкнулся со следующей проблемой. Пытаюсь написать программу...

DBGrid, получение указателя на следующую строку
Подскажите код для перемещения указателя в DBGrid....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru