ReactOS  0.4.14-dev-317-g96040ec
rosload.c File Reference
#include "rosload.h"
Include dependency graph for rosload.c:

Go to the source code of this file.

Functions

NTSTATUS OslArchTransferToKernel (_In_ PLOADER_PARAMETER_BLOCK LoaderBlock, _In_ PVOID KernelEntrypoint)
 
VOID OslFatalErrorEx (_In_ ULONG ErrorCode, _In_ ULONG Parameter1, _In_ ULONG_PTR Parameter2, _In_ ULONG_PTR Parameter3)
 
VOID OslAbortBoot (_In_ NTSTATUS Status)
 
NTSTATUS OslBlStatusErrorHandler (_In_ ULONG ErrorCode, _In_ ULONG Parameter1, _In_ ULONG_PTR Parameter2, _In_ ULONG_PTR Parameter3, _In_ ULONG_PTR Parameter4)
 
VOID OslpSanitizeLoadOptionsString (_In_ PWCHAR OptionString, _In_ PWCHAR SanitizeString)
 
VOID OslpSanitizeStringOptions (_In_ PBL_BCD_OPTION BcdOptions)
 
NTSTATUS OslpRemoveInternalApplicationOptions (VOID)
 
NTSTATUS OslpCheckForcedFailure (VOID)
 
VOID OslpInitializeBootStatusDataLog (VOID)
 
NTSTATUS OslpReadWriteBootStatusData (_In_ BOOLEAN WriteAccess)
 
NTSTATUS OslpGetSetBootStatusData (_In_ BOOLEAN Read, _In_ RTL_BSD_ITEM_TYPE DataClass, _Out_ PVOID Buffer, _Inout_ PULONG Size)
 
NTSTATUS OslSetBootStatusData (_In_ BOOLEAN LastBootGood, _In_ BOOLEAN LastBootShutdown, _In_ BOOLEAN LastBootCheckpoint, _In_ ULONG UpdateIncrement, _In_ ULONG BootAttemptCount)
 
NTSTATUS OslGetBootStatusData (_Out_ PBOOLEAN LastBootGood, _Out_ PBOOLEAN LastBootShutdown, _Out_ PBOOLEAN LastBootCheckpoint, _Out_ PULONG LastBootId, _Out_ PBOOLEAN BootGood, _Out_ PBOOLEAN BootShutdown)
 
BOOLEAN OslpAdvancedOptionsRequested (VOID)
 
NTSTATUS OslPrepareTarget (_Out_ PULONG ReturnFlags, _Out_ PBOOLEAN Jump)
 
NTSTATUS OslFwpKernelSetupPhase1 (_In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
 
NTSTATUS OslArchpKernelSetupPhase0 (_In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
 
VOID ArchRestoreProcessorFeatures (VOID)
 
NTSTATUS OslArchKernelSetup (_In_ ULONG Phase, _In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
 
NTSTATUS OslExecuteTransition (VOID)
 
NTSTATUS OslpMain (_Out_ PULONG ReturnFlags)
 
NTSTATUS NTAPI OslMain (_In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters)
 

Variables

PLOADER_PARAMETER_BLOCK OslLoaderBlock
 
PVOID OslEntryPoint
 
PVOID UserSharedAddress
 
ULONGLONG ArchXCr0BitsToClear
 
ULONGLONG ArchCr4BitsToClear
 
BOOLEAN BdDebugAfterExitBootServices
 
KDESCRIPTOR OslKernelGdt
 
KDESCRIPTOR OslKernelIdt
 
ULONG_PTR OslImcHiveHandle
 
ULONG_PTR OslMachineHiveHandle
 
ULONG_PTR OslElamHiveHandle
 
ULONG_PTR OslSystemHiveHandle
 
PBL_DEVICE_DESCRIPTOR OslLoadDevice
 
PCHAR OslLoadOptions
 
PWCHAR OslSystemRoot
 
LIST_ENTRY OslFreeMemoryDesctiptorsList
 
LIST_ENTRY OslFinalMemoryMap
 
LIST_ENTRY OslCoreExtensionSubGroups [2]
 
LIST_ENTRY OslLoadedFirmwareDriverList
 
BL_BUFFER_DESCRIPTOR OslFinalMemoryMapDescriptorsBuffer
 
GUID OslApplicationIdentifier
 
ULONG OslResetBootStatus
 
BOOLEAN OslImcProcessingValid
 
ULONG OslFreeMemoryDesctiptorsListSize
 
PVOID OslMemoryDescriptorBuffer
 
BcdObjectType BlpSbdiCurrentApplicationType
 
PRTL_BSD_DATA BsdBootStatusData
 
OSL_BSD_ITEM_TABLE_ENTRY OslpBootStatusFields [RtlBsdItemMax]
 
ULONG OslBootAttemptCount
 
ULONG OslBootCountUpdateRequestForAbort
 
ULONG OslBootAttemptMaximum
 
ULONG OslBootCountUpdateIncrement
 
BOOLEAN OslCurrentBootCheckpoint
 
BOOLEAN OslCurrentBootSucceeded
 
BOOLEAN OslCurrentBootShutdown
 

Function Documentation

◆ ArchRestoreProcessorFeatures()

VOID ArchRestoreProcessorFeatures ( VOID  )

Definition at line 877 of file rosload.c.

880 {
881  /* Any XCR0 bits to clear? */
883  {
884  /* Clear them */
885 #if defined(_MSC_VER) && !defined(__clang__) && !defined(_M_ARM)
886  __xsetbv(0, __xgetbv(0) & ~ArchXCr0BitsToClear);
887 #endif
889  }
890 
891  /* Any CR4 bits to clear? */
892  if (ArchCr4BitsToClear)
893  {
894  /* Clear them */
895 #if !defined(_M_ARM)
897 #endif
898  ArchCr4BitsToClear = 0;
899  }
900 }
__INTRIN_INLINE void __writecr4(unsigned int Data)
Definition: intrin_x86.h:1680
ULONGLONG ArchCr4BitsToClear
Definition: rosload.c:25
__INTRIN_INLINE unsigned long __readcr4(void)
Definition: intrin_x86.h:1713
ULONGLONG ArchXCr0BitsToClear
Definition: rosload.c:24

Referenced by OslArchKernelSetup().

◆ OslAbortBoot()

VOID OslAbortBoot ( _In_ NTSTATUS  Status)

Definition at line 150 of file rosload.c.

153 {
154  /* For now just do this */
155  BlStatusPrint(L"BOOT ABORTED: %lx\n", Status);
156 }
static const WCHAR L[]
Definition: oid.c:1250
Status
Definition: gdiplustypes.h:24
VOID BlStatusPrint(_In_ PCWCH Format,...)
Definition: debug.c:75

Referenced by OslPrepareTarget().

◆ OslArchKernelSetup()

NTSTATUS OslArchKernelSetup ( _In_ ULONG  Phase,
_In_ PLOADER_PARAMETER_BLOCK  LoaderBlock 
)

Definition at line 903 of file rosload.c.

907 {
908  /* For phase 0, do architectural setup */
909  if (Phase == 0)
910  {
911  return OslArchpKernelSetupPhase0(LoaderBlock);
912  }
913 
914  /* Nothing to do for Phase 1 */
915  if (Phase == 1)
916  {
917  return STATUS_SUCCESS;
918  }
919 
920  /* Relocate the self map */
922 
923  /* Zero out the HAL Heap */
926 
927  /* Move shared user data in its place */
930  PAGE_SIZE);
931 
932  /* Clear XCR0/CR4 CPU features that should be disabled before boot */
934 
935  /* Good to go */
936  return STATUS_SUCCESS;
937 }
#define MM_HAL_VA_START
Definition: ketypes.h:256
#define MM_HAL_VA_END
Definition: ketypes.h:257
PBL_MM_RELOCATE_SELF_MAP BlMmRelocateSelfMap
Definition: arch.c:16
PBL_MM_ZERO_VIRTUAL_ADDRESS_RANGE BlMmZeroVirtualAddressRange
Definition: arch.c:18
NTSTATUS OslArchpKernelSetupPhase0(_In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: rosload.c:869
VOID ArchRestoreProcessorFeatures(VOID)
Definition: rosload.c:877
PVOID UserSharedAddress
Definition: rosload.c:23
#define KI_USER_SHARED_DATA
#define PAGE_SIZE
Definition: env_spec_w32.h:49
return STATUS_SUCCESS
Definition: btrfs.c:2938
PBL_MM_MOVE_VIRTUAL_ADDRESS_RANGE BlMmMoveVirtualAddressRange
Definition: arch.c:17

Referenced by OslExecuteTransition().

◆ OslArchpKernelSetupPhase0()

NTSTATUS OslArchpKernelSetupPhase0 ( _In_ PLOADER_PARAMETER_BLOCK  LoaderBlock)

Definition at line 869 of file rosload.c.

872 {
873  return STATUS_NOT_IMPLEMENTED;
874 }
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225

Referenced by OslArchKernelSetup().

◆ OslArchTransferToKernel()

NTSTATUS OslArchTransferToKernel ( _In_ PLOADER_PARAMETER_BLOCK  LoaderBlock,
_In_ PVOID  KernelEntrypoint 
)

Referenced by OslExecuteTransition().

◆ OslBlStatusErrorHandler()

NTSTATUS OslBlStatusErrorHandler ( _In_ ULONG  ErrorCode,
_In_ ULONG  Parameter1,
_In_ ULONG_PTR  Parameter2,
_In_ ULONG_PTR  Parameter3,
_In_ ULONG_PTR  Parameter4 
)

Definition at line 159 of file rosload.c.

166 {
167  /* We only filter error code 4 */
168  if (ErrorCode != 4)
169  {
170  return STATUS_NOT_IMPLEMENTED;
171  }
172 
173  /* Handle error 4 as a fatal error 3 internally */
174  OslFatalErrorEx(3, Parameter1, Parameter2, Parameter3);
175  return STATUS_SUCCESS;
176 }
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
VOID OslFatalErrorEx(_In_ ULONG ErrorCode, _In_ ULONG Parameter1, _In_ ULONG_PTR Parameter2, _In_ ULONG_PTR Parameter3)
Definition: rosload.c:138
return STATUS_SUCCESS
Definition: btrfs.c:2938

Referenced by OslPrepareTarget().

◆ OslExecuteTransition()

NTSTATUS OslExecuteTransition ( VOID  )

Definition at line 940 of file rosload.c.

943 {
945 
946  /* Is the debugger meant to be kept enabled throughout the boot phase? */
948  {
949 #ifdef BL_KD_SUPPORT
950  /* No -- disable it */
951  BlBdStop();
952 #endif
953  }
954 
955  /* Setup Firmware for Phase 1 */
957  if (NT_SUCCESS(Status))
958  {
959  /* Setup kernel for Phase 2 */
961  if (NT_SUCCESS(Status))
962  {
963 #ifdef BL_KD_SUPPORT
964  /* Stop the boot debugger */
965  BlBdStop();
966 #endif
967  /* Jump to the kernel entrypoint */
969 
970  /* Infinite loop if we got here */
971  for (;;);
972  }
973  }
974 
975  /* Return back with the failure code */
976  return Status;
977 }
LONG NTSTATUS
Definition: precomp.h:26
PLOADER_PARAMETER_BLOCK OslLoaderBlock
Definition: rosload.c:21
NTSTATUS OslArchKernelSetup(_In_ ULONG Phase, _In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: rosload.c:903
NTSTATUS OslFwpKernelSetupPhase1(_In_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: rosload.c:861
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
BOOLEAN BdDebugAfterExitBootServices
Definition: rosload.c:26
Status
Definition: gdiplustypes.h:24
NTSTATUS OslArchTransferToKernel(_In_ PLOADER_PARAMETER_BLOCK LoaderBlock, _In_ PVOID KernelEntrypoint)
PVOID OslEntryPoint
Definition: rosload.c:22

Referenced by OslpMain().

◆ OslFatalErrorEx()

VOID OslFatalErrorEx ( _In_ ULONG  ErrorCode,
_In_ ULONG  Parameter1,
_In_ ULONG_PTR  Parameter2,
_In_ ULONG_PTR  Parameter3 
)

Definition at line 138 of file rosload.c.

144 {
145  /* For now just do this */
146  BlStatusPrint(L"FATAL ERROR IN ROSLOAD: %lx\n", ErrorCode);
147 }
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
static const WCHAR L[]
Definition: oid.c:1250
VOID BlStatusPrint(_In_ PCWCH Format,...)
Definition: debug.c:75

Referenced by OslBlStatusErrorHandler(), and OslPrepareTarget().

◆ OslFwpKernelSetupPhase1()

NTSTATUS OslFwpKernelSetupPhase1 ( _In_ PLOADER_PARAMETER_BLOCK  LoaderBlock)

Definition at line 861 of file rosload.c.

864 {
865  return STATUS_NOT_IMPLEMENTED;
866 }
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225

Referenced by OslExecuteTransition().

◆ OslGetBootStatusData()

NTSTATUS OslGetBootStatusData ( _Out_ PBOOLEAN  LastBootGood,
_Out_ PBOOLEAN  LastBootShutdown,
_Out_ PBOOLEAN  LastBootCheckpoint,
_Out_ PULONG  LastBootId,
_Out_ PBOOLEAN  BootGood,
_Out_ PBOOLEAN  BootShutdown 
)

Definition at line 446 of file rosload.c.

454 {
456  ULONG Size;
457  ULONG64 BootStatusPolicy;
458  BOOLEAN localBootShutdown, localBootGood;
459 
460  /* Capture the BSD data in our globals, if needed */
462  if (!NT_SUCCESS(Status))
463  {
464  goto Quickie;
465  }
466 
467  /* Read the last boot ID */
468  Size = sizeof(*LastBootId);
470  if (!NT_SUCCESS(Status))
471  {
472  /* Set to zero if we couldn't find it */
473  *LastBootId = 0;
474  }
475 
476  /* Get the boot status policy */
479  &BootStatusPolicy);
480  if (!NT_SUCCESS(Status))
481  {
482  /* Apply a default if none exists */
483  BootStatusPolicy = IgnoreShutdownFailures;
484  }
485 
486  /* Check if this was a good shutdown */
487  Size = sizeof(localBootShutdown);
490  &localBootShutdown,
491  &Size);
492  if (!NT_SUCCESS(Status))
493  {
494  goto Quickie;
495  }
496 
497  /* Tell the caller */
498  *BootShutdown = localBootShutdown;
499 
500  /* Check if this was a good boot */
501  Size = sizeof(localBootGood);
504  &localBootGood,
505  &Size);
506  if (!NT_SUCCESS(Status))
507  {
508  goto Quickie;
509  }
510 
511  /* Tell the caller*/
512  *BootGood = localBootGood;
513 
514  /* TODO: Additional logic for checkpoints and such */
516 
517 Quickie:
518  return Status;
519 }
#define TRUE
Definition: types.h:120
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS BlGetBootOptionInteger(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PULONGLONG Value)
Definition: bcdopt.c:467
BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
Definition: bootlib.c:19
NTSTATUS OslpReadWriteBootStatusData(_In_ BOOLEAN WriteAccess)
Definition: rosload.c:283
PBL_BCD_OPTION BcdData
Definition: bl.h:868
unsigned char BOOLEAN
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
unsigned __int64 ULONG64
Definition: imports.h:198
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
NTSTATUS OslpGetSetBootStatusData(_In_ BOOLEAN Read, _In_ RTL_BSD_ITEM_TYPE DataClass, _Out_ PVOID Buffer, _Inout_ PULONG Size)
Definition: rosload.c:308
unsigned int ULONG
Definition: retypes.h:1

Referenced by OslPrepareTarget().

◆ OslMain()

Definition at line 1055 of file rosload.c.

1058 {
1059  BL_LIBRARY_PARAMETERS LibraryParameters;
1060  NTSTATUS Status;
1061  PBL_RETURN_ARGUMENTS ReturnArguments;
1062  PBL_APPLICATION_ENTRY AppEntry;
1063  CPU_INFO CpuInfo;
1064  ULONG Flags;
1065 
1066  /* Get the return arguments structure, and set our version */
1067  ReturnArguments = (PBL_RETURN_ARGUMENTS)((ULONG_PTR)BootParameters +
1068  BootParameters->ReturnArgumentsOffset);
1069  ReturnArguments->Version = BL_RETURN_ARGUMENTS_VERSION;
1070 
1071  /* Get the application entry, and validate it */
1072  AppEntry = (PBL_APPLICATION_ENTRY)((ULONG_PTR)BootParameters +
1073  BootParameters->AppEntryOffset);
1074  if (!RtlEqualMemory(AppEntry->Signature,
1076  sizeof(AppEntry->Signature)))
1077  {
1078  /* Unrecognized, bail out */
1080  goto Quickie;
1081  }
1082 
1083 #if !defined(_M_ARM)
1084  /* Check if CPUID 01h is supported */
1086  {
1087  /* Query CPU features */
1088  BlArchCpuId(1, 0, &CpuInfo);
1089 
1090  /* Check if PAE is supported */
1091  if (CpuInfo.Edx & 0x40)
1092  {
1093  EfiPrintf(L"PAE Supported, but won't be used\r\n");
1094  }
1095  }
1096 #endif
1097 
1098  /* Setup the boot library parameters for this application */
1099  BlSetupDefaultParameters(&LibraryParameters);
1100  LibraryParameters.TranslationType = BlVirtual;
1103  LibraryParameters.MinimumAllocationCount = 1024;
1104  LibraryParameters.MinimumHeapSize = 2 * 1024 * 1024;
1105  LibraryParameters.HeapAllocationAttributes = BlMemoryKernelRange;
1106  LibraryParameters.FontBaseDirectory = L"\\Reactos\\Boot\\Fonts";
1107  LibraryParameters.DescriptorCount = 512;
1108 
1109  /* Initialize the boot library */
1110  Status = BlInitializeLibrary(BootParameters, &LibraryParameters);
1111  if (NT_SUCCESS(Status))
1112  {
1113  /* For testing, draw the logo */
1114  OslDrawLogo();
1115 
1116  /* Call the main routine */
1117  Status = OslpMain(&Flags);
1118 
1119  /* Return the flags, and destroy the boot library */
1120  ReturnArguments->Flags = Flags;
1121  BlDestroyLibrary();
1122  }
1123 
1124 Quickie:
1125  /* Return back to boot manager */
1126  ReturnArguments->Status = Status;
1127  return Status;
1128 }
VOID BlDestroyLibrary(VOID)
Definition: bootlib.c:405
ULONG HeapAllocationAttributes
Definition: bl.h:762
ULONG Version
Definition: bl.h:817
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_INVALID_PARAMETER_9
Definition: ntstatus.h:469
CHAR Signature[8]
Definition: bl.h:857
VOID NTAPI OslDrawLogo(VOID)
Definition: roslogo.c:9767
#define BL_APP_ENTRY_SIGNATURE
Definition: bl.h:54
uint32_t ULONG_PTR
Definition: typedefs.h:63
Definition: bl.h:232
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
Definition: bl.h:855
ULONG LibraryFlags
Definition: bl.h:758
BOOLEAN BlArchIsCpuIdFunctionSupported(_In_ ULONG Function)
Definition: util.c:856
NTSYSAPI ULONG NTAPI RtlEqualMemory(CONST VOID *Source1, CONST VOID *Source2, ULONG Length)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS BlInitializeLibrary(_In_ PBOOT_APPLICATION_PARAMETER_BLOCK BootAppParameters, _In_ PBL_LIBRARY_PARAMETERS LibraryParameters)
Definition: bootlib.c:355
FORCEINLINE VOID BlSetupDefaultParameters(_Out_ PBL_LIBRARY_PARAMETERS LibraryParameters)
Definition: bl.h:1355
#define BL_LIBRARY_FLAG_ZERO_HEAP_ALLOCATIONS_ON_FREE
Definition: bl.h:131
ULONG MinimumHeapSize
Definition: bl.h:761
static const WCHAR L[]
Definition: oid.c:1250
Status
Definition: gdiplustypes.h:24
ULONG TranslationType
Definition: bl.h:759
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
#define BL_LIBRARY_FLAG_REINITIALIZE_ALL
Definition: bl.h:130
ULONG MinimumAllocationCount
Definition: bl.h:760
unsigned int ULONG
Definition: retypes.h:1
struct _BL_APPLICATION_ENTRY * PBL_APPLICATION_ENTRY
VOID BlArchCpuId(_In_ ULONG Function, _In_ ULONG SubFunction, _Out_ PCPU_INFO Result)
Definition: util.c:924
#define BL_RETURN_ARGUMENTS_VERSION
Definition: bl.h:64
ULONG Edx
Definition: ketypes.h:299
PWCHAR FontBaseDirectory
Definition: bl.h:765
NTSTATUS Status
Definition: bl.h:818
ULONG DescriptorCount
Definition: bl.h:764
NTSTATUS OslpMain(_Out_ PULONG ReturnFlags)
Definition: rosload.c:980
struct _BL_RETURN_ARGUMENTS * PBL_RETURN_ARGUMENTS

◆ OslpAdvancedOptionsRequested()

BOOLEAN OslpAdvancedOptionsRequested ( VOID  )

Definition at line 522 of file rosload.c.

525 {
526  /* TODO */
527  return FALSE;
528 }

Referenced by OslPrepareTarget().

◆ OslpCheckForcedFailure()

NTSTATUS OslpCheckForcedFailure ( VOID  )

Definition at line 249 of file rosload.c.

252 {
253  ULONG64 ForceReason;
255 
256  /* Read the option */
259  &ForceReason);
260  if (NT_SUCCESS(Status) && (ForceReason < 4))
261  {
262  /* For reasons above 3, don't actually do anything */
263  if (ForceReason > 3)
264  {
265  return STATUS_SUCCESS;
266  }
267  }
268 
269  /* If the option isn't there or invalid, always return success */
270  return STATUS_SUCCESS;
271 }
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS BlGetBootOptionInteger(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PULONGLONG Value)
Definition: bcdopt.c:467
BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
Definition: bootlib.c:19
PBL_BCD_OPTION BcdData
Definition: bl.h:868
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
unsigned __int64 ULONG64
Definition: imports.h:198
Status
Definition: gdiplustypes.h:24
return STATUS_SUCCESS
Definition: btrfs.c:2938

Referenced by OslPrepareTarget().

◆ OslpGetSetBootStatusData()

NTSTATUS OslpGetSetBootStatusData ( _In_ BOOLEAN  Read,
_In_ RTL_BSD_ITEM_TYPE  DataClass,
_Out_ PVOID  Buffer,
_Inout_ PULONG  Size 
)

Definition at line 308 of file rosload.c.

314 {
317 
318  /* No data has been read yet, fail */
319  if (!BsdBootStatusData)
320  {
321  return STATUS_UNSUCCESSFUL;
322  }
323 
324  /* Invalid data item, fail */
325  if (DataClass >= RtlBsdItemMax)
326  {
328  }
329 
330  /* Capture the length and offset */
331  Length = OslpBootStatusFields[DataClass].Size;
332  Offset = OslpBootStatusFields[DataClass].Offset;
333 
334  /* Make sure it doesn't overflow past the structure we've read */
336  {
338  }
339 
340  /* Make sure we have enough space */
341  if (*Size >= Length)
342  {
343  /* We do -- is this a read? */
344  if (Read)
345  {
346  /* Yes, copy into the caller's buffer */
349  Length);
350  }
351  else
352  {
353  /* It's a write, copy from caller's buffer */
355  Buffer,
356  Length);
357  }
358 
359  /* Set success */
361  }
362  else
363  {
364  /* Return size needed and failure code */
365  *Size = Length;
367  }
368 
369  /* All good */
370  return Status;
371 }
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:311
_In_ BOOLEAN Read
Definition: strmini.h:479
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
OSL_BSD_ITEM_TABLE_ENTRY OslpBootStatusFields[RtlBsdItemMax]
Definition: rosload.c:57
LONG NTSTATUS
Definition: precomp.h:26
ULONG Version
Definition: rtltypes.h:1328
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
uint32_t ULONG_PTR
Definition: typedefs.h:63
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
Definition: bufpool.h:45
PRTL_BSD_DATA BsdBootStatusData
Definition: rosload.c:55
ULONG Size
Definition: rosload.h:40
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
ULONG Offset
Definition: rosload.h:39
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:2938

Referenced by OslGetBootStatusData(), OslPrepareTarget(), and OslSetBootStatusData().

◆ OslpInitializeBootStatusDataLog()

VOID OslpInitializeBootStatusDataLog ( VOID  )

Definition at line 274 of file rosload.c.

277 {
278  /* TODO */
279  return;
280 }

Referenced by OslPrepareTarget().

◆ OslpMain()

NTSTATUS OslpMain ( _Out_ PULONG  ReturnFlags)

Definition at line 980 of file rosload.c.

983 {
985  BOOLEAN ExecuteJump;
986 #if !defined(_M_ARM)
987  CPU_INFO CpuInfo;
988  BOOLEAN NxEnabled;
989  LARGE_INTEGER MiscMsr;
990 
991  /* Check if the CPU supports NX */
992  BlArchCpuId(0x80000001, 0, &CpuInfo);
993  if (!(CpuInfo.Edx & 0x10000))
994  {
995  /* It doesn't, check if this is Intel */
996  EfiPrintf(L"NX disabled: %lx\r\n", CpuInfo.Edx);
997  if (BlArchGetCpuVendor() == CPU_INTEL)
998  {
999  /* Then turn off the MSR disable feature for it, enabling NX */
1001  EfiPrintf(L"NX being turned on: %llx\r\n", MiscMsr.QuadPart);
1002  MiscMsr.HighPart &= MSR_XD_ENABLE_MASK;
1005  NxEnabled = TRUE;
1006  }
1007  }
1008 
1009  /* Turn on NX support with the CPU-generic MSR */
1011 
1012 #endif
1013 
1014  /* Load the kernel */
1015  Status = OslPrepareTarget(ReturnFlags, &ExecuteJump);
1016  if (NT_SUCCESS(Status) && (ExecuteJump))
1017  {
1018  /* Jump to the kernel */
1020  }
1021 
1022 #if !defined(_M_ARM)
1023  /* Retore NX support */
1025 
1026  /* Did we manually enable NX? */
1027  if (NxEnabled)
1028  {
1029  /* Turn it back off */
1031  MiscMsr.HighPart |= ~MSR_XD_ENABLE_MASK;
1033  }
1034 
1035 #endif
1036  /* Go back */
1037  return Status;
1038 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
#define MSR_IA32_MISC_ENABLE
Definition: ketypes.h:192
#define MSR_XD_ENABLE_MASK
Definition: ketypes.h:221
unsigned char BOOLEAN
PPC_QUAL unsigned long long __readmsr()
Definition: intrin_ppc.h:741
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static const WCHAR L[]
Definition: oid.c:1250
CPU_VENDORS BlArchGetCpuVendor(VOID)
Definition: util.c:937
NTSTATUS OslExecuteTransition(VOID)
Definition: rosload.c:940
#define MSR_EFER
Definition: ketypes.h:182
PPC_QUAL void __writemsr(const unsigned long Value)
Definition: intrin_ppc.h:748
Status
Definition: gdiplustypes.h:24
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
VOID BlArchCpuId(_In_ ULONG Function, _In_ ULONG SubFunction, _Out_ PCPU_INFO Result)
Definition: util.c:924
NTSTATUS OslPrepareTarget(_Out_ PULONG ReturnFlags, _Out_ PBOOLEAN Jump)
Definition: rosload.c:531
ULONG Edx
Definition: ketypes.h:299
#define MSR_NXE
Definition: ketypes.h:214
LONGLONG QuadPart
Definition: typedefs.h:112

Referenced by OslMain().

◆ OslpReadWriteBootStatusData()

NTSTATUS OslpReadWriteBootStatusData ( _In_ BOOLEAN  WriteAccess)

Definition at line 283 of file rosload.c.

286 {
287  /* Are you trying to write? */
288  if (WriteAccess)
289  {
290  /* Have we already read? */
291  if (!BsdBootStatusData)
292  {
293  /* No -- fail */
294  return STATUS_UNSUCCESSFUL;
295  }
296  }
297  else if (BsdBootStatusData)
298  {
299  /* No -- you're trying to read and we already have the data: no-op */
300  return STATUS_SUCCESS;
301  }
302 
303  /* TODO */
304  return STATUS_NOT_IMPLEMENTED;
305 }
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
PRTL_BSD_DATA BsdBootStatusData
Definition: rosload.c:55
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
return STATUS_SUCCESS
Definition: btrfs.c:2938

Referenced by OslGetBootStatusData(), OslPrepareTarget(), and OslSetBootStatusData().

◆ OslpRemoveInternalApplicationOptions()

NTSTATUS OslpRemoveInternalApplicationOptions ( VOID  )

Definition at line 198 of file rosload.c.

201 {
204 
205  /* Assume success */
207 
208  /* Remove attempts to disable integrity checks or ELAM driver load */
213 
214  /* Get the command-line parameters, if any */
217  &LoadString);
218  if (NT_SUCCESS(Status))
219  {
220  /* Conver to upper case */
222 
223  /* Remove the existing one */
226 
227  /* Sanitize strings we don't want */
228  OslpSanitizeLoadOptionsString(LoadString, L"DISABLE_INTEGRITY_CHECKS");
229  OslpSanitizeLoadOptionsString(LoadString, L"NOINTEGRITYCHECKS");
230  OslpSanitizeLoadOptionsString(LoadString, L"DISABLEELAMDRIVERS");
231 
232  /* Add the sanitized one back */
235  LoadString);
236 
237  /* Free the original BCD one */
239  }
240 
241  /* One more pass for secure-boot options */
243 
244  /* All good */
245  return Status;
246 }
LONG NTSTATUS
Definition: precomp.h:26
VOID BlRemoveBootOption(_In_ PBL_BCD_OPTION List, _In_ ULONG Type)
Definition: bcdopt.c:801
uint16_t * PWCHAR
Definition: typedefs.h:54
NTSTATUS BlMmFreeHeap(_In_ PVOID Buffer)
Definition: heapalloc.c:663
BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
Definition: bootlib.c:19
PBL_BCD_OPTION BcdData
Definition: bl.h:868
VOID OslpSanitizeStringOptions(_In_ PBL_BCD_OPTION BcdOptions)
Definition: rosload.c:189
_CRTIMP wchar_t *__cdecl _wcsupr(_Inout_z_ wchar_t *_String)
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID OslpSanitizeLoadOptionsString(_In_ PWCHAR OptionString, _In_ PWCHAR SanitizeString)
Definition: rosload.c:179
static const WCHAR L[]
Definition: oid.c:1250
NTSTATUS BlGetBootOptionString(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PWCHAR *Value)
Definition: bcdopt.c:146
NTSTATUS BlAppendBootOptionString(_In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, _In_ ULONG OptionId, _In_ PWCHAR OptionString)
Definition: bcdopt.c:689
Status
Definition: gdiplustypes.h:24
return STATUS_SUCCESS
Definition: btrfs.c:2938
#define LoadString
Definition: winuser.h:5720

Referenced by OslPrepareTarget().

◆ OslPrepareTarget()

NTSTATUS OslPrepareTarget ( _Out_ PULONG  ReturnFlags,
_Out_ PBOOLEAN  Jump 
)

Definition at line 531 of file rosload.c.

535 {
536  PGUID AppId;
538  PBL_DEVICE_DESCRIPTOR OsDevice;
540  SIZE_T RootLength, RootLengthWithSep;
541  ULONG i;
542  ULONG64 StartPerf, EndPerf;
543  RTL_BSD_DATA_POWER_TRANSITION PowerTransitionData;
544  PRTL_BSD_DATA_POWER_TRANSITION PowerBuffer;
545  ULONG OsDeviceHandle;
546  BOOLEAN LastBootGood, LastBootShutdown, LastBootCheckpoint;
547  ULONG BootId;
548  BOOLEAN BootGood, BootShutdown;
549  ULONG BsdSize;
550 
551  /* Initialize locals */
552  PowerBuffer = NULL;
553 
554  /* Assume no flags */
555  *ReturnFlags = 0;
556 
557  /* Make all registry handles invalid */
558  OslImcHiveHandle = -1;
560  OslElamHiveHandle = -1;
561  OslSystemHiveHandle = -1;
562 
563  /* Initialize memory lists */
567  for (i = 0; i < RTL_NUMBER_OF(OslCoreExtensionSubGroups); i++)
568  {
570  }
571 
572  /* Initialize the memory map descriptor buffer */
575 
576  /* Initialize general pointers */
582 
583  /* Initialize general variables */
584  OslResetBootStatus = 0;
587 
588  /* Capture the current TSC */
589  StartPerf = BlArchGetPerformanceCounter();
590 
591  /* Set our application type for SecureBoot/TPM purposes */
599 
600  /* Register an error handler */
602 
603  /* Get the application identifier and save it */
604  AppId = BlGetApplicationIdentifier();
605  if (AppId)
606  {
607  OslApplicationIdentifier = *AppId;
608  }
609 
610  /* Enable tracing */
611 #ifdef BL_ETW_SUPPORT
612  TraceLoggingRegister(&TlgOslBootProviderProv);
613 #endif
614 
615  /* Remove dangerous BCD options */
617  if (!NT_SUCCESS(Status))
618  {
619  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
620  goto Quickie;
621  }
622 
623  /* Get the OS device */
626  &OsDevice,
627  0);
628  if (!NT_SUCCESS(Status))
629  {
630  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
631  goto Quickie;
632  }
633 
634  /* If the OS device is the boot device, use the one provided by bootlib */
635  if (OsDevice->DeviceType == BootDevice)
636  {
637  OsDevice = BlpBootDevice;
638  }
639 
640  /* Save it as a global for later */
641  OslLoadDevice = OsDevice;
642 
643  /* Get the system root */
646  &SystemRoot);
647  if (!NT_SUCCESS(Status))
648  {
649  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
650  goto Quickie;
651  }
652 
653  EfiPrintf(L"System root: %s\r\n", SystemRoot);
654 
655  /* Get the system root length and make sure it's slash-terminated */
656  RootLength = wcslen(SystemRoot);
657  if (SystemRoot[RootLength - 1] == OBJ_NAME_PATH_SEPARATOR)
658  {
659  /* Perfect, set it */
661  }
662  else
663  {
664  /* Allocate a new buffer large enough to contain the slash */
665  RootLengthWithSep = RootLength + sizeof(OBJ_NAME_PATH_SEPARATOR);
666  OslSystemRoot = BlMmAllocateHeap(RootLengthWithSep * sizeof(WCHAR));
667  if (!OslSystemRoot)
668  {
669  /* Bail out if we're out of memory */
671  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
672  goto Quickie;
673  }
674 
675  /* Make a copy of the path, adding the separator */
677  wcscat(OslSystemRoot, L"\\");
678 
679  /* Free the original one from the BCD library */
681  }
682 
683  /* Initialize access to the BSD */
685 
686  /* Check if we're supposed to fail on purpose */
688  if (!NT_SUCCESS(Status))
689  {
690  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
691  goto Quickie;
692  }
693 
694  /* Always disable VGA mode */
697  TRUE);
698  if (!NT_SUCCESS(Status))
699  {
700  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
701  goto Quickie;
702  }
703 
704  /* Get telemetry data from the last boot */
705  Status = OslGetBootStatusData(&LastBootGood,
706  &LastBootShutdown,
707  &LastBootCheckpoint,
708  &BootId,
709  &BootGood,
710  &BootShutdown);
711  if (!NT_SUCCESS(Status))
712  {
713  /* Assume this is the very first boot and everything went well */
714  BootId = 0;
715  LastBootGood = TRUE;
716  LastBootShutdown = TRUE;
717  LastBootCheckpoint = TRUE;
718  BootGood = TRUE;
719  BootShutdown = TRUE;
720 
721  /* Set 0 boot attempts */
723  }
724 
725  /* Set more attempt variables to their initial state */
728 
729  /* Read the current BSD data into the global buffer */
731  if (NT_SUCCESS(Status))
732  {
733  /* Get the power transition buffer from the BSD */
734  BsdSize = sizeof(PowerTransitionData);
737  &PowerTransitionData,
738  &BsdSize);
739  if (NT_SUCCESS(Status))
740  {
741  /* Save the buffer */
742  PowerBuffer = &PowerTransitionData;
743  }
744  }
745 
746  /* Check if this is VHD boot, which gets 3 boot attempts instead of 2 */
749 
750  /* Check if the user wants to see the advanced menu */
752  {
753  /* The last boot failed more than the maximum */
754  if (!(LastBootGood) &&
756  {
757  /* Return failure due to boot -- launch recovery */
758  *ReturnFlags |= 8;
759 
760  /* Update the attempt count and status variables */
762  OslCurrentBootCheckpoint = LastBootCheckpoint;
764  OslCurrentBootShutdown = LastBootShutdown;
765 
766  /* Crash with code 15 and abort boot */
767  OslFatalErrorEx(15, 0, 0, 0);
769  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
770  goto Quickie;
771  }
772 
773  /* We never made it far enough, more than the maximum */
774  if (!(LastBootCheckpoint) &&
776  {
777  /* Return crash/dirty shutdown during boot attempt */
778  *ReturnFlags |= 0x10;
779 
780  /* Update the attempt count and status variables */
782  OslCurrentBootSucceeded = LastBootGood;
783  OslCurrentBootShutdown = LastBootShutdown;
785 
786  /* Crash with code 16 and abort boot */
787  OslFatalErrorEx(16, 0, 0, 0);
789  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
790  goto Quickie;
791  }
792 
793  /* We failed to shutdown cleanly, and haven't booted yet */
794  if (!(LastBootShutdown) && !(OslBootAttemptCount))
795  {
796  /* Return crash/dirty shutdown */
797  *ReturnFlags |= 0x10;
798 
799  /* There's no boot attempt, so only update shutdown variables */
800  OslCurrentBootSucceeded = LastBootGood;
802  OslCurrentBootCheckpoint = LastBootCheckpoint;
803 
804  /* Crash with code 16 and abort boot */
805  OslFatalErrorEx(16, 0, 0, 0);
807  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
808  goto Quickie;
809  }
810  }
811 
812  /* Officially increment the number of boot attempts */
814 
815  /* No success yet, write to boot status file */
820  FALSE,
821  FALSE,
824 
825  /* Open the OS Loader Device for Read/Write access */
828  0,
829  &OsDeviceHandle);
830  if (!NT_SUCCESS(Status))
831  {
832  EfiPrintf(L"Fail here: %d\r\n", __LINE__);
833  goto Quickie;
834  }
835 
836  /* That's all for now, folks */
838  DBG_UNREFERENCED_LOCAL_VARIABLE(PowerBuffer);
839 
840  /* Printf perf */
841  EndPerf = BlArchGetPerformanceCounter();
842  EfiPrintf(L"Delta: %lld\r\n", EndPerf - StartPerf);
843 
844 Quickie:
845 #if BL_BITLOCKER_SUPPORT
846  /* Destroy the RNG/AES library for BitLocker */
847  SymCryptRngAesUninstantiate();
848 #endif
849 
850  /* Abort the boot */
852 
853  /* This is a failure path, so never do the jump */
854  *Jump = FALSE;
855 
856  /* Return error code */
857  return Status;
858 }
ULONG_PTR OslSystemHiveHandle
Definition: rosload.c:33
ULONG OslResetBootStatus
Definition: rosload.c:48
PBL_DEVICE_DESCRIPTOR BlpBootDevice
Definition: bootlib.c:16
#define TRUE
Definition: types.h:120
ULONG OslBootCountUpdateIncrement
Definition: rosload.c:129
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
#define BL_DEVICE_WRITE_ACCESS
Definition: bl.h:154
LIST_ENTRY OslLoadedFirmwareDriverList
Definition: rosload.c:42
Definition: bl.h:252
LONG NTSTATUS
Definition: precomp.h:26
LIST_ENTRY OslCoreExtensionSubGroups[2]
Definition: rosload.c:41
PVOID OslMemoryDescriptorBuffer
Definition: rosload.c:51
uint16_t * PWCHAR
Definition: typedefs.h:54
BOOLEAN OslpAdvancedOptionsRequested(VOID)
Definition: rosload.c:522
VOID OslpInitializeBootStatusDataLog(VOID)
Definition: rosload.c:274
NTSTATUS BlMmFreeHeap(_In_ PVOID Buffer)
Definition: heapalloc.c:663
BOOLEAN OslCurrentBootCheckpoint
Definition: rosload.c:131
BOOLEAN OslImcProcessingValid
Definition: rosload.c:49
PLOADER_PARAMETER_BLOCK OslLoaderBlock
Definition: rosload.c:21
BL_LOADED_APPLICATION_ENTRY BlpApplicationEntry
Definition: bootlib.c:19
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
VOID OslAbortBoot(_In_ NTSTATUS Status)
Definition: rosload.c:150
PBL_DEVICE_DESCRIPTOR OslLoadDevice
Definition: rosload.c:35
#define BCD_OBJECT_TYPE_APPLICATION
Definition: bcd.h:44
#define OBJ_NAME_PATH_SEPARATOR
Definition: arcname_tests.c:25
NTSTATUS OslpReadWriteBootStatusData(_In_ BOOLEAN WriteAccess)
Definition: rosload.c:283
PBL_BCD_OPTION BcdData
Definition: bl.h:868
BOOLEAN OslCurrentBootSucceeded
Definition: rosload.c:132
BOOLEAN BlDeviceIsVirtualPartitionDevice(_In_ PBL_DEVICE_DESCRIPTOR InputDevice, _Outptr_ PBL_DEVICE_DESCRIPTOR *VirtualDevice)
Definition: device.c:612
unsigned char BOOLEAN
DEVICE_TYPE DeviceType
Definition: bl.h:951
smooth NULL
Definition: ftsmooth.c:416
LIST_ENTRY OslFreeMemoryDesctiptorsList
Definition: rosload.c:39
PVOID BlMmAllocateHeap(_In_ SIZE_T Size)
Definition: heapalloc.c:569
ULONG OslBootCountUpdateRequestForAbort
Definition: rosload.c:126
ULONG_PTR OslImcHiveHandle
Definition: rosload.c:30
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:326
BcdObjectType BlpSbdiCurrentApplicationType
Definition: rosload.c:53
static const WCHAR SystemRoot[]
Definition: reg.c:38
BOOLEAN OslCurrentBootShutdown
Definition: rosload.c:133
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
ULONG_PTR OslMachineHiveHandle
Definition: rosload.c:31
#define BCD_IMAGE_TYPE_BOOT_APP
Definition: bcd.h:30
PWCHAR OslSystemRoot
Definition: rosload.c:37
PGUID BlGetApplicationIdentifier(VOID)
Definition: bootlib.c:414
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
unsigned __int64 ULONG64
Definition: imports.h:198
NTSTATUS OslSetBootStatusData(_In_ BOOLEAN LastBootGood, _In_ BOOLEAN LastBootShutdown, _In_ BOOLEAN LastBootCheckpoint, _In_ ULONG UpdateIncrement, _In_ ULONG BootAttemptCount)
Definition: rosload.c:374
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static const WCHAR L[]
Definition: oid.c:1250
NTSTATUS BlGetBootOptionString(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PWCHAR *Value)
Definition: bcdopt.c:146
LIST_ENTRY OslFinalMemoryMap
Definition: rosload.c:40
VOID OslFatalErrorEx(_In_ ULONG ErrorCode, _In_ ULONG Parameter1, _In_ ULONG_PTR Parameter2, _In_ ULONG_PTR Parameter3)
Definition: rosload.c:138
PCHAR OslLoadOptions
Definition: rosload.c:36
ULONG_PTR OslElamHiveHandle
Definition: rosload.c:32
Status
Definition: gdiplustypes.h:24
#define BL_DEVICE_READ_ACCESS
Definition: bl.h:153
ULONG_PTR SIZE_T
Definition: typedefs.h:78
NTSTATUS OslpRemoveInternalApplicationOptions(VOID)
Definition: rosload.c:198
NTSTATUS BlGetBootOptionDevice(_In_ PBL_BCD_OPTION List, _In_ ULONG Type, _Out_ PBL_DEVICE_DESCRIPTOR *Value, _In_opt_ PBL_BCD_OPTION *ExtraOptions)
Definition: bcdopt.c:321
GUID OslApplicationIdentifier
Definition: rosload.c:46
NTSTATUS OslGetBootStatusData(_Out_ PBOOLEAN LastBootGood, _Out_ PBOOLEAN LastBootShutdown, _Out_ PBOOLEAN LastBootCheckpoint, _Out_ PULONG LastBootId, _Out_ PBOOLEAN BootGood, _Out_ PBOOLEAN BootShutdown)
Definition: rosload.c:446
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
ULONG OslBootAttemptCount
Definition: rosload.c:125
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
ULONG OslFreeMemoryDesctiptorsListSize
Definition: rosload.c:50
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
ULONG OslBootAttemptMaximum
Definition: rosload.c:127
NTSTATUS OslpCheckForcedFailure(VOID)
Definition: rosload.c:249
struct BcdObjectType::@102::@104::@106 Application
BL_BUFFER_DESCRIPTOR OslFinalMemoryMapDescriptorsBuffer
Definition: rosload.c:44
ULONGLONG BlArchGetPerformanceCounter(VOID)
Definition: util.c:902
NTSTATUS OslpGetSetBootStatusData(_In_ BOOLEAN Read, _In_ RTL_BSD_ITEM_TYPE DataClass, _Out_ PVOID Buffer, _Inout_ PULONG Size)
Definition: rosload.c:308
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define BCD_APPLICATION_TYPE_OSLOADER
Definition: bcd.h:36
NTSTATUS BlpDeviceOpen(_In_ PBL_DEVICE_DESCRIPTOR Device, _In_ ULONG Flags, _In_ ULONG Unknown, _Out_ PULONG DeviceId)
Definition: device.c:2111
NTSTATUS OslBlStatusErrorHandler(_In_ ULONG ErrorCode, _In_ ULONG Parameter1, _In_ ULONG_PTR Parameter2, _In_ ULONG_PTR Parameter3, _In_ ULONG_PTR Parameter4)
Definition: rosload.c:159
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
NTSTATUS BlAppendBootOptionBoolean(_In_ PBL_LOADED_APPLICATION_ENTRY AppEntry, _In_ ULONG OptionId, _In_ BOOLEAN Value)
Definition: bcdopt.c:625
PBL_STATUS_ERROR_HANDLER BlpStatusErrorHandler
Definition: debug.c:20

Referenced by OslpMain().

◆ OslpSanitizeLoadOptionsString()

VOID OslpSanitizeLoadOptionsString ( _In_ PWCHAR  OptionString,
_In_ PWCHAR  SanitizeString 
)

Definition at line 179 of file rosload.c.

183 {
184  /* TODO */
185  return;
186 }

Referenced by OslpRemoveInternalApplicationOptions().

◆ OslpSanitizeStringOptions()

VOID OslpSanitizeStringOptions ( _In_ PBL_BCD_OPTION  BcdOptions)

Definition at line 189 of file rosload.c.

192 {
193  /* TODO */
194  return;
195 }

Referenced by OslpRemoveInternalApplicationOptions().

◆ OslSetBootStatusData()

NTSTATUS OslSetBootStatusData ( _In_ BOOLEAN  LastBootGood,
_In_ BOOLEAN  LastBootShutdown,
_In_ BOOLEAN  LastBootCheckpoint,
_In_ ULONG  UpdateIncrement,
_In_ ULONG  BootAttemptCount 
)

Definition at line 374 of file rosload.c.

381 {
383  ULONG Size;
384 
385  /* Capture the BSD data in our globals, if needed */
387  if (!NT_SUCCESS(Status))
388  {
389  goto Quickie;
390  }
391 
392  /* Write last boot shutdown */
393  Size = sizeof(LastBootShutdown);
396  &LastBootShutdown,
397  &Size);
398  if (!NT_SUCCESS(Status))
399  {
400  goto Quickie;
401  }
402 
403  /* Write last boot good */
404  Size = sizeof(LastBootGood);
407  &LastBootGood,
408  &Size);
409  if (!NT_SUCCESS(Status))
410  {
411  goto Quickie;
412  }
413 
414  /* Write last boot checkpoint */
415  Size = sizeof(LastBootCheckpoint);
418  &LastBootCheckpoint,
419  &Size);
420  if (!NT_SUCCESS(Status))
421  {
422  goto Quickie;
423  }
424 
425  /* Write boot attempt count */
426  Size = sizeof(BootAttemptCount);
429  &BootAttemptCount,
430  &Size);
431  if (!NT_SUCCESS(Status))
432  {
433  goto Quickie;
434  }
435 
436  /* TODO: Update Boot ID*/
437 
438  /* Now write the data */
440 
441 Quickie:
442  return Status;
443 }
#define TRUE
Definition: types.h:120
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS OslpReadWriteBootStatusData(_In_ BOOLEAN WriteAccess)
Definition: rosload.c:283
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
NTSTATUS OslpGetSetBootStatusData(_In_ BOOLEAN Read, _In_ RTL_BSD_ITEM_TYPE DataClass, _Out_ PVOID Buffer, _Inout_ PULONG Size)
Definition: rosload.c:308
unsigned int ULONG
Definition: retypes.h:1

Referenced by OslPrepareTarget().

Variable Documentation

◆ ArchCr4BitsToClear

ULONGLONG ArchCr4BitsToClear

Definition at line 25 of file rosload.c.

Referenced by ArchRestoreProcessorFeatures().

◆ ArchXCr0BitsToClear

ULONGLONG ArchXCr0BitsToClear

Definition at line 24 of file rosload.c.

Referenced by ArchRestoreProcessorFeatures().

◆ BdDebugAfterExitBootServices

BOOLEAN BdDebugAfterExitBootServices

Definition at line 26 of file rosload.c.

Referenced by OslExecuteTransition().

◆ BlpSbdiCurrentApplicationType

BcdObjectType BlpSbdiCurrentApplicationType

Definition at line 53 of file rosload.c.

Referenced by OslPrepareTarget().

◆ BsdBootStatusData

PRTL_BSD_DATA BsdBootStatusData

Definition at line 55 of file rosload.c.

Referenced by OslpGetSetBootStatusData(), and OslpReadWriteBootStatusData().

◆ OslApplicationIdentifier

GUID OslApplicationIdentifier

Definition at line 46 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslBootAttemptCount

ULONG OslBootAttemptCount

Definition at line 125 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslBootAttemptMaximum

ULONG OslBootAttemptMaximum

Definition at line 127 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslBootCountUpdateIncrement

ULONG OslBootCountUpdateIncrement

Definition at line 129 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslBootCountUpdateRequestForAbort

ULONG OslBootCountUpdateRequestForAbort

Definition at line 126 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslCoreExtensionSubGroups

LIST_ENTRY OslCoreExtensionSubGroups[2]

Definition at line 41 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslCurrentBootCheckpoint

BOOLEAN OslCurrentBootCheckpoint

Definition at line 131 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslCurrentBootShutdown

BOOLEAN OslCurrentBootShutdown

Definition at line 133 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslCurrentBootSucceeded

BOOLEAN OslCurrentBootSucceeded

Definition at line 132 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslElamHiveHandle

ULONG_PTR OslElamHiveHandle

Definition at line 32 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslEntryPoint

PVOID OslEntryPoint

Definition at line 22 of file rosload.c.

Referenced by OslExecuteTransition().

◆ OslFinalMemoryMap

LIST_ENTRY OslFinalMemoryMap

Definition at line 40 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslFinalMemoryMapDescriptorsBuffer

BL_BUFFER_DESCRIPTOR OslFinalMemoryMapDescriptorsBuffer

Definition at line 44 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslFreeMemoryDesctiptorsList

LIST_ENTRY OslFreeMemoryDesctiptorsList

Definition at line 39 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslFreeMemoryDesctiptorsListSize

ULONG OslFreeMemoryDesctiptorsListSize

Definition at line 50 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslImcHiveHandle

ULONG_PTR OslImcHiveHandle

Definition at line 30 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslImcProcessingValid

BOOLEAN OslImcProcessingValid

Definition at line 49 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslKernelGdt

KDESCRIPTOR OslKernelGdt

Definition at line 27 of file rosload.c.

◆ OslKernelIdt

KDESCRIPTOR OslKernelIdt

Definition at line 28 of file rosload.c.

◆ OslLoadDevice

PBL_DEVICE_DESCRIPTOR OslLoadDevice

Definition at line 35 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslLoadedFirmwareDriverList

LIST_ENTRY OslLoadedFirmwareDriverList

Definition at line 42 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslLoaderBlock

PLOADER_PARAMETER_BLOCK OslLoaderBlock

Definition at line 21 of file rosload.c.

Referenced by OslExecuteTransition(), and OslPrepareTarget().

◆ OslLoadOptions

PCHAR OslLoadOptions

Definition at line 36 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslMachineHiveHandle

ULONG_PTR OslMachineHiveHandle

Definition at line 31 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslMemoryDescriptorBuffer

PVOID OslMemoryDescriptorBuffer

Definition at line 51 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslpBootStatusFields

OSL_BSD_ITEM_TABLE_ENTRY OslpBootStatusFields[RtlBsdItemMax]

Definition at line 57 of file rosload.c.

Referenced by OslpGetSetBootStatusData().

◆ OslResetBootStatus

ULONG OslResetBootStatus

Definition at line 48 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslSystemHiveHandle

ULONG_PTR OslSystemHiveHandle

Definition at line 33 of file rosload.c.

Referenced by OslPrepareTarget().

◆ OslSystemRoot

PWCHAR OslSystemRoot

Definition at line 37 of file rosload.c.

Referenced by OslPrepareTarget().

◆ UserSharedAddress

PVOID UserSharedAddress

Definition at line 23 of file rosload.c.

Referenced by OslArchKernelSetup().