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.

215 lines
5.2 KiB

  1. #ifdef __cplusplus
  2. // ADVPACK.DLL delay load
  3. class CRunSetupHook
  4. {
  5. public:
  6. #ifdef WX86
  7. #define DELAYRSCAPI(_fn, _args, _nargs) \
  8. DWORD _fn _args { \
  9. HRESULT hres = Init(); \
  10. DWORD dwRet = (DWORD)hres; \
  11. if (SUCCEEDED(hres)) { \
  12. dwRet = _pfn##_fn _nargs; \
  13. } \
  14. return dwRet; } \
  15. DWORD (STDAPICALLTYPE* _pfn##_fn) _args; \
  16. DWORD _fn##X86 _args { \
  17. HRESULT hres = InitX86(); \
  18. DWORD dwRet = (DWORD)hres; \
  19. if (SUCCEEDED(hres)) { \
  20. dwRet = _pfn##_fn##X86 _nargs; \
  21. } \
  22. return dwRet; } \
  23. DWORD (STDAPICALLTYPE* _pfn##_fn##X86) _args;
  24. #else
  25. #define DELAYRSCAPI(_fn, _args, _nargs) \
  26. DWORD _fn _args { \
  27. HRESULT hres = Init(); \
  28. DWORD dwRet = (DWORD)hres; \
  29. if (SUCCEEDED(hres)) { \
  30. dwRet = _pfn##_fn _nargs; \
  31. } \
  32. return dwRet; } \
  33. DWORD (STDAPICALLTYPE* _pfn##_fn) _args;
  34. #endif
  35. HRESULT Init(void);
  36. #ifdef WX86
  37. HRESULT InitX86(void);
  38. typedef BOOL (*pfnUnloadFn)(HMODULE hMod);
  39. pfnUnloadFn pfnUnload;
  40. #endif
  41. CRunSetupHook();
  42. ~CRunSetupHook();
  43. BOOL m_fInited;
  44. HMODULE m_hMod;
  45. #ifdef WX86
  46. BOOL m_fInitedX86;
  47. HMODULE m_hModX86;
  48. HMODULE m_hModWx86;
  49. #endif
  50. DELAYRSCAPI( RunSetupCommand,
  51. (HWND hWnd,
  52. LPSTR szCmdName,
  53. LPSTR szInfSection,
  54. LPSTR szDir,
  55. LPSTR szTitle,
  56. HANDLE *phEXE,
  57. DWORD dwFlags,
  58. LPVOID pvReserved),
  59. (hWnd, szCmdName, szInfSection, szDir, szTitle, phEXE, dwFlags,pvReserved));
  60. DELAYRSCAPI( NeedReboot,
  61. (DWORD dwRebootCheck),
  62. (dwRebootCheck));
  63. DELAYRSCAPI( NeedRebootInit, (), ());
  64. DELAYRSCAPI( TranslateInfString,
  65. (PCSTR pszInfFilename,
  66. PCSTR pszInstallSection,
  67. PCSTR pszTranslateSection,
  68. PCSTR pszTranslateKey,
  69. PSTR pszBuffer,
  70. DWORD dwBufferSize,
  71. PDWORD pdwRequiredSize,
  72. PVOID pvReserved),
  73. (pszInfFilename, pszInstallSection, pszTranslateSection, pszTranslateKey,
  74. pszBuffer, dwBufferSize, pdwRequiredSize, pvReserved));
  75. DELAYRSCAPI( AdvInstallFile,
  76. (HWND hwnd,
  77. LPCSTR lpszSourceDir,
  78. LPCSTR lpszSourceFile,
  79. LPCSTR lpszDestDir,
  80. LPCSTR lpszDestFile,
  81. DWORD dwFlags,
  82. DWORD dwReserved),
  83. (hwnd, lpszSourceDir, lpszSourceFile, lpszDestDir, lpszDestFile, dwFlags,
  84. dwReserved));
  85. };
  86. inline
  87. CRunSetupHook::CRunSetupHook()
  88. {
  89. m_fInited = FALSE;
  90. m_hMod = NULL;
  91. #ifdef WX86
  92. m_hModX86 = m_hModWx86 = NULL;
  93. #endif
  94. }
  95. inline
  96. CRunSetupHook::~CRunSetupHook()
  97. {
  98. if (m_fInited) {
  99. if (m_hMod) {
  100. FreeLibrary(m_hMod);
  101. }
  102. #ifdef WX86
  103. if (m_hModX86) {
  104. if (pfnUnload) {
  105. (*pfnUnload)(m_hModX86); // free x86 advpack.dll
  106. }
  107. }
  108. if (m_hModWx86) {
  109. FreeLibrary(m_hModWx86); // free wx86.dll
  110. }
  111. #endif
  112. }
  113. }
  114. inline
  115. HRESULT
  116. CRunSetupHook::Init(void)
  117. {
  118. if (m_fInited) {
  119. return S_OK;
  120. }
  121. m_hMod = LoadLibrary( "ADVPACK.DLL" );
  122. if (!m_hMod) {
  123. return HRESULT_FROM_WIN32(GetLastError());
  124. }
  125. #define CHECKAPI(_fn) \
  126. *(FARPROC*)&(_pfn##_fn) = GetProcAddress(m_hMod, #_fn); \
  127. if (!(_pfn##_fn)) return E_UNEXPECTED;
  128. CHECKAPI(RunSetupCommand);
  129. CHECKAPI(NeedReboot);
  130. CHECKAPI(NeedRebootInit);
  131. CHECKAPI(TranslateInfString);
  132. CHECKAPI(AdvInstallFile);
  133. m_fInited = TRUE;
  134. return S_OK;
  135. }
  136. #ifdef WX86
  137. inline
  138. HRESULT
  139. CRunSetupHook::InitX86(void)
  140. {
  141. typedef HMODULE (*pfnLoadFn)(LPCWSTR name, DWORD dwFlags);
  142. typedef PVOID (*pfnThunkFn)(PVOID pvAddress, PVOID pvCbDispatch, BOOLEAN fNativeToX86);
  143. pfnLoadFn pfnLoad;
  144. pfnThunkFn pfnThunk;
  145. if (m_fInitedX86) {
  146. return S_OK;
  147. }
  148. // No need to check the reg key to see if Wx86 is installed and enabled.
  149. // By the time this routine runs, that has already been done.
  150. m_hModWx86 = LoadLibrary("wx86.dll");
  151. if (!m_hModWx86) {
  152. return HRESULT_FROM_WIN32(GetLastError());
  153. }
  154. pfnLoad = (pfnLoadFn)GetProcAddress(m_hModWx86, "Wx86LoadX86Dll");
  155. pfnUnload = (pfnUnloadFn)GetProcAddress(m_hModWx86, "Wx86FreeX86Dll");
  156. pfnThunk = (pfnThunkFn)GetProcAddress(m_hModWx86, "Wx86ThunkProc");
  157. if (!pfnLoad || !pfnThunk || !pfnUnload) {
  158. HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
  159. FreeLibrary(m_hModWx86);
  160. return hr;
  161. }
  162. // Load x86 advpack.dll
  163. m_hModX86 = (*pfnLoad)( L"ADVPACK.DLL", 0 );
  164. if (!m_hModX86) {
  165. return HRESULT_FROM_WIN32(GetLastError());
  166. }
  167. #undef CHECKAPI
  168. #define CHECKAPI(_fn, n) \
  169. *(FARPROC*)&(_pfn##_fn##X86) = GetProcAddress(m_hModX86, #_fn); \
  170. if (!(_pfn##_fn##X86)) return E_UNEXPECTED; \
  171. *(FARPROC*)&(_pfn##_fn##X86) = (FARPROC)(*pfnThunk)(_pfn##_fn##X86, (PVOID)n, TRUE);
  172. CHECKAPI(RunSetupCommand, 8);
  173. CHECKAPI(NeedReboot, 1);
  174. CHECKAPI(NeedRebootInit, 0);
  175. CHECKAPI(TranslateInfString, 8);
  176. CHECKAPI(AdvInstallFile, 7);
  177. m_fInitedX86 = TRUE;
  178. return S_OK;
  179. }
  180. #endif
  181. #endif