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.

607 lines
15 KiB

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1999
  5. //
  6. // File: db.h
  7. //
  8. // Contents: Cert Server Database interface implementation
  9. //
  10. //---------------------------------------------------------------------------
  11. #include "resource.h" // main symbols
  12. typedef struct _DBSEEKDATA
  13. {
  14. DWORD SeekFlags; // CST_*
  15. JET_GRBIT grbitSeekRange; // JetSeek flags if CST_SEEKINDEXRANGE
  16. // this is where to seek to retrieve
  17. // end-of-range key
  18. JET_GRBIT grbitInitial; // JetMove or JetSeek flags: set initial cursor
  19. // Where to set the cursor initially
  20. JET_GRBIT grbitRange; // JetSetIndexRange flags if CST_SEEKINDEXRANGE
  21. // other flags to be ingested while setting
  22. // range (bitRange UpperLimit, Inclusive)
  23. } DBSEEKDATA;
  24. // _Create() CreateFlags:
  25. #define CF_DATABASE 0x00000001
  26. #define CF_MISSINGTABLES 0x00000002
  27. #define CF_MISSINGCOLUMNS 0x00000004
  28. #define CF_MISSINGINDEXES 0x00000008
  29. #ifdef DBG_CERTSRV
  30. #define CSASSERTTHREAD(pcs) \
  31. { \
  32. DWORD dwThreadId = GetCurrentThreadId(); \
  33. if ((pcs)->dwThreadId != dwThreadId) \
  34. { \
  35. DBGPRINT((DBG_SS_CERTDB, "Session tid=%d, Current tid=%d\n", (pcs)->dwThreadId, dwThreadId)); \
  36. } \
  37. CSASSERT((pcs)->dwThreadId == dwThreadId); \
  38. }
  39. #endif
  40. HRESULT
  41. InitGlobalWriterState(VOID);
  42. HRESULT
  43. UnInitGlobalWriterState(VOID);
  44. VOID
  45. DBFreeParms();
  46. HRESULT
  47. DBInitParms(
  48. IN DWORD cSession,
  49. IN DWORD DBFlags,
  50. OPTIONAL IN WCHAR const *pwszEventSource,
  51. OPTIONAL IN WCHAR const *pwszLogDir,
  52. OPTIONAL IN WCHAR const *pwszSystemDir,
  53. OPTIONAL IN WCHAR const *pwszTempDir,
  54. OUT JET_INSTANCE *pInstance);
  55. #if DBG_CERTSRV
  56. VOID
  57. dbgcat(
  58. IN OUT WCHAR *pwszBuf,
  59. IN WCHAR const *pwszAdd);
  60. WCHAR const *
  61. wszSeekgrbit(
  62. JET_GRBIT grbit);
  63. WCHAR const *
  64. wszMovecrow(
  65. IN LONG cRow);
  66. WCHAR const *
  67. wszSetIndexRangegrbit(
  68. JET_GRBIT grbit);
  69. WCHAR const *
  70. wszMakeKeygrbit(
  71. JET_GRBIT grbit);
  72. WCHAR const *
  73. wszCSFFlags(
  74. IN LONG Flags);
  75. WCHAR const *
  76. wszCSTFlags(
  77. IN LONG Flags);
  78. WCHAR const *
  79. wszSeekOperator(
  80. IN LONG SeekOperator);
  81. WCHAR const *
  82. wszSortOperator(
  83. IN LONG SortOrder);
  84. VOID
  85. dbDumpValue(
  86. IN DWORD dwSubSystemId,
  87. OPTIONAL IN DBTABLE const *pdt,
  88. IN BYTE const *pbValue,
  89. IN DWORD cbValue);
  90. VOID
  91. dbDumpColumn(
  92. IN DWORD dwSubSystemId,
  93. IN DBTABLE const *pdt,
  94. IN BYTE const *pbValue,
  95. IN DWORD cbValue);
  96. #endif // DBG_CERTSRV
  97. class CCertDB:
  98. public ICertDB,
  99. //public ISupportErrorInfoImpl<&IID_ICertDB>,
  100. public CComObjectRoot,
  101. public CComCoClass<CCertDB, &CLSID_CCertDB>
  102. {
  103. public:
  104. CCertDB();
  105. ~CCertDB();
  106. BEGIN_COM_MAP(CCertDB)
  107. COM_INTERFACE_ENTRY(ICertDB)
  108. //COM_INTERFACE_ENTRY(ISupportErrorInfo)
  109. END_COM_MAP()
  110. DECLARE_NOT_AGGREGATABLE(CCertDB)
  111. // Remove the comment from the line above if you don't want your object to
  112. // support aggregation. The default is to support it
  113. DECLARE_REGISTRY(
  114. CCertDB,
  115. wszCLASS_CERTDB TEXT(".1"),
  116. wszCLASS_CERTDB,
  117. IDS_CERTDB_DESC,
  118. THREADFLAGS_BOTH)
  119. // ICertDB
  120. public:
  121. STDMETHOD(Open)(
  122. /* [in] */ DWORD Flags,
  123. /* [in] */ DWORD cSession,
  124. /* [in] */ WCHAR const *pwszEventSource,
  125. /* [in] */ WCHAR const *pwszDBFile,
  126. /* [in] */ WCHAR const *pwszLogDir,
  127. /* [in] */ WCHAR const *pwszSystemDir,
  128. /* [in] */ WCHAR const *pwszTempDir);
  129. STDMETHOD(ShutDown)(
  130. /* [in] */ DWORD dwFlags);
  131. STDMETHOD(OpenRow)(
  132. /* [in] */ DWORD dwFlags,
  133. /* [in] */ DWORD RowId,
  134. /* [in] */ WCHAR const *pwszSerialNumberOrCertHash, // OPTIONAL
  135. /* [out] */ ICertDBRow **pprow);
  136. STDMETHOD(OpenView)(
  137. /* [in] */ DWORD ccvr,
  138. /* [in] */ CERTVIEWRESTRICTION const *acvr,
  139. /* [in] */ DWORD ccolOut,
  140. /* [in] */ DWORD const *acolOut,
  141. /* [in] */ DWORD const dwFlags,
  142. /* [out] */ IEnumCERTDBRESULTROW **ppenum);
  143. STDMETHOD(EnumCertDBColumn)(
  144. /* [in] */ DWORD dwTable,
  145. /* [out] */ IEnumCERTDBCOLUMN **ppenum);
  146. STDMETHOD(OpenBackup)(
  147. /* [in] */ LONG grbitJet,
  148. /* [out] */ ICertDBBackup **ppBackup);
  149. STDMETHOD(GetDefaultColumnSet)(
  150. /* [in] */ DWORD iColumnSetDefault,
  151. /* [in] */ DWORD cColumnIds,
  152. /* [out] */ DWORD *pcColumnIds,
  153. /* [out, ref] */ DWORD *pColumnIds);
  154. // CCertDB
  155. HRESULT BeginTransaction(
  156. IN CERTSESSION *pcs,
  157. IN BOOL fPrepareUpdate);
  158. HRESULT CommitTransaction(
  159. IN CERTSESSION *pcs,
  160. IN BOOL fCommit,
  161. IN BOOL fSoftCommit);
  162. HRESULT ReleaseSession(
  163. IN CERTSESSION *pcs);
  164. HRESULT BackupBegin(
  165. IN LONG grbitJet);
  166. HRESULT BackupGetDBFileList(
  167. IN OUT DWORD *pcwcList,
  168. OUT WCHAR *pwszzList); // OPTIONAL
  169. HRESULT BackupGetLogFileList(
  170. IN OUT DWORD *pcwcList,
  171. OUT WCHAR *pwszzList); // OPTIONAL
  172. HRESULT BackupOpenFile(
  173. IN WCHAR const *pwszFile,
  174. OUT JET_HANDLE *phFileDB,
  175. OPTIONAL OUT ULARGE_INTEGER *pliSize);
  176. HRESULT BackupReadFile(
  177. IN JET_HANDLE hFileDB,
  178. OUT BYTE *pb,
  179. IN DWORD cb,
  180. OUT DWORD *pcb);
  181. HRESULT BackupCloseFile(
  182. IN JET_HANDLE hFileDB);
  183. HRESULT BackupTruncateLog();
  184. HRESULT BackupEnd();
  185. HRESULT SetProperty(
  186. IN CERTSESSION *pcs,
  187. IN DBTABLE const *pdt,
  188. IN DWORD cbProp,
  189. IN BYTE const *pbProp); // OPTIONAL
  190. HRESULT GetProperty(
  191. IN CERTSESSION *pcs,
  192. IN DBTABLE const *pdt,
  193. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn,
  194. IN OUT DWORD *pcbProp,
  195. OUT BYTE *pbProp); // OPTIONAL
  196. HRESULT SetAttribute(
  197. IN CERTSESSION *pcs,
  198. IN WCHAR const *pwszAttributeName,
  199. IN DWORD cbValue,
  200. IN BYTE const *pbValue); // OPTIONAL
  201. HRESULT GetAttribute(
  202. IN CERTSESSION *pcs,
  203. IN WCHAR const *pwszAttributeName,
  204. IN OUT DWORD *pcbValue,
  205. OUT BYTE *pbValue); // OPTIONAL
  206. HRESULT SetExtension(
  207. IN CERTSESSION *pcs,
  208. IN WCHAR const *pwszExtensionName,
  209. IN DWORD dwExtFlags,
  210. IN DWORD cbValue,
  211. IN BYTE const *pbValue); // OPTIONAL
  212. HRESULT GetExtension(
  213. IN CERTSESSION *pcs,
  214. IN WCHAR const *pwszExtensionName,
  215. OUT DWORD *pdwExtFlags,
  216. IN OUT DWORD *pcbValue,
  217. OUT BYTE *pbValue); // OPTIONAL
  218. HRESULT CopyRequestNames(
  219. IN CERTSESSION *pcs);
  220. HRESULT GetColumnType(
  221. IN LONG ColumnIndex,
  222. OUT DWORD *pType);
  223. HRESULT EnumCertDBColumnNext(
  224. IN DWORD dwTable,
  225. IN ULONG ielt,
  226. IN ULONG celt,
  227. OUT CERTDBCOLUMN *rgelt,
  228. OUT ULONG *pielt,
  229. OUT ULONG *pceltFetched);
  230. HRESULT EnumCertDBResultRowNext(
  231. IN CERTSESSION *pcs,
  232. IN DWORD ccvr,
  233. IN CERTVIEWRESTRICTION const *acvr,
  234. IN DWORD ccolOut,
  235. IN DWORD const *acolOut,
  236. IN LONG cskip,
  237. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn,
  238. IN ULONG celt,
  239. OUT CERTDBRESULTROW *rgelt,
  240. OUT ULONG *pceltFetched,
  241. OUT LONG *pcskipped);
  242. HRESULT ReleaseResultRow(
  243. IN ULONG celt,
  244. IN OUT CERTDBRESULTROW *rgelt);
  245. HRESULT EnumerateSetup(
  246. IN CERTSESSION *pcs,
  247. IN OUT DWORD *pFlags,
  248. OUT JET_TABLEID *ptableid);
  249. HRESULT EnumerateNext(
  250. IN CERTSESSION *pcs,
  251. IN OUT DWORD *pFlags,
  252. IN JET_TABLEID tableid,
  253. IN LONG cskip,
  254. IN ULONG celt,
  255. OUT CERTDBNAME *rgelt,
  256. OUT ULONG *pceltFetched);
  257. HRESULT EnumerateClose(
  258. IN CERTSESSION *pcs,
  259. IN JET_TABLEID tableid);
  260. HRESULT OpenTables(
  261. IN CERTSESSION *pcs,
  262. OPTIONAL IN CERTVIEWRESTRICTION const *pcvr);
  263. HRESULT CloseTables(
  264. IN CERTSESSION *pcs);
  265. HRESULT Delete(
  266. IN CERTSESSION *pcs);
  267. HRESULT CloseTable(
  268. IN CERTSESSION *pcs,
  269. IN JET_TABLEID tableid);
  270. HRESULT MapPropId(
  271. IN WCHAR const *pwszPropName,
  272. IN DWORD dwFlags,
  273. OUT DBTABLE *pdtOut);
  274. HRESULT TestShutDownState();
  275. #if DBG_CERTSRV
  276. VOID DumpRestriction(
  277. IN DWORD dwSubSystemId,
  278. IN LONG i,
  279. IN CERTVIEWRESTRICTION const *pcvr);
  280. #endif // DBG_CERTSRV
  281. private:
  282. HRESULT _AllocateSession(
  283. OUT CERTSESSION **ppcs);
  284. HRESULT _BackupGetFileList(
  285. IN BOOL fDBFiles,
  286. IN OUT DWORD *pcwcList,
  287. OPTIONAL OUT WCHAR *pwszzList);
  288. HRESULT _CreateTable(
  289. IN DWORD CreateFlags, // CF_*
  290. IN CERTSESSION *pcs,
  291. IN DBCREATETABLE const *pct);
  292. HRESULT _Create(
  293. IN DWORD CreateFlags, // CF_*
  294. IN CHAR const *pszDatBaseName);
  295. HRESULT _CreateIndex(
  296. IN CERTSESSION *pcs,
  297. IN JET_TABLEID tableid,
  298. IN CHAR const *pszIndexName,
  299. IN CHAR const *pchKey,
  300. IN DWORD cbKey,
  301. IN DWORD flags);
  302. HRESULT _AddColumn(
  303. IN CERTSESSION *pcs,
  304. IN JET_TABLEID tableid,
  305. IN DBTABLE const *pdt);
  306. HRESULT _BuildColumnIds(
  307. IN CERTSESSION *pcs,
  308. IN CHAR const *pszTableName,
  309. IN DBTABLE *pdt);
  310. HRESULT _ConvertOldColumnData(
  311. IN CERTSESSION *pcs,
  312. IN CHAR const *pszTableName,
  313. IN DBAUXDATA const *pdbaux,
  314. IN DBTABLE *pdt);
  315. HRESULT _ConvertColumnData(
  316. IN CERTSESSION *pcs,
  317. IN JET_TABLEID tableid,
  318. IN DWORD RowId,
  319. IN DBTABLE const *pdt,
  320. IN DBAUXDATA const *pdbaux,
  321. IN OUT BYTE **ppbBuf,
  322. IN OUT DWORD *pcbBuf);
  323. HRESULT _AddKeyLengthColumn(
  324. IN CERTSESSION *pcs,
  325. IN JET_TABLEID tableid,
  326. IN DWORD RowId,
  327. IN DBTABLE const *pdtPublicKey,
  328. IN DBTABLE const *pdtPublicKeyAlgorithm,
  329. IN DBTABLE const *pdtPublicKeyParameters,
  330. IN DBTABLE const *pdtPublicKeyLength,
  331. IN DBAUXDATA const *pdbaux,
  332. IN OUT BYTE **ppbBuf,
  333. IN OUT DWORD *pcbBuf);
  334. HRESULT _AddCallerName(
  335. IN CERTSESSION *pcs,
  336. IN JET_TABLEID tableid,
  337. IN DWORD RowId,
  338. IN DBTABLE const *pdtCallerName,
  339. IN DBTABLE const *pdtRequesterName,
  340. IN DBAUXDATA const *pdbaux,
  341. IN OUT BYTE **ppbBuf,
  342. IN OUT DWORD *pcbBuf);
  343. HRESULT _SetHashColumnIfEmpty(
  344. IN CERTSESSION *pcs,
  345. IN JET_TABLEID tableid,
  346. IN DWORD RowId,
  347. IN DBTABLE const *pdtHash,
  348. IN DBAUXDATA const *pdbaux,
  349. IN BYTE const *pbHash,
  350. IN DWORD cbHash);
  351. HRESULT _AddCertColumns(
  352. IN CERTSESSION *pcs,
  353. IN JET_TABLEID tableid,
  354. IN DWORD RowId,
  355. IN DBTABLE const *pdtCertHash,
  356. IN DBTABLE const *pdtSKI,
  357. IN DBTABLE const *pdtCert,
  358. IN DBAUXDATA const *pdbaux,
  359. IN OUT BYTE **ppbBuf,
  360. IN OUT DWORD *pcbBuf);
  361. HRESULT _SetColumn(
  362. IN JET_SESID SesId,
  363. IN JET_TABLEID tableid,
  364. IN DBTABLE const *pdt,
  365. IN JET_COLUMNID columnid,
  366. IN DWORD cbProp,
  367. IN BYTE const *pbProp); // OPTIONAL
  368. HRESULT _OpenTableRow(
  369. IN CERTSESSION *pcs,
  370. IN DBAUXDATA const *pdbaux,
  371. OPTIONAL IN CERTVIEWRESTRICTION const *pcvr,
  372. OUT CERTSESSIONTABLE *pTable,
  373. OUT DWORD *pdwRowIdMismatch);
  374. HRESULT _UpdateTable(
  375. IN CERTSESSION *pcs,
  376. IN JET_TABLEID tableid);
  377. HRESULT _OpenTable(
  378. IN CERTSESSION *pcs,
  379. IN DBAUXDATA const *pdbaux,
  380. IN CERTVIEWRESTRICTION const *pcvr,
  381. IN OUT CERTSESSIONTABLE *pTable);
  382. HRESULT _SetIndirect(
  383. IN CERTSESSION *pcs,
  384. IN OUT CERTSESSIONTABLE *pTable,
  385. IN WCHAR const *pwszName,
  386. IN DWORD const *pdwExtFlags, // OPTIONAL
  387. IN DWORD cbValue,
  388. IN BYTE const *pbValue); // OPTIONAL
  389. HRESULT _GetIndirect(
  390. IN CERTSESSION *pcs,
  391. IN OUT CERTSESSIONTABLE *pTable,
  392. IN WCHAR const *pwszName,
  393. OUT DWORD *pdwExtFlags, // OPTIONAL
  394. IN OUT DWORD *pcbValue,
  395. OUT BYTE *pbValue); // OPTIONAL
  396. DBTABLE const *_MapTable(
  397. IN WCHAR const *pwszPropName,
  398. IN DBTABLE const *pdt);
  399. HRESULT _MapPropIdIndex(
  400. IN DWORD ColumnIndex,
  401. OUT DBTABLE const **ppdt,
  402. OPTIONAL OUT DWORD *pType);
  403. HRESULT _MapTableToIndex(
  404. IN DBTABLE const *pdt,
  405. OUT DWORD *pColumnIndex);
  406. HRESULT _RetrieveColumnBuffer(
  407. IN CERTSESSION *pcs,
  408. IN JET_TABLEID tableid,
  409. IN DBTABLE const *pdt,
  410. IN JET_COLUMNID columnid,
  411. IN OUT DWORD *pcbProp,
  412. IN OUT BYTE **ppbBuf,
  413. IN OUT DWORD *pcbBuf);
  414. HRESULT _RetrieveColumn(
  415. IN CERTSESSION *pcs,
  416. IN JET_TABLEID tableid,
  417. IN DBTABLE const *pdt,
  418. IN JET_COLUMNID columnid,
  419. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn,
  420. IN OUT DWORD *pcbData,
  421. OUT BYTE *pbData);
  422. HRESULT _CompareColumnValue(
  423. IN CERTSESSION *pcs,
  424. IN CERTVIEWRESTRICTION const *pcvr,
  425. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn);
  426. HRESULT _EnumerateMove(
  427. IN CERTSESSION *pcs,
  428. IN OUT DWORD *pFlags,
  429. IN DBAUXDATA const *pdbaux,
  430. IN JET_TABLEID tableid,
  431. IN LONG cskip);
  432. HRESULT _MakeSeekKey(
  433. IN CERTSESSION *pcs,
  434. IN JET_TABLEID tableid,
  435. IN DBTABLE const *pdt,
  436. IN BYTE const *pbValue,
  437. IN DWORD cbValue);
  438. HRESULT _SeekTable(
  439. IN CERTSESSION *pcs,
  440. IN JET_TABLEID tableid,
  441. IN CERTVIEWRESTRICTION const *pcvr,
  442. IN DBTABLE const *pdt,
  443. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn,
  444. IN DWORD dwPosition,
  445. OUT DWORD *pTableFlags
  446. DBGPARM(IN DBAUXDATA const *pdbaux));
  447. HRESULT _MoveTable(
  448. IN CERTSESSION *pcs,
  449. IN DWORD ccvr,
  450. IN CERTVIEWRESTRICTION const *acvr,
  451. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn,
  452. IN LONG cskip,
  453. OUT LONG *pcskipped);
  454. HRESULT _GetResultRow(
  455. IN CERTSESSION *pcs,
  456. IN DWORD ccvr,
  457. IN CERTVIEWRESTRICTION const *acvr,
  458. IN LONG cskip,
  459. IN DWORD ccolOut,
  460. IN DWORD const *acolOut,
  461. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn,
  462. OUT CERTDBRESULTROW *pelt,
  463. OUT LONG *pcskipped);
  464. HRESULT _JetSeekFromRestriction(
  465. IN CERTVIEWRESTRICTION const *pcvr,
  466. IN DWORD dwPosition,
  467. OUT DBSEEKDATA *pSeekData);
  468. HRESULT _DupString(
  469. OPTIONAL IN WCHAR const *pwszPrefix,
  470. IN WCHAR const *pwszIn,
  471. OUT WCHAR **ppwszOut);
  472. HRESULT _Rollback(
  473. IN CERTSESSION *pcs);
  474. #if DBG_CERTSRV
  475. HRESULT _DumpRowId(
  476. IN CHAR const *psz,
  477. IN CERTSESSION *pcs,
  478. IN JET_TABLEID tableid);
  479. HRESULT _DumpColumn(
  480. IN CHAR const *psz,
  481. IN CERTSESSION *pcs,
  482. IN JET_TABLEID tableid,
  483. IN DBTABLE const *pdt,
  484. OPTIONAL IN ICertDBComputedColumn *pIComputedColumn);
  485. #endif // DBG_CERTSRV
  486. BOOL m_fDBOpen;
  487. BOOL m_fDBReadOnly;
  488. BOOL m_fDBRestart;
  489. BOOL m_fFoundOldColumns;
  490. BOOL m_fAddedNewColumns;
  491. JET_INSTANCE m_Instance;
  492. CERTSESSION *m_aSession;
  493. DWORD m_cSession;
  494. DWORD m_cbPage;
  495. CRITICAL_SECTION m_critsecSession;
  496. CRITICAL_SECTION m_critsecAutoIncTables;
  497. BOOL m_cCritSec;
  498. BOOL m_fPendingShutDown;
  499. };