6.1 Appendix A.1: winsif.idl

For ease of implementation, the full stand-alone Interface Definition Language (IDL) file for the winsif interface (section 3.1) is provided. Some of the data types and structures used by this protocol are defined in other documents. In order for this IDL to stand alone, the types and structures from [MS-DTYP] are imported.

 import "ms-dtyp.idl";
  
 #define WINSINTF_MAX_NO_RPL_PNRS 25
  
 typedef PVOID LPVOID;
 typedef LARGE_INTEGER WINSINTF_VERS_NO_T;
  
 typedef struct _WINSINTF_ADD_T {
    BYTE Type;
    DWORD Len;
    DWORD IPAdd;
 } WINSINTF_ADD_T, *PWINSINTF_ADD_T;
  
 typedef enum _WINSINTF_PRIORITY_CLASS_E {
    WINSINTF_E_NORMAL = 0,
    WINSINTF_E_HIGH
 } WINSINTF_PRIORITY_CLASS_E, *PWINSINTF_PRIORITY_CLASS_E;
  
 typedef enum  _WINSINTF_ACT_E {
    WINSINTF_E_INSERT = 0,
    WINSINTF_E_DELETE,
    WINSINTF_E_RELEASE,
    WINSINTF_E_MODIFY,
    WINSINTF_E_QUERY
 } WINSINTF_ACT_E, *PWINSINTF_ACT_E;
  
 typedef enum _WINSINTF_TRIG_TYPE_E {   WINSINTF_E_PULL = 0,
    WINSINTF_E_PUSH,
    WINSINTF_E_PUSH_PROP
 } WINSINTF_TRIG_TYPE_E, *PWINSINTF_TRIG_TYPE_E;
  
 typedef struct _WINSINTF_RECORD_ACTION_T {
    WINSINTF_ACT_E Cmd_e;
    [size_is(NameLen + 1)] LPBYTE pName;
    DWORD NameLen;
    DWORD TypOfRec_e;
    DWORD NoOfAdds;
    [unique, size_is(NoOfAdds)] PWINSINTF_ADD_T pAdd;
    WINSINTF_ADD_T Add;
    LARGE_INTEGER VersNo;
    BYTE NodeTyp;
    DWORD OwnerId;
    DWORD State_e;
    DWORD fStatic;
    DWORD_PTR TimeStamp;
 } WINSINTF_RECORD_ACTION_T, *PWINSINTF_RECORD_ACTION_T;
  
 typedef struct _WINSINTF_RPL_COUNTERS_T {
    WINSINTF_ADD_T Add;
    DWORD NoOfRpls;
    DWORD NoOfCommFails;
 } WINSINTF_RPL_COUNTERS_T, *PWINSINTF_RPL_COUNTERS_T;
  
 typedef struct _WINSINTF_STAT_T {
    struct {
       DWORD NoOfUniqueReg;
       DWORD NoOfGroupReg;
       DWORD NoOfQueries;
       DWORD NoOfSuccQueries;
       DWORD NoOfFailQueries;
       DWORD NoOfUniqueRef;
       DWORD NoOfGroupRef;
       DWORD NoOfRel;
       DWORD NoOfSuccRel;
       DWORD NoOfFailRel;
       DWORD NoOfUniqueCnf;
       DWORD NoOfGroupCnf;
    } Counters;
    struct {
       SYSTEMTIME   WINSStartTime;
       SYSTEMTIME LastPScvTime;
       SYSTEMTIME LastATScvTime; 
       SYSTEMTIME LastTombScvTime; 
       SYSTEMTIME LastVerifyScvTime;
       SYSTEMTIME LastPRplTime;
       SYSTEMTIME LastATRplTime; 
       SYSTEMTIME LastNTRplTime; 
       SYSTEMTIME LastACTRplTime; 
       SYSTEMTIME LastInitDbTime; 
       SYSTEMTIME CounterResetTime;    
    } TimeStamps;
    DWORD NoOfPnrs;
    [unique, size_is(NoOfPnrs)] PWINSINTF_RPL_COUNTERS_T pRplPnrs;
 } WINSINTF_STAT_T, *PWINSINTF_STAT_T;
  
 typedef struct _WINSINTF_ADD_VERS_MAP_T {
    WINSINTF_ADD_T Add;
    LARGE_INTEGER VersNo;
 } WINSINTF_ADD_VERS_MAP_T, *PWINSINTF_ADD_VERS_MAP_T;
  
 typedef struct _WINSINTF_RESULTS_T {
    DWORD NoOfOwners;
    WINSINTF_ADD_VERS_MAP_T AddVersMaps[WINSINTF_MAX_NO_RPL_PNRS];
    LARGE_INTEGER MyMaxVersNo;
    DWORD RefreshInterval;
    DWORD TombstoneInterval;
    DWORD TombstoneTimeout;
    DWORD VerifyInterval;
    DWORD   WINSPriorityClass;
    DWORD NoOfWorkerThds;
    WINSINTF_STAT_T   WINSStat;
 } WINSINTF_RESULTS_T, *PWINSINTF_RESULTS_T; 
  
 typedef struct _WINSINTF_RESULTS_NEW_T {
    DWORD NoOfOwners;
    [unique, size_is(NoOfOwners)] 
       PWINSINTF_ADD_VERS_MAP_T pAddVersMaps;
  
    LARGE_INTEGER MyMaxVersNo;
    DWORD RefreshInterval;
    DWORD TombstoneInterval;
    DWORD TombstoneTimeout;
    DWORD VerifyInterval;
    DWORD   WINSPriorityClass;
    DWORD NoOfWorkerThds;
    WINSINTF_STAT_T   WINSStat;
 } WINSINTF_RESULTS_NEW_T, *PWINSINTF_RESULTS_NEW_T; 
  
 typedef enum _WINSINTF_CMD_E {
    WINSINTF_E_ADDVERSMAP = 0,
    WINSINTF_E_CONFIG,
    WINSINTF_E_STAT, WINSINTF_E_CONFIG_ALL_MAPS
 } WINSINTF_CMD_E, *PWINSINTF_CMD_E;
  
 typedef struct _WINSINTF_RECS_T {
    DWORD BuffSize;
    [unique,size_is(NoOfRecs)] PWINSINTF_RECORD_ACTION_T pRow;
    DWORD NoOfRecs;
    DWORD TotalNoOfRecs;
 } WINSINTF_RECS_T, *PWINSINTF_RECS_T;
  
 typedef struct _WINSINTF_PULL_RANGE_INFO_T {
    LPVOID pPnr;
    WINSINTF_ADD_T OwnAdd;
    WINSINTF_VERS_NO_T MinVersNo;
    WINSINTF_VERS_NO_T MaxVersNo;
 } WINSINTF_PULL_RANGE_INFO_T, *PWINSINTF_PULL_RANGE_INFO_T;
  
 typedef struct _WINSINTF_BROWSER_INFO_T {
    DWORD dwNameLen;
    [string] LPBYTE pName;
 } WINSINTF_BROWSER_INFO_T, *PWINSINTF_BROWSER_INFO_T;
  
 typedef struct _WINSINTF_BROWSER_NAMES_T {
    DWORD EntriesRead;  
    [unique, size_is(EntriesRead)]  PWINSINTF_BROWSER_INFO_T pInfo;
 } WINSINTF_BROWSER_NAMES_T, *PWINSINTF_BROWSER_NAMES_T;
  
 typedef enum _WINSINTF_SCV_OPC_E {
    WINSINTF_E_SCV_GENERAL,
    WINSINTF_E_SCV_VERIFY
 } WINSINTF_SCV_OPC_E, *PWINSINTF_SCV_OPC_E;
  
 typedef struct _WINSINTF_SCV_REQ_T {
    WINSINTF_SCV_OPC_E Opcode_e;
    DWORD Age;
    DWORD fForce;
 } WINSINTF_SCV_REQ_T, *PWINSINTF_SCV_REQ_T;
  
 typedef struct _WINSINTF_BIND_DATA_T {
    DWORD fTcpIp;
    [string] LPSTR pServerAdd; 
    [string] LPSTR pPipeName;  
  } WINSINTF_BIND_DATA_T, *PWINSINTF_BIND_DATA_T;
  
 [
     uuid(45F52C28-7F9F-101A-B52B-08002B2EFABE),
     version(1.0),
     pointer_default(unique)
 ]
  
 interface winsif {
  
 #define MIDL_PASS
  
 typedef [handle] PWINSINTF_BIND_DATA_T WINSIF_HANDLE;
 typedef handle_t WINSIF2_HANDLE;
  
 #define DECLARE_WINS_HANDLE(_hdl ) [in] WINSIF2_HANDLE _hdl,
 #define DECLARE_WINS_HANDLE0(_hdl ) [in] WINSIF2_HANDLE _hdl
  
 DWORD R_WinsRecordAction(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, out, ref] PWINSINTF_RECORD_ACTION_T *ppRecAction
 );
  
 DWORD R_WinsStatus(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in]   WINSINTF_CMD_E          Cmd_e,
     [in, out, ref] PWINSINTF_RESULTS_T pResults
 );
  
 DWORD R_WinsTrigger(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, ref] PWINSINTF_ADD_T pWinsAdd,
     [in]   WINSINTF_TRIG_TYPE_E  TrigType_e
 );
  
 DWORD R_WinsDoStaticInit(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, unique, string] LPWSTR pDataFilePath,
     [in]   DWORD fDel
 );
  
 DWORD R_WinsDoScavenging(
            DECLARE_WINS_HANDLE0( ServerHdl )
 );
  
 DWORD R_WinsGetDbRecs(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, ref] PWINSINTF_ADD_T pWinsAdd,
     [in]   WINSINTF_VERS_NO_T MinVersNo,
     [in]   WINSINTF_VERS_NO_T MaxVersNo,
     [out]  PWINSINTF_RECS_T pRecs
 );
  
 DWORD R_WinsTerm(
     [in]   handle_t ServerHdl,
     [in]   short fAbruptTem
 );
  
 DWORD R_WinsBackup(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, string, ref] LPBYTE pBackupPath,
     [in]   short fIncremental
 );
  
 DWORD R_WinsDelDbRecs(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, ref] PWINSINTF_ADD_T pWinsAdd,
     [in]   WINSINTF_VERS_NO_T MinVersNo,
     [in]   WINSINTF_VERS_NO_T MaxVersNo
 );
  
 DWORD R_WinsPullRange(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, ref] PWINSINTF_ADD_T pWinsAdd,
     [in, ref] PWINSINTF_ADD_T pOwnerAdd,
     [in]   WINSINTF_VERS_NO_T MinVersNo,
     [in]   WINSINTF_VERS_NO_T MaxVersNo
 );
  
 DWORD R_WinsSetPriorityClass(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in]   WINSINTF_PRIORITY_CLASS_E PrCls_e
 );
  
 DWORD R_WinsResetCounters(
            DECLARE_WINS_HANDLE0( ServerHdl )
 );
  
 DWORD R_WinsWorkerThdUpd(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in]   DWORD NewNoOfNbtThds
 );
  
 DWORD R_WinsGetNameAndAdd(
            DECLARE_WINS_HANDLE( ServerHdl )
     [out, ref] PWINSINTF_ADD_T pWinsAdd,
     [out, string, size_is(80)] LPBYTE pUncName
 );
  
 DWORD R_WinsGetBrowserNames_Old(
            DECLARE_WINS_HANDLE( ServerHdl )
     [out] PWINSINTF_BROWSER_NAMES_T pNames
 );
  
 DWORD R_WinsDeleteWins(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, ref] PWINSINTF_ADD_T pWinsAdd
 );
  
 DWORD R_WinsSetFlags(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in]   DWORD fFlags 
 );
  
 DWORD R_WinsGetBrowserNames(
     [in, ref] WINSIF_HANDLE ServerHdl,
     [out] PWINSINTF_BROWSER_NAMES_T pNames
 );
  
 DWORD R_WinsGetDbRecsByName(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, unique] PWINSINTF_ADD_T pWinsAdd,
     [in]   DWORD Location,
     [in, unique, size_is(NameLen + 1)] LPBYTE pName,
     [in]   DWORD NameLen,
     [in]   DWORD NoOfRecsDesired,
     [in]   DWORD fOnlyStatic,
     [out]  PWINSINTF_RECS_T pRecs
 );
  
 DWORD R_WinsStatusNew(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in]   WINSINTF_CMD_E Cmd_e,
     [out]  PWINSINTF_RESULTS_NEW_T pResults
 );
  
 DWORD R_WinsStatusWHdl(
     [in, ref] WINSIF_HANDLE ServerHdl,
     [in] WINSINTF_CMD_E Cmd_e,
     [in, out, ref] PWINSINTF_RESULTS_NEW_T pResults
 );
  
 DWORD R_WinsDoScavengingNew(
            DECLARE_WINS_HANDLE( ServerHdl )
     [in, ref] PWINSINTF_SCV_REQ_T pScvReq
 );
 }