日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows API GetProcAddress 及demo code

發(fā)布時(shí)間:2023/12/20 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows API GetProcAddress 及demo code 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

GetProcAddress函數(shù)檢索指定的動態(tài)鏈接庫(DLL)中的輸出庫函數(shù)地址。

  函數(shù)原型:

  FARPROC GetProcAddress(

  HMODULE hModule, // DLL模塊句柄

  LPCSTR lpProcName// 函數(shù)名

  );

 參數(shù):

 hModule

  [in] 包含此函數(shù)的DLL模塊的句柄。LoadLibrary、AfxLoadLibrary?或者GetModuleHandle函數(shù)可以返回此句柄。

  lpProcName

  [in] 包含函數(shù)名的以NULL結(jié)尾的字符串,或者指定函數(shù)的序數(shù)值。如果此參數(shù)是一個(gè)序數(shù)值,它必須在一個(gè)字的底字節(jié),高字節(jié)必須為0。

  返回值:

  如果函數(shù)調(diào)用成功,返回值是DLL中的輸出函數(shù)地址。

  如果函數(shù)調(diào)用失敗,返回值是NULL。得到進(jìn)一步的錯(cuò)誤信息,調(diào)用函數(shù)GetLastError。

?

FARPROC 是一個(gè)4字節(jié)指針,指向一個(gè)函數(shù)的內(nèi)存地址,例如
GetProcAddress 的返回類型就是一個(gè)FARPROC。
如果你要存放這個(gè)地址,可以聲明以一個(gè) FARPROC變量來存放。

?

GetProcAddress返回的是一個(gè)函數(shù)地址的指針。
聲明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你應(yīng)該知道你要的函數(shù)的類型是什么,可以用typedef的方法定義函數(shù)類型,然后定義一個(gè)這種類型的變量,你得到地址后,將地址的類型轉(zhuǎn)換并存到那個(gè)變量中就行了。例如:

?這是RunHook定義:
BOOL _stdcall RunHook(HMODULE hModule,DWORD dwThreadId)
{
HWndHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HOOKProc,hMod,dwThreadId);
return TRUE;
}

這是全局聲明:
typedef BOOL (_stdcall *funRunHook)(HMODULE hModule,DWORD dwThreadID);

這兩種調(diào)用都不行:
funRunHook RunHook;
RunHook=(funRunHook)GetProcAddress(hMod,"RunHook");


LoadLibrary
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

說明

載入指定的動態(tài)鏈接庫,并將它映射到當(dāng)前進(jìn)程使用的地址空間。一旦載入,即可訪問庫內(nèi)保存的資源

返回值

Long,成功則返回庫模塊的句柄,零表示失敗。會設(shè)置GetLastError 參數(shù) 類型及說明 lpLibFileName String,指定要載入的動態(tài)鏈接庫的名稱。采用與CreateProcess函數(shù)的lpCommandLine參數(shù)指定的同樣的搜索順序 注解 一旦不需要,用FreeLibrary函數(shù)釋放DLL

**********************************************************************************************************************************************************

原文:http://blog.csdn.net/g5dsk/article/details/6680698


使用?GetProcAddress?Function?時(shí),有以下幾點(diǎn)需要特別留意:

1. 第二個(gè)參數(shù)類型是?LPCSTR,不是?LPCTSTR

2. 用?__declspec(dllexport),按?C?名稱修飾(extern "C") 導(dǎo)出的函數(shù)名,對于?__stdcall?和?__fastcall?調(diào)用約定是相同的;對?__cdecl?是不同的(導(dǎo)出的函數(shù)名沒有前面的下劃線);

3. 即使返回值不是?NULL,也有可能發(fā)生錯(cuò)誤。當(dāng) .def 模塊不是連續(xù)地從 1 開始編號 ordinal 值,那么,如果用一個(gè)無函數(shù)對應(yīng)的 ordinal 值調(diào)用?GetProcAddress,就會發(fā)生錯(cuò)誤,返回一個(gè)無效的非?NULL?地址;?

4. 最好用函數(shù)名,而不是 ordinal 值調(diào)用?GetProcAddress,以避免不同版本 Dll 中某些函數(shù)不存在的情況。

注:確認(rèn) Dll 的導(dǎo)出函數(shù)名,可以用?DUMPBIN /EXPORTS dll_file_name.dll?命令,然后查看?name?列。

[cpp]?view plain?copy ?print?
  • //?The?myPuts?function?writes?a?null-terminated?string?to??
  • //?the?standard?output?device.??
  • ???
  • //?The?export?mechanism?used?here?is?the?__declspec(export)??
  • //?method?supported?by?Microsoft?Visual?Studio,?but?any??
  • //?other?export?method?supported?by?your?development??
  • //?environment?may?be?substituted.??
  • ???
  • ???
  • #include?<windows.h>??
  • ???
  • #define?EOF?(-1)??
  • ???
  • #ifdef?__cplusplus????//?If?used?by?C++?code,???
  • extern?"C"?{??????????//?we?need?to?export?the?C?interface??
  • #endif??
  • ???
  • __declspec(dllexport)?int?__cdecl?myPuts(LPTSTR?lpszMsg)?//?__cdecl?|?__stdcall?|?__fastcall??
  • {??
  • ????DWORD?cchWritten;??
  • ????HANDLE?hStdout;??
  • ????BOOL?fRet;??
  • ???
  • ????//?Get?a?handle?to?the?standard?output?device.??
  • ???
  • ????hStdout?=?GetStdHandle(STD_OUTPUT_HANDLE);??
  • ????if?(INVALID_HANDLE_VALUE?==?hStdout)??
  • ????????return?EOF;??
  • ???
  • ????//?Write?a?null-terminated?string?to?the?standard?output?device.??
  • ???
  • ????while?(*lpszMsg?!=?'\0')??
  • ????{??
  • ????????fRet?=?WriteFile(hStdout,?lpszMsg,?1,?&cchWritten,?NULL);??
  • ????????if(?(FALSE?==?fRet)?||?(1?!=?cchWritten)?)??
  • ????????????return?EOF;??
  • ????????lpszMsg++;??
  • ????}??
  • ???
  • ????return?1;??
  • }??
  • ???
  • #ifdef?__cplusplus??
  • }??
  • #endif??
  • [cpp]?view plain?copy ?print?
  • //?A?simple?program?that?uses?LoadLibrary?and???
  • //?GetProcAddress?to?access?myPuts?from?Myputs.dll.???
  • ???
  • #include?<stdio.h>???
  • #include?<windows.h>???
  • ???
  • typedef?int?(__cdecl?*MYPROC)(LPTSTR);?//?__cdecl?|?__stdcall?|?__fastcall??
  • ???
  • VOID?main(VOID)???
  • {???
  • ????HINSTANCE?hinstLib;???
  • ????MYPROC?ProcAdd;???
  • ????BOOL?fFreeResult,?fRunTimeLinkSuccess?=?FALSE;???
  • ???
  • ????//?Get?a?handle?to?the?DLL?module.??
  • ???
  • ????hinstLib?=?LoadLibrary(TEXT("bin\\Myputs"));?//?雖然?MSDN?Library?說這里如果??
  • ?????????????????????????????????????????????????//?指定了路徑,要用?backslashes?(\),??
  • ?????????????????????????????????????????????????//?不要用?forward?slashes?(/),但??
  • ?????????????????????????????????????????????????//?其實(shí)用二者都可以。??
  • ?????????????????????????????????????????????????//?注:如果用?\,要用?\\。??
  • ???
  • ????//?If?the?handle?is?valid,?try?to?get?the?function?address.??
  • ???
  • ????if?(hinstLib?!=?NULL)???
  • ????{???
  • ????????ProcAdd?=?(MYPROC)GetProcAddress(hinstLib,?"myPuts");?//?__cdecl???:?myPuts??
  • ??????????????????????????????????????????????????????????????//?__stdcall?:?_myPuts@4??
  • ??????????????????????????????????????????????????????????????//?__fastcall:?@myPuts@4??
  • ???
  • ????????//?If?the?function?address?is?valid,?call?the?function.??
  • ???
  • ????????if?(NULL?!=?ProcAdd)???
  • ????????{??
  • ????????????fRunTimeLinkSuccess?=?TRUE;??
  • ????????????(ProcAdd)?(TEXT("Message?via?DLL?function\n"));???
  • ????????}??
  • ???
  • ????????//?Free?the?DLL?module.??
  • ???
  • ????????fFreeResult?=?FreeLibrary(hinstLib);???
  • ????}???
  • ???
  • ????//?If?unable?to?call?the?DLL?function,?use?an?alternative.??
  • ???
  • ????if?(!?fRunTimeLinkSuccess)???
  • ????????printf("Message?via?alternative?method\n");???
  • } ?
  • 總結(jié)

    以上是生活随笔為你收集整理的Windows API GetProcAddress 及demo code的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。