HOSTANNC.H
/*++ 
 
Copyright (c) 1990 Microsoft Corporation 
 
Module Name: 
 
    hostannc.h 
 
Abstract: 
 
    This module defines the data structures related to host announcements. 
 
Author: 
 
    Larry Osterman (LarryO) 22-Oct-1990 
 
Revision History: 
 
    22-Oct-1991  LarryO 
 
        Created 
 
--*/ 
 
#ifndef _HOSTANNC_ 
#define _HOSTANNC_ 
 
 
typedef enum _MailslotType { 
    MailslotTransaction = -2, 
    OtherTransaction = -1, 
    Illegal = 0, 
    HostAnnouncement = 1, 
    AnnouncementRequest = 2, 
    InterrogateInfoRequest = 3, 
    RelogonRequest = 4, 
    Election = 8, 
    GetBackupListReq = 9, 
    GetBackupListResp = 10, 
    BecomeBackupServer = 11, 
    WkGroupAnnouncement = 12, 
    MasterAnnouncement = 13, 
    ResetBrowserState = 14, 
    LocalMasterAnnouncement = 15, 
    MaximumMailslotType 
} MAILSLOTTYPE, *PMAILSLOTTYPE; 
 
#define WORKSTATION_SIGNATURE       '\0' 
#define SERVER_SIGNATURE            ' ' 
#define PRIMARY_DOMAIN_SIGNATURE    '\0' 
#define PRIMARY_CONTROLLER_SIGNATURE '\x1B' 
#define DOMAIN_CONTROLLER_SIGNATURE '\x1C' 
#define MASTER_BROWSER_SIGNATURE    '\x1D' 
#define BROWSER_ELECTION_SIGNATURE  '\x1E' 
#define DOMAIN_ANNOUNCEMENT_NAME    "\x01\x02__MSBROWSE__\x02\x01" 
// 
//  The following values should be the minimum and maximum of the 
//  mailslot transaction opcodes defined above. 
// 
 
#define MIN_TRANSACT_MS_OPCODE          MailslotTransaction 
#define MAX_TRANSACT_MS_OPCODE          RelogonRequest 
 
// 
//  Common name for reserved, `internal' transactions 
// 
 
#define MAILSLOT_LANMAN_NAME SMB_MAILSLOT_PREFIX "\\LANMAN" 
#define MAILSLOT_BROWSER_NAME SMB_MAILSLOT_PREFIX "\\BROWSE" 
#define ANNOUNCEMENT_MAILSLOT_NAME     "\\\\*" ITRANS_MS_NAME 
 
 
#include <packon.h> 
 // 
// Each visible server on the net periodically emits a host announcement. 
// This is a SMB TRANSACTION REQUEST on a reserved, "internal" name. 
// 
 
// 
//  There are two versions of each of these structures defined.  The first, 
//  is the actual "meat" of the structure, the second includes the announcement 
//  type. 
// 
 
// 
// Lan Manager announcement message.  This is used for opcodes: 
// 
//  HostAnnouncement to \MAILSLOT\LANMAN on the LANMAN domain name. 
// 
 
typedef struct _HOST_ANNOUNCE_PACKET_1 { 
    UCHAR       CompatibilityPad; 
    ULONG       Type; 
    UCHAR       VersionMajor;   /* version of LM running on host */ 
    UCHAR       VersionMinor;   /*  "  "   "   "    "    "    "   */ 
    USHORT      Periodicity;   /* announcement cycle in secs   */ 
    CHAR        NameComment[LM20_CNLEN+1+LM20_MAXCOMMENTSZ+1]; 
} HOST_ANNOUNCE_PACKET_1, *PHOST_ANNOUNCE_PACKET_1; 
 
typedef struct _HOST_ANNOUNCE_PACKET { 
    UCHAR       AnnounceType; 
    HOST_ANNOUNCE_PACKET_1 HostAnnouncement; 
} HOST_ANNOUNCE_PACKET, *PHOST_ANNOUNCE_PACKET; 
 
// 
// General announcement message.  This is used for opcodes: 
// 
//  HostAnnouncement, WkGroupAnnouncement, and LocalMasterAnnouncement 
// 
 
typedef struct _BROWSE_ANNOUNCE_PACKET_1 { 
    UCHAR       UpdateCount;    // Inc'ed when announce data changed. 
    ULONG       Periodicity;    // announcement cycle in milliseconds 
 
    UCHAR       ServerName[LM20_CNLEN+1]; 
    UCHAR       VersionMajor; 
    UCHAR       VersionMinor;   /*  "  "   "   "    "    "    "   */ 
    ULONG       Type;           // Server type. 
    CHAR        *CommentPointer; 
    CHAR        Comment[LM20_MAXCOMMENTSZ+1]; 
} BROWSE_ANNOUNCE_PACKET_1, *PBROWSE_ANNOUNCE_PACKET_1; 
 
typedef struct _BROWSE_ANNOUNCE_PACKET { 
    UCHAR       BrowseType; 
    BROWSE_ANNOUNCE_PACKET_1 BrowseAnnouncement; 
} BROWSE_ANNOUNCE_PACKET, *PBROWSE_ANNOUNCE_PACKET; 
// 
//  The request announcement packet is sent by clients to request that 
//  remote servers announce themselves. 
// 
 
typedef struct _REQUEST_ANNOUNCE_PACKET_1 {      // Contents of request announcement 
    UCHAR    Flags;                 // Unused Flags 
    CHAR     Reply[LM20_CNLEN+1]; 
}  REQUEST_ANNOUNCE_PACKET_1, *PREQUEST_ANNOUNCE_PACKET_1; 
 
typedef struct _REQUEST_ANNOUNCE_PACKET {        /* Request announcement struct */ 
    UCHAR   Type; 
    REQUEST_ANNOUNCE_PACKET_1    RequestAnnouncement; 
} REQUEST_ANNOUNCE_PACKET, *PREQUEST_ANNOUNCE_PACKET; 
 
#define HOST_ANNC_NAME(xx)     ((xx)->NameComment) 
#define HOST_ANNC_COMMENT(xx)  ((xx)->NameComment + (strlen(HOST_ANNC_NAME(xx))+1)) 
 
#define BROWSE_ANNC_NAME(xx)     ((xx)->ServerName) 
#define BROWSE_ANNC_COMMENT(xx)  ((xx)->Comment) 
 
 // 
//  Definitions for Windows Browser 
// 
 
// 
//  Request to retrieve a backup server list. 
// 
 
typedef struct _BACKUP_LIST_REQUEST_1 { 
    UCHAR       RequestedCount; 
    ULONG       Token; 
} BACKUP_LIST_REQUEST_1, *PBACKUP_LIST_REQUEST_1; 
 
 
typedef struct _BACKUP_LIST_REQUEST { 
    UCHAR  Type; 
    BACKUP_LIST_REQUEST_1 BackupListRequest; 
} BACKUP_LIST_REQUEST, *PBACKUP_LIST_REQUEST; 
 
// 
//  Response containing a backup server list. 
// 
 
typedef struct _BACKUP_LIST_RESPONSE_1 { 
    UCHAR       BackupServerCount; 
    ULONG       Token; 
    UCHAR       BackupServerList[1]; 
} BACKUP_LIST_RESPONSE_1, *PBACKUP_LIST_RESPONSE_1; 
 
typedef struct _BACKUP_LIST_RESPONSE { 
    UCHAR Type; 
    BACKUP_LIST_RESPONSE_1 BackupListResponse; 
} BACKUP_LIST_RESPONSE, *PBACKUP_LIST_RESPONSE; 
 
 
// 
//  Message indicating that a potential browser server should become a backup 
//  server. 
// 
 
typedef struct _BECOME_BACKUP_1 { 
    UCHAR       BrowserToPromote[1]; 
} BECOME_BACKUP_1, *PBECOME_BACKUP_1; 
 
typedef struct _BECOME_BACKUP { 
    UCHAR Type; 
    BECOME_BACKUP_1 BecomeBackup; 
} BECOME_BACKUP, *PBECOME_BACKUP; 
 
 
// 
//  Sent during the election process. 
// 
 
typedef struct _REQUEST_ELECTION_1 { 
    UCHAR       Version; 
    ULONG       Criteria; 
    ULONG       TimeUp; 
    ULONG       MustBeZero; 
    UCHAR       ServerName[1]; 
} REQUEST_ELECTION_1, *PREQUEST_ELECTION_1; 
 
typedef struct _REQUEST_ELECTION { 
    UCHAR Type; 
    REQUEST_ELECTION_1 ElectionRequest; 
} REQUEST_ELECTION, *PREQUEST_ELECTION; 
 
#define ELECTION_CR_OSTYPE      0xFF000000L // Native OS running on server 
#define ELECTION_CR_OSWFW       0x01000000L //  Windows for workgroups server 
#define ELECTION_CR_WIN_NT      0x10000000L //  Windows/NT Server 
#define ELECTION_CR_LM_NT       0x20000000L //  Lan Manager for Windows/NT 
 
#define ELECTION_CR_REVISION    0x00FFFF00L // Browser software revision 
#define ELECTION_MAKE_REV(major, minor) (((major)&0xffL)<<16|((minor)&0xFFL)<<8) 
 
#define ELECTION_CR_DESIRE      0x000000FFL // Desirability of becoming master. 
 
// 
//  Election desirability within criteria. 
// 
//  Most important is a running PDC, next is a configured domain master. 
// 
//  After that come running masters, then configured backups, then existing 
//  running backups. 
// 
 
#define ELECTION_DESIRE_AM_BACKUP  0x00000001L // Currently is backup 
//                                     00000001 
#define ELECTION_DESIRE_AM_CFG_BKP 0x00000002L // Always want to be 
//                                     00000010 
                                               //  master - set if backup && 
                                               //  MaintainServerList==YES 
#define ELECTION_DESIRE_AM_MASTER  0x00000004L // Currently is master 
//            00000100 
#define ELECTION_DESIRE_AM_DOMMSTR 0x00000008L // Configured as domain master 
//                                     00001000 
 
#define ELECTION_DESIRE_AM_PDC     0x00000080L // Machine is a lanman NT server. 
//                                     10000000 
// 
//  "Tickle" packet - sent to change state of browser. 
// 
 
typedef struct _RESET_STATE_1 { 
    UCHAR       Options; 
} RESET_STATE_1, *PRESET_STATE_1; 
 
typedef struct _RESET_STATE { 
    UCHAR Type; 
    RESET_STATE_1 ResetStateRequest; 
} RESET_STATE, *PRESET_STATE; 
 
#define RESET_STATE_STOP_MASTER 0x01    // Stop being master 
#define RESET_STATE_CLEAR_ALL   0x02    // Clear all browser state. 
#define RESET_STATE_STOP        0x04    // Stop the browser service. 
 
// 
//  Master Announcement - Send from master to domain master. 
// 
 
typedef struct _MASTER_ANNOUNCEMENT_1 { 
    UCHAR       MasterName[1]; 
} MASTER_ANNOUNCEMENT_1, *PMASTER_ANNOUNCEMENT_1; 
 
typedef struct _MASTER_ANNOUNCEMENT { 
    UCHAR Type; 
    MASTER_ANNOUNCEMENT_1 MasterAnnouncement; 
} MASTER_ANNOUNCEMENT, *PMASTER_ANNOUNCEMENT; 
 
 
 // 
//  Definitions for Workstation interrogation and revalidation transactions 
// 
 
typedef struct _WKSTA_INFO_INTERROGATE_PACKET { 
    UCHAR   CompatibilityPad; 
    ULONG   Delay ;             // Number of milliseconds to wait before replying 
    CHAR    ReturnMailslot[1] ; // Mailslot to reply to. 
} WKSTA_INFO_INTERROGATE_PACKET, *PWKSTA_INFO_INTERROGATE_PACKET; 
 
typedef struct _WKSTA_INFO_RESPONSE_PACKET { 
    UCHAR   CompatibilityPad; 
    UCHAR   VersionMajor; 
    UCHAR   VersionMinor; 
    USHORT  OsVersion ; 
    CHAR    ComputerName[1] ;       // var-length ASCIIZ string */ 
#if 0 
// 
//  The following two ASCIIZ strings are not defined in the structure 
//  but are concatenated to the end of the structure. 
// 
    CHAR        UserName[] ; 
    CHAR        LogonDomain[] ; 
#endif 
} WKSTA_INFO_RESPONSE_PACKET, *PWKSTA_INFO_RESPONSE_PACKET; 
 
typedef struct _WKSTA_RELOGON_REQUEST_PACKET { 
    UCHAR   CompatibilityPad; 
    ULONG   Delay ; 
    ULONG   Flags ; 
    CHAR    ReturnMailslot[1] ; // var-length ASCIIZ string 
#if 0 
// 
//  The following ASCIIZ string is not defined in the structure 
//  but is concatenated to the end of the structure. 
// 
 
    CHAR    DC_Name[] ; 
#endif 
} WKSTA_RELOGON_REQUEST_PACKET, *PWKSTA_RELOGON_REQUEST_PACKET; 
 
// 
//  Values for <wkrrq_flags> field */ 
// 
 
#define WKRRQ_FLAG_LOGON_SERVER      0x1    // I'm your official logon server; 
                                            // do a relogon to me. 
                                            // 
 
typedef struct _WKSTA_RELOGON_RESPONSE_PACKET { 
    UCHAR   CompatibilityPad; 
    USHORT  Status ; 
    CHAR    ComputerName[1] ;   // var-length ASCIIZ string 
} WKSTA_RELOGON_RESPONSE_PACKET, *PWKSTA_RELOGON_RESPONSE_PACKET; 
 
 
// 
//  Values for <wkrrs_status> field 
// 
 
#define WKRRS_STATUS_SUCCEEDED      0       // Operation succeeded 
#define WKRRS_STATUS_DENIED         1       // Operation denied to caller 
#define WKRRS_STATUS_FAILED         2       // Operation tried but failed 
 
#define EXCESS_NAME_LEN (sizeof(ITRANS_MS_NAME) - \ 
                            FIELD_OFFSET(SMB_TRANSACTION_MAILSLOT, Buffer) ) 
 
// 
//  This structure defines all of the types of requests that appear in messages 
//  to the internal mailslot. 
// 
 
typedef struct _INTERNAL_TRANSACTION { 
    UCHAR   Type;                               // Type of request. 
    union { 
        HOST_ANNOUNCE_PACKET_1           Announcement ; 
        BROWSE_ANNOUNCE_PACKET_1         BrowseAnnouncement ; 
        REQUEST_ANNOUNCE_PACKET_1        RequestAnnounce ; 
        BACKUP_LIST_RESPONSE_1           GetBackupListResp ; 
        BACKUP_LIST_REQUEST_1            GetBackupListRequest ; 
        BECOME_BACKUP_1                  BecomeBackup ; 
        REQUEST_ELECTION_1               RequestElection ; 
        MASTER_ANNOUNCEMENT_1            MasterAnnouncement ; 
        RESET_STATE_1                    ResetState ; 
 
        WKSTA_INFO_INTERROGATE_PACKET    InterrogateRequest ; 
        WKSTA_INFO_RESPONSE_PACKET       InterrogateResponse ; 
        WKSTA_RELOGON_REQUEST_PACKET     RelogonRequest ; 
        WKSTA_RELOGON_RESPONSE_PACKET    RelogonResponse ; 
    } Union; 
} INTERNAL_TRANSACTION, *PINTERNAL_TRANSACTION ; 
 
#include <packoff.h> 
 
#endif // _HOSTANNC_