Итак, есть код:
Код:
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 умалчивает...
Собственно, какое решение проблемы посоветуете?