331 lines
12 KiB
C
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_
|