windows-nt/Source/XPSP1/NT/public/internal/base/inc/oscpkt.h
2020-09-26 16:20:57 +08:00

331 lines
12 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
oscpkt.h
Abstract:
This file describes OSchooser packets.
Author:
Adam Barr (adamba) 25-July-1997
Revision History:
--*/
#ifndef _OSCPKT_
#define _OSCPKT_
//
// Defines NTLMSSP_MESSAGE_SIGNATURE_SIZE
//
#include <ntlmsp.h>
//
// The 4 byte signatures for our packets. They all start with hex 81
// (for messages to the server) or hex 82 (for messages from the server).
//
static const PCHAR NegotiateSignature = "\x81" "NEG";
static const PCHAR ChallengeSignature = "\x82" "CHL";
static const PCHAR AuthenticateSignature = "\x81" "AUT";
static const PCHAR AuthenticateFlippedSignature = "\x81" "AU2";
static const PCHAR ResultSignature = "\x82" "RES";
static const PCHAR RequestUnsignedSignature = "\x81" "RQU";
static const PCHAR ResponseUnsignedSignature = "\x82" "RSU";
static const PCHAR RequestSignedSignature = "\x81" "REQ";
static const PCHAR ResponseSignedSignature = "\x82" "RSP";
static const PCHAR ErrorSignedSignature = "\x82" "ERR";
static const PCHAR UnrecognizedClientSignature = "\x82" "UNR";
static const PCHAR LogoffSignature = "\x81" "OFF";
static const PCHAR NegativeAckSignature = "\x82" "NAK";
static const PCHAR NetcardRequestSignature = "\x81" "NCQ";
static const PCHAR NetcardResponseSignature = "\x82" "NCR";
static const PCHAR NetcardErrorSignature = "\x82" "NCE";
static const PCHAR HalRequestSignature = "\x81" "HLQ";
static const PCHAR HalResponseSignature = "\x82" "HLR";
static const PCHAR SetupRequestSignature = "\x81" "SPQ";
static const PCHAR SetupResponseSignature = "\x82" "SPS";
//
// Format for packets we exchange during login.
//
typedef struct _LOGIN_PACKET {
UCHAR Signature[4]; // "AUT", "CHL", etc.
ULONG Length; // of the rest of the packet.
union {
UCHAR Data[1]; // the NTLMSSP buffer.
ULONG Status; // status for result packets.
};
} LOGIN_PACKET, *PLOGIN_PACKET;
#define LOGIN_PACKET_DATA_OFFSET FIELD_OFFSET(LOGIN_PACKET, Data[0])
//
// Format for signed packets.
//
typedef struct _SIGNED_PACKET {
UCHAR Signature[4]; // "REQ", "RSP".
ULONG Length; // of the rest of the packet (starting after this field).
ULONG SequenceNumber;
USHORT FragmentNumber; // which fragment in a message this is
USHORT FragmentTotal; // total number of fragments in this message
ULONG SignLength;
UCHAR Sign[NTLMSSP_MESSAGE_SIGNATURE_SIZE];
UCHAR Data[1]; // the data.
} SIGNED_PACKET, *PSIGNED_PACKET;
#define SIGNED_PACKET_DATA_OFFSET FIELD_OFFSET(SIGNED_PACKET, Data[0])
#define SIGNED_PACKET_EMPTY_LENGTH (FIELD_OFFSET(SIGNED_PACKET, Data[0]) - FIELD_OFFSET(SIGNED_PACKET, Length) - sizeof(ULONG))
#define SIGNED_PACKET_ERROR_LENGTH (FIELD_OFFSET(SIGNED_PACKET, SequenceNumber) + sizeof(ULONG))
//
// Format for subsequent fragments of signed packets -- same as SIGNED_PACKET
// except without the sign.
//
typedef struct _FRAGMENT_PACKET {
UCHAR Signature[4]; // "RSP".
ULONG Length; // of the rest of the packet (starting after this field).
ULONG SequenceNumber;
USHORT FragmentNumber; // which fragment in a message this is
USHORT FragmentTotal; // total number of fragments in this message
UCHAR Data[1]; // the data.
} FRAGMENT_PACKET, *PFRAGMENT_PACKET;
#define FRAGMENT_PACKET_DATA_OFFSET FIELD_OFFSET(FRAGMENT_PACKET, Data[0])
#define FRAGMENT_PACKET_EMPTY_LENGTH (FIELD_OFFSET(FRAGMENT_PACKET, Data[0]) - FIELD_OFFSET(FRAGMENT_PACKET, Length) - sizeof(ULONG))
//
// These are definitions for RebootParameter inside the CREATE_DATA structure. They are used
// to pass specific instructions and/or options for the next reboot.
//
#define OSC_REBOOT_COMMAND_CONSOLE_ONLY 0x1 // This means that the CREATE_DATA is a launch of a command console.
#define OSC_REBOOT_ASR 0x2 // This means that the CREATE_DATA is a launch of ASR.
//
// Structure that goes in the Data section of a signed packet for
// a create account response.
//
#define OSC_CREATE_DATA_VERSION 1
typedef struct _CREATE_DATA {
UCHAR Id[4]; // Contains "ACCT", where a normal screen has "NAME"
ULONG VersionNumber;
ULONG RebootParameter;
UCHAR Sid[28];
UCHAR Domain[32];
UCHAR Name[32];
UCHAR Password[32];
ULONG UnicodePasswordLength; // in bytes
WCHAR UnicodePassword[32];
UCHAR Padding[24];
UCHAR MachineType[6]; // 'i386\0' or 'Alpha\0'
UCHAR NextBootfile[128];
UCHAR SifFile[128];
} CREATE_DATA, *PCREATE_DATA;
//
// The maximum length of a screen name
//
#define MAX_SCREEN_NAME_LENGTH 32
//
// The maximum number of flip servers we handle
//
#define MAX_FLIP_SERVER_COUNT 8
//
// This is the structure that is sent to the server to get information
// about a card. It roughly corresponds to the PXENV_UNDI_GET_NIC_TYPE
// structure, but is redefined here to make sure that it won't change.
//
typedef struct _NET_CARD_INFO {
ULONG NicType; // 2=PCI, 3=PnP
union{
struct{
USHORT Vendor_ID;
USHORT Dev_ID;
UCHAR Base_Class;
UCHAR Sub_Class;
UCHAR Prog_Intf;
UCHAR Rev;
USHORT BusDevFunc;
USHORT Pad1;
ULONG Subsys_ID;
}pci;
struct{
ULONG EISA_Dev_ID;
UCHAR Base_Class;
UCHAR Sub_Class;
UCHAR Prog_Intf;
UCHAR Pad2;
USHORT CardSelNum;
USHORT Pad3;
}pnp;
};
} NET_CARD_INFO, * PNET_CARD_INFO;
//
// Packets we exchange with the server.
//
#define OSCPKT_NETCARD_REQUEST_VERSION 2
typedef struct _NETCARD_REQUEST_PACKET {
UCHAR Signature[4]; // "NCQ".
ULONG Length; // of the rest of the packet (starting after this field).
ULONG Version; // set to OSCPKT_NETCARD_REQUEST_VERSION
ULONG Architecture; // See NetPc spec for definitions for x86, Alpha, etc.
UCHAR Guid[16]; // Guid of the NetPc
NET_CARD_INFO CardInfo;
USHORT SetupDirectoryLength;
#if defined(REMOTE_BOOT)
ULONG FileCheckAndCopy;// Should BINL check for this netcard and copy if necessary
USHORT DriverDirectoryLength;
UCHAR DriverDirectoryPath[ 1 ]; // only sent if FileCheckAndCopy is TRUE
#endif
// if REMOTE_BOOT is defined, the SetupDirectoryPath simply follows
// DriverDirectoryPath
UCHAR SetupDirectoryPath[ 1 ];
} NETCARD_REQUEST_PACKET, * PNETCARD_REQUEST_PACKET;
typedef struct _NETCARD_RESPONSE_PACKET {
UCHAR Signature[4]; // "NCR" or "NCE"
ULONG Length; // of the rest of the packet (starting after this field).
ULONG Status; // if not SUCCESS, the packet ends here.
ULONG Version; // currently 1
//
// these are offsets within the packet where the associated string starts
// if the length is zero, the value is not present.
//
ULONG HardwareIdOffset; // string is in unicode, null terminated
ULONG DriverNameOffset; // string is in unicode, null terminated
ULONG ServiceNameOffset; // string is in unicode, null terminated
ULONG RegistryLength;
ULONG RegistryOffset; // string is in ansi, length of RegistryLength
} NETCARD_RESPONSE_PACKET, * PNETCARD_RESPONSE_PACKET;
#define NETCARD_RESPONSE_NO_REGISTRY_LENGTH (FIELD_OFFSET(NETCARD_RESPONSE_PACKET, Registry[0]) - FIELD_OFFSET(NETCARD_RESPONSE_PACKET, Length) - sizeof(ULONG))
#define MAX_HAL_NAME_LENGTH 30 // Keep in sync with definition in setupblk.h
typedef struct _HAL_REQUEST_PACKET {
UCHAR Signature[4]; // "HLQ".
ULONG Length; // of the rest of the packet (starting after this field).
UCHAR Guid[16]; // Ugly, but defn of Guid will not change anytime soon...
ULONG GuidLength; // number of bytes in Guid that are valid.
CHAR HalName[MAX_HAL_NAME_LENGTH + 1];
} HAL_REQUEST_PACKET, * PHAL_REQUEST_PACKET;
typedef struct _HAL_RESPONSE_PACKET {
UCHAR Signature[4]; // "NCR" or "NCE"
ULONG Length; // of the rest of the packet (starting after this field).
NTSTATUS Status; // if not SUCCESS, the packet ends here.
} HAL_RESPONSE_PACKET, * PHAL_RESPONSE_PACKET;
#define OSC_ADMIN_PASSWORD_LEN 64
#define TFTP_RESTART_BLOCK_VERSION 2
typedef struct _TFTP_RESTART_BLOCK_V1 {
CHAR User[64];
CHAR Domain[64];
CHAR Password[64];
CHAR SifFile[128];
CHAR RebootFile[128];
ULONGLONG RebootParameter;
ULONG Checksum;
ULONG Tag;
} TFTP_RESTART_BLOCK_V1, *PTFTP_RESTART_BLOCK_V1;
//
// N.B. The TFTP_RESTART_BLOCK_V1 structure members must be properly aligned
// working backwards. So make sure there isn't any problem packing the
// structure.
//
// The structure itself will be placed in memory such that the TFTP_RESTART_BLOCK_V1 will
// be on a mod-8 boundary. This structure is used by win2k clients.
//
// All offsets from AdministratorPassword on down MUST stay in order and in alignment
// to allow WinXP Beta2 loaders to work. If you add any items, make sure you place
// them at the top and add/use Filler fields to keep alignment correct.
//
typedef struct _TFTP_RESTART_BLOCK {
ULONG Filler1; // mod-8
ULONG HeadlessTerminalType; // mod-4
CHAR AdministratorPassword[OSC_ADMIN_PASSWORD_LEN];// mod-8 Don't change the alignment from here down!
ULONG HeadlessPortNumber; // mod-8
ULONG HeadlessParity; // mod-4
ULONG HeadlessBaudRate; // mod-8
ULONG HeadlessStopBits; // mod-4
ULONG HeadlessUsedBiosSettings; // mod-8
ULONG HeadlessPciDeviceId; // mod-4
ULONG HeadlessPciVendorId; // mod-8
ULONG HeadlessPciBusNumber; // mod-4
ULONG HeadlessPciSlotNumber; // mod-8
ULONG HeadlessPciFunctionNumber; // mod-4
ULONG HeadlessPciFlags; // mod-8
PUCHAR HeadlessPortAddress; // mod-4
ULONG TftpRestartBlockVersion; // mod-8
ULONG NewCheckSumLength; // mod-4
ULONG NewCheckSum; // mod-8 address.
TFTP_RESTART_BLOCK_V1 RestartBlockV1; // this will start on a mod-8 address.
} TFTP_RESTART_BLOCK, *PTFTP_RESTART_BLOCK;
//
// Packet used by textmode setup for requests and responses
//
typedef struct _SPUDP_PACKET {
UCHAR Signature[4]; // "SPQ", "SPS".
ULONG Length; // of the rest of the packet (starting after this field).
ULONG RequestType; // Specific request needed.
NTSTATUS Status; // Status of the operation (used in response packets)
ULONG SequenceNumber;
USHORT FragmentNumber; // which fragment in a message this is
USHORT FragmentTotal; // total number of fragments in this message
UCHAR Data[1]; // the data.
} SPUDP_PACKET, *PSPUDP_PACKET;
#define SPUDP_PACKET_DATA_OFFSET FIELD_OFFSET(SPUDP_PACKET, Data[0])
#define SPUDP_PACKET_EMPTY_LENGTH (FIELD_OFFSET(SPUDP_PACKET, Data[0]) - FIELD_OFFSET(SPUDP_PACKET, Length) - sizeof(ULONG))
typedef struct _SP_NETCARD_INFO_REQ {
ULONG Version; // currently 0
ULONG Architecture; // See NetPc spec for definitions for x86, Alpha, etc.
NET_CARD_INFO CardInfo;
WCHAR SetupPath[1];
} SP_NETCARD_INFO_REQ, *PSP_NETCARD_INFO_REQ;
typedef struct _SP_NETCARD_INFO_RSP {
ULONG cFiles; // Count of the number of source/destination pairs below.
WCHAR MultiSzFiles[1];
} SP_NETCARD_INFO_RSP, *PSP_NETCARD_INFO_RSP;
#endif // _OSCPKT_