/// <summary> /// Initializes a new instance of the NativeLibrary class from a native module stored on disk. /// </summary> /// <param name="lpLibFileName">Native module file name.</param> public DynamicNativeLibrary(string fileName) { _loadedModuleHandle = WinBase.LoadLibrary(fileName); if (_loadedModuleHandle == IntPtr.Zero) { throw new Exception("Module could not be loaded."); } _loadedFromMemory = false; }
/// <summary> /// Loads required dlls and adjust function table of the imports. /// </summary> /// <param name="memory_module">Pointer to a memory module.</param> /// <returns>If the function succeeds, the return value is true.</returns> private bool BuildImportTable(MEMORY_MODULE *memory_module) { bool result = true; WinNT.IMAGE_DATA_DIRECTORY *directory = this.GET_HEADER_DIRECTORY(memory_module, WinNT.IMAGE_DIRECTORY_ENTRY_IMPORT); if (directory->Size > 0) { WinNT.IMAGE_IMPORT_DESCRIPTOR *importDesc = (WinNT.IMAGE_IMPORT_DESCRIPTOR *)(memory_module->codeBase + directory->VirtualAddress); for (; importDesc->Name != 0; importDesc++) { IntPtr *thunkRef; IntPtr *funcRef; string moduleName = Marshal.PtrToStringAnsi((IntPtr)(memory_module->codeBase + importDesc->Name)); IntPtr handle = WinBase.LoadLibrary(moduleName); if (handle == IntPtr.Zero) { result = false; break; } int size_of_pointer = sizeof(IntPtr); memory_module->modules = (IntPtr *)memory.realloc((byte *)memory_module->modules, (uint)((memory_module->numModules) * size_of_pointer), (uint)((memory_module->numModules + 1) * size_of_pointer)); if (memory_module->modules == null) { result = false; break; } memory_module->modules[memory_module->numModules++] = handle; if (importDesc->Characteristics != 0) { thunkRef = (IntPtr *)(memory_module->codeBase + importDesc->Characteristics); funcRef = (IntPtr *)(memory_module->codeBase + importDesc->FirstThunk); } else { thunkRef = (IntPtr *)(memory_module->codeBase + importDesc->FirstThunk); funcRef = (IntPtr *)(memory_module->codeBase + importDesc->FirstThunk); } for (; *thunkRef != IntPtr.Zero; thunkRef++, funcRef++) { if (WinNT.IMAGE_SNAP_BY_ORDINAL(thunkRef)) { *funcRef = WinBase.GetProcAddress(handle, (byte *)WinNT.IMAGE_ORDINAL(thunkRef)); } else { WinNT.IMAGE_IMPORT_BY_NAME *thunkData = (WinNT.IMAGE_IMPORT_BY_NAME *)(memory_module->codeBase + (ulong)*thunkRef); //string procName = Marshal.PtrToStringAnsi((IntPtr)(byte*)(thunkData) + 2); IntPtr a = (IntPtr)(byte *)(thunkData); string procName = Marshal.PtrToStringAnsi(new IntPtr(a.ToInt64() + 2)); * funcRef = WinBase.GetProcAddress(handle, procName); } if (*funcRef == IntPtr.Zero) { result = false; break; } } if (!result) { break; } } } return(result); }