574 lines
13 KiB
C++
574 lines
13 KiB
C++
//+--------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
};
|