dllmain.cpp
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:4k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. Windows Live Messenger Plugin Demo -- Proxy DLL
  3. Copyright (C) 2008  Hern醤 Di Pietro
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  14. /*****************************************************************************/
  15.        
  16. #include "msimgproxy.h"
  17. #include <tchar.h>
  18. PFNTRANSPARENTBLT pfnTransparentBlt = NULL;
  19. PFNALPHABLEND pfnAlphaBlend = NULL;
  20. PFNDLLINITIALIZE pfnDllInitialize = NULL;
  21. PFNGRADIENTFILL pfnGradientFill = NULL;
  22. PFNVSETDDRAWFLAG pfnVSetDdrawFlag = NULL;
  23. PFNINITDLL pfnInitDll = NULL;
  24. bool GetMsimg32FnAddr();
  25. HMODULE hMsimg32 = NULL;
  26. HMODULE hPlugDll = NULL;
  27. TCHAR pszInjDllName[] = TEXT("wlmplugindll.dll");
  28. /************************************************************************/
  29. /* */
  30. /* Proxy DLL Entry point                                                */
  31. /* */
  32. /************************************************************************/
  33. BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, 
  34.   LPVOID lpReserved )
  35. {
  36. switch (ul_reason_for_call)
  37. {
  38. case DLL_PROCESS_ATTACH:
  39. {
  40. if (!GetMsimg32FnAddr())
  41. {
  42. OutputDebugString (TEXT("MSIMG32 Proxy: GetMsimg32FnAddr() failedn"));
  43. return FALSE;
  44. }
  45. OutputDebugString(TEXT("MSIMG32 Proxy: DLL attachedn"));
  46. // Load injected DLL and execute it's initialization function
  47. if (! (hPlugDll = LoadLibrary(pszInjDllName)))
  48. {
  49. OutputDebugString (TEXT("MSIMG32 Proxy: Cannot load inject-DLLn"));
  50. return FALSE;
  51. }
  52. if (! (pfnInitDll = (PFNINITDLL) GetProcAddress (hPlugDll, "InitDLL")))
  53. {
  54. OutputDebugString (TEXT("MSIMG32 Proxy: No valid address for executing InitDLLn"));
  55. return FALSE;
  56. }
  57. (*pfnInitDll)();
  58. break;
  59. }
  60. case DLL_PROCESS_DETACH:
  61. {
  62. if (hMsimg32)
  63. if (FreeLibrary(hMsimg32))
  64. OutputDebugString (TEXT("MSIMG32 Proxy: DLL detached.n"));
  65. break;
  66. }
  67. }
  68. return TRUE;
  69. }
  70. // 
  71. // Get original MSIMG32.DLL functions virtual addresses
  72. //////////////////////////////////////////////////////////////////////////
  73. bool GetMsimg32FnAddr()
  74. {
  75. TCHAR libName[MAX_PATH];
  76. GetSystemDirectory (libName, MAX_PATH);
  77. _tcscat_s (libName, MAX_PATH*sizeof(TCHAR), TEXT("\msimg32.dll"));
  78. hMsimg32 = LoadLibrary (libName);
  79. if (!hMsimg32)
  80. return false;
  81. if ( (pfnVSetDdrawFlag = (PFNVSETDDRAWFLAG) GetProcAddress(hMsimg32, "vSetDdrawflag")) == NULL)
  82. return false;
  83. if ( (pfnAlphaBlend = (PFNALPHABLEND) GetProcAddress(hMsimg32, "AlphaBlend")) == NULL)
  84. return false;
  85. if ( (pfnDllInitialize = (PFNDLLINITIALIZE) GetProcAddress(hMsimg32, "DllInitialize")) == NULL)
  86. return false;
  87. if ( (pfnGradientFill = (PFNGRADIENTFILL) GetProcAddress(hMsimg32, "GradientFill")) == NULL)
  88. return false;
  89. if ( (pfnTransparentBlt = (PFNTRANSPARENTBLT) GetProcAddress(hMsimg32, "TransparentBlt")) == NULL)
  90. return false;
  91. return true;
  92. }
  93. //
  94. // Exported function definition
  95. //////////////////////////////////////////////////////////////////////////
  96. BOOL WINAPI TransparentBlt(HDC p1, int p2, int p3, int p4, int p5, HDC p6, int p7, int p8, 
  97.    int p9, int p10, UINT p11)
  98. {
  99. return pfnTransparentBlt (p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11);
  100. }
  101. BOOL WINAPI AlphaBlend(HDC p1, int p2, int p3, int p4, int p5, HDC p6, int p7 , int p8,
  102.    int p9, int p10, BLENDFUNCTION dw)
  103. {
  104. return pfnAlphaBlend (p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,dw);
  105. }
  106. BOOL WINAPI GradientFill (HDC p1, PTRIVERTEX p2, ULONG p3, PVOID p4, ULONG p5, ULONG p6)
  107. {
  108. return pfnGradientFill (p1, p2, p3, p4, p5, p6);
  109. }
  110. BOOL WINAPI DllInitialize (HINSTANCE d1,DWORD d2, LPVOID d3)
  111. {
  112. return pfnDllInitialize (d1, d2, d3);
  113. }
  114. VOID WINAPI vSetDdrawflag (VOID) { (*pfnVSetDdrawFlag)(); }