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.

455 lines
9.6 KiB

  1. /*++
  2. Copyright (c) 1999-2001 Microsoft Corporation
  3. Module Name:
  4. kbproc.cpp
  5. Abstract:
  6. Implementation of DLL Exports.
  7. Note: Proxy/Stub Information
  8. To build a separate proxy/stub DLL,
  9. run nmake -f kbprocps.mk in the project directory.
  10. Author:
  11. Vishnu Patankar (VishnuP) - Oct 2001
  12. Environment:
  13. User mode only.
  14. Exported Functions:
  15. DLL regserver etc.
  16. Revision History:
  17. Created - Oct 2001
  18. --*/
  19. #include "stdafx.h"
  20. #include "resource.h"
  21. #include <initguid.h>
  22. #include "kbproc.h"
  23. #include "kbproc_i.c"
  24. #include "process.h"
  25. #include <windows.h>
  26. #include <tchar.h>
  27. #include <comdef.h>
  28. #include <msxml2.h>
  29. #include <winsvc.h>
  30. #include <atlbase.h>
  31. #include <atlcom.h>
  32. CComModule _Module;
  33. BEGIN_OBJECT_MAP(ObjectMap)
  34. OBJECT_ENTRY(CLSID_process, process)
  35. END_OBJECT_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // DLL Entry Point
  38. extern "C"
  39. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
  40. {
  41. if (dwReason == DLL_PROCESS_ATTACH)
  42. {
  43. _Module.Init(ObjectMap, hInstance, &LIBID_KBPROCLib);
  44. DisableThreadLibraryCalls(hInstance);
  45. }
  46. else if (dwReason == DLL_PROCESS_DETACH)
  47. _Module.Term();
  48. return TRUE; // ok
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // Used to determine whether the DLL can be unloaded by OLE
  52. STDAPI DllCanUnloadNow(void)
  53. {
  54. return (_Module.GetLockCount()==0) ? S_OK : S_FALSE;
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. // Returns a class factory to create an object of the requested type
  58. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  59. {
  60. return _Module.GetClassObject(rclsid, riid, ppv);
  61. }
  62. /////////////////////////////////////////////////////////////////////////////
  63. // DllRegisterServer - Adds entries to the system registry
  64. STDAPI DllRegisterServer(void)
  65. {
  66. // registers object, typelib and all interfaces in typelib
  67. return _Module.RegisterServer(TRUE);
  68. }
  69. /////////////////////////////////////////////////////////////////////////////
  70. // DllUnregisterServer - Removes entries from the system registry
  71. STDAPI DllUnregisterServer(void)
  72. {
  73. return _Module.UnregisterServer(TRUE);
  74. }
  75. HRESULT
  76. process::SsrpCprocess(
  77. BSTR pszKBDir,
  78. BSTR pszUIFile,
  79. BSTR pszKbMode,
  80. BSTR pszLogFile,
  81. BSTR pszMachineName,
  82. VARIANT vtFeedback)
  83. /*++
  84. Routine Description:
  85. Main routine called by COM KB interface
  86. Arguments:
  87. pszKBDir - KBs dir
  88. pszUIFile - UI XML file
  89. pszKbMode - KB Mode
  90. pszLogFile - Log file name
  91. pszMachineName - Machine name to query SCM info (optional)
  92. Return:
  93. HRESULT error code
  94. --*/
  95. {
  96. HRESULT hr;
  97. DWORD rc;
  98. CComPtr<IXMLDOMDocument> pXMLMergedKBsDoc = NULL;
  99. CComPtr<IXMLDOMElement> pXMLMergedKBsDocElemRoot = NULL;
  100. VARIANT_BOOL vtSuccess;
  101. CComVariant OutFile(pszUIFile);
  102. CComVariant InFile(pszKBDir);
  103. CComVariant Type(NODE_ELEMENT);
  104. m_bDbg = FALSE;
  105. if (pszMachineName && pszMachineName[0] == L'\0') {
  106. pszMachineName = NULL;
  107. }
  108. hr = CoInitialize(NULL);
  109. if (FAILED(hr)) {
  110. return hr;
  111. }
  112. CComPtr <ISsrFeedbackSink> pISink = NULL;
  113. if (!(vtFeedback.vt == VT_UNKNOWN ||
  114. vtFeedback.vt == VT_DISPATCH)) {
  115. hr = E_INVALIDARG;
  116. }
  117. if (vtFeedback.punkVal != NULL ) {
  118. hr = vtFeedback.punkVal->QueryInterface(IID_ISsrFeedbackSink, (void **) &pISink);
  119. if (FAILED(hr)) {
  120. return hr;
  121. }
  122. }
  123. VARIANT var;
  124. var.vt = VT_UI4;
  125. var.ulVal = 120;
  126. if (pISink) {
  127. pISink->OnNotify(SSR_FB_TOTAL_STEPS, var, L"Starting...");
  128. }
  129. //
  130. // instantiate the logging object object to process the KB
  131. //
  132. hr = CoCreateInstance(CLSID_SsrLog,
  133. NULL,
  134. CLSCTX_INPROC_SERVER,
  135. IID_ISsrLog,
  136. (void**)&m_pSsrLogger);
  137. if (FAILED(hr) || m_pSsrLogger == NULL ) {
  138. return hr;
  139. }
  140. hr = m_pSsrLogger->put_LogFile(pszLogFile);
  141. if (FAILED(hr)) {
  142. SsrpLogError(L"Logger failed create log file");
  143. goto ExitHandler;
  144. }
  145. var.ulVal = 10;
  146. if (pISink) {
  147. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  148. }
  149. //
  150. // instantiate an empty DOM document object to store the merged KB
  151. //
  152. hr = CoCreateInstance(CLSID_DOMDocument,
  153. NULL,
  154. CLSCTX_INPROC_SERVER,
  155. IID_IXMLDOMDocument,
  156. (void**)&pXMLMergedKBsDoc);
  157. if (FAILED(hr) || pXMLMergedKBsDoc == NULL ) {
  158. SsrpLogError(L"COM failed to create a DOM instance");
  159. goto ExitHandler;
  160. }
  161. hr = pXMLMergedKBsDoc->get_parseError(&m_pXMLError);
  162. if (FAILED(hr) || m_pXMLError == NULL ) {
  163. SsrpLogError(L"Unable to get the XML parse error interface");
  164. goto ExitHandler;
  165. }
  166. if (pISink) {
  167. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  168. }
  169. hr = pXMLMergedKBsDoc->put_validateOnParse(VARIANT_TRUE);
  170. if (FAILED(hr)) {
  171. SsrpLogParseError(hr);
  172. goto ExitHandler;
  173. }
  174. hr = pXMLMergedKBsDoc->put_async(VARIANT_FALSE);
  175. if (FAILED(hr)) {
  176. SsrpLogParseError(hr);
  177. goto ExitHandler;
  178. }
  179. if (pISink) {
  180. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  181. }
  182. rc = SsrpQueryInstalledServicesInfo(pszMachineName);
  183. if (rc != ERROR_SUCCESS ) {
  184. SsrpLogWin32Error(rc);
  185. goto ExitHandler;
  186. }
  187. if (pISink) {
  188. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  189. }
  190. //
  191. // merge Extensions/Custom/Root KBs
  192. //
  193. hr = SsrpProcessKBsMerge(pszKBDir,
  194. pszMachineName,
  195. &pXMLMergedKBsDocElemRoot,
  196. &pXMLMergedKBsDoc);
  197. if (FAILED(hr) || pXMLMergedKBsDocElemRoot == NULL) {
  198. SsrpLogParseError(hr);
  199. goto ExitHandler;
  200. }
  201. if (pISink) {
  202. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  203. }
  204. //
  205. // delete all comments
  206. //
  207. hr = SsrpDeleteComments(pXMLMergedKBsDocElemRoot);
  208. if (FAILED(hr)) {
  209. SsrpLogParseError(hr);
  210. goto ExitHandler;
  211. }
  212. //
  213. // create <Preprocessor> section
  214. //
  215. hr = SsrpCreatePreprocessorSection(pXMLMergedKBsDocElemRoot, pXMLMergedKBsDoc, pszKbMode, pszKBDir);
  216. if (FAILED(hr)) {
  217. SsrpLogParseError(hr);
  218. goto ExitHandler;
  219. }
  220. if (pISink) {
  221. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  222. }
  223. //
  224. // process every Role
  225. //
  226. hr = SsrpProcessRolesOrTasks(pszMachineName,
  227. pXMLMergedKBsDocElemRoot,
  228. pXMLMergedKBsDoc,
  229. pszKbMode,
  230. TRUE);
  231. if (FAILED(hr)) {
  232. SsrpLogParseError(hr);
  233. goto ExitHandler;
  234. }
  235. if (pISink) {
  236. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  237. }
  238. //
  239. // process every Task
  240. //
  241. hr = SsrpProcessRolesOrTasks(pszMachineName,
  242. pXMLMergedKBsDocElemRoot,
  243. pXMLMergedKBsDoc,
  244. pszKbMode,
  245. FALSE);
  246. if (FAILED(hr)) {
  247. SsrpLogParseError(hr);
  248. goto ExitHandler;
  249. }
  250. if (pISink) {
  251. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  252. }
  253. //
  254. // write out all services on system but not in KB in the Unknown role
  255. //
  256. hr = SsrpAddUnknownSection(pXMLMergedKBsDocElemRoot, pXMLMergedKBsDoc);
  257. if (FAILED(hr)) {
  258. SsrpLogParseError(hr);
  259. goto ExitHandler;
  260. }
  261. if (pISink) {
  262. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  263. }
  264. hr = SsrpAddUnknownServicesInfoToServiceLoc(pXMLMergedKBsDocElemRoot, pXMLMergedKBsDoc);
  265. if (FAILED(hr)) {
  266. SsrpLogParseError(hr);
  267. goto ExitHandler;
  268. }
  269. if (pISink) {
  270. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  271. }
  272. //
  273. // write out all services on system with startup mode information
  274. //
  275. hr = SsrpAddServiceStartup(pXMLMergedKBsDocElemRoot, pXMLMergedKBsDoc);
  276. if (FAILED(hr)) {
  277. SsrpLogParseError(hr);
  278. goto ExitHandler;
  279. }
  280. if (pISink) {
  281. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Processing...");
  282. }
  283. hr = SsrpAddUnknownServicestoServices(pXMLMergedKBsDocElemRoot, pXMLMergedKBsDoc);
  284. if (FAILED(hr)) {
  285. SsrpLogParseError(hr);
  286. goto ExitHandler;
  287. }
  288. hr = pXMLMergedKBsDoc->save(OutFile);
  289. if (FAILED(hr)) {
  290. SsrpLogParseError(hr);
  291. }
  292. ExitHandler:
  293. if (pISink) {
  294. pISink->OnNotify(SSR_FB_STEPS_JUST_DONE, var, L"Stopping...");
  295. }
  296. CoUninitialize();
  297. return hr;
  298. }