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.

327 lines
8.7 KiB

  1. /*++
  2. Copyright (c) 2002 Microsoft Corporation
  3. Module Name:
  4. SecurityDatabase.cpp
  5. Abstract:
  6. Implementation of CSecurityDatabase interface
  7. SecurityDatabase is a COM interface that allows users to perform
  8. basic operations on SCE security databases such as analysis,
  9. import and export.
  10. This is a bare implementation just to expose export functionality
  11. of SCE analysis databases. Still needs work.
  12. Author:
  13. Steven Chan (t-schan) July 2002
  14. --*/
  15. #include <nt.h>
  16. #include <ntrtl.h>
  17. #include <nturtl.h>
  18. #include <windows.h>
  19. #include <string.h>
  20. #include <shlwapi.h>
  21. #include <winnlsp.h>
  22. #include <iostream.h>
  23. #include "stdafx.h"
  24. #include "SecMan.h"
  25. #include "SecurityDatabase.h"
  26. #include "SceXMLLogWriter.h"
  27. #include "SceAnalysisReader.h"
  28. #include "SceLogException.h"
  29. #include "secedit.h" //REMOVE ONCE DEMO IS DONE!
  30. CSecurityDatabase::CSecurityDatabase()
  31. {
  32. bstrFileName=L"";
  33. myModuleHandle=GetModuleHandle(L"SecMan.dll");
  34. }
  35. STDMETHODIMP CSecurityDatabase::get_FileName(BSTR *pVal)
  36. {
  37. return bstrFileName.CopyTo(pVal);
  38. }
  39. STDMETHODIMP CSecurityDatabase::put_FileName(BSTR newVal)
  40. {
  41. bstrFileName = newVal;
  42. return S_OK;
  43. }
  44. STDMETHODIMP CSecurityDatabase::get_MachineName(BSTR *pVal)
  45. {
  46. return E_NOTIMPL;
  47. }
  48. STDMETHODIMP CSecurityDatabase::put_MachineName(BSTR newVal)
  49. {
  50. return E_NOTIMPL;
  51. }
  52. STDMETHODIMP CSecurityDatabase::ImportTemplateFile(BSTR FileName)
  53. {
  54. // IMPLEMENTED ONLY FOR DEMO!!!
  55. // Still needs work to convert SCESTATUS result code to HRESULT
  56. SceConfigureSystem(NULL,
  57. FileName,
  58. bstrFileName,
  59. NULL,
  60. SCE_OVERWRITE_DB | SCE_NO_CONFIG,
  61. AREA_ALL,
  62. NULL,
  63. NULL,
  64. NULL
  65. );
  66. return S_OK;
  67. }
  68. STDMETHODIMP CSecurityDatabase::ImportTemplateString(BSTR TemplateString)
  69. {
  70. return E_NOTIMPL;
  71. }
  72. STDMETHODIMP CSecurityDatabase::Analyze()
  73. {
  74. // IMPLEMENTED ONLY FOR DEMO!!!
  75. // Still needs work to convert SCESTATUS result code to HRESULT
  76. SceAnalyzeSystem(NULL,
  77. NULL,
  78. bstrFileName,
  79. NULL,
  80. SCE_UPDATE_DB,
  81. AREA_ALL,
  82. NULL,
  83. NULL,
  84. NULL);
  85. return S_OK;
  86. }
  87. STDMETHODIMP CSecurityDatabase::ExportAnalysisToXML(BSTR FileName, BSTR ErrorLogFileName)
  88. /*++
  89. Routine Description:
  90. exports the analysis information from this SecurityDatabase to FileName
  91. Arguments:
  92. FileName: XML file to export to
  93. ErrorLogFileName: Error log
  94. Return Value:
  95. none
  96. --*/
  97. {
  98. HANDLE hLogFile=NULL;
  99. HRESULT result=S_OK;
  100. SceXMLLogWriter *LogWriter=NULL;
  101. SceAnalysisReader *AnalysisReader=NULL;
  102. //
  103. // initialize logfile if necessary
  104. // if log file fails to be created, we just go about not logging
  105. // (a parameter of NULL for log file handle to SceAnalysisReader::ExportAnalysis
  106. // indicates no logging
  107. //
  108. if (ErrorLogFileName!=NULL) {
  109. hLogFile = CreateFile(ErrorLogFileName,
  110. GENERIC_WRITE,
  111. FILE_SHARE_WRITE,
  112. NULL,
  113. CREATE_ALWAYS,
  114. FILE_ATTRIBUTE_NORMAL,
  115. NULL);
  116. }
  117. try {
  118. trace(IDS_LOG_START_EXPORT, hLogFile);
  119. LogWriter = new SceXMLLogWriter();
  120. AnalysisReader = new SceAnalysisReader(myModuleHandle, bstrFileName);
  121. AnalysisReader->ExportAnalysis(LogWriter, hLogFile);
  122. trace(IDS_LOG_SAVING, hLogFile);
  123. trace(FileName, hLogFile);
  124. trace(L"\n\r\n\r", hLogFile);
  125. LogWriter->SaveAs(FileName);
  126. trace(IDS_LOG_SUCCESS, hLogFile);
  127. } catch(SceLogException *e) {
  128. switch (e->ErrorType) {
  129. case SceLogException::SXERROR_INTERNAL:
  130. trace(IDS_LOG_ERROR_INTERNAL, hLogFile);
  131. result=E_UNEXPECTED;
  132. break;
  133. case SceLogException::SXERROR_OS_NOT_SUPPORTED:
  134. trace(IDS_LOG_ERROR_OS_NOT_SUPPORTED, hLogFile);
  135. result=ERROR_OLD_WIN_VERSION;
  136. break;
  137. case SceLogException::SXERROR_INIT:
  138. trace(IDS_LOG_ERROR_INTERNAL, hLogFile);
  139. result=ERROR_MOD_NOT_FOUND;
  140. break;
  141. case SceLogException::SXERROR_INIT_MSXML:
  142. trace(IDS_LOG_ERROR_INIT_MSXML, hLogFile);
  143. result=ERROR_MOD_NOT_FOUND;
  144. break;
  145. case SceLogException::SXERROR_SAVE:
  146. trace(IDS_LOG_ERROR_SAVE, hLogFile);
  147. result=ERROR_WRITE_FAULT;
  148. break;
  149. case SceLogException::SXERROR_SAVE_INVALID_FILENAME:
  150. trace(IDS_LOG_ERROR_SAVE_INVALID_FILENAME, hLogFile);
  151. result=ERROR_INVALID_NAME;
  152. break;
  153. case SceLogException::SXERROR_SAVE_ACCESS_DENIED:
  154. trace(IDS_LOG_ERROR_SAVE_ACCESS_DENIED, hLogFile);
  155. result=E_ACCESSDENIED;
  156. break;
  157. case SceLogException::SXERROR_OPEN:
  158. trace(IDS_LOG_ERROR_OPEN, hLogFile);
  159. result=ERROR_OPEN_FAILED;
  160. break;
  161. case SceLogException::SXERROR_OPEN_FILE_NOT_FOUND:
  162. trace(IDS_LOG_ERROR_OPEN_FILE_NOT_FOUND, hLogFile);
  163. result=ERROR_FILE_NOT_FOUND;
  164. break;
  165. case SceLogException::SXERROR_READ:
  166. trace(IDS_LOG_ERROR_READ, hLogFile);
  167. result=ERROR_READ_FAULT;
  168. break;
  169. case SceLogException::SXERROR_READ_NO_ANALYSIS_TABLE:
  170. trace(IDS_LOG_ERROR_READ_NO_ANALYSIS_TABLE, hLogFile);
  171. result=ERROR_READ_FAULT;
  172. break;
  173. case SceLogException::SXERROR_READ_NO_CONFIGURATION_TABLE:
  174. trace(IDS_LOG_ERROR_READ_NO_CONFIGURATION_TABLE, hLogFile);
  175. result=ERROR_READ_FAULT;
  176. break;
  177. case SceLogException::SXERROR_READ_ANALYSIS_SUGGESTED:
  178. trace(IDS_LOG_ERROR_READ_ANALYSIS_SUGGESTED, hLogFile);
  179. result=ERROR_READ_FAULT;
  180. break;
  181. case SceLogException::SXERROR_INSUFFICIENT_MEMORY:
  182. trace(IDS_LOG_ERROR_INSUFFICIENT_MEMORY, hLogFile);
  183. result=E_OUTOFMEMORY;
  184. break;
  185. default:
  186. trace(IDS_LOG_ERROR_UNEXPECTED, hLogFile);
  187. result=E_UNEXPECTED;
  188. break;
  189. }
  190. trace (IDS_LOG_ERROR_DEBUGINFO, hLogFile);
  191. trace (e->szDebugInfo, hLogFile);
  192. trace (L"\n\r",hLogFile);
  193. trace (IDS_LOG_ERROR_AREA, hLogFile);
  194. trace (e->szArea, hLogFile);
  195. trace (L"\n\r",hLogFile);
  196. trace (IDS_LOG_ERROR_SETTING, hLogFile);
  197. trace (e->szSettingName, hLogFile);
  198. delete e;
  199. }
  200. catch(...){
  201. trace(IDS_LOG_ERROR_UNEXPECTED, hLogFile);
  202. result = E_UNEXPECTED;
  203. }
  204. if (NULL!=LogWriter) {
  205. delete LogWriter;
  206. LogWriter=NULL;
  207. }
  208. if (NULL!=AnalysisReader) {
  209. delete AnalysisReader;
  210. AnalysisReader=NULL;
  211. }
  212. if (NULL!=hLogFile) {
  213. CloseHandle(hLogFile);
  214. }
  215. return result;
  216. }
  217. void
  218. CSecurityDatabase::trace(
  219. PCWSTR szBuffer,
  220. HANDLE hLogFile
  221. )
  222. /*++
  223. Routine Description:
  224. Internal method to trace info to an error log.
  225. Arguments:
  226. szBuffer: string to be added to log
  227. hLogFile: handle of error log file
  228. Return Value:
  229. none
  230. --*/
  231. {
  232. DWORD dwNumWritten;
  233. if ((NULL!=hLogFile) && (NULL!=szBuffer)) {
  234. WriteFile(hLogFile,
  235. szBuffer,
  236. wcslen(szBuffer)*sizeof(WCHAR),
  237. &dwNumWritten,
  238. NULL);
  239. }
  240. }
  241. void
  242. CSecurityDatabase::trace(
  243. UINT uID,
  244. HANDLE hLogFile
  245. )
  246. /*++
  247. Routine Description:
  248. Internal method to trace info to an error log.
  249. Arguments:
  250. uID: ID of string to be added to log
  251. hLogFile: handle of error log file
  252. Return Value:
  253. none
  254. --*/
  255. {
  256. DWORD dwNumWritten;
  257. WCHAR szTmpStringBuffer[512];
  258. if (NULL!=hLogFile) {
  259. LoadString(myModuleHandle,
  260. uID,
  261. szTmpStringBuffer,
  262. sizeof(szTmpStringBuffer)/sizeof(WCHAR));
  263. WriteFile(hLogFile,
  264. szTmpStringBuffer,
  265. wcslen(szTmpStringBuffer)*sizeof(WCHAR),
  266. &dwNumWritten,
  267. NULL);
  268. }
  269. }