主题:替换系统文件造成无法启动
替换的目标是iphlpapi.dll,里面是IP Helper的API。
我建立了一个工程,先把iphlpapi.dll重命名为iphlpori.dll,然后用dev-C++写一个dll,里面loadLibrary调用iphlpori.dll的api函数并且返回,基本代码格式如下:
DLLIMPORT DWORD GetNumberOfInterfaces(PDWORD pdwNumIf)
{
DWORD result;
HMODULE hDLL = LoadLibrary("IpHlpOri.dll");
if(hDLL)
{
lpGetNumberOfInterfaces fp = (lpGetNumberOfInterfaces)GetProcAddress(hDLL, "GetNumberOfInterfaces");
result = (*fp)(pdwNumIf);
FreeLibrary(hDLL);
return result;
}
return 1;
}
代码里错误检测几乎没有,不过简单测试了一下,其他程序通过产生的新dll可以得到正常的结果
dll头文件代码头部如下:
1. #ifndef _DLL_H_
2. #define _DLL_H_
3. #if BUILDING_DLL
4. # define DLLIMPORT __declspec (dllexport)
5. #else /* Not BUILDING_DLL */
6. # define DLLIMPORT __declspec (dllimport)
7. #endif /* Not BUILDING_DLL */
8. #include <windows.h>
9. #include "iptypes.h"
10. #include "ipexport.h"
11. #include "iprtrmib.h"
12. extern "C" DLLIMPORT DWORD GetNumberOfInterfaces(PDWORD pdwNumIf);
13. //....
在控制台里测试调用函数,结果正常。但是把原dll更名为iphlpori.dll,把产生的文件更名为iphlpapi.dll,放到system32下,系统就无法启动了。
请问问题出在什么地方呢?
另外一个相关的问题是SDK中的原版iphlpapi.h中有关键字。如WINAPI IN OUT OPTIONAL等等。这些关键字在哪里定义呢?是否有相关文档?我的dll代码里直接删除这些关键字是否可行?
我建立了一个工程,先把iphlpapi.dll重命名为iphlpori.dll,然后用dev-C++写一个dll,里面loadLibrary调用iphlpori.dll的api函数并且返回,基本代码格式如下:
DLLIMPORT DWORD GetNumberOfInterfaces(PDWORD pdwNumIf)
{
DWORD result;
HMODULE hDLL = LoadLibrary("IpHlpOri.dll");
if(hDLL)
{
lpGetNumberOfInterfaces fp = (lpGetNumberOfInterfaces)GetProcAddress(hDLL, "GetNumberOfInterfaces");
result = (*fp)(pdwNumIf);
FreeLibrary(hDLL);
return result;
}
return 1;
}
代码里错误检测几乎没有,不过简单测试了一下,其他程序通过产生的新dll可以得到正常的结果
dll头文件代码头部如下:
1. #ifndef _DLL_H_
2. #define _DLL_H_
3. #if BUILDING_DLL
4. # define DLLIMPORT __declspec (dllexport)
5. #else /* Not BUILDING_DLL */
6. # define DLLIMPORT __declspec (dllimport)
7. #endif /* Not BUILDING_DLL */
8. #include <windows.h>
9. #include "iptypes.h"
10. #include "ipexport.h"
11. #include "iprtrmib.h"
12. extern "C" DLLIMPORT DWORD GetNumberOfInterfaces(PDWORD pdwNumIf);
13. //....
在控制台里测试调用函数,结果正常。但是把原dll更名为iphlpori.dll,把产生的文件更名为iphlpapi.dll,放到system32下,系统就无法启动了。
请问问题出在什么地方呢?
另外一个相关的问题是SDK中的原版iphlpapi.h中有关键字。如WINAPI IN OUT OPTIONAL等等。这些关键字在哪里定义呢?是否有相关文档?我的dll代码里直接删除这些关键字是否可行?