import "ms-dtyp.idl";
import "ms-oaut.idl";
 
typedef byte BYTE;
 
typedef struct _CERTTRANSBLOB
{
    ULONG               cb;
    [size_is(cb), unique] BYTE *pb;
} CERTTRANSBLOB;
 
typedef struct _CATRANSPROP {
  LONG lPropID;
  BYTE propType;
  BYTE Reserved;
  USHORT propFlags;
  ULONG obwszDisplayName;
} CATRANSPROP;
 
 
typedef struct _CERTTRANSDBATTRIBUTE
{
    ULONG obwszName;
    ULONG obwszValue;
} CERTTRANSDBATTRIBUTE;
 
typedef struct _CERTTRANSDBEXTENSION
{
    ULONG obwszName;
    LONG  ExtFlags;
    DWORD cbValue;
    ULONG obValue;
} CERTTRANSDBEXTENSION;
 
 
typedef struct _CERTTRANSDBCOLUMN
{
    DWORD Type;
    DWORD Index;
    DWORD cbMax;
    ULONG obwszName;
    ULONG obwszDisplayName;
} CERTTRANSDBCOLUMN;
 
typedef struct _CERTTRANSDBRESULTCOLUMN
{
    DWORD  Type;
    DWORD  Index;
    ULONG  obValue;
    DWORD  cbValue;
} CERTTRANSDBRESULTCOLUMN;
 
typedef struct _CERTTRANSDBRESULTROW  // Marshaled form
{
    DWORD rowid;
    DWORD ccol;
    ULONG cbrow;
} CERTTRANSDBRESULTROW;
 
 
typedef struct _CERTVIEWRESTRICTION
{
    DWORD                            ColumnIndex;
    LONG                             SeekOperator;
    LONG                             SortOrder;
    [size_is(cbValue), unique] BYTE *pbValue;
    DWORD                            cbValue;
} CERTVIEWRESTRICTION;
 
/* Interface ICertAdminD */
[
    object,
    uuid(d99e6e71-fc88-11d0-b498-00a0c90312f3),
    helpstring("ICertAdmin DCOM Interface"),
    pointer_default(unique)
]
interface ICertAdminD: IUnknown
{
    HRESULT SetExtension(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          dwRequestId,
        [in, string, unique] wchar_t const *pwszExtensionName,
        [in]                 DWORD          dwType,
        [in]                 DWORD          dwFlags,
        [in, ref]            CERTTRANSBLOB *pctbValue
    );
 
    HRESULT SetAttributes(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          dwRequestId,
        [in, string, unique] wchar_t const *pwszAttributes
    );
 
    HRESULT ResubmitRequest(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          dwRequestId,
        [out]                DWORD         *pdwDisposition
    );
 
    HRESULT DenyRequest(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          dwRequestId
    );
 
    HRESULT IsValidCertificate(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in, string, unique] wchar_t const *pSerialNumber,
        [out]                LONG          *pRevocationReason,
        [out]                LONG          *pDisposition
    );
 
    HRESULT PublishCRL(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 FILETIME       FileTime
    );
 
    HRESULT GetCRL(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out, ref]           CERTTRANSBLOB *pctbCRL
    );
 
    HRESULT RevokeCertificate(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in, string, unique] wchar_t const *pwszSerialNumber,
        [in]                 DWORD          Reason,
        [in]                 FILETIME       FileTime
    );
 
    HRESULT EnumViewColumn(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          iColumn,
        [in]                 DWORD          cColumn,
        [out]                DWORD         *pcColumnOut, // XXX: pcColumn -> pcColumnOut 
        [out, ref]           CERTTRANSBLOB *pctbColumnInfo
    );
 
    HRESULT GetViewDefaultColumnSet(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          iColumnSetDefault,
        [out]                DWORD         *pcColumnOut, // XXX: pcColumn -> pcColumnOut 
        [out, ref]           CERTTRANSBLOB *pctbColumnInfo
    );
 
    HRESULT EnumAttributesOrExtensions(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          RowId,
        [in]                 DWORD          Flags,
        [in, string, unique] wchar_t const *pwszLast,
        [in]                 DWORD          celt,
        [out]                DWORD         *pceltFetched,
        [out, ref]           CERTTRANSBLOB *pctbOut
    );
 
 
    HRESULT OpenView(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                   DWORD                     ccvr,
        [in, size_is(ccvr)]    CERTVIEWRESTRICTION const *acvr,
        [in]                   DWORD                      ccolOut,
        [in, size_is(ccolOut)] DWORD const               *acolOut,
        [in]                   DWORD                         ielt,
        [in]                   DWORD                         celt,
        [out]                  DWORD                *pceltFetched,
        [out, ref]             CERTTRANSBLOB      *pctbResultRows
    
    );
 
 
    HRESULT EnumView(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          ielt,
        [in]                 DWORD          celt,
        [out]                DWORD         *pceltFetched,
        [out, ref]           CERTTRANSBLOB *pctbResultRows
    );
 
 
    HRESULT CloseView(
        [in, string, unique] wchar_t const *pwszAuthority
    );
 
    HRESULT ServerControl(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          dwControlFlags,
        [out, ref]           CERTTRANSBLOB *pctbOut
    );
 
    /* this is a test function */
    HRESULT Ping(
        [in, string, unique] wchar_t const *pwszAuthority
    );
 
    HRESULT GetServerState(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out]                DWORD         *pdwState
    );
 
    HRESULT BackupPrepare(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 unsigned long  grbitJet,
        [in]                 unsigned long  dwBackupFlags,
        [in]                 WCHAR const   *pwszBackupAnnotation,
        [in]                 DWORD          dwClientIdentifier
    );
 
    HRESULT BackupEnd(
    );
 
    HRESULT BackupGetAttachmentInformation(
        [out, size_is( , *pcwcDBFiles)] [format(multi_size)] WCHAR **ppwszzDBFiles,
        [out]                           LONG   *pcwcDBFiles
    );
 
    HRESULT BackupGetBackupLogs(
        [out, size_is( , *pcwcLogFiles)] [format(multi_size)] WCHAR **ppwszzLogFiles,
        [out]                            LONG   *pcwcLogFiles
    );
 
    HRESULT BackupOpenFile(
        [in, string, unique] wchar_t const  *pwszPath,
        [out]                unsigned hyper *pliLength
    );
 
    HRESULT BackupReadFile(
        [ref, out, size_is(cbBuffer)] BYTE *pbBuffer,
        [in]                          LONG  cbBuffer,
        [out]                         LONG *pcbRead
    );
 
    HRESULT BackupCloseFile(
    );
 
    HRESULT BackupTruncateLogs(
    );
 
    HRESULT ImportCertificate(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in, ref]               CERTTRANSBLOB *pctbCertificate,
        [in]                    LONG           dwFlags,
        [out]                   LONG          *pdwRequestId
    );
 
    HRESULT BackupGetDynamicFiles(
        [out, size_is( , *pcwcFiles)] [format(multi_size)] WCHAR **ppwszzFiles,
        [out]                         LONG   *pcwcFiles
    );
 
    HRESULT RestoreGetDatabaseLocations(
        [out, size_is( , *pcwcPaths)] [format(multi_size)] WCHAR 
                      **ppwszzDatabaseLocations,
        [out]                         LONG   *pcwcPaths
    );
};
 
 
/* Interface ICertAdminD2 */
[
    object,
    uuid(7fe0d935-dda6-443f-85d0-1cfb58fe41dd),
    helpstring("ICertAdmin2 DCOM Interface"),
    pointer_default(unique)
]
interface ICertAdminD2: ICertAdminD
{
    HRESULT PublishCRLs(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 FILETIME       FileTime,
        [in]                 DWORD            Flags
    );
 
    HRESULT GetCAProperty(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 LONG           PropId,
        [in]                 LONG           PropIndex,
        [in]                 LONG           PropType,
        [out, ref]           CERTTRANSBLOB *pctbPropertyValue
    );
 
    HRESULT SetCAProperty(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 LONG           PropId,
        [in]                 LONG           PropIndex,
        [in]                 LONG           PropType,
        [in]                 CERTTRANSBLOB *pctbPropertyValue
    );
 
    HRESULT GetCAPropertyInfo(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out]                LONG          *pcProperty,
        [out, ref]           CERTTRANSBLOB *pctbPropInfo
    );
 
    HRESULT EnumViewColumnTable(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          iTable,
        [in]                 DWORD          iColumn,
        [in]                 DWORD          cColumn,
        [out]                DWORD         *pcColumnOut, // XXX: pcColumn -> pcColumnOut 
        [out, ref]           CERTTRANSBLOB *pctbColumnInfo
    );
 
    HRESULT GetCASecurity(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out, ref]             CERTTRANSBLOB *pctbSD
    );
 
    HRESULT SetCASecurity(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in, ref]             CERTTRANSBLOB *pctbSD
    );
 
    /* this is a test function */
    HRESULT Ping2(
        [in, string, unique] wchar_t const *pwszAuthority
    );
 
    HRESULT GetArchivedKey(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                     DWORD            dwRequestId,
        [out, ref]             CERTTRANSBLOB *pctbArchivedKey
    );
 
 
    HRESULT GetAuditFilter(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out]                DWORD         *pdwFilter
    );
 
    HRESULT SetAuditFilter(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                 DWORD          dwFilter
    );
 
    HRESULT GetOfficerRights(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out]                     BOOL           *pfEnabled,
        [out, ref]             CERTTRANSBLOB *pctbSD
    );
 
    HRESULT SetOfficerRights(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                     BOOL            fEnable,
        [in, ref]             CERTTRANSBLOB *pctbSD
    );
 
    HRESULT GetConfigEntry(
        [in, string, unique] wchar_t const *pwszAuthority,        
        [in, string, unique] wchar_t const *pwszNodePath,
        [in, string, ref]    wchar_t const *pwszEntry,
        [out, ref]             VARIANT           *pVariant
    );
 
    HRESULT SetConfigEntry(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in, string, unique] wchar_t const *pwszNodePath,
        [in, string, ref]    wchar_t const *pwszEntry,
        [in, ref]             VARIANT           *pVariant
    );
 
    HRESULT ImportKey(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                     DWORD            dwRequestId,
        [in, string, unique] wchar_t const *pwszCertHash,
        [in]                     DWORD            dwFlags,
        [in, ref]             CERTTRANSBLOB *pctbKey
    );
 
    HRESULT GetMyRoles(
        [in, string, unique] wchar_t const *pwszAuthority,
        [out]                LONG          *pdwRoles
    );
 
    HRESULT DeleteRow(
        [in, string, unique] wchar_t const *pwszAuthority,
        [in]                     DWORD            dwFlags,
        [in]                 FILETIME       FileTime,
        [in]                 DWORD          dwTable,
        [in]                 DWORD          dwRowId,
        [out, retval]        LONG          *pcDeleted
    );
}
 
