ReactOS  0.4.14-dev-593-g1793dcc
headless.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Boot Loader
3  * LICENSE: BSD - See COPYING.ARM in the top level directory
4  * FILE: boot/freeldr/freeldr/windows/headless.c
5  * PURPOSE: Provides support for Windows Emergency Management Services
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include <freeldr.h>
12 #include <cportlib/cportlib.h>
13 
14 /* Note: Move these to some smbios.h header */
15 #define SYSID_TYPE_UUID "_UUID_"
16 #define SYSID_UUID_DATA_SIZE 16
17 #include <pshpack1.h>
18 typedef struct _SYSID_UUID_ENTRY
19 {
20  UCHAR Type[6];
25 #include <poppack.h>
26 
27 /* GLOBALS ********************************************************************/
28 
33 
35 {
36  {NULL, 0, TRUE},
37  {NULL, 0, TRUE},
38  {NULL, 0, TRUE},
39  {NULL, 0, TRUE}
40 };
41 
42 /* FUNCTIONS ******************************************************************/
43 
44 VOID
46 {
47  PSYSID_UUID_ENTRY CurrentAddress;
48 
49  CurrentAddress = (PSYSID_UUID_ENTRY)0xE0000;
50  while (CurrentAddress < (PSYSID_UUID_ENTRY)0x100000)
51  {
52  if (RtlCompareMemory(&CurrentAddress->Type, SYSID_TYPE_UUID, 6) == 6)
53  {
54  RtlCopyMemory(SystemGuid, &CurrentAddress->UUID, SYSID_UUID_DATA_SIZE);
55  return;
56  }
57  CurrentAddress = (PSYSID_UUID_ENTRY)((ULONG_PTR)CurrentAddress + 1);
58  }
59 
61 }
62 
63 BOOLEAN
66  IN PUCHAR PortAddress,
67  IN BOOLEAN TerminalConnected,
68  OUT PULONG PortId)
69 {
70  /* Set default baud rate */
71  if (BaudRate == 0) BaudRate = 19200;
72 
73  /* Check if port or address given */
74  if (PortNumber)
75  {
76  /* Pick correct address for port */
77  if (!PortAddress)
78  {
79  switch (PortNumber)
80  {
81  case 1:
82  PortAddress = (PUCHAR)0x3F8;
83  break;
84 
85  case 2:
86  PortAddress = (PUCHAR)0x2F8;
87  break;
88 
89  case 3:
90  PortAddress = (PUCHAR)0x3E8;
91  break;
92 
93  default:
94  PortNumber = 4;
95  PortAddress = (PUCHAR)0x2E8;
96  }
97  }
98  }
99  else
100  {
101  /* Pick correct port for address */
102  PortAddress = (PUCHAR)0x2F8;
103  if (CpDoesPortExist(PortAddress))
104  {
105  PortNumber = 2;
106  }
107  else
108  {
109  PortAddress = (PUCHAR)0x3F8;
110  if (!CpDoesPortExist(PortAddress)) return FALSE;
111  PortNumber = 1;
112  }
113  }
114 
115  /* Not yet supported */
117 
118  /* Check if port exists */
119  if ((CpDoesPortExist(PortAddress)) || (CpDoesPortExist(PortAddress)))
120  {
121  /* Initialize port for first time, or re-initialize if specified */
122  if (((TerminalConnected) && (Port[PortNumber - 1].Address)) ||
123  !(Port[PortNumber - 1].Address))
124  {
125  /* Initialize the port, return it */
126  CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
127  *PortId = PortNumber - 1;
128  return TRUE;
129  }
130  }
131 
132  return FALSE;
133 }
134 
135 VOID
137  IN UCHAR Byte)
138 {
139  CpPutByte(&Port[PortId], Byte);
140 }
141 
142 BOOLEAN
144  OUT PUCHAR Byte)
145 {
146  return CpGetByte(&Port[PortId], Byte, TRUE, FALSE) == CP_GET_SUCCESS;
147 }
148 
149 BOOLEAN
151 {
152  UCHAR Dummy;
153 
154  return CpGetByte(&Port[PortId], &Dummy, FALSE, TRUE) == CP_GET_SUCCESS;
155 }
156 
157 VOID
159  IN BOOLEAN Enable)
160 {
161  CpEnableFifo(Port[PortId].Address, Enable);
162 }
163 
164 VOID
166 {
167  ULONG PortNumber, BaudRate;
168  PUCHAR PortAddress;
169  PCHAR AnsiReset = "\x1B[m";
170  ULONG i;
171 
175 
176  /* Pick a port address */
177  if (PortNumber)
178  {
179  if (!PortAddress)
180  {
181  switch (PortNumber)
182  {
183  case 2:
185  break;
186 
187  case 3:
189  break;
190 
191  case 4:
193  break;
194 
195  default:
197  break;
198  }
199  }
200  }
201  else
202  {
203  /* No number, so no EMS */
205  return;
206  }
207 
208  /* Call arch code to initialize the port */
211  BaudRate,
212  PortNumber,
213  PortAddress,
216 
218  {
219  /* Port seems usable, set it up and get the BIOS GUID */
221 
223 
224  /* Calculate delay in us based on the baud, assume 9600 if none given */
225  if (!BaudRate)
226  {
227  BaudRate = 9600;
229  }
230 
231  WinLdrTerminalDelay = (10 * 1000 * 1000) / (BaudRate / 10) / 6;
232 
233  /* Sent an ANSI reset sequence to get the terminal up and running */
234  for (i = 0; i < strlen(AnsiReset); i++)
235  {
238  }
239  }
240 }
241 
242 VOID
244 {
245  PCHAR Settings, RedirectPort;
246 
247  /* Start fresh */
250 
251  /* Use a direction port if one was given, or use ACPI to detect one instead */
252  Settings = strstr(BootOptions, "/redirect=");
253  if (Settings)
254  {
255  RedirectPort = strstr(Settings, "com");
256  if (RedirectPort)
257  {
258  RedirectPort += sizeof("com") - 1;
260  LoaderRedirectionInformation.TerminalType = 1; // HeadlessSerialPort
261  }
262  else
263  {
264  RedirectPort = strstr(Settings, "usebiossettings");
265  if (RedirectPort)
266  {
267  UiDrawStatusText("ACPI SRT Table Not Supported...");
268  return;
269  }
270  else
271  {
274  {
276  }
277  }
278  }
279  }
280 
281  /* Use a direction baudrate if one was given */
282  Settings = strstr(BootOptions, "/redirectbaudrate=");
283  if (Settings)
284  {
285  if (strstr(Settings, "115200"))
286  {
288  }
289  else if (strstr(Settings, "57600"))
290  {
292  }
293  else if (strstr(Settings, "19200"))
294  {
296  }
297  else
298  {
300  }
301  }
302 
303  /* Enable headless support if parameters were found */
305  {
307  {
309  }
310 
312  }
313 }
314 
315 /* EOF */
signed char * PCHAR
Definition: retypes.h:7
CPPORT Port[4]
Definition: headless.c:34
#define IN
Definition: typedefs.h:38
UCHAR Type[6]
Definition: headless.c:20
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
ULONG WinLdrTerminalDeviceId
Definition: headless.c:31
Type
Definition: Type.h:6
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
unsigned char Byte
Definition: zconf.h:391
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
unsigned char * PUCHAR
Definition: retypes.h:3
HEADLESS_LOADER_BLOCK LoaderRedirectionInformation
Definition: headless.c:29
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:140
ULONG WinLdrTerminalDelay
Definition: headless.c:32
UCHAR Checksum
Definition: headless.c:21
struct _SYSID_UUID_ENTRY SYSID_UUID_ENTRY
#define SYSID_TYPE_UUID
Definition: headless.c:15
UCHAR UUID[SYSID_UUID_DATA_SIZE]
Definition: headless.c:23
uint32_t ULONG_PTR
Definition: typedefs.h:63
VOID WinLdrPortPutByte(IN ULONG PortId, IN UCHAR Byte)
Definition: headless.c:136
USHORT NTAPI CpGetByte(IN PCPPORT Port, OUT PUCHAR Byte, IN BOOLEAN Wait, IN BOOLEAN Poll)
Definition: cport.c:256
VOID WinLdrInitializeHeadlessPort(VOID)
Definition: headless.c:165
BOOLEAN NTAPI CpDoesPortExist(IN PUCHAR Address)
Definition: cport.c:227
PUCHAR PortAddress
Definition: arc.h:312
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ULONG PortNumber
Definition: storport.c:18
USHORT Length
Definition: headless.c:22
VOID StallExecutionProcessor(ULONG Microseconds)
Definition: hardware.c:55
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
UCHAR TerminalType
Definition: arc.h:321
BOOLEAN WinLdrPortInitialize(IN ULONG BaudRate, IN ULONG PortNumber, IN PUCHAR PortAddress, IN BOOLEAN TerminalConnected, OUT PULONG PortId)
Definition: headless.c:64
#define PCI_INVALID_VENDORID
Definition: iotypes.h:3245
VOID NTAPI CpEnableFifo(IN PUCHAR Address, IN BOOLEAN Enable)
Definition: cport.c:54
VOID NTAPI CpPutByte(IN PCPPORT Port, IN UCHAR Byte)
Definition: cport.c:306
SETTINGS Settings
Definition: charmap.c:26
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
USHORT PciDeviceId
Definition: arc.h:313
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID UiDrawStatusText(PCSTR StatusText)
Definition: ui.c:249
BOOLEAN WinLdrPortPollOnly(IN ULONG PortId)
Definition: headless.c:150
BOOLEAN WinLdrTerminalConnected
Definition: headless.c:30
NTSTATUS NTAPI CpInitialize(IN PCPPORT Port, IN PUCHAR Address, IN ULONG BaudRate)
Definition: cport.c:88
VOID WinLdrEnableFifo(IN ULONG PortId, IN BOOLEAN Enable)
Definition: headless.c:158
VOID WinLdrSetupEms(IN PCHAR BootOptions)
Definition: headless.c:243
VOID WinLdrLoadGUID(OUT PGUID SystemGuid)
Definition: headless.c:45
unsigned short USHORT
Definition: pedump.c:61
unsigned int * PULONG
Definition: retypes.h:1
#define CP_GET_SUCCESS
Definition: cportlib.h:18
#define SYSID_UUID_DATA_SIZE
Definition: headless.c:16
_Check_return_ int __cdecl atoi(_In_z_ const char *_Str)
#define OUT
Definition: typedefs.h:39
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
struct _SYSID_UUID_ENTRY * PSYSID_UUID_ENTRY
Definition: headless.c:18
BOOLEAN WinLdrPortGetByte(IN ULONG PortId, OUT PUCHAR Byte)
Definition: headless.c:143
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
UCHAR IsMMIODevice
Definition: arc.h:320