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

PlugIns编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. Windows Live Messenger Plugin Demo
  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. #include "wlmplugin.h"
  16. // ---------------------------------------------------------------------------
  17. void Handle_FindResourceW (NktHandlerParams* hp)
  18. {
  19. // Note that WLM seems to use integer resources
  20. HMODULE hMod = *(HMODULE*) PARAMETER_INDEX(0);
  21. DWORD dwName = (DWORD)(*(LPCTSTR*)PARAMETER_INDEX(1));
  22. DWORD dwType = (DWORD)(*(LPCTSTR*)PARAMETER_INDEX(2));
  23. ULONGLONG ulid = MAKEULONGLONG(dwType,dwName);
  24. //_OutputDebugString(L"Handle_FindResourceW: dwName %d, dwType %d",dwName,dwType);
  25. // find out if this resource is registered to be hooked
  26. if (g_resMgr.IsResourceRegistered(dwType,dwName))
  27. {
  28. //OutputDebugString(L"Resource is registered.");
  29. // add a handle-table entry for the resource
  30. if (g_resMgr.IsNewResource(ulid)) 
  31. {
  32. // For adding a new resource to WLM from the resource DLL
  33. // we simply return the handle to it
  34. g_resMgr.AddHandleTableEntry(ulid, g_resMgr.GetDLLResourceHandle(ulid));
  35. g_resMgr.SetResourceSize(ulid, g_resMgr.GetDLLResourceSize(ulid));
  36. hp->iHook->SetReturnValue(&hp->context,(INT_PTR) g_resMgr.GetDLLResourceHandle(ulid));
  37. }
  38. else
  39. {
  40. if ((HRSRC)WINAPI_RETVAL)
  41. {
  42. g_resMgr.AddHandleTableEntry (ulid,(HRSRC)WINAPI_RETVAL);
  43. // save the resource size for later use 
  44. //_OutputDebugString(L"Handle_FindResourceW: Calling SizeOfresource for handle %d", (HRSRC)WINAPI_RETVAL);
  45. DWORD dwSize = SizeofResource(hMod, (HRSRC)WINAPI_RETVAL);
  46. //_OutputDebugString(L"Handle_FindResourceW: SizeOfResource returned %d bytes, LastError %d", dwSize, GetLastError());
  47. g_resMgr.SetResourceSize (MAKEULONGLONG(dwType,dwName), dwSize);
  48. }
  49. }
  50. }
  51. }
  52. // ---------------------------------------------------------------------------
  53. void Handle_LoadResource (NktHandlerParams* hp)
  54. {
  55. HRSRC hRes = *(HRSRC*)PARAMETER_INDEX(1);
  56. _OutputDebugString(L"Handle_LoadResource %d", hRes);
  57. // check if this handle is in the registered handle table
  58. if (g_resMgr.IsHandleRegistered(hRes))
  59. {
  60. ULONGLONG res = g_resMgr.ResourceIDFromHandle(hRes);
  61. if (g_resMgr.IsNewResource(res))
  62. {
  63. // return the stored handle for DLL resources
  64. g_resMgr.AddPointerTableEntry (res, g_resMgr.GetDLLResourceDataHandle(res));
  65. hp->iHook->SetReturnValue(&hp->context,(INT_PTR)g_resMgr.GetDLLResourceDataHandle(res));
  66. }
  67. else
  68. {
  69. // add an entry with the handle to resource data, and register
  70. // to which resource it's related (leave the resource address for LockResource)
  71. g_resMgr.AddPointerTableEntry (res, (HGLOBAL)WINAPI_RETVAL);
  72. }
  73. }
  74. }
  75. // ---------------------------------------------------------------------------
  76. void Handle_LockResource (NktHandlerParams* hp)
  77. {
  78. HGLOBAL hpData = *(HGLOBAL*)PARAMETER_INDEX(0);
  79. if ((DWORD)WINAPI_RETVAL)
  80. {
  81. // check if data pointer handle is registered
  82. if (g_resMgr.IsDataPointerRegistered(hpData))
  83. {
  84. // Here we operate with the resource if we are requesting
  85. // to be modified (or copied to the new virtual address).
  86. // Set the pointer data depending on the requested operation
  87. // on the resource. 
  88. g_resMgr.SetResourcePointer (hpData, (LPVOID) WINAPI_RETVAL);
  89. LPVOID lpvResourceAddress = g_resMgr.AllocResource(hpData);
  90. if (lpvResourceAddress)
  91. {
  92. g_resMgr.SetResourcePointer (hpData, lpvResourceAddress);
  93. g_resMgr.DumpTables();
  94. hp->iHook->SetReturnValue(&hp->context, (INT_PTR) lpvResourceAddress);
  95. }
  96. }
  97. }
  98. }
  99. // ---------------------------------------------------------------------------
  100. void Handle_SizeofResource (NktHandlerParams* hp)
  101. {
  102. DWORD hMod = (DWORD) (*(HMODULE*) PARAMETER_INDEX(0));
  103. HRSRC hr   = *(HRSRC*)PARAMETER_INDEX(1);
  104. if (g_resMgr.IsHandleRegistered(hr))
  105. {
  106. _OutputDebugString (L"Handle_SizeOfResource: handled with hModule=%d", hMod ); 
  107. // if this is the first time we call, return original resource size
  108. if (g_resMgr.GetOriginalResourceSize(hr) != NULL)
  109. {
  110. _OutputDebugString (L"Handle_SizeOfResource: First 'hooked' call for resource %d ",hr);
  111. hp->iHook->SetReturnValue (&hp->context, g_resMgr.GetFixedResourceSize (hr));
  112. }
  113. else
  114. OutputDebugString (L"Handle_SizeOfResource: cbOldSize is NULL, return with default value");
  115. //g_resMgr.DumpTables();
  116. }
  117. //else
  118. // _OutputDebugString (L"Handle_SizeOfResource with unregistered res handle %dnn",hr);
  119. }