什么是"api-ms-win - * - * - lx-xx.dll"伞库?

c00*_*0fd 6 c++ dll winapi uwp

我一直在运行具有长文件名的DLL.例如两个:"api-ms-win-appmodel-runtime-l1-1-1.dll"或"api-ms-win-appmodel-identity-l1-2-0.dll".显然,微软称他们为" 伞库 ".

我最初的理解是它们只是带有新文件名的新DLL,但后来我尝试搜索这些文件.好吧,我找不到它们作为磁盘上的物理文件......

所以我很好奇,它们是否是磁盘上不存在的某种虚拟DLL文件名?

WCHAR buff[MAX_PATH];
buff[0] = 0;
GetSystemDirectory(buff, MAX_PATH);
StringCchCat(buff, MAX_PATH, L"\\api-ms-win-appmodel-runtime-l1-1-1.dll");

HMODULE hModule = LoadLibrary(buff);
//'hModule' is NULL & error code is ERROR_MOD_NOT_FOUND
Run Code Online (Sandbox Code Playgroud)

但以下工作:

HMODULE hModule = LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1.dll");
Run Code Online (Sandbox Code Playgroud)

RbM*_*bMm 13

这是"虚拟DLL"的名称.装载机,当我们调用LoadLibrary(LdrLoadDll)检查众所周知的名称前缀(说api-),如果名称以此开头-使用ApiSetSchema机制的转换虚拟DLL名称(即api-ms-win..)实际DLL名称(文件名,如kernel32.dll,kernelbase.dll等).此映射在位于system32文件夹中的ApiSetSchema.dll中实现.

在此输入图像描述

关于内部实现 - 读取运行时DLL名称解析:ApiSetSchema - 第二部分和API集架构

  • 为了与旧系统兼容,这些 API 集库有时被视为转发到实现 DLL 的真实 DLL。 (2认同)