diff options
Diffstat (limited to '')
-rw-r--r-- | public/sdk/inc/ntddbrow.h | 448 |
1 files changed, 448 insertions, 0 deletions
diff --git a/public/sdk/inc/ntddbrow.h b/public/sdk/inc/ntddbrow.h new file mode 100644 index 000000000..1bf12b52d --- /dev/null +++ b/public/sdk/inc/ntddbrow.h @@ -0,0 +1,448 @@ +/*++ BUILD Version: 0005 // Increment this if a change has global effects + +Copyright (c) 1987-1993 Microsoft Corporation + +Module Name: + + ntddbrow.h + +Abstract: + + This is the include file that defines all constants and types for + accessing the datagram receiver device driver, better know as the + Browser. + +Authors: + + Larry Osterman (larryo) & Rita Wong (ritaw) 25-Mar-1991 + +Revision History: + +--*/ + +#ifndef _NTDDBROW_ +#define _NTDDBROW_ + +#include <windef.h> +#include <lmcons.h> +#include <lmwksta.h> + +// +// Device Name - this string is the name of the device. It is the name +// that should be passed to NtOpenFile when accessing the device. +// +// Note: For devices that support multiple units, it should be suffixed +// with the Ascii representation of the unit number. +// + +#define DD_BROWSER_DEVICE_NAME "\\Device\\LanmanDatagramReceiver" + +#define DD_BROWSER_DEVICE_NAME_U L"\\Device\\LanmanDatagramReceiver" + +// +// The file system name as returned by +// NtQueryInformationVolume(FileFsAttributeInformation) +// + +#define DD_BROWSER_NAME "LMBROWSER" + +// +// Name of the event used to force the scavenger thread to announce the +// server. +// + +#define SERVER_ANNOUNCE_EVENT_W L"\\LanmanServerAnnounceEvent" + +#define BOWSER_CONFIG_PARAMETERS L"Parameters" + +#define BOWSER_CONFIG_IRP_STACK_SIZE L"IrpStackSize" + +#define BOWSER_CONFIG_MAILSLOT_THRESHOLD L"MailslotDatagramThreshold" +#define BOWSER_CONFIG_GETBLIST_THRESHOLD L"GetBrowserListThreshold" + +#define BOWSER_CONFIG_SERVER_DELETION_THRESHOLD L"BrowserServerDeletionThreshold" +#define BOWSER_CONFIG_DOMAIN_DELETION_THRESHOLD L"BrowserDomainDeletionThreshold" +#define BOWSER_CONFIG_FIND_MASTER_TIMEOUT L"BrowserFindMasterTimeout" +#define BOWSER_CONFIG_MINIMUM_CONFIGURED_BROWSER L"BrowserMinimumConfiguredBrowsers" +#define BROWSER_CONFIG_BACKUP_RECOVERY_TIME L"BackupBrowserRecoveryTime" + + + +// +// This defines the revision of the NT browser. +// +// To guarantee that a newer browser is preferred over an older version, bump +// this version number. +// + +#define BROWSER_ELECTION_VERSION 0x0001 + +#define BROWSER_VERSION_MAJOR 0x01 +#define BROWSER_VERSION_MINOR 0x0F + +// +// Number of seconds a GetBrowserServerList request will wait until it forces +// an election. +// + +#define BOWSER_GETBROWSERLIST_TIMEOUT 1 + +// +// Number of retries of the GetBrowserServerList request we will issue before we +// give up. +// + +#define BOWSER_GETBROWSERLIST_RETRY_COUNT 3 + +// +// The browser service on a master browser will query the driver with this +// frequency. +// + +#define BROWSER_QUERY_DRIVER_FREQUENCY 30 + +// +// NtDeviceIoControlFile IoControlCode values for this device. +// +// Warning: Remember that the low two bits of the code specify how the +// buffers are passed to the driver! +// +// +// Method = 00 - Buffer both input and output buffers for the request +// Method = 01 - Buffer input, map output buffer to an MDL as an IN buff +// Method = 10 - Buffer input, map output buffer to an MDL as an OUT buff +// Method = 11 - Do not buffer either the input or output +// + +#define IOCTL_DGR_BASE FILE_DEVICE_NETWORK_BROWSER + +#define _BROWSER_CONTROL_CODE(request, method, access) \ + CTL_CODE(IOCTL_DGR_BASE, request, method, access) + +#define IOCTL_LMDR_START _BROWSER_CONTROL_CODE(0x001, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_LMDR_STOP _BROWSER_CONTROL_CODE(0x002, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_LMDR_ADD_NAME _BROWSER_CONTROL_CODE(0x003, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_DELETE_NAME _BROWSER_CONTROL_CODE(0x004, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_ADD_NAME_DOM _BROWSER_CONTROL_CODE(0x003, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_LMDR_DELETE_NAME_DOM _BROWSER_CONTROL_CODE(0x004, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_LMDR_ENUMERATE_NAMES _BROWSER_CONTROL_CODE(0x005, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_LMDR_ENUMERATE_SERVERS _BROWSER_CONTROL_CODE(0x006, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_LMDR_BIND_TO_TRANSPORT _BROWSER_CONTROL_CODE(0x007, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_BIND_TO_TRANSPORT_DOM _BROWSER_CONTROL_CODE(0x007, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_LMDR_ENUMERATE_TRANSPORTS _BROWSER_CONTROL_CODE(0x008, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_LMDR_UNBIND_FROM_TRANSPORT _BROWSER_CONTROL_CODE(0x008, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_UNBIND_FROM_TRANSPORT_DOM _BROWSER_CONTROL_CODE(0x009, METHOD_NEITHER, FILE_ANY_ACCESS) + +// Begin Never Used +#define IOCTL_LMDR_GET_HINT_SIZE _BROWSER_CONTROL_CODE(0x009, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_GET_LOGONSTATUS_REQUEST _BROWSER_CONTROL_CODE(0x00A, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) +// End Never Used + +#define IOCTL_LMDR_GET_BROWSER_SERVER_LIST _BROWSER_CONTROL_CODE(0x00C, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_LMDR_GET_MASTER_NAME _BROWSER_CONTROL_CODE(0x00D, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_BECOME_BACKUP _BROWSER_CONTROL_CODE(0x00E, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_BECOME_MASTER _BROWSER_CONTROL_CODE(0x00F, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// Begin Never Used +#define IOCTL_LMDR_WAIT_FOR_BROWSER_REQUEST _BROWSER_CONTROL_CODE(0x010, METHOD_BUFFERED, FILE_ANY_ACCESS) +// End Never Used + +#define IOCTL_LMDR_WAIT_FOR_MASTER_ANNOUNCE _BROWSER_CONTROL_CODE(0x011, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_WRITE_MAILSLOT _BROWSER_CONTROL_CODE(0x012, METHOD_IN_DIRECT, FILE_ANY_ACCESS) +#define IOCTL_LMDR_UPDATE_STATUS _BROWSER_CONTROL_CODE(0x013, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_LMDR_CHANGE_ROLE _BROWSER_CONTROL_CODE(0x014, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_NEW_MASTER_NAME _BROWSER_CONTROL_CODE(0x015, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_QUERY_STATISTICS _BROWSER_CONTROL_CODE(0x016, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_RESET_STATISTICS _BROWSER_CONTROL_CODE(0x017, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_DEBUG_CALL _BROWSER_CONTROL_CODE(0x018, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_NETLOGON_MAILSLOT_READ _BROWSER_CONTROL_CODE(0x019, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) +#define IOCTL_LMDR_NETLOGON_MAILSLOT_ENABLE _BROWSER_CONTROL_CODE(0x020, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_IP_ADDRESS_CHANGED _BROWSER_CONTROL_CODE(0x021, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_LMDR_ENABLE_DISABLE_TRANSPORT _BROWSER_CONTROL_CODE(0x022, METHOD_BUFFERED, FILE_ANY_ACCESS) + +// +// Identifies the data structure type for Buffer 2 of each IoCtl +// + +typedef enum _IOCTL_LMDR_STRUCTURES { + EnumerateNames, // IOCTL_LMDR_ENUMERATE_NAMES + EnumerateServers, // IOCTL_LMDR_ENUMERATE_SERVERS + EnumerateXports, // IOCTL_LMDR_ENUMERATE_TRANSPORTS + Datagram +} IOCTL_LMDR_STRUCTURES; + + +typedef enum _DGRECEIVER_NAME_TYPE { + ComputerName = 1, // Computer name (signature 0), unique + PrimaryDomain, // Primary domain (signature 0), group + LogonDomain, // Logon domain (signature 0), group + OtherDomain, // Other domain (signature 0), group + DomainAnnouncement, // domain announce (__MSBROWSE__), group + MasterBrowser, // Master browser (domain name, signature 1d), unique + BrowserElection, // Election name (domain name, signature 1e), group + BrowserServer, // Server name (signature 20) + DomainName, // DC Domain name (domain name, signature 1c) + PrimaryDomainBrowser, // PDC Browser name (domain name, signature 1b), unique + AlternateComputerName // Computer name (signature 0), unique +} DGRECEIVER_NAME_TYPE, *PDGRECEIVER_NAME_TYPE; + + +// +// LAN Man Redirector Request Packet used by the Workstation service +// to pass parameters to the Redirector through Buffer 1 of +// NtDeviceIoControlFile. +// +// Additional input or output of each IoCtl is found in Buffer 2. +// + +#define LMDR_REQUEST_PACKET_VERSION_DOM 0x00000007L // Structure version. +#define LMDR_REQUEST_PACKET_VERSION 0x00000006L // Structure version. + +typedef struct _LMDR_REQUEST_PACKET { + + IOCTL_LMDR_STRUCTURES Type; // Type of structure in Buffer 2 + ULONG Version; // Version of structure in Buffer 2 + ULONG Level; // Level of information or force level + LUID LogonId; // User logon session identifier + + UNICODE_STRING TransportName; + UNICODE_STRING EmulatedDomainName; + + union { + + struct { + ULONG NumberOfMailslotBuffers; + ULONG NumberOfServerAnnounceBuffers; + ULONG IllegalDatagramThreshold; + ULONG EventLogResetFrequency; + BOOLEAN LogElectionPackets; + } Start; // IN + + struct { + DGRECEIVER_NAME_TYPE Type; // Type of name + ULONG DgReceiverNameLength; // Length of datagram receiver name + WCHAR Name[1]; // Null terminated datagram receiver name. + } AddDelName; + + struct { + ULONG EntriesRead; // OUT Number of entries returned + ULONG TotalEntries; // OUT Total entries available. + ULONG TotalBytesNeeded; // OUT Number of bytes needed for API + ULONG ResumeHandle; // IN OUT Resume handle + } EnumerateNames; // OUT Buffer2 is an array of DGRECEIVE + + struct { + ULONG EntriesRead; // OUT Number of entries returned + ULONG TotalEntries; // OUT Total entries available + ULONG TotalBytesNeeded; // OUT Total bytes needed to read all + // entries + ULONG ResumeHandle; // IN OUT Resume handle + ULONG ServerType; // IN Type of servers to enumerate + // (defined in lmserver.h) + ULONG DomainNameLength; // IN Length of domain name + WCHAR DomainName[1]; // IN Name of domain to enumerate servers + // from + + } EnumerateServers; // OUT Buffer2 contains array of + // ServerInfo structures + + struct { + ULONG EntriesRead; // OUT Number of entries returned + ULONG TotalEntries; // OUT Total entries available + ULONG TotalBytesNeeded; // OUT Total bytes needed to read all + // entries + ULONG ResumeHandle; // IN OUT Resume handle + + } EnumerateTransports; // OUT Buffer2 contains array of + + struct { + ULONG TransportNameLength; // not including terminator + WCHAR TransportName[1]; // Name of transport provider + } Bind; // IN + + struct { + ULONG TransportNameLength; // not including terminator + WCHAR TransportName[1]; // Name of transport provider + } Unbind; // IN + +// Begin Never Used + struct { + ULONG ServerInfoHintSize; // Number of bytes needed for buffer + // to enumerate servers. + ULONG DGReceiverNamesHintSize; + // Number of bytes needed for buffer + // to enumerate datagram names. + } GetHintSize; // OUT + + struct { + ULONG MessageLength; // Length of request message in + // Buffer2 including opcode + WCHAR SenderName[1]; // Null terminated name of logon + // request sender + } LogonRequest; // OUT +// End Never Used + + struct { + ULONG EntriesRead; // OUT Number of entries returned + ULONG TotalEntries; // OUT Total entries available. + ULONG TotalBytesNeeded; // OUT Number of bytes needed for API + ULONG ResumeHandle; // IN OUT Resume handle (Ignored) + USHORT DomainNameLength; // IN Length of domain name. + BOOLEAN ForceRescan; // IN Discard internal list and re-query. + BOOLEAN UseBrowseList; // IN TRUE if use server list (not net) + WCHAR DomainName[1]; // IN Name of domain to retreive domain for + } GetBrowserServerList; + +// Begin Never Used + struct { + LARGE_INTEGER TimeReceived; // Time request was received. + LARGE_INTEGER TimeQueued; // Time request was queued. + LARGE_INTEGER TimeQueuedToBrowserThread; // Time request was queued. + ULONG RequestorNameLength; // Length of name requesting list + ULONG Token; // Client token. + USHORT RequestedCount; // Number of entries requested. + WCHAR Name[1]; // IN Name of transport, OUT name of requestor + } WaitForBrowserServerRequest; +// End Never Used + + struct { + ULONG MasterNameLength; // Length of name requesting list + WCHAR Name[1]; // IN Name of transport, OUT name of master + } WaitForMasterAnnouncement; + + struct { + ULONG MasterNameLength; // OUT Length of master for domain + WCHAR Name[1]; // IN Name of transport, OUT name of master + } GetMasterName; + + struct { + DGRECEIVER_NAME_TYPE DestinationNameType; // IN Name type of name to send. + + ULONG MailslotNameLength; // IN Length of mailslot name. + // If 0, use default (\MAILSLOT\BROWSE) + ULONG NameLength; // IN Destination name length. + WCHAR Name[1]; // IN Name of destination + } SendDatagram; + + struct { + ULONG NewStatus; + ULONG NumberOfServersInTable; + BOOLEAN IsLanmanNt; + BOOLEAN IsPrimaryDomainController; +// Begin Never Used + BOOLEAN IsMemberDomain; +// End Never Used + BOOLEAN IsDomainMaster; + BOOLEAN MaintainServerList; + } UpdateStatus; + + struct { + UCHAR RoleModification; + } ChangeRole; + + struct { + DWORD DebugTraceBits; // IN New debug trace bits. + BOOL OpenLog; // IN True if we should open log file + BOOL CloseLog; // IN True if we should close log file + BOOL TruncateLog; // IN True if we should truncate log + WCHAR TraceFileName[1]; // IN If OpenLog, LogFileName (NT file) + } Debug; + + struct { + DWORD MaxMessageCount; // IN number of netlogon messages to queue + } NetlogonMailslotEnable; // Use 0 to disable queuing + + struct { + BOOL EnableTransport; // IN True if we should enable transport + BOOL PreviouslyEnabled; // Returns if the transport was previously enabled + } EnableDisableTransport; + + } Parameters; + +} LMDR_REQUEST_PACKET, *PLMDR_REQUEST_PACKET; + +// +// The NETLOGON_MAILSLOT structure describes a mailslot messages received by +// the browser's IOCTL_LMDR_NETLOGON_MAILSLOT_READ +// +// A NETLOGON_MAILSLOT message is also returned to Netlogon when an +// interesting PNP event occurs. In that case, the fields will be set as +// follows: +// +// MailslotNameSize: 0 indicating this is a PNP event. +// MailslotNameOffset: One of the NETLOGON_PNP_OPCODEs indicating the +// event being notified. +// TransportName*: Name of transport being affected. +// + +typedef enum _NETLOGON_PNP_OPCODE { + NlPnpMailslotMessage, + NlPnpTransportBind, + NlPnpTransportUnbind, + NlPnpNewIpAddress +} NETLOGON_PNP_OPCODE, *PNETLOGON_PNP_OPCODE; + +typedef struct { + LARGE_INTEGER TimeReceived; + DWORD MailslotNameSize; // Unicode name of mailslot message was received on + DWORD MailslotNameOffset; + DWORD TransportNameSize; // Unicode name of transport message was received on + DWORD TransportNameOffset; + DWORD MailslotMessageSize;// Actual mailslot message + DWORD MailslotMessageOffset; + DWORD DestinationNameSize;// Unicode name of computer or domain message was received on + DWORD DestinationNameOffset; +} NETLOGON_MAILSLOT, *PNETLOGON_MAILSLOT; + + +// +// The DGRECEIVE structure describes the list of names that have been +// added to the datagram browser. +// + +typedef struct _DGRECEIVE_NAMES { + UNICODE_STRING DGReceiverName; + DGRECEIVER_NAME_TYPE Type; +} DGRECEIVE_NAMES, *PDGRECEIVE_NAMES; + + +typedef struct _LMDR_TRANSPORT_LIST { + ULONG NextEntryOffset; // Offset of next entry (dword aligned) + ULONG TransportNameLength; + ULONG Flags; // Flags for transport + WCHAR TransportName[1]; +} LMDR_TRANSPORT_LIST, *PLMDR_TRANSPORT_LIST; + +#define LMDR_TRANSPORT_WANNISH 0x00000001 // If set, Xport is wannish. +#define LMDR_TRANSPORT_RAS 0x00000002 // If set, Xport is RAS. +#define LMDR_TRANSPORT_IPX 0x00000004 // If set, Xport is direct host IPX. + +// +// Browser statistics. +// + +typedef struct _BOWSER_STATISTICS { + LARGE_INTEGER StartTime; + LARGE_INTEGER NumberOfServerAnnouncements; + LARGE_INTEGER NumberOfDomainAnnouncements; + ULONG NumberOfElectionPackets; + ULONG NumberOfMailslotWrites; + ULONG NumberOfGetBrowserServerListRequests; + ULONG NumberOfMissedServerAnnouncements; + ULONG NumberOfMissedMailslotDatagrams; + ULONG NumberOfMissedGetBrowserServerListRequests; + ULONG NumberOfFailedServerAnnounceAllocations; + ULONG NumberOfFailedMailslotAllocations; + ULONG NumberOfFailedMailslotReceives; + ULONG NumberOfFailedMailslotWrites; + ULONG NumberOfFailedMailslotOpens; + ULONG NumberOfDuplicateMasterAnnouncements; + LARGE_INTEGER NumberOfIllegalDatagrams; +} BOWSER_STATISTICS, *PBOWSER_STATISTICS; + +#endif // ifndef _NTDDBROW_ |