首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LdrLoadDll问题

LdrLoadDll问题
EN

Stack Overflow用户
提问于 2011-05-04 21:19:22
回答 2查看 7.4K关注 0票数 1

基于从ntdll调用函数LdrLoadDll的想法,我正在尝试编写一个替代LoadLibrary函数的代码。此函数需要将UNICODE_STRING格式的dll文件作为参数加载。我真的不知道我在这里做错了什么(字符串似乎被正确初始化了),但是当调用LdrLoadDll时,我得到了以下错误:

Test.exe(NTDLL.DLL)中未处理异常: 0xC0000005:访问冲突。

我使用的是VisualWindows6.0,我使用的是64位C++ 7。

我在这里发布了完整的代码,提前感谢大家的帮助:

代码语言:javascript
运行
复制
#include <Windows.h>


typedef LONG NTSTATUS; //To be used with VC++ 6, since NTSTATUS type is not defined



typedef struct _UNICODE_STRING { //UNICODE_STRING structure
  USHORT  Length;
  USHORT  MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;




typedef NTSTATUS (WINAPI *fLdrLoadDll) //LdrLoadDll function prototype 
    (
         IN PWCHAR PathToFile OPTIONAL,
         IN ULONG Flags OPTIONAL, 
         IN PUNICODE_STRING ModuleFileName, 
         OUT PHANDLE ModuleHandle 
    ); 





/**************************************************************************
  *      RtlInitUnicodeString   (NTDLL.@)
  *
  * Initializes a buffered unicode string.
  *
  * RETURNS
  *  Nothing.
  *
  * NOTES
  *  Assigns source to target->Buffer. The length of source is assigned to
  *  target->Length and target->MaximumLength. If source is NULL the length
  *  of source is assumed to be 0.
  */
 void WINAPI RtlInitUnicodeString(
     PUNICODE_STRING target, /* [I/O] Buffered unicode string to be initialized */
     PCWSTR source)          /* [I]   '\0' terminated unicode string used to initialize target */
 {
     if ((target->Buffer = (PWSTR) source))
     {
         unsigned int length = lstrlenW(source) * sizeof(WCHAR);
         if (length > 0xfffc)
             length = 0xfffc;
         target->Length = length;
         target->MaximumLength = target->Length + sizeof(WCHAR);
     }
     else target->Length = target->MaximumLength = 0;
 }



NTSTATUS LoadDll( LPCSTR lpFileName)
{
  HMODULE hmodule = GetModuleHandleA("ntdll.dll");
  fLdrLoadDll   _LdrLoadDll = (fLdrLoadDll) GetProcAddress ( hmodule, "LdrLoadDll" );

  int AnsiLen = lstrlenA(lpFileName);
  BSTR WideStr = SysAllocStringLen(NULL, AnsiLen);
  ::MultiByteToWideChar(CP_ACP, 0, lpFileName, AnsiLen, WideStr, AnsiLen);

  UNICODE_STRING usDllFile;
  RtlInitUnicodeString(&usDllFile, WideStr); //Initialize UNICODE_STRING for LdrLoadDll function
  ::SysFreeString(WideStr);

  NTSTATUS result = _LdrLoadDll(NULL, LOAD_WITH_ALTERED_SEARCH_PATH, &usDllFile,0); //Error on this line!

  return result;
}



void main()
{
  LoadDll("Kernel32.dll");
}
EN

回答 2

Stack Overflow用户

发布于 2015-01-22 18:41:44

在_LdrLoadDll(NULL,LOAD_WITH_ALTERED_SEARCH_PATH,&usDllFile,0)中;最后一个参数不能为零

票数 3
EN

Stack Overflow用户

发布于 2020-04-11 12:53:16

在调用_LdrLoadDll之前不能调用SysFreeString,因为usDllFile.buffer参数指向此字符串

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5884061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档