// // // Copyright (c) 1995-1996 Microsoft Corporation // // Module Name: // // crsapi.h // // Abstract: // // This module defines the common structures and prototypes for the // Content Replication Service API. // // Revision History: // #ifndef CRSAPI_INCLUDED #define CRSAPI_INCLUDED #if defined(STATIC_REX) #define CRSAPI #elif defined(IN_CRSDLL) #define CRSAPI __declspec( dllexport ) _stdcall #else #define CRSAPI __declspec( dllimport) _stdcall #endif //IN_DLL #define MAX_PROJECT 100 #define MAX_LOCATION 300 #define MAX_DESTINATION_BUFFER 0x1000 #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #define NOREF(x) x=x // @DOC #define RF_NO_DELETE 1 #define RF_REPLICATE_ACLS (1 << 1) #define RF_NO_DATA (1 << 2) #define RF_FORCE_REPL (1 << 3) #define RF_PERMIT_TREE (1 << 4) #define RF_IN_PROC (1 << 5) #define RF_INCREMENTAL (1 << 6) #define RF_FASTMODE (1 << 7) #define RF_ON_DIR_CHANGE (1 << 8) #define RF_AUTO_ROUTE (1 << 9) #define RF_ON_NOTIFY (1 << 10) #define RF_NO_CHAIN (1 << 11) // added by nathanf 10/3/96 for Raid 6904 - exclude all subdirs is missing #define RF_EXCLUDE_ALL (1 << 12) #define RF_DELETE (1 << 16) #define RF_NO_REPLICATE_ACLS (1 << 17) #define RF_DATA (1 << 18) #define RF_NO_FORCE_REPL (1 << 19) #define RF_NO_PERMIT_TREE (1 << 20) #define RF_NO_IN_PROC (1 << 21) #define RF_NO_INCREMENTAL (1 << 22) #define RF_NO_FASTMODE (1 << 23) #define RF_NO_ON_DIR_CHANGE (1 << 24) #define RF_NO_AUTO_ROUTE (1 << 25) #define RF_NO_ON_NOTIFY (1 << 26) #define RF_CHAIN (1 << 27) #define REPL_STATE_EMPTY 0 #define REPL_STATE_STARTING 1 #define REPL_STATE_RUNNING 2 #define REPL_STATE_COMPLETE 3 #define REPL_STATE_ABORTED 4 #define REPL_STATE_CANCLED 5 #define REPL_STATE_RECEIVING 6 #define PARM_VALUE_ENCRYPTED 1 #define CP_PROPOGATE_ALL 1 #define MAX_PARM_STRING 300 typedef void *REPLICATION_INSTANCE; // @type REPLICATION_INSTANCE | Identifier of a particular replication instance. Needed to call any function which manipulates or queries and existing replication #ifndef UNICODE_ONLY // @struct SELECTION_ENTRY_A | Defines a single entry member of a fileset for a given replication request typedef struct _SELECTION_ENTRY_A { CHAR cPath[MAX_PATH]; //@field The path specification DWORD dwFlags; //@field Flags which indicate handle the entry should be handled. } SELECTION_ENTRY_A; #endif #ifndef ANSI_ONLY // @struct SELECTION_ENTRY_A | Defines a single entry member of a fileset for a given replication request typedef struct _SELECTION_ENTRY_W { WCHAR cPath[MAX_PATH]; //@field The path specification DWORD dwFlags; //@field Flags which indicate handle the entry should be handled. } SELECTION_ENTRY_W; #endif #ifdef UNICODE #define SELECTION_ENTRY SELECTION_ENTRY_W #else #define SELECTION_ENTRY SELECTION_ENTRY_A #endif // @struct SELECTION_LIST | Defines a complete fileset for a replication. typedef struct _SELECTION_LIST { int nEntries; //@field The number of selection entries in the list. SELECTION_ENTRY sList[1]; //@field An Array of selection entries. } SELECTION_LIST; // @struct REPLICATION_COUNTERS | Counters used to record replication information. Returned by QueryReplication. typedef struct _REPLICATION_COUNTERS { DWORD dwStartStamp; //@field Start Time DWORD dwFilesSent; //@field The Total files that have been sent across this connection. DWORD dwFilesReceived; //@field The total files that have been received across this connection. DWORD dwFilesMatched; //@field The number of files that matched and did not need to be sent DWORD dwFilesErrored; //@field The number of files which had errors DWORD dwBytesSent; //@field The total bytes sent across this connection. DWORD dwBytesReceived; //@field The total bytes received across this connection. DWORD dwBytesMatched; //@field The total bytes which matched and did not need to be sent. DWORD dwBytesErrored; //@field The total bytes errored DWORD dwDirectoriesProcessed; //@field The number of directories processed } REPLICATION_COUNTERS; #ifndef UNICODE_ONLY //@struct REPLICATION_INFO_A | Contains information about a particular replication instance. // Is returned by and . typedef struct _REPLICATION_INFO_A { REPLICATION_INSTANCE hInstance; //@field The instance id for this replication. CHAR cProject[MAX_PROJECT]; //@field The project associated with this replication. DWORD dwState; //@field The Current State of this replication // @flag REPL_STATE_EMPTY | This Replication Info structure is empty. // @flag REPL_STATE_STARTING | The replication is a startup state. // @flag REPL_STATE_RUNNING | The replication is currently running. // @flag REPL_STATE_COMPLETE | The replication is complete. // @flag REPL_STATE_ABORTED | The replication aborted due to an error. // @flag REPL_STATE_CANCLED | The replication was canceled. // @flag REPL_STATE_RECEIVING | The replication is receiving data. DWORD dwError; // @field An error code if the replication aborted DWORD dwFlags; //@field Flags this replication was started with. // @flag RF_NO_DELETE | Turns of Delete Processing // @flag RF_REPLICATE_ACLS | Replicates ACL's // @flag RF_NO_DATA | Skips Replicating Data, will only replicate directories. // @flag RF_FORCE_REPL | Forces data to be replicated without checking first // @flag RF_IN_PROC | Causes the StartReplication API to run in process (note: This blocks!) // @flag RF_INCREMENTAL | Runs replication in "Incremental" mode, meaning that only files which have been locally detected to have been modified since the last replication are checked and sent. // @flag RF_FASTMODE | Uses Unframed Protocol for enhanced performance over faster/secure links. // @flag RF_ON_DIR_CHANGE | Turns on monitor mode. This will monitor a directory for changes and then replicate them to the destination. // @flag RF_AUTO_ROUTE | Uses information in the routing table to determine destinations servers. // @flag RF_NOTIFY | Turns on notify mode. Replications occur based on notifications from the IAcceptNotify COM interface. // @flag RF_PERMIT_TREE | Applies ACLs on the directory structure to the files beneath it. } REPLICATION_INFO_A; #endif #ifndef ANSI_ONLY //@struct REPLICATION_INFO_W | Contains information about a particular replication instance. // Is returned by and . typedef struct _REPLICATION_INFO_W { REPLICATION_INSTANCE hInstance; //@field The instance id for this replication. WCHAR cProject[MAX_PROJECT]; //@field The project associated with this replication. DWORD dwState; //@field The Current State of this replication // @flag REPL_STATE_EMPTY | This Replication Info structure is empty. // @flag REPL_STATE_STARTING | The replication is a startup state. // @flag REPL_STATE_RUNNING | The replication is currently running. // @flag REPL_STATE_COMPLETE | The replication is complete. // @flag REPL_STATE_ABORTED | The replication aborted due to an error. // @flag REPL_STATE_CANCLED | The replication was canceled. // @flag REPL_STATE_RECEIVING | The replication is receiving data. DWORD dwError; // @field An error code if the replication aborted DWORD dwFlags; //@field Flags this replication was started with. // @flag RF_NO_DELETE | Turns of Delete Processing // @flag RF_REPLICATE_ACLS | Replicates ACL's // @flag RF_NO_DATA | Skips Replicating Data, will only replicate directories. // @flag RF_FORCE_REPL | Forces data to be replicated without checking first // @flag RF_IN_PROC | Causes the StartReplication API to run in process (note: This blocks!) // @flag RF_INCREMENTAL | Runs replication in "Incremental" mode, meaning that only files which have been locally detected to have been modified since the last replication are checked and sent. // @flag RF_FASTMODE | Uses Unframed Protocol for enhanced performance over faster/secure links. // @flag RF_ON_DIR_CHANGE | Turns on monitor mode. This will monitor a directory for changes and then replicate them to the destination. // @flag RF_AUTO_ROUTE | Uses information in the routing table to determine destinations servers. // @flag RF_NOTIFY | Turns on notify mode. Replications occur based on notifications from the IAcceptNotify COM interface. // @flag RF_PERMIT_TREE | Applies ACLs on the directory structure to the files beneath it. } REPLICATION_INFO_W; #endif #ifdef UNICODE #define REPLICATION_INFO REPLICATION_INFO_W #else #define REPLICATION_INFO REPLICATION_INFO_A #endif #ifndef UNICODE_ONLY //@struct PROJECT_INFO | Returns a list of projects with some additional information. // Is returned by . typedef struct _PROJECT_INFO_A { CHAR cProject[ MAX_PROJECT]; //@field Project name CHAR cReplicationMethod[MAX_PROJECT]; //@field Replication method ("SENDINET" or "PULL") CHAR cDestination[ MAX_LOCATION]; //@field Destination server or route. CHAR cRootUrl[MAX_LOCATION]; //@field Root URL of a pull replication. CHAR cLocalDir[MAX_LOCATION]; //@field Local directory. CHAR cComments[MAX_LOCATION]; //@field User comments. } PROJECT_INFO_A; #endif #ifndef ANSI_ONLY //@struct PROJECT_INFO | Returns a list of projects with some additional information. // Is returned by . typedef struct _PROJECT_INFO_W { WCHAR cProject[ MAX_PROJECT]; //@field Project name WCHAR cReplicationMethod[MAX_PROJECT]; //@field Replication method ("SENDINET" or "PULL") WCHAR cDestination[ MAX_LOCATION]; //@field Destination server or route. WCHAR cRootUrl[MAX_LOCATION]; //@field Root URL of a pull replication. WCHAR cLocalDir[MAX_LOCATION]; //@field Local directory. WCHAR cComments[MAX_LOCATION]; //@field User comments. } PROJECT_INFO_W; #endif #ifdef UNICODE #define PROJECT_INFO PROJECT_INFO_W #else #define PROJECT_INFO PROJECT_INFO_A #endif #ifndef UNICODE_ONLY //@struct ROUTE_LIST_A | Returns the list of routes defined for a server. // Is returned by . typedef struct _ROUTE_LIST_A { CHAR cRouteName[MAX_PROJECT]; //@field Name of the route. CHAR cDestinations[MAX_LOCATION]; //@field Multi-string list of destinations (format "dest1\0dest2\0\0") CHAR cBaseDirectory[MAX_LOCATION]; //@field Base directory for projects using this route. } ROUTE_LIST_A; #endif #ifndef ANSI_ONLY //@struct ROUTE_LIST_W | Returns the list of routes defined for a server. // Is returned by . typedef struct _ROUTE_LIST_W { WCHAR cRouteName[MAX_PROJECT]; //@field Name of the route. WCHAR cDestinations[MAX_LOCATION]; //@field Multi-string list of destinations (format "dest1\0dest2\0\0") WCHAR cBaseDirectory[MAX_LOCATION]; //@field Base directory for projects using this route. } ROUTE_LIST_W; #endif #ifdef UNICODE #define ROUTE_LIST ROUTE_LIST_W #else #define ROUTE_LIST ROUTE_LIST_A #endif #ifndef UNICODE_ONLY //@struct PARMSET_A | Defines a Parameter for , , and . typedef struct { DWORD dwType; //@field Parameter Type (Registry type values, REG_SZ, etc). DWORD dwFlags; //@field Parameter flags DWORD dwSize; //@field Size of value parameter CHAR cParmName[MAX_PARM_STRING]; //@field Parameter Name CHAR cParmValue[MAX_PARM_STRING]; //@field Parameter Value }PARMSET_A; #endif #ifndef ANSI_ONLY //@struct PARMSET_W | Defines a Parameter for , , and . typedef struct { DWORD dwType; //@field Parameter Type (Registry type values, REG_SZ, etc). DWORD dwFlags; //@field Parameter flags DWORD dwSize; //@field Size of value parameter WCHAR cParmName[MAX_PARM_STRING]; //@field Parameter Name WCHAR cParmValue[MAX_PARM_STRING]; //@field Parameter Value }PARMSET_W; #endif #ifdef UNICODE #define PARMSET PARMSET_W #else #define PARMSET PARMSET_A #endif //@struct PARM_LIST | Contains a list of parameters to pass with , , . typedef struct _PARM_LIST { DWORD dwNumParms; // @field The number of Parameters in this list PARMSET Parms[1]; // @field An array of Parameters } PARM_LIST; #ifndef UNICODE_ONLY typedef struct _PARM_LIST_A { DWORD dwNumParms; // @field The number of Parameters in this list PARMSET_A Parms[1]; // @field An array of Parameters } PARM_LIST_A; #endif #define CRS_STOP_SERVICE (1<<1) #define CRS_PAUSE_SERVICE (1<<2) #define CRS_RESUME_SERVICE (1<<3) #define CRS_START_SERVICE (1<<4) #define CRS_USER_ACCESS ( KEY_READ ) #define CRS_ADMIN_ACCESS ( KEY_ALL_ACCESS | READ_CONTROL ) typedef SELECTION_LIST *PSELECTION_LIST; typedef REPLICATION_INSTANCE *PREPLICATION_INSTANCE; #define SELECT_LIST_SIZE(p) ((p->nEntries * sizeof(SELECTION_ENTRY))+sizeof(p->nEntries)) #ifndef USE_COM_APIS #ifndef UNICODE_ONLY DWORD CRSAPI CancelReplicationA(LPCSTR pszServer, REPLICATION_INSTANCE hInstance,DWORD dwFlags ); #endif #ifndef ANSI_ONLY DWORD CRSAPI CancelReplicationW(LPCWSTR pszServer, REPLICATION_INSTANCE hInstance,DWORD dwFlags ); #endif #ifdef UNICODE #define CancelReplication CancelReplicationW #else #define CancelReplication CancelReplicationA #endif #ifndef UNICODE_ONLY DWORD CRSAPI StartReplicationA(LPCSTR pszServer, LPCSTR pszProject, PSELECTION_LIST slFileSet, DWORD dwFlags, PREPLICATION_INSTANCE hInstance); #endif #ifndef ANSI_ONLY DWORD CRSAPI StartReplicationW(LPCWSTR pszServer, LPCWSTR pszProject, PSELECTION_LIST slFileSet, DWORD dwFlags, PREPLICATION_INSTANCE hInstance); #endif #ifdef UNICODE #define StartReplication StartReplicationW #else #define StartReplication StartReplicationA #endif #ifndef UNICODE_ONLY DWORD CRSAPI QueryReplicationA(LPCSTR pszServer, REPLICATION_INSTANCE hInstance, REPLICATION_INFO_A *rpInfo, REPLICATION_COUNTERS *rCounters); #endif #ifndef ANSI_ONLY DWORD CRSAPI QueryReplicationW(LPCWSTR pszServer, REPLICATION_INSTANCE hInstance, REPLICATION_INFO_W *rpInfo, REPLICATION_COUNTERS *rCounters); #endif #ifdef UNICODE #define QueryReplication QueryReplicationW #else #define QueryReplication QueryReplicationA #endif #ifndef UNICODE_ONLY DWORD CRSAPI EnumReplicationsA(LPCSTR pszServer, LPCSTR pszMatchProject, DWORD dwMatchState, DWORD *dwNumReplications, void **pBuffer); #endif #ifndef ANSI_ONLY DWORD CRSAPI EnumReplicationsW(LPCWSTR pszServer, LPCWSTR pszMatchProject, DWORD dwMatchState, DWORD *dwNumReplications, void **pBuffer); #endif #ifdef UNICODE #define EnumReplications EnumReplicationsW #else #define EnumReplications EnumReplicationsA #endif #ifndef UNICODE_ONLY DWORD CRSAPI LockTransactionsA(LPCSTR pszServer, LPCSTR pszProject, DWORD dwWait, DWORD dwFlags); #endif #ifndef ANSI_ONLY DWORD CRSAPI LockTransactionsW(LPCTSTR pszServer, LPCTSTR pszProject, DWORD dwWait, DWORD dwFlags); #endif #ifdef UNICODE #define LockTransactions LockTransactionsW #else #define LockTransactions LockTransactionsA #endif #ifndef UNICODE_ONLY DWORD CRSAPI UnlockTransactionsA(LPCSTR pszServer, LPCSTR pszProject, DWORD dwFlags); #endif #ifndef ANSI_ONLY DWORD CRSAPI UnlockTransactionsW(LPCWSTR pszServer, LPCWSTR pszProject, DWORD dwFlags); #endif #ifdef UNICODE #define UnlockTransactions UnlockTransactionsW #else #define UnlockTransactions UnlockTransactionsA #endif #ifndef UNICODE_ONLY DWORD CRSAPI RollbackReplicationA(LPCSTR pszServer, LPCSTR pszProject,int nRollbacks,DWORD dwFlags); #endif #ifndef ANSI_ONLY DWORD CRSAPI RollbackReplicationW(LPCWSTR pszServer, LPCWSTR pszProject,int nRollbacks,DWORD dwFlags); #endif #ifdef UNICODE #define RollbackReplication RollbackReplicationW #else #define RollbackReplication RollbackReplicationA #endif #ifndef UNICODE_ONLY DWORD CRSAPI ReturnLogA(LPCSTR pszServer, DWORD dwOffset, DWORD *dwSize, PVOID pvBuffer); #endif #ifndef ANSI_ONLY DWORD CRSAPI ReturnLogW(LPCWSTR pszServer, DWORD dwOffset, DWORD *dwSize, PVOID pvBuffer); #endif #ifdef UNICODE #define ReturnLog ReturnLogW #else #define ReturnLog ReturnLogA #endif #ifndef UNICODE_ONLY DWORD CRSAPI CreateNewProjectA(LPCSTR pszServer, LPCSTR pszProjectType, LPCSTR pszProject, DWORD dwFlags, LPCSTR pszDest, LPCSTR pszLocalDir, PARM_LIST *pParms); #endif #ifndef ANSI_ONLY DWORD CRSAPI CreateNewProjectW(LPCWSTR pszServer, LPCWSTR pszProjectType, LPCWSTR pszProject, DWORD dwFlags, LPCWSTR pszDest, LPCWSTR pszLocalDir, PARM_LIST *pParms); #endif #ifdef UNICODE #define CreateNewProject CreateNewProjectW #else #define CreateNewProject CreateNewProjectA #endif #ifndef UNICODE_ONLY DWORD CRSAPI DeleteProjectA(LPCSTR pszServer, LPCSTR pzsProject, DWORD dwFlags); #endif #ifndef ANSI_ONLY DWORD CRSAPI DeleteProjectW(LPCWSTR pszServer, LPCWSTR pzsProject, DWORD dwFlags); #endif #ifdef UNICODE #define DeleteProject DeleteProjectW #else #define DeleteProject DeleteProjectA #endif #ifndef UNICODE_ONLY DWORD CRSAPI EnumProjectsA( LPCSTR pszServer, DWORD dwFlags, DWORD *dwNumProjects, void **pBuffer); #endif #ifndef ANSI_ONLY DWORD CRSAPI EnumProjectsW( LPCWSTR pszServer, DWORD dwFlags, DWORD *dwNumProjects, void **pBuffer); #endif #ifdef UNICODE #define EnumProjects EnumProjectsW #else #define EnumProjects EnumProjectsA #endif #ifndef UNICODE_ONLY DWORD CRSAPI QueryProjectA( LPCSTR pszServer, LPCSTR pszProject, PARM_LIST **pParmList); #endif #ifndef ANSI_ONLY DWORD CRSAPI QueryProjectW( LPCWSTR pszServer, LPCWSTR pszProject, PARM_LIST **pParmList); #endif #ifdef UNICODE #define QueryProject QueryProjectW #else #define QueryProject QueryProjectA #endif #ifndef UNICODE_ONLY DWORD CRSAPI SetProjectA( LPCSTR pszServer, LPCSTR pszProject, PARM_LIST *pParmList); #endif #ifndef ANSI_ONLY DWORD CRSAPI SetProjectW( LPCWSTR pszServer, LPCWSTR pszProject, PARM_LIST *pParmList); #endif #ifdef UNICODE #define SetProject SetProjectW #else #define SetProject SetProjectA #endif #ifndef UNICODE_ONLY DWORD CRSAPI AddRouteA( LPCSTR pszServer, LPCSTR pszRoute, LPSTR pszDestinations, LPCSTR pszBaseDir ); #endif #ifndef ANSI_ONLY DWORD CRSAPI AddRouteW( LPCWSTR pszServer, LPCWSTR pszRoute, LPWSTR pszDestinations, LPCWSTR pszBaseDir ); #endif #ifdef UNICODE #define AddRoute AddRouteW #else #define AddRoute AddRouteA #endif #ifndef UNICODE_ONLY DWORD CRSAPI ListRoutesA( LPCSTR pszServer, LPDWORD dwNumRoutes, ROUTE_LIST_A **pRouteList); #endif #ifndef ANSI_ONLY DWORD CRSAPI ListRoutesW( LPCWSTR pszServer, LPDWORD dwNumRoutes, ROUTE_LIST_W **pRouteList); #endif #ifdef UNICODE #define ListRoutes ListRoutesW #else #define ListRoutes ListRoutesA #endif #ifndef UNICODE_ONLY DWORD CRSAPI DeleteRouteA( LPCSTR pszServer, LPCSTR pszRoute); #endif #ifndef ANSI_ONLY DWORD CRSAPI DeleteRouteW( LPCWSTR pszServer, LPCWSTR pszRoute); #endif #ifdef UNICODE #define DeleteRoute DeleteRouteW #else #define DeleteRoute DeleteRouteA #endif #ifndef UNICODE_ONLY DWORD CRSAPI CrsInitLoggingA(LPCSTR pszLoggingName, BOOL fFullLogging); #endif #ifndef ANSI_ONLY DWORD CRSAPI CrsInitLoggingW(LPCWSTR pszLoggingName, BOOL fFullLogging); #endif #ifdef UNICODE #define CrsInitLogging CrsInitLoggingW #else #define CrsInitLogging CrsInitLoggingA #endif #ifndef UNICODE_ONLY DWORD CRSAPI CrsControlA( LPCSTR pszServer, DWORD dwFlags); #endif #ifndef ANSI_ONLY DWORD CRSAPI CrsControlW( LPCWSTR pszServer, DWORD dwFlags); #endif #ifdef UNICODE #define CrsControl CrsControlW #else #define CrsControl CrsControlA #endif #ifndef UNICODE_ONLY DWORD CRSAPI QueryReplicationGlobalsA( LPCSTR pszServer, PARM_LIST **ppParmList); #endif #ifndef ANSI_ONLY DWORD CRSAPI QueryReplicationGlobalsW( LPCWSTR pszServer, PARM_LIST **ppParmList); #endif #ifdef UNICODE #define QueryReplicationGlobals QueryReplicationGlobalsW #else #define QueryReplicationGlobals QueryReplicationGlobalsA #endif #ifndef UNICODE_ONLY DWORD CRSAPI SetReplicationGlobalsA( LPCSTR pszServer, PARM_LIST *ppParmList); #endif #ifndef ANSI_ONLY DWORD CRSAPI SetReplicationGlobalsW( LPCWSTR pszServer, PARM_LIST *ppParmList); #endif #ifdef UNICODE #define SetReplicationGlobals SetReplicationGlobalsW #else #define SetReplicationGlobals SetReplicationGlobalsA #endif #ifndef UNICODE_ONLY DWORD CRSAPI CrsGrantAccessA( LPCSTR pszServer, LPCSTR pszProject, LPCSTR pszUserName, DWORD dwAccess ); #endif #ifndef ANSI_ONLY DWORD CRSAPI CrsGrantAccessW( LPCWSTR pszServer, LPCWSTR pszProject, LPCWSTR pszUserName, DWORD dwAccess ); #endif #ifdef UNICODE #define CrsGrantAccess CrsGrantAccessW #else #define CrsGrantAccess CrsGrantAccessA #endif #ifndef UNICODE_ONLY DWORD CRSAPI CrsRemoveAccessA( LPCSTR pszServer, LPCSTR pszProject, LPCSTR pszUserName); #endif #ifndef ANSI_ONLY DWORD CRSAPI CrsRemoveAccessW( LPCWSTR pszServer, LPCWSTR pszProject, LPCWSTR pszUserName); #endif #ifdef UNICODE #define CrsRemoveAccess CrsRemoveAccessW #else #define CrsRemoveAccess CrsRemoveAccessA #endif DWORD CRSAPI FreeEnumBuffer(void **pBuffer); BOOL CRSAPI IsCrsAdmin(void); #endif // USE_COM_APIS #endif