mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
379 lines
11 KiB
379 lines
11 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
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.
|
|
//
|
|
// Machines running WINS client are important because they are more capable
|
|
// of connecting to a PDC who's address was configured via DHCP.
|
|
//
|
|
|
|
#define ELECTION_DESIRE_AM_BACKUP 0x00000001L // Currently is backup
|
|
#define ELECTION_DESIRE_AM_CFG_BKP 0x00000002L // Always want to be
|
|
// master - set if backup &&
|
|
// MaintainServerList==YES
|
|
#define ELECTION_DESIRE_AM_MASTER 0x00000004L // Currently is master
|
|
#define ELECTION_DESIRE_AM_DOMMSTR 0x00000008L // Configured as domain master
|
|
|
|
#define ELECTION_DESIRE_WINS_CLIENT 0x00000020L // Transport running WINS client
|
|
|
|
|
|
#ifdef ENABLE_PSEUDO_BROWSER
|
|
#define ELECTION_DESIRE_AM_PSEUDO 0x00000040L // Machine is a Pseudo Server
|
|
#endif
|
|
|
|
#define ELECTION_DESIRE_AM_PDC 0x00000080L // Machine is a lanman NT server.
|
|
|
|
//
|
|
// "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_
|
|
|