Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

573 lines
13 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: db.h
//
// Contents: Cert Server Database interface implementation
//
//---------------------------------------------------------------------------
#include "resource.h" // main symbols
typedef struct _DBSEEKDATA
{
DWORD SeekFlags; // CST_*
JET_GRBIT grbitSeekRange; // JetSeek flags if CST_SEEKINDEXRANGE
// this is where to seek to retrieve
// end-of-range key
JET_GRBIT grbitInitial; // JetMove or JetSeek flags: set initial cursor
// Where to set the cursor initially
JET_GRBIT grbitRange; // JetSetIndexRange flags if CST_SEEKINDEXRANGE
// other flags to be ingested while setting
// range (bitRange UpperLimit, Inclusive)
} DBSEEKDATA;
// _Create() CreateFlags:
#define CF_DATABASE 0x00000001
#define CF_MISSINGTABLES 0x00000002
#define CF_MISSINGCOLUMNS 0x00000004
#define CF_MISSINGINDEXES 0x00000008
#ifdef DBG_CERTSRV
#define CSASSERTTHREAD(pcs) \
{ \
DWORD dwThreadId = GetCurrentThreadId(); \
if ((pcs)->dwThreadId != dwThreadId) \
{ \
DBGPRINT((DBG_SS_CERTDB, "Session tid=%d, Current tid=%d\n", (pcs)->dwThreadId, dwThreadId)); \
} \
CSASSERT((pcs)->dwThreadId == dwThreadId); \
}
#endif
HRESULT
InitGlobalWriterState(VOID);
HRESULT
UnInitGlobalWriterState(VOID);
VOID
DBFreeParms();
HRESULT
DBInitParms(
IN DWORD cSession,
IN BOOL fCircularLogging,
OPTIONAL IN WCHAR const *pwszEventSource,
OPTIONAL IN WCHAR const *pwszLogDir,
OPTIONAL IN WCHAR const *pwszSystemDir,
OPTIONAL IN WCHAR const *pwszTempDir,
OUT JET_INSTANCE *pInstance);
#if DBG_CERTSRV
VOID
dbgcat(
IN OUT WCHAR *pwszBuf,
IN WCHAR const *pwszAdd);
WCHAR const *
wszSeekgrbit(
JET_GRBIT grbit);
WCHAR const *
wszMovecrow(
IN LONG cRow);
WCHAR const *
wszSetIndexRangegrbit(
JET_GRBIT grbit);
WCHAR const *
wszMakeKeygrbit(
JET_GRBIT grbit);
WCHAR const *
wszCSFFlags(
IN LONG Flags);
WCHAR const *
wszCSTFlags(
IN LONG Flags);
WCHAR const *
wszSeekOperator(
IN LONG SeekOperator);
WCHAR const *
wszSortOperator(
IN LONG SortOrder);
VOID
dbDumpValue(
IN DWORD dwSubSystemId,
OPTIONAL IN DBTABLE const *pdt,
IN BYTE const *pbValue,
IN DWORD cbValue);
VOID
dbDumpColumn(
IN DWORD dwSubSystemId,
IN DBTABLE const *pdt,
IN BYTE const *pbValue,
IN DWORD cbValue);
#endif // DBG_CERTSRV
class CCertDB:
public ICertDB,
//public ISupportErrorInfoImpl<&IID_ICertDB>,
public CComObjectRoot,
public CComCoClass<CCertDB, &CLSID_CCertDB>
{
public:
CCertDB();
~CCertDB();
BEGIN_COM_MAP(CCertDB)
COM_INTERFACE_ENTRY(ICertDB)
//COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(CCertDB)
// Remove the comment from the line above if you don't want your object to
// support aggregation. The default is to support it
DECLARE_REGISTRY(
CCertDB,
wszCLASS_CERTDB TEXT(".1"),
wszCLASS_CERTDB,
IDS_CERTDB_DESC,
THREADFLAGS_BOTH)
// ICertDB
public:
STDMETHOD(Open)(
/* [in] */ DWORD Flags,
/* [in] */ DWORD cSession,
/* [in] */ WCHAR const *pwszEventSource,
/* [in] */ WCHAR const *pwszDBFile,
/* [in] */ WCHAR const *pwszLogDir,
/* [in] */ WCHAR const *pwszSystemDir,
/* [in] */ WCHAR const *pwszTempDir);
STDMETHOD(ShutDown)(
/* [in] */ DWORD dwFlags);
STDMETHOD(OpenRow)(
/* [in] */ DWORD dwFlags,
/* [in] */ DWORD RowId,
/* [in] */ WCHAR const *pwszSerialNumberOrCertHash, // OPTIONAL
/* [out] */ ICertDBRow **pprow);
STDMETHOD(OpenView)(
/* [in] */ DWORD ccvr,
/* [in] */ CERTVIEWRESTRICTION const *acvr,
/* [in] */ DWORD ccolOut,
/* [in] */ DWORD const *acolOut,
/* [in] */ DWORD const dwFlags,
/* [out] */ IEnumCERTDBRESULTROW **ppenum);
STDMETHOD(EnumCertDBColumn)(
/* [in] */ DWORD dwTable,
/* [out] */ IEnumCERTDBCOLUMN **ppenum);
STDMETHOD(OpenBackup)(
/* [in] */ LONG grbitJet,
/* [out] */ ICertDBBackup **ppBackup);
STDMETHOD(GetDefaultColumnSet)(
/* [in] */ DWORD iColumnSetDefault,
/* [in] */ DWORD cColumnIds,
/* [out] */ DWORD *pcColumnIds,
/* [out, ref] */ DWORD *pColumnIds);
// CCertDB
HRESULT BeginTransaction(
IN CERTSESSION *pcs,
IN BOOL fPrepareUpdate);
HRESULT CommitTransaction(
IN CERTSESSION *pcs,
IN BOOL fCommit);
HRESULT ReleaseSession(
IN CERTSESSION *pcs);
HRESULT BackupBegin(
IN LONG grbitJet);
HRESULT BackupGetDBFileList(
IN OUT DWORD *pcwcList,
OUT WCHAR *pwszzList); // OPTIONAL
HRESULT BackupGetLogFileList(
IN OUT DWORD *pcwcList,
OUT WCHAR *pwszzList); // OPTIONAL
HRESULT BackupOpenFile(
IN WCHAR const *pwszFile,
OUT JET_HANDLE *phFileDB,
OPTIONAL OUT ULARGE_INTEGER *pliSize);
HRESULT BackupReadFile(
IN JET_HANDLE hFileDB,
OUT BYTE *pb,
IN DWORD cb,
OUT DWORD *pcb);
HRESULT BackupCloseFile(
IN JET_HANDLE hFileDB);
HRESULT BackupTruncateLog();
HRESULT BackupEnd();
HRESULT SetProperty(
IN CERTSESSION *pcs,
IN DBTABLE const *pdt,
IN DWORD cbProp,
IN BYTE const *pbProp); // OPTIONAL
HRESULT GetProperty(
IN CERTSESSION *pcs,
IN DBTABLE const *pdt,
IN OUT DWORD *pcbProp,
OUT BYTE *pbProp); // OPTIONAL
HRESULT SetAttribute(
IN CERTSESSION *pcs,
IN WCHAR const *pwszAttributeName,
IN DWORD cbValue,
IN BYTE const *pbValue); // OPTIONAL
HRESULT GetAttribute(
IN CERTSESSION *pcs,
IN WCHAR const *pwszAttributeName,
IN OUT DWORD *pcbValue,
OUT BYTE *pbValue); // OPTIONAL
HRESULT SetExtension(
IN CERTSESSION *pcs,
IN WCHAR const *pwszExtensionName,
IN DWORD dwExtFlags,
IN DWORD cbValue,
IN BYTE const *pbValue); // OPTIONAL
HRESULT GetExtension(
IN CERTSESSION *pcs,
IN WCHAR const *pwszExtensionName,
OUT DWORD *pdwExtFlags,
IN OUT DWORD *pcbValue,
OUT BYTE *pbValue); // OPTIONAL
HRESULT CopyRequestNames(
IN CERTSESSION *pcs);
HRESULT GetColumnType(
IN LONG ColumnIndex,
OUT DWORD *pType);
HRESULT EnumCertDBColumnNext(
IN DWORD dwTable,
IN ULONG ielt,
IN ULONG celt,
OUT CERTDBCOLUMN *rgelt,
OUT ULONG *pielt,
OUT ULONG *pceltFetched);
HRESULT EnumCertDBResultRowNext(
IN CERTSESSION *pcs,
IN DWORD ccvr,
IN CERTVIEWRESTRICTION const *acvr,
IN DWORD ccolOut,
IN DWORD const *acolOut,
IN LONG cskip,
IN ULONG celt,
OUT CERTDBRESULTROW *rgelt,
OUT ULONG *pceltFetched,
OUT LONG *pcskipped);
HRESULT ReleaseResultRow(
IN ULONG celt,
IN OUT CERTDBRESULTROW *rgelt);
HRESULT EnumerateSetup(
IN CERTSESSION *pcs,
IN OUT DWORD *pFlags,
OUT JET_TABLEID *ptableid);
HRESULT EnumerateNext(
IN CERTSESSION *pcs,
IN OUT DWORD *pFlags,
IN JET_TABLEID tableid,
IN LONG cskip,
IN ULONG celt,
OUT CERTDBNAME *rgelt,
OUT ULONG *pceltFetched);
HRESULT EnumerateClose(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid);
HRESULT OpenTables(
IN CERTSESSION *pcs,
OPTIONAL IN CERTVIEWRESTRICTION const *pcvr);
HRESULT CloseTables(
IN CERTSESSION *pcs);
HRESULT Delete(
IN CERTSESSION *pcs);
HRESULT CloseTable(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid);
HRESULT MapPropId(
IN WCHAR const *pwszPropName,
IN DWORD dwFlags,
OUT DBTABLE *pdtOut);
HRESULT TestShutDownState();
#if DBG_CERTSRV
VOID DumpRestriction(
IN DWORD dwSubSystemId,
IN LONG i,
IN CERTVIEWRESTRICTION const *pcvr);
#endif // DBG_CERTSRV
private:
HRESULT _AllocateSession(
OUT CERTSESSION **ppcs);
HRESULT _BackupGetFileList(
IN BOOL fDBFiles,
IN OUT DWORD *pcwcList,
OPTIONAL OUT WCHAR *pwszzList);
HRESULT _CreateTable(
IN DWORD CreateFlags, // CF_*
IN CERTSESSION *pcs,
IN DBCREATETABLE const *pct);
HRESULT _Create(
IN DWORD CreateFlags, // CF_*
IN CHAR const *pszDatBaseName);
HRESULT _CreateIndex(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN CHAR const *pszIndexName,
IN CHAR const *pchKey,
IN DWORD cbKey,
IN DWORD flags);
HRESULT _AddColumn(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN DBTABLE const *pdt);
HRESULT _BuildColumnIds(
IN CERTSESSION *pcs,
IN CHAR const *pszTableName,
IN DBTABLE *pdt);
HRESULT _ConvertOldColumnData(
IN CERTSESSION *pcs,
IN CHAR const *pszTableName,
IN DBAUXDATA const *pdbaux,
IN DBTABLE *pdt);
HRESULT _ConvertColumnData(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN DWORD RowId,
IN DBTABLE const *pdt,
IN DBAUXDATA const *pdbaux,
IN OUT BYTE **ppbBuf,
IN OUT DWORD *pcbBuf);
HRESULT _AddKeyLengthColumn(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN DWORD RowId,
IN DBTABLE const *pdtPublicKey,
IN DBTABLE const *pdtPublicKeyAlgorithm,
IN DBTABLE const *pdtPublicKeyParameters,
IN DBTABLE const *pdtPublicKeyLength,
IN DBAUXDATA const *pdbaux,
IN OUT BYTE **ppbBuf,
IN OUT DWORD *pcbBuf);
HRESULT _AddCallerName(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN DWORD RowId,
IN DBTABLE const *pdtCallerName,
IN DBTABLE const *pdtRequesterName,
IN DBAUXDATA const *pdbaux,
IN OUT BYTE **ppbBuf,
IN OUT DWORD *pcbBuf);
HRESULT _SetColumn(
IN JET_SESID SesId,
IN JET_TABLEID tableid,
IN JET_COLUMNID columnid,
IN DWORD cbProp,
IN BYTE const *pbProp); // OPTIONAL
HRESULT _OpenTableRow(
IN CERTSESSION *pcs,
IN DBAUXDATA const *pdbaux,
OPTIONAL IN CERTVIEWRESTRICTION const *pcvr,
OUT CERTSESSIONTABLE *pTable,
OUT DWORD *pdwRowIdMismatch);
HRESULT _UpdateTable(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid);
HRESULT _OpenTable(
IN CERTSESSION *pcs,
IN DBAUXDATA const *pdbaux,
IN CERTVIEWRESTRICTION const *pcvr,
IN OUT CERTSESSIONTABLE *pTable);
HRESULT _SetIndirect(
IN CERTSESSION *pcs,
IN OUT CERTSESSIONTABLE *pTable,
IN WCHAR const *pwszName,
IN DWORD const *pdwExtFlags, // OPTIONAL
IN DWORD cbValue,
IN BYTE const *pbValue); // OPTIONAL
HRESULT _GetIndirect(
IN CERTSESSION *pcs,
IN OUT CERTSESSIONTABLE *pTable,
IN WCHAR const *pwszName,
OUT DWORD *pdwExtFlags, // OPTIONAL
IN OUT DWORD *pcbValue,
OUT BYTE *pbValue); // OPTIONAL
DBTABLE const *_MapTable(
IN WCHAR const *pwszPropName,
IN DBTABLE const *pdt);
HRESULT _MapPropIdIndex(
IN DWORD ColumnIndex,
OUT DBTABLE const **ppdt,
OPTIONAL OUT DWORD *pType);
HRESULT _RetrieveColumnBuffer(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN JET_COLUMNID columnid,
IN JET_COLTYP coltyp,
IN OUT DWORD *pcbProp,
IN OUT BYTE **ppbBuf,
IN OUT DWORD *pcbBuf);
HRESULT _RetrieveColumn(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN JET_COLUMNID columnid,
IN JET_COLTYP coltyp,
IN OUT DWORD *pcbData,
OUT BYTE *pbData);
HRESULT _CompareColumnValue(
IN CERTSESSION *pcs,
IN CERTVIEWRESTRICTION const *pcvr);
HRESULT _EnumerateMove(
IN CERTSESSION *pcs,
IN OUT DWORD *pFlags,
IN DBAUXDATA const *pdbaux,
IN JET_TABLEID tableid,
IN LONG cskip);
HRESULT _MakeSeekKey(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN DBTABLE const *pdt,
IN BYTE const *pbValue,
IN DWORD cbValue);
HRESULT _SeekTable(
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN CERTVIEWRESTRICTION const *pcvr,
IN DBTABLE const *pdt,
IN DWORD dwPosition,
OUT DWORD *pTableFlags
DBGPARM(IN DBAUXDATA const *pdbaux));
HRESULT _MoveTable(
IN CERTSESSION *pcs,
IN DWORD ccvr,
IN CERTVIEWRESTRICTION const *acvr,
IN LONG cskip,
OUT LONG *pcskipped);
HRESULT _GetResultRow(
IN CERTSESSION *pcs,
IN DWORD ccvr,
IN CERTVIEWRESTRICTION const *acvr,
IN LONG cskip,
IN DWORD ccolOut,
IN DWORD const *acolOut,
OUT CERTDBRESULTROW *pelt,
OUT LONG *pcskipped);
HRESULT _JetSeekFromRestriction(
IN CERTVIEWRESTRICTION const *pcvr,
IN DWORD dwPosition,
OUT DBSEEKDATA *pSeekData);
HRESULT _DupString(
OPTIONAL IN WCHAR const *pwszPrefix,
IN WCHAR const *pwszIn,
OUT WCHAR **ppwszOut);
HRESULT _Rollback(
IN CERTSESSION *pcs);
#if DBG_CERTSRV
HRESULT _DumpRowId(
IN CHAR const *psz,
IN CERTSESSION *pcs,
IN JET_TABLEID tableid);
HRESULT _DumpColumn(
IN CHAR const *psz,
IN CERTSESSION *pcs,
IN JET_TABLEID tableid,
IN DBTABLE const *pdt);
#endif // DBG_CERTSRV
BOOL m_fDBOpen;
BOOL m_fDBReadOnly;
BOOL m_fDBRestart;
BOOL m_fFoundOldColumns;
BOOL m_fAddedNewColumns;
JET_INSTANCE m_Instance;
CERTSESSION *m_aSession;
DWORD m_cSession;
DWORD m_cbPage;
CRITICAL_SECTION m_critsecSession;
CRITICAL_SECTION m_critsecAutoIncTables;
BOOL m_cCritSec;
BOOL m_fPendingShutDown;
};