Windows Phone 8加载外部动态链接库DLL(非安装包内的)
Windows Phone 8加载外部动态链接库DLL(非安装包内的)
在《动态加载与插件化》中大概介绍了下,wp8加载非安装包的下动态链接库,这次详细梳理下。
加载外部DLL主要的原理:
- 通过NtCurrentTeb获得线程环境块
- 从线程环境块中获得进程环境块
- 在进程环境块中加载过得DLL链表
- 从链表中找到kernelbase.dll的模块句柄
- 从kernelbase.dll中获得LoadLibraryEx函数地址
- 加载指定地址下的DLL
相关的结构体:
typedef struct _CLIENT_ID
{
PVOID UniqueProcess;
PVOID UniqueThread;
} CLIENT_ID;
//模块链表实体
typedef struct _MODULE_LIST_ENTRY
{
struct _MODULE_LIST_ENTRY* Flink;
struct _MODULE_LIST_ENTRY* Blink;
DWORD* baseAddress;
}MODULE_LIST_ENTRY;
//进程加载的模块信息
typedef struct _PEB_LDR_DATA
{
// BYTE fill[0x1c]; x86
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle ;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
MODULE_LIST_ENTRY* initModuleList;
}PEB_LDR_DATA;
//进程环境块
typedef struct _PEB
{
// BYTE fill[0x0c]; x86
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PEB_LDR_DATA* ldr;
}PEB;
//线程环境块
typedef struct _TEB
{
//BYTE fill[0x30]; x86
NT_TIB nt_tib;
PVOID EnvironmentPointer;
CLIENT_ID id;
PVOID ActiveRpcHandle;
PVOID ThreadLocalStoragePointer;
PEB* currentPEB;
}TEB;
typedef HMODULE(*LoadLibraryEx)(
LPCTSTR lpLibFileName,
HANDLE hFile,
DWORD dwFlags
);
获取kernelbase.dll模块句柄的类定义
namespace Anye
{
namespace Native
{
public ref class DllHandle sealed
{
friend ref class NativeInterop;
friend class NativeHelper;
public:
int GetModule();
private:
HMODULE _handle;
DllHandle(HMODULE handle);
//获取指定名称的函数地址
void* GetFunction(LPCSTR name);
};
public ref class NativeInterop sealed
{
public:
NativeInterop();
//加载指定路径下的DLL
DllHandle^ LoadLibrary(Platform::String^ name);
//获取KernelBase.dll的模块句柄
DllHandle^ GetKernel();
int GetModule();
private:
DllHandle^ _kernel;
LoadLibraryEx _loadLibrary;
HMODULE getKernelModule();
};
class NativeHelper
{
public:
NativeHelper(const wchar_t* path);
void* GetFunction(LPCSTR name);
private:
DllHandle^ _interop;
};
}
}
主要的加载逻辑
HMODULE NativeInterop::getKernelModule()
{
//获取线程环境快
TEB* teb = NtCurrentTeb();
获取KernelBase.dll的模块句柄PS:保险点的方法市历遍DLL初始化链表通过模块名称确定
return (HMODULE) teb->currentPEB->ldr->initModuleList->Flink->baseAddress;
}
DllHandle^ NativeInterop::LoadLibrary(Platform::String^ name)
{
if (_loadLibrary == nullptr)//获取LoadLibraryExW函数地址
_loadLibrary = (LoadLibraryEx)_kernel->GetFunction("LoadLibraryExW");
HMODULE module = _loadLibrary(name->Data(), nullptr, 0);
if (module != nullptr)
return ref new DllHandle(module);
return nullptr;
}
void* DllHandle::GetFunction(LPCSTR name)
{
return GetProcAddress(_handle, name);
}
NativeHelper
NativeHelper::NativeHelper(const wchar_t* path)
{
auto inter = ref new NativeInterop();
String^ pathString = (Platform::String^)Platform::StringReference(path);
_interop = inter->LoadLibrary(pathString);
}
void* NativeHelper::GetFunction(LPCSTR name)
{
return _interop->GetFunction(name);
}
下面是加载wp手机SD卡上的plugin.dll的例子

动态库项目

动态链接库逻辑
extern "C"
{
__declspec(dllexport) void* Create();
}
namespace Plugin
{
class IPlugin
{
public:
virtual void Show(Platform::String^ msg) = 0;
};
class TestPlugin : public IPlugin
{
public:
TestPlugin()
{
}
void Show(Platform::String^ msg)
{
(ref new Windows::UI::Popups::MessageDialog(msg))->ShowAsync();
}
};
}
void* Create()
{
return new Plugin::TestPlugin();
}
加载外部动态链接库
class IPlugin
{
public:
virtual void Show(Platform::String^ msg) = 0;
};
void NativeEntry::Load(Platform::String^ path)
{ //path 是 D:\\Downloads\\plugin.dll,D盘就是sd
Anye::Native::NativeHelper* h = new Anye::Native::NativeHelper(path->Data());
CreateFunc func;
func = (CreateFunc)h->GetFunction("Create");
IPlugin* plugin = (IPlugin*)func();
plugin->Show("我是"+path+"里的插件^_^");
}
好了例子就到这了,我们获得了LoadLibraryExW函数,不局限于加载外部DLL,也可以去加载系统的DLL,去访问一些微软未公开的API,如只读访问注册表信息
Anye::Native::NativeInterop interop;
auto h = interop.LoadLibrary("ADVAPI32LEGACY.DLL");
Anye_RegCreateKeyEx = (RegCreateKeyFunc)GetFunc(h->GetModule(), "RegCreateKeyW");
Anye_RegSetValueEx = (RegSetValueFunc)GetFunc(h->GetModule(), "RegSetValueW");
Anye_RegQueryValueEx = (RegQueryValueFunc)GetFunc(h->GetModule(), "RegQueryValueW");
Anye_RegCloseKey = (RegCloseKeyFunc)GetFunc(h->GetModule(), "RegCloseKey");
Anye_RegOpenKey = (RegOpenKeyFunc)GetFunc(h->GetModule(), "RegOpenKeyW");
Anye_RegEnumKey = (RegEnumKeyFunc)GetFunc(h->GetModule(), "RegEnumKeyW");
Windows Phone 8加载外部动态链接库DLL(非安装包内的)的更多相关文章
- PhoneGap 白名单安全机制 navigator.app 加载外部页面返回以及退出介绍
一. Phonegap 白名单安全机制 Phonegap应用的页面大多存在于本地,但有时需要加载外部的Web页面到应用内置的浏览器 视图中已完成特定的应用功能,出于安全性考虑,PhoneGap 设立了 ...
- 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
[源码下载] 背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件 作者 ...
- windows 通过AppInit加载任意dll
windows操作系统允许将用户提供的dll加载到所有的进程的内存空间中.该功能可以用来做后门持久化.有点类似于linux的ld_preload环境变量.在进程启动的时候,操作系统会将用户提供的dll ...
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...
- 其原因可能是堆被损坏,这说明**.exe中或它加载的任何DLL中有Bug
最近在写一个写日志文件的线程时,调用了HeapAlloc/HeapFree 申请/释放堆缓冲内存.调用HeapFree释放有个条件就是,日志的空闲缓冲队列中内存块超过100个.在测试的时候,发现调用H ...
- 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件
CustomResource ResourceDictionary 加载外部的 ResourceDictionary 文件 示例1.演示“CustomResource”相关知识点Resource/Cu ...
- AppDomain加载与释放dll
AppDomain加载与释放dll 几年前写过同名随笔,但今天应不大适用了.但还有几个朋友留言关注,我重新发布相关代码. 首先我们的目的就是运行期间更新dll,并应用dll.这个过程需要应用 AppD ...
- 【Win 10 应用开发】加载外部的 srt 字幕
据说系统内置的多媒体功能支持 srt. ssa 等字幕,老周测试过几种格式的字幕均能加载. SRT 字幕是最简单的字幕结构,甚至你用记事本都能做出来,就是分为几行来写. 第一行是字幕的编号,应该是从1 ...
- 删除 Windows 旧 OS 加载器
装过多个系统,然后又删除掉了,系统启动引导时,又把以前的废弃的系统引导给带了出来,试过多种方式,以下方法是最好的. 开始->运行->cmd bcdedit /v 查看要删除的"W ...
随机推荐
- 经典卷积神经网络的学习(一)—— AlexNet
AlexNet 为卷积神经网络和深度学习正名,以绝对优势拿下 ILSVRC 2012 年冠军,引起了学术界的极大关注,掀起了深度学习研究的热潮. AlexNet 在 ILSVRC 数据集上达到 16. ...
- TensorFlow 实战(四)—— tensor 的认识
tensorflow,即是 tensor flows,在 computation graph 中 flows(流动)的不是别人,正是 tensor: 1. tensor 基本属性 tensor 的名字 ...
- 【29.41%】【codeforces 724D】Dense Subsequence
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Git命令小总结
常用 git init git 初始化 git clone https://github.com/wsxx111/thisStudy.git 从远端拉下来 git status 查看跟踪状态 git ...
- POJ3280 Cheapest Palindrome 【DP】
Cheapest Palindrome Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6013 Accepted: 29 ...
- 从Client应用场景介绍IdentityServer4(五)
原文:从Client应用场景介绍IdentityServer4(五) 本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置. 一.新建 ...
- wpf控件开发基础(3) -属性系统(2)
原文:wpf控件开发基础(3) -属性系统(2) 上篇说明了属性存在的一系列问题. 属性默认值,可以保证属性的有效性. 属性验证有效性,可以对输入的属性进行校验 属性强制回调, 即不管属性有无发生变化 ...
- uwp - ContentDialog - 自定义仿iphone提示框,提示框美化
原文:uwp - ContentDialog - 自定义仿iphone提示框,提示框美化 为了实现我想要的效果花费了我很长时间,唉,当初英语不好好学,翻官网翻了半天才找到,分享给刚入门的新手. 首先看 ...
- C# WPF QQ新消息托盘悬浮窗效果实现
原文:C# WPF QQ新消息托盘悬浮窗效果实现 今天在做一个项目的时候需要这么一个效果,但是网上找了一会发现并没有现成的给我参考(复制),但是呢,我千(到)辛(处)万(抄)苦(袭)想(复)破(制)头 ...
- Atitit.故障排除系列---php
计划网站数据库错误排除过程
Atitit.故障排除系列---php 计划网站数据库错误排除过程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能 ...