Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
6.5 KiB

  1. /*++
  2. Copyright (c) 1996, 1997 Microsoft Corporation
  3. Module Name:
  4. module.c
  5. Abstract:
  6. This module contains routines to perform module related query activities
  7. in the protected store.
  8. Author:
  9. Scott Field (sfield) 27-Nov-96
  10. --*/
  11. #include <nt.h>
  12. #include <ntrtl.h>
  13. #include <nturtl.h>
  14. #include <windows.h>
  15. #include <tlhelp32.h>
  16. #include "module.h"
  17. #include "filemisc.h"
  18. #include "unicode.h"
  19. #include "debug.h"
  20. #include "pstypes.h"
  21. #include "pstprv.h"
  22. //
  23. // common function typedefs + pointers
  24. //
  25. typedef BOOL (WINAPI *SYMLOADMODULE)(
  26. IN HANDLE hProcess,
  27. IN HANDLE hFile,
  28. IN LPSTR ImageName,
  29. IN LPSTR ModuleName,
  30. IN DWORD_PTR BaseOfDll,
  31. IN DWORD SizeOfDll
  32. );
  33. SYMLOADMODULE _SymLoadModule = NULL;
  34. //
  35. // winnt specific function typedefs + pointers
  36. //
  37. typedef NTSTATUS (NTAPI *NTQUERYPROCESS)(
  38. HANDLE ProcessHandle,
  39. PROCESSINFOCLASS ProcessInformationClass,
  40. PVOID ProcessInformation,
  41. ULONG ProcessInformationLength,
  42. PULONG ReturnLength OPTIONAL
  43. );
  44. #ifdef WIN95_LEGACY
  45. //
  46. // win95 specific function typedefs + pointers.
  47. //
  48. typedef BOOL (WINAPI *MODULEWALK)(
  49. HANDLE hSnapshot,
  50. LPMODULEENTRY32 lpme
  51. );
  52. typedef BOOL (WINAPI *THREADWALK)(
  53. HANDLE hSnapshot,
  54. LPTHREADENTRY32 lpte
  55. );
  56. typedef BOOL (WINAPI *PROCESSWALK)(
  57. HANDLE hSnapshot,
  58. LPPROCESSENTRY32 lppe
  59. );
  60. typedef HANDLE (WINAPI *CREATESNAPSHOT)(
  61. DWORD dwFlags,
  62. DWORD th32ProcessID
  63. );
  64. CREATESNAPSHOT pCreateToolhelp32Snapshot = NULL;
  65. MODULEWALK pModule32First = NULL;
  66. MODULEWALK pModule32Next = NULL;
  67. PROCESSWALK pProcess32First = NULL;
  68. PROCESSWALK pProcess32Next = NULL;
  69. #endif // WIN95_LEGACY
  70. extern FARPROC _ImageNtHeader;
  71. //
  72. // private function prototypes
  73. //
  74. VOID
  75. FixupBrokenLoaderPath(
  76. IN LPWSTR szFilePath
  77. );
  78. BOOL
  79. GetFileNameFromBaseAddrNT(
  80. IN HANDLE hProcess,
  81. IN DWORD dwProcessId,
  82. IN DWORD_PTR dwBaseAddr,
  83. OUT LPWSTR *lpszDirectCaller
  84. );
  85. #ifdef WIN95_LEGACY
  86. BOOL
  87. GetFileNameFromBaseAddr95(
  88. IN HANDLE hProcess,
  89. IN DWORD dwProcessId,
  90. IN DWORD_PTR dwBaseAddr,
  91. OUT LPWSTR *lpszDirectCaller
  92. );
  93. #endif // WIN95_LEGACY
  94. VOID
  95. FixupBrokenLoaderPath(
  96. IN LPWSTR szFilePath
  97. )
  98. {
  99. if( !FIsWinNT() || szFilePath == NULL )
  100. return;
  101. //
  102. // sfield, 28-Oct-97 (NTbug 118803 filed against MarkL)
  103. // for WinNT, the loader data structures are broken:
  104. // a path len extension prefix of \??\ is used instead of \\?\
  105. //
  106. if( szFilePath[0] == L'\\' &&
  107. szFilePath[1] == L'?' &&
  108. szFilePath[2] == L'?' &&
  109. szFilePath[3] == L'\\' ) {
  110. szFilePath[1] = L'\\';
  111. }
  112. }
  113. #ifdef WIN95_LEGACY
  114. BOOL
  115. GetFileNameFromBaseAddr95(
  116. IN HANDLE hProcess,
  117. IN DWORD dwProcessId,
  118. IN DWORD_PTR dwBaseAddr,
  119. OUT LPWSTR *lpszDirectCaller
  120. )
  121. {
  122. HANDLE hSnapshot;
  123. MODULEENTRY32 me32;
  124. BOOL bSuccess = FALSE;
  125. BOOL bFound = FALSE;
  126. *lpszDirectCaller = NULL;
  127. hSnapshot = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
  128. if(hSnapshot == INVALID_HANDLE_VALUE)
  129. return FALSE;
  130. me32.dwSize = sizeof(me32);
  131. bSuccess = pModule32First(hSnapshot, &me32);
  132. while(bSuccess) {
  133. LPCSTR szFileName;
  134. DWORD cchModule;
  135. if((DWORD_PTR)me32.modBaseAddr != dwBaseAddr) {
  136. me32.dwSize = sizeof(me32);
  137. bSuccess = pModule32Next(hSnapshot, &me32);
  138. continue;
  139. }
  140. cchModule = lstrlenA(me32.szExePath) + 1;
  141. *lpszDirectCaller = (LPWSTR)SSAlloc(cchModule * sizeof(WCHAR));
  142. if(*lpszDirectCaller == NULL)
  143. break;
  144. if(MultiByteToWideChar(
  145. 0,
  146. 0,
  147. me32.szExePath,
  148. cchModule,
  149. *lpszDirectCaller,
  150. cchModule
  151. ) != 0) {
  152. bFound = TRUE;
  153. }
  154. break;
  155. }
  156. CloseHandle(hSnapshot);
  157. if(!bFound) {
  158. if(*lpszDirectCaller) {
  159. SSFree(*lpszDirectCaller);
  160. *lpszDirectCaller = NULL;
  161. }
  162. }
  163. return bFound;
  164. }
  165. BOOL
  166. GetProcessIdFromPath95(
  167. IN LPCSTR szProcessPath,
  168. IN OUT DWORD *dwProcessId
  169. )
  170. {
  171. LPCSTR szProcessName;
  172. HANDLE hSnapshot;
  173. PROCESSENTRY32 pe32;
  174. DWORD dwLastError = 0;
  175. BOOL bSuccess;
  176. BOOL bFound = FALSE; // assume no match found
  177. if(!GetFileNameFromPathA(szProcessPath, &szProcessName))
  178. return FALSE;
  179. hSnapshot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  180. if(hSnapshot == INVALID_HANDLE_VALUE)
  181. return FALSE;
  182. pe32.dwSize = sizeof(pe32);
  183. bSuccess = pProcess32First(hSnapshot, &pe32);
  184. while(bSuccess) {
  185. LPCSTR szFileName;
  186. GetFileNameFromPathA(pe32.szExeFile, &szFileName);
  187. if(lstrcmpiA( szFileName, szProcessName ) == 0) {
  188. *dwProcessId = pe32.th32ProcessID;
  189. bFound = TRUE;
  190. break;
  191. }
  192. pe32.dwSize = sizeof(pe32);
  193. bSuccess = pProcess32Next(hSnapshot, &pe32);
  194. }
  195. CloseHandle(hSnapshot);
  196. if(!bFound && dwLastError) {
  197. SetLastError(dwLastError);
  198. }
  199. return bFound;
  200. }
  201. BOOL
  202. GetBaseAddressModule95(
  203. IN DWORD dwProcessId,
  204. IN LPCSTR szImagePath,
  205. IN OUT DWORD_PTR *dwBaseAddress,
  206. IN OUT DWORD *dwUseCount
  207. )
  208. {
  209. LPSTR szImageName;
  210. HANDLE hSnapshot;
  211. MODULEENTRY32 me32;
  212. BOOL bSuccess = FALSE;
  213. BOOL bFound = FALSE;
  214. if(!GetFileNameFromPathA(szImagePath, &szImageName))
  215. return FALSE;
  216. hSnapshot = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
  217. if(hSnapshot == INVALID_HANDLE_VALUE)
  218. return FALSE;
  219. me32.dwSize = sizeof(me32);
  220. bSuccess = pModule32First(hSnapshot, &me32);
  221. while(bSuccess) {
  222. LPCSTR szFileName;
  223. GetFileNameFromPathA(me32.szExePath, &szFileName);
  224. if(lstrcmpiA( szFileName, szImageName ) == 0) {
  225. *dwBaseAddress = (DWORD_PTR)me32.modBaseAddr;
  226. *dwUseCount = me32.ProccntUsage;
  227. bFound = TRUE;
  228. break;
  229. }
  230. me32.dwSize = sizeof(me32);
  231. bSuccess = pModule32Next(hSnapshot, &me32);
  232. }
  233. CloseHandle(hSnapshot);
  234. return bFound;
  235. }
  236. #endif // WIN95_LEGACY