ReactOS  0.4.13-dev-52-g0efcfec
util.c File Reference
#include "bl.h"
Include dependency graph for util.c:

Go to the source code of this file.

Functions

NTSTATUS BlUtlGetAcpiTable (_Out_ PVOID *TableAddress, _In_ ULONG Signature)
 
VOID BlUtlUpdateProgress (_In_ ULONG Percentage, _Out_opt_ PBOOLEAN Completed)
 
NTSTATUS BlUtlInitialize (VOID)
 
VOID BmUpdateProgressInfo (_In_ PVOID Unknown, _In_ PWCHAR ProgressInfo)
 
VOID BmUpdateProgress (_In_ PVOID Unknown, _In_ ULONG Percent, _Out_ PBOOLEAN Completed)
 
NTSTATUS BlUtlRegisterProgressRoutine (VOID)
 
PVOID BlTblFindEntry (_In_ PVOID *Table, _In_ ULONG Count, _Out_ PULONG EntryIndex, _In_ PBL_TBL_LOOKUP_ROUTINE Callback, _In_ PVOID Argument1, _In_ PVOID Argument2, _In_ PVOID Argument3, _In_ PVOID Argument4)
 
NTSTATUS BlTblSetEntry (_Inout_ PVOID **Table, _Inout_ PULONG Count, _In_ PVOID Entry, _Out_ PULONG EntryIndex, _In_ PBL_TBL_SET_ROUTINE Callback)
 
NTSTATUS BlTblMap (_In_ PVOID *Table, _In_ ULONG Count, _In_ PBL_TBL_MAP_ROUTINE MapCallback)
 
ULONG DefaultHashFunction (_In_ PBL_HASH_ENTRY Entry, _In_ ULONG TableSize)
 
BOOLEAN HtpCompareKeys (_In_ PBL_HASH_ENTRY Entry1, _In_ PBL_HASH_ENTRY Entry2)
 
NTSTATUS TblDoNotPurgeEntry (_In_ PVOID Entry)
 
NTSTATUS BlHtCreate (_In_ ULONG Size, _In_ PBL_HASH_TABLE_HASH_FUNCTION HashFunction, _In_ PBL_HASH_TABLE_COMPARE_FUNCTION CompareFunction, _Out_ PULONG Id)
 
NTSTATUS BlHtLookup (_In_ ULONG TableId, _In_ PBL_HASH_ENTRY Entry, _Out_opt_ PBL_HASH_VALUE *Value)
 
NTSTATUS BlHtStore (_In_ ULONG TableId, _In_ PBL_HASH_ENTRY Entry, _In_ PVOID Data, _In_ ULONG DataSize)
 
NTSTATUS BlHtDelete (_In_ ULONG TableId, _In_ PBL_HASH_ENTRY Entry)
 
ULONG BlUtlCheckSum (_In_ ULONG PartialSum, _In_ PUCHAR Buffer, _In_ ULONG Length, _In_ ULONG Flags)
 
BOOLEAN BlArchIsCpuIdFunctionSupported (_In_ ULONG Function)
 
ULONGLONG BlArchGetPerformanceCounter (VOID)
 
VOID BlArchCpuId (_In_ ULONG Function, _In_ ULONG SubFunction, _Out_ PCPU_INFO Result)
 
CPU_VENDORS BlArchGetCpuVendor (VOID)
 

Variables

PRSDT UtlRsdt
 
PXSDT UtlXsdt
 
PVOID UtlMcContext
 
PVOID UtlMcDisplayMessageRoutine
 
PVOID UtlMcUpdateMessageRoutine
 
PVOID UtlProgressRoutine
 
PVOID UtlProgressContext
 
PVOID UtlProgressInfoRoutine
 
ULONG UtlProgressGranularity
 
ULONG UtlCurrentPercentComplete
 
ULONG UtlNextUpdatePercentage
 
BOOLEAN UtlProgressNeedsInfoUpdate
 
PVOID UtlProgressInfo
 
ULONG HtTableSize
 
PBL_HASH_TABLEHtTableArray
 
ULONG HtTableEntries
 

Function Documentation

◆ BlArchCpuId()

VOID BlArchCpuId ( _In_ ULONG  Function,
_In_ ULONG  SubFunction,
_Out_ PCPU_INFO  Result 
)

Definition at line 924 of file util.c.

929 {
930 #if defined(_M_IX86) || defined(_M_X64)
931  /* Use the intrinsic */
932  __cpuidex((INT*)Result->AsUINT32, Function, SubFunction);
933 #endif
934 }
int32_t INT
Definition: typedefs.h:56
static LPOVERLAPPED_COMPLETION_ROUTINE Function
Definition: sync.c:684
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
Definition: intrin_x86.h:1530

Referenced by BlArchGetCpuVendor(), BlArchGetPerformanceCounter(), MmArchInitialize(), OslMain(), and OslpMain().

◆ BlArchGetCpuVendor()

CPU_VENDORS BlArchGetCpuVendor ( VOID  )

Definition at line 937 of file util.c.

940 {
941  CPU_INFO CpuInfo;
942  INT Temp;
943 
944  /* Get the CPU Vendor */
945  BlArchCpuId(0, 0, &CpuInfo);
946  Temp = CpuInfo.Ecx;
947  CpuInfo.Ecx = CpuInfo.Edx;
948  CpuInfo.Edx = Temp;
949 
950  /* Check against supported values */
951  if (!strncmp((PCHAR)&CpuInfo.Ebx, "GenuineIntel", 12))
952  {
953  return CPU_INTEL;
954  }
955  if (!strncmp((PCHAR)&CpuInfo.Ebx, "AuthenticAMD", 12))
956  {
957  return CPU_AMD;
958  }
959  if (!strncmp((PCHAR)&CpuInfo.Ebx, "CentaurHauls", 12))
960  {
961  return CPU_VIA;
962  }
963 #ifdef _M_IX86
964  if (!strncmp((PCHAR)&CpuInfo.Ebx, "CyrixInstead", 12))
965  {
966  return CPU_CYRIX;
967  }
968  if (!strncmp((PCHAR)&CpuInfo.Ebx, "GenuineTMx86", 12))
969  {
970  return CPU_TRANSMETA;
971  }
972  if (!strncmp((PCHAR)&CpuInfo.Ebx, "RiseRiseRise", 12))
973  {
974  return CPU_RISE;
975  }
976 #endif // _M_IX86
977  /* Other */
978  return CPU_UNKNOWN;
979 }
signed char * PCHAR
Definition: retypes.h:7
int32_t INT
Definition: typedefs.h:56
ULONG Ebx
Definition: ketypes.h:297
ULONG Ecx
Definition: ketypes.h:298
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
VOID BlArchCpuId(_In_ ULONG Function, _In_ ULONG SubFunction, _Out_ PCPU_INFO Result)
Definition: util.c:924
ULONG Edx
Definition: ketypes.h:299

Referenced by OslpMain().

◆ BlArchGetPerformanceCounter()

ULONGLONG BlArchGetPerformanceCounter ( VOID  )

Definition at line 902 of file util.c.

905 {
906 #if defined(_M_IX86) || defined(_M_X64)
907  CPU_INFO CpuInfo;
908 
909  /* Serialize with CPUID, if it exists */
910  if (Archx86IsCpuidSupported())
911  {
912  BlArchCpuId(0, 0, &CpuInfo);
913  }
914 
915  /* Read the TSC */
916  return __rdtsc();
917 #else
918  EfiPrintf(L"BlArchGetPerformanceCounter not implemented for this platform.\r\n");
919  return 0;
920 #endif
921 }
PPC_QUAL unsigned long long __rdtsc(void)
Definition: intrin_ppc.h:688
static const WCHAR L[]
Definition: oid.c:1250
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

Referenced by MmArchInitialize(), and OslPrepareTarget().

◆ BlArchIsCpuIdFunctionSupported()

BOOLEAN BlArchIsCpuIdFunctionSupported ( _In_ ULONG  Function)

Definition at line 856 of file util.c.

859 {
860 #if defined(_M_IX86) || defined(_M_X64)
861  BOOLEAN Supported;
862  INT CpuInfo[4];
863 
864  /* Check if the CPU supports this instruction */
865  Supported = Archx86IsCpuidSupported();
866  if (!Supported)
867  {
868  return FALSE;
869  }
870 
871  /* Check if it's the extended function */
872  if (Function >= 0x80000000)
873  {
874  /* Check if extended functions are supported */
875  __cpuid(CpuInfo, 0x80000000);
876  if ((CpuInfo[0] & 0xFFFFFF00) != 0x80000000)
877  {
878  /* Nope */
879  return FALSE;
880  }
881  }
882  else
883  {
884  /* It's a regular function, get the maximum one supported */
885  __cpuid(CpuInfo, 0);
886  }
887 
888  /* Check if our function is within bounds */
889  if (Function <= CpuInfo[0])
890  {
891  return TRUE;
892  }
893 #else
894  EfiPrintf(L"BlArchIsCpuIdFunctionSupported not implemented for this platform.\r\n");
895 #endif
896 
897  /* Nope */
898  return FALSE;
899 }
#define TRUE
Definition: types.h:120
int32_t INT
Definition: typedefs.h:56
static LPOVERLAPPED_COMPLETION_ROUTINE Function
Definition: sync.c:684
unsigned char BOOLEAN
static const WCHAR L[]
Definition: oid.c:1250
PPC_QUAL void __cpuid(int CPUInfo[], const int InfoType)
Definition: intrin_ppc.h:682
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126

Referenced by MmArchInitialize(), and OslMain().

◆ BlHtCreate()

NTSTATUS BlHtCreate ( _In_ ULONG  Size,
_In_ PBL_HASH_TABLE_HASH_FUNCTION  HashFunction,
_In_ PBL_HASH_TABLE_COMPARE_FUNCTION  CompareFunction,
_Out_ PULONG  Id 
)

Definition at line 504 of file util.c.

510 {
513  ULONG i;
514 
515  /* Assume failure */
516  HashTable = NULL;
517 
518  /* Can't create a table with no ID */
519  if (!Id)
520  {
522  }
523 
524  /* Check if we don't already have a hash table table */
525  if (!HtTableSize)
526  {
527  /* Allocate it and zero it out */
528  HtTableSize = 4;
530  if (!HtTableArray)
531  {
533  goto Quickie;
534  }
536  HtTableEntries = 0;
537  }
538 
539  /* Allocate the hash table */
541  if (!HashTable)
542  {
544  goto Quickie;
545  }
546 
547  /* Fill it out */
548  HashTable->HashFunction = HashFunction ? HashFunction : DefaultHashFunction;
549  HashTable->CompareFunction = CompareFunction ? CompareFunction : HtpCompareKeys;
550  HashTable->Size = Size ? Size : 13;
551 
552  /* Allocate the hash links, one for each bucket */
553  HashTable->HashLinks = BlMmAllocateHeap(sizeof(LIST_ENTRY) * HashTable->Size);
554  if (!HashTable->HashLinks)
555  {
557  goto Quickie;
558  }
559 
560  /* Initialize the hash links */
561  for (i = 0; i < HashTable->Size; i++)
562  {
563  InitializeListHead(&HashTable->HashLinks[i]);
564  }
565 
566  /* Save us in the table of hash tables */
568  &Size,
569  HashTable,
570  Id,
572  if (NT_SUCCESS(Status))
573  {
574  /* One more -- we're done */
575  ++HtTableEntries;
576  return Status;
577  }
578 
579 Quickie:
580  /* Check if we just allocated the table array now */
581  if (!(HtTableEntries) && (HtTableArray))
582  {
583  /* Free it */
585  HtTableArray = NULL;
586  HtTableSize = 0;
587  }
588 
589  /* Check if we allocated a hash table*/
590  if (HashTable)
591  {
592  /* With links? */
593  if (HashTable->HashLinks)
594  {
595  /* Free them */
596  BlMmFreeHeap(HashTable->HashLinks);
597  }
598 
599  /* Free the table*/
601  }
602 
603  /* We're done */
604  return Status;
605 }
Definition: hash.c:67
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
PBL_HASH_TABLE * HtTableArray
Definition: util.c:438
ULONG HtTableSize
Definition: util.c:437
ULONG DefaultHashFunction(_In_ PBL_HASH_ENTRY Entry, _In_ ULONG TableSize)
Definition: util.c:442
NTSTATUS BlMmFreeHeap(_In_ PVOID Buffer)
Definition: heapalloc.c:663
NTSTATUS TblDoNotPurgeEntry(_In_ PVOID Entry)
Definition: util.c:495
DWORD Id
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 HtTableEntries
Definition: util.c:439
smooth NULL
Definition: ftsmooth.c:416
PVOID BlMmAllocateHeap(_In_ SIZE_T Size)
Definition: heapalloc.c:569
NTSTATUS BlTblSetEntry(_Inout_ PVOID **Table, _Inout_ PULONG Count, _In_ PVOID Entry, _Out_ PULONG EntryIndex, _In_ PBL_TBL_SET_ROUTINE Callback)
Definition: util.c:321
BOOLEAN HtpCompareKeys(_In_ PBL_HASH_ENTRY Entry1, _In_ PBL_HASH_ENTRY Entry2)
Definition: util.c:464
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Definition: typedefs.h:117
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Status
Definition: gdiplustypes.h:24
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261

Referenced by BcInitialize(), BlockIopInitialize(), and EfiVmOpenProtocol().

◆ BlHtDelete()

NTSTATUS BlHtDelete ( _In_ ULONG  TableId,
_In_ PBL_HASH_ENTRY  Entry 
)

Definition at line 722 of file util.c.

726 {
730  PLIST_ENTRY HashLinkHead, HashLink;
731  PBL_HASH_NODE HashNode;
732 
733  /* Check if the table ID is invalid, or we have no entry, or it's malformed */
734  if ((HtTableSize <= TableId) ||
735  !(Entry) ||
736  !(Entry->Size) ||
737  !(Entry->Value) ||
738  ((Entry->Flags & BL_HT_VALUE_IS_INLINE) && (Entry->Size != sizeof(ULONG))))
739  {
740  /* Fail */
742  }
743  else
744  {
745  /* Otherwise, get the hash table for this index */
746  HashTable = HtTableArray[TableId];
747 
748  /* Get the hash bucket */
749  HashValue = HashTable->HashFunction(Entry, HashTable->Size);
750 
751  /* Start iterating each entry in the bucket, assuming failure */
753  HashLinkHead = &HashTable->HashLinks[HashValue];
754  HashLink = HashLinkHead->Flink;
755  while (HashLink != HashLinkHead)
756  {
757  /* Get a node in this bucket, and compare the value */
758  HashNode = CONTAINING_RECORD(HashLink, BL_HASH_NODE, ListEntry);
759  if (HashTable->CompareFunction(&HashNode->Entry, Entry))
760  {
761  /* Remove it from the list and free it */
762  RemoveEntryList(&HashNode->ListEntry);
763  BlMmFreeHeap(HashNode);
764  return STATUS_SUCCESS;
765  }
766 
767  /* Try the next node */
768  HashLink = HashLink->Flink;
769  }
770  }
771 
772  /* Return back to the caller */
773  return Status;
774 }
LIST_ENTRY ListEntry
Definition: bl.h:1192
Definition: hash.c:67
BL_HASH_ENTRY Entry
Definition: bl.h:1193
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
PBL_HASH_TABLE * HtTableArray
Definition: util.c:438
_In_ BOOLEAN _In_ ULONG _Out_ PULONG HashValue
Definition: rtlfuncs.h:2039
ULONG HtTableSize
Definition: util.c:437
NTSTATUS BlMmFreeHeap(_In_ PVOID Buffer)
Definition: heapalloc.c:663
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define STATUS_NOT_FOUND
Definition: shellext.h:67
Definition: typedefs.h:117
Status
Definition: gdiplustypes.h:24
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:2725
#define BL_HT_VALUE_IS_INLINE
Definition: bl.h:138
base of all file and directory entries
Definition: entries.h:82

Referenced by BlockIoFirmwareOpen(), and EfiVmpFreeInterfaceEntry().

◆ BlHtLookup()

NTSTATUS BlHtLookup ( _In_ ULONG  TableId,
_In_ PBL_HASH_ENTRY  Entry,
_Out_opt_ PBL_HASH_VALUE Value 
)

Definition at line 608 of file util.c.

613 {
617  PLIST_ENTRY HashLinkHead, HashLink;
618  PBL_HASH_NODE HashNode;
619 
620  /* Check if the table ID is invalid, or we have no entry, or it's malformed */
621  if ((HtTableSize <= TableId) ||
622  !(Entry) ||
623  ((Entry->Flags & BL_HT_VALUE_IS_INLINE) && (Entry->Size != sizeof(ULONG))))
624  {
625  /* Fail */
627  }
628  else
629  {
630  /* Otherwise, get the hash table for this index */
631  HashTable = HtTableArray[TableId];
632 
633  /* Get the hash bucket */
634  HashValue = HashTable->HashFunction(Entry, HashTable->Size);
635 
636  /* Start iterating each entry in the bucket, assuming failure */
638  HashLinkHead = &HashTable->HashLinks[HashValue];
639  HashLink = HashLinkHead->Flink;
640  while (HashLink != HashLinkHead)
641  {
642  /* Get a node in this bucket, and compare the value */
643  HashNode = CONTAINING_RECORD(HashLink, BL_HASH_NODE, ListEntry);
644  if (HashTable->CompareFunction(&HashNode->Entry, Entry))
645  {
646  /* Does the caller want the value? */
647  if (Value)
648  {
649  /* Return it */
650  *Value = &HashNode->Value;
651  }
652 
653  /* Return success and stop scanning */
655  break;
656  }
657 
658  /* Try the next node */
659  HashLink = HashLink->Flink;
660  }
661  }
662 
663  /* Return back to the caller */
664  return Status;
665 }
_In_opt_ ULONG _Out_ PULONG Value
Definition: rtlfuncs.h:2327
Definition: hash.c:67
BL_HASH_VALUE Value
Definition: bl.h:1194
BL_HASH_ENTRY Entry
Definition: bl.h:1193
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
PBL_HASH_TABLE * HtTableArray
Definition: util.c:438
_In_ BOOLEAN _In_ ULONG _Out_ PULONG HashValue
Definition: rtlfuncs.h:2039
ULONG HtTableSize
Definition: util.c:437
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define STATUS_NOT_FOUND
Definition: shellext.h:67
Definition: typedefs.h:117
Status
Definition: gdiplustypes.h:24
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:2725
#define BL_HT_VALUE_IS_INLINE
Definition: bl.h:138
base of all file and directory entries
Definition: entries.h:82

◆ BlHtStore()

NTSTATUS BlHtStore ( _In_ ULONG  TableId,
_In_ PBL_HASH_ENTRY  Entry,
_In_ PVOID  Data,
_In_ ULONG  DataSize 
)

Definition at line 668 of file util.c.

674 {
675  PBL_HASH_NODE HashNode;
677  PLIST_ENTRY HashLinkHead;
679 
680  /* Check for invalid table ID, missing arguments, or malformed entry */
681  if ((HtTableSize <= TableId) ||
682  !(Entry) ||
683  !(Data) ||
684  !(Entry->Size) ||
685  !(Entry->Value) ||
686  !(DataSize) ||
687  ((Entry->Flags & BL_HT_VALUE_IS_INLINE) && (Entry->Size != sizeof(ULONG))))
688  {
689  /* Fail the call */
691  goto Quickie;
692  }
693 
694  /* Get the hash table for this ID */
695  HashTable = HtTableArray[TableId];
696 
697  /* Allocate a hash node */
698  HashNode = BlMmAllocateHeap(sizeof(*HashNode));
699  if (!HashNode)
700  {
702  goto Quickie;
703  }
704 
705  /* Capture all the data*/
706  HashNode->Entry.Size = Entry->Size;
707  HashNode->Entry.Flags = Entry->Flags;
708  HashNode->Entry.Value = Entry->Value;
709  HashNode->Value.DataSize = DataSize;
710  HashNode->Value.Data = Data;
711 
712  /* Insert it into the bucket list and return success */
713  HashLinkHead = &HashTable->HashLinks[HashTable->HashFunction(Entry, HashTable->Size)];
714  InsertTailList(HashLinkHead, &HashNode->ListEntry);
716 
717 Quickie:
718  return Status;
719 }
LIST_ENTRY ListEntry
Definition: bl.h:1192
Definition: hash.c:67
ULONG Size
Definition: bl.h:1179
BL_HASH_VALUE Value
Definition: bl.h:1194
BL_HASH_ENTRY Entry
Definition: bl.h:1193
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
PBL_HASH_TABLE * HtTableArray
Definition: util.c:438
PVOID Value
Definition: bl.h:1181
#define InsertTailList(ListHead, Entry)
ULONG HtTableSize
Definition: util.c:437
PVOID Data
Definition: bl.h:1187
PVOID BlMmAllocateHeap(_In_ SIZE_T Size)
Definition: heapalloc.c:569
_In_ LPGUID _In_ PVOID Data
Definition: classpnp.h:778
ULONG DataSize
Definition: bl.h:1186
Definition: typedefs.h:117
ULONG Flags
Definition: bl.h:1180
Status
Definition: gdiplustypes.h:24
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:2725
#define BL_HT_VALUE_IS_INLINE
Definition: bl.h:138
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4733
base of all file and directory entries
Definition: entries.h:82

Referenced by BlockIoFirmwareOpen(), and EfiVmOpenProtocol().

◆ BlTblFindEntry()

PVOID BlTblFindEntry ( _In_ PVOID Table,
_In_ ULONG  Count,
_Out_ PULONG  EntryIndex,
_In_ PBL_TBL_LOOKUP_ROUTINE  Callback,
_In_ PVOID  Argument1,
_In_ PVOID  Argument2,
_In_ PVOID  Argument3,
_In_ PVOID  Argument4 
)

Definition at line 273 of file util.c.

283 {
284  PVOID Entry = NULL;
285  ULONG Index;
286  BOOLEAN Result;
287 
288  /* Check for invalid parameters */
289  if (!(Table) || !(EntryIndex))
290  {
291  return Entry;
292  }
293 
294  /* Loop each entry in the table */
295  for (Index = 0; Index < Count; Index++)
296  {
297  /* Check if this entry is filled out */
298  if (Table[Index])
299  {
300  /* Call the comparison function */
302  Argument1,
303  Argument2,
304  Argument3,
305  Argument4);
306  if (Result)
307  {
308  /* Entry found return it */
309  *EntryIndex = Index;
310  Entry = Table[Index];
311  break;
312  }
313  }
314  }
315 
316  /* Return the entry that was (or wasn't) found */
317  return Entry;
318 }
ASMGENDATA Table[]
Definition: genincdata.c:61
_IRQL_requires_same_ _In_opt_ PVOID Argument1
Definition: cmtypes.h:694
struct _Entry Entry
Definition: kefuncs.h:640
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
_In_ PVOID Argument2
Definition: classpnp.h:680
static const UCHAR Index[8]
Definition: usbohci.c:18
unsigned int ULONG
Definition: retypes.h:1
LPFNPSPCALLBACK Callback
Definition: desk.c:111
base of all file and directory entries
Definition: entries.h:82

Referenced by BlockIoOpen(), BlpDeviceOpen(), FileIoOpen(), and MmBapFindBlockInformation().

◆ BlTblMap()

NTSTATUS BlTblMap ( _In_ PVOID Table,
_In_ ULONG  Count,
_In_ PBL_TBL_MAP_ROUTINE  MapCallback 
)

Definition at line 399 of file util.c.

404 {
405  NTSTATUS Status, LocalStatus;
406  PVOID Entry;
407  ULONG Index;
408 
409  /* Bail out if there's no table */
410  if (!Table)
411  {
413  }
414 
415  /* Assume success and loop each index */
417  for (Index = 0; Index < Count; Index++)
418  {
419  /* See if an entry exists at this index */
420  Entry = Table[Index];
421  if (Entry)
422  {
423  /* Call the map routine for this entry */
424  LocalStatus = MapCallback(Entry, Index);
425  if (!NT_SUCCESS(LocalStatus))
426  {
427  /* Propagate failure only */
428  Status = LocalStatus;
429  }
430  }
431  }
432 
433  /* Return status to caller */
434  return Status;
435 }
ASMGENDATA Table[]
Definition: genincdata.c:61
struct _Entry Entry
Definition: kefuncs.h:640
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static const UCHAR Index[8]
Definition: usbohci.c:18
Status
Definition: gdiplustypes.h:24
unsigned int ULONG
Definition: retypes.h:1
return STATUS_SUCCESS
Definition: btrfs.c:2725
base of all file and directory entries
Definition: entries.h:82

Referenced by BlockIoDeviceTableDestroy().

◆ BlTblSetEntry()

NTSTATUS BlTblSetEntry ( _Inout_ PVOID **  Table,
_Inout_ PULONG  Count,
_In_ PVOID  Entry,
_Out_ PULONG  EntryIndex,
_In_ PBL_TBL_SET_ROUTINE  Callback 
)

Definition at line 321 of file util.c.

328 {
329  ULONG NewCount;
331  ULONG Index = 0;
332  PVOID* NewTable;
333 
334  /* Make sure all the parameters were specified */
335  if (!(Table) || !(*Table) || !(Count) || !(Callback))
336  {
338  }
339 
340  /* Read the current table */
341  NewTable = *Table;
342  NewCount = *Count;
343 
344  /* Iterate over it */
345  while (Index < NewCount)
346  {
347  /* Look for a free index */
348  if (!NewTable[Index])
349  {
350  goto SetIndex;
351  }
352 
353  /* No free index yet, keep going */
354  ++Index;
355  }
356 
357  /* No free index was found, try to purge some entries */
358  Index = 0;
359  while (Index < NewCount)
360  {
361  /* Call each purge callback, trying to make space */
362  Status = Callback(NewTable[Index]);
363  if (NT_SUCCESS(Status))
364  {
365  /* We should have this slot available now */
366  goto SetIndex;
367  }
368 
369  /* Keep trying to purge more */
370  ++Index;
371  }
372 
373  /* Double the table */
374  NewTable = BlMmAllocateHeap(2 * sizeof(PVOID) * NewCount);
375  if (!NewTable)
376  {
377  return STATUS_NO_MEMORY;
378  }
379 
380  /* Clear the new table, and copy the old entries */
381  RtlZeroMemory(&NewTable[NewCount], sizeof(PVOID) * NewCount);
382  RtlCopyMemory(NewTable, *Table, sizeof(PVOID) * NewCount);
383 
384  /* Free the old table */
386 
387  /* Return the new table and count */
388  *Count = 2 * NewCount;
389  *Table = NewTable;
390 
391 SetIndex:
392  /* Set the index and return */
393  NewTable[Index] = Entry;
394  *EntryIndex = Index;
395  return Status;
396 }
ASMGENDATA Table[]
Definition: genincdata.c:61
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
struct _Entry Entry
Definition: kefuncs.h:640
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
NTSTATUS BlMmFreeHeap(_In_ PVOID Buffer)
Definition: heapalloc.c:663
PVOID BlMmAllocateHeap(_In_ SIZE_T Size)
Definition: heapalloc.c:569
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static const UCHAR Index[8]
Definition: usbohci.c:18
Status
Definition: gdiplustypes.h:24
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
unsigned int ULONG
Definition: retypes.h:1
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
return STATUS_SUCCESS
Definition: btrfs.c:2725
LPFNPSPCALLBACK Callback
Definition: desk.c:111

Referenced by BlHtCreate(), BlImgLoadBootApplication(), BlockIoFirmwareOpen(), BlpDeviceOpen(), BlpIoRegisterDestroyRoutine(), BlpMmCreateBlockAllocator(), EtfsMount(), and FileIoOpen().

◆ BlUtlCheckSum()

ULONG BlUtlCheckSum ( _In_ ULONG  PartialSum,
_In_ PUCHAR  Buffer,
_In_ ULONG  Length,
_In_ ULONG  Flags 
)

Definition at line 777 of file util.c.

783 {
784  ULONG i;
785 
787  {
788  EfiPrintf(L"Not supported\r\n");
789  return 0;
790  }
792  {
793  PartialSum = (unsigned __int16)PartialSum;
794  Length &= ~1;
795 
796  for (i = 0; i < Length; i += 2)
797  {
798  PartialSum += *(unsigned __int16 *)&Buffer[i];
800  {
801  PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum);
802  }
803  }
804 
805  if (i != Length)
806  {
807  PartialSum += (unsigned __int8)Buffer[Length];
809  {
810  PartialSum = (unsigned __int16)((PartialSum >> 16) + PartialSum);
811  }
812  }
813 
815  {
816  return ~PartialSum;
817  }
818 
819  PartialSum = (unsigned __int16)PartialSum;
820  }
821  else
822  {
823  /* Invalid mode */
824  return 0;
825  }
826 
828  {
829  return ~PartialSum;
830  }
831 
832  return PartialSum;
833 }
#define BL_UTL_CHECKSUM_NEGATE
Definition: bl.h:190
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
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
Definition: bufpool.h:45
#define BL_UTL_CHECKSUM_UCHAR_BUFFER
Definition: bl.h:191
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
static const WCHAR L[]
Definition: oid.c:1250
#define BL_UTL_CHECKSUM_USHORT_BUFFER
Definition: bl.h:192
#define BL_UTL_CHECKSUM_COMPLEMENT
Definition: bl.h:188
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
#define __int8
Definition: basetyps.h:25
unsigned int ULONG
Definition: retypes.h:1
#define __int16
Definition: basetyps.h:22

Referenced by ImgpLoadPEImage().

◆ BlUtlGetAcpiTable()

NTSTATUS BlUtlGetAcpiTable ( _Out_ PVOID TableAddress,
_In_ ULONG  Signature 
)

Definition at line 34 of file util.c.

38 {
39  ULONG i, TableCount, HeaderLength;
41  PRSDT Rsdt;
42  PXSDT Xsdt;
45 
46  Header = 0;
47 
48  /* Make sure there's an output parameter */
49  if (!TableAddress)
50  {
52  }
53 
54  /* Get the currently known RSDT and XSDT */
55  Rsdt = (PRSDT)UtlRsdt;
56  Xsdt = (PXSDT)UtlXsdt;
57 
58  /* Is there an RSDT? */
59  if (!Rsdt)
60  {
61  /* No -- is there an XSDT? */
62  if (!Xsdt)
63  {
64  /* No. Look up the RSDT */
66  if (!NT_SUCCESS(Status))
67  {
68  EfiPrintf(L"no rsdp found\r\n");
69  return Status;
70  }
71 
72  /* Map the header */
74  0,
75  sizeof(*Header),
77  if (!NT_SUCCESS(Status))
78  {
79  return Status;
80  }
81 
82  /* Unmap the header */
84 
85  /* Map the whole table */
87  0,
88  Header->Length,
90  if (!NT_SUCCESS(Status))
91  {
92  return Status;
93  }
94 
95  /* Check if its an XSDT or an RSDT */
96  if (Header->Signature == XSDT_SIGNATURE)
97  {
98  /* It's an XSDT */
99  Xsdt = (PXSDT)Header;
100  UtlXsdt = Xsdt;
101  }
102  else
103  {
104  /* It's an RSDT */
105  Rsdt = (PRSDT)Header;
106  UtlRsdt = Rsdt;
107  }
108  }
109  }
110 
111  /* OK, so do we have an XSDT after all? */
112  if (Xsdt)
113  {
114  /* Yes... how big is it? */
115  HeaderLength = Xsdt->Header.Length;
116  if (HeaderLength >= sizeof(*Header))
117  {
118  HeaderLength = sizeof(*Header);
119  }
120 
121  /* Based on that, how many tables are there? */
122  TableCount = (Xsdt->Header.Length - HeaderLength) / sizeof(PHYSICAL_ADDRESS);
123  }
124  else
125  {
126  /* Nope, we have an RSDT. How big is it? */
127  HeaderLength = Rsdt->Header.Length;
128  if (HeaderLength >= sizeof(*Header))
129  {
130  HeaderLength = sizeof(*Header);
131  }
132 
133  /* Based on that, how many tables are there? */
134  TableCount = (Rsdt->Header.Length - HeaderLength) / sizeof(ULONG);
135  }
136 
137  /* Loop through the ACPI tables */
138  for (i = 0; i < TableCount; i++)
139  {
140  /* For an XSDT, read the 64-bit address directly */
141  if (Xsdt)
142  {
143  PhysicalAddress = Xsdt->Tables[i];
144  }
145  else
146  {
147  /* For RSDT, cast it */
148  PhysicalAddress.QuadPart = Rsdt->Tables[i];
149  }
150 
151  /* Map the header */
153  0,
154  sizeof(*Header),
156  if (!NT_SUCCESS(Status))
157  {
158  return Status;
159  }
160 
161  /* Is it the right one? */
162  if (Header->Signature == Signature)
163  {
164  /* Unmap the header */
166 
167  /* Map the whole table */
168  return BlMmMapPhysicalAddressEx(TableAddress,
169  0,
170  Header->Length,
172  }
173  }
174 
175  /* Requested table does not exist */
176  return STATUS_NOT_FOUND;
177 }
#define XSDT_SIGNATURE
Definition: acpi.h:39
Definition: acpi.h:193
NTSTATUS BlMmMapPhysicalAddressEx(_In_ PVOID *VirtualAddress, _In_ ULONG Attributes, _In_ ULONGLONG Size, _In_ PHYSICAL_ADDRESS PhysicalAddress)
Definition: mm.c:192
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
ULONG Tables[ANYSIZE_ARRAY]
Definition: acpi.h:189
LONG NTSTATUS
Definition: precomp.h:26
PXSDT UtlXsdt
Definition: util.c:16
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
PHYSICAL_ADDRESS Tables[ANYSIZE_ARRAY]
Definition: acpi.h:196
Definition: Header.h:8
DESCRIPTION_HEADER Header
Definition: acpi.h:195
#define STATUS_NOT_FOUND
Definition: shellext.h:67
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS BlMmUnmapVirtualAddressEx(_In_ PVOID VirtualAddress, _In_ ULONGLONG Size)
Definition: mm.c:487
NTSTATUS EfipGetRsdt(_Out_ PPHYSICAL_ADDRESS FoundRsdt)
Definition: firmware.c:1635
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS PhysicalAddress
Definition: iotypes.h:1060
static const WCHAR L[]
Definition: oid.c:1250
RSDT * PRSDT
Definition: acpi.h:191
Status
Definition: gdiplustypes.h:24
ULONG Length
Definition: acpi.h:97
Definition: acpi.h:186
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
unsigned int ULONG
Definition: retypes.h:1
XSDT * PXSDT
Definition: acpi.h:198
static const WCHAR Signature[]
Definition: parser.c:141
PRSDT UtlRsdt
Definition: util.c:15
DESCRIPTION_HEADER Header
Definition: acpi.h:188
LONGLONG QuadPart
Definition: typedefs.h:112

Referenced by BlDisplayGetOemBitmap(), and BlDisplayInvalidateOemBitmap().

◆ BlUtlInitialize()

NTSTATUS BlUtlInitialize ( VOID  )

Definition at line 197 of file util.c.

200 {
201  UtlRsdt = 0;
202  UtlXsdt = 0;
203 
204  UtlMcContext = 0;
207 
208  UtlProgressRoutine = 0;
209  UtlProgressContext = 0;
215  UtlProgressInfo = 0;
216 
217  return STATUS_SUCCESS;
218 }
PVOID UtlMcUpdateMessageRoutine
Definition: util.c:20
PVOID UtlProgressInfoRoutine
Definition: util.c:24
PVOID UtlProgressContext
Definition: util.c:23
PXSDT UtlXsdt
Definition: util.c:16
PVOID UtlMcDisplayMessageRoutine
Definition: util.c:19
ULONG UtlCurrentPercentComplete
Definition: util.c:26
BOOLEAN UtlProgressNeedsInfoUpdate
Definition: util.c:28
PVOID UtlProgressInfo
Definition: util.c:29
PVOID UtlMcContext
Definition: util.c:18
ULONG UtlProgressGranularity
Definition: util.c:25
ULONG UtlNextUpdatePercentage
Definition: util.c:27
return STATUS_SUCCESS
Definition: btrfs.c:2725
PRSDT UtlRsdt
Definition: util.c:15
PVOID UtlProgressRoutine
Definition: util.c:22

Referenced by InitializeLibrary().

◆ BlUtlRegisterProgressRoutine()

NTSTATUS BlUtlRegisterProgressRoutine ( VOID  )

Definition at line 244 of file util.c.

247 {
248  /* One shouldn't already exist */
249  if (UtlProgressRoutine)
250  {
251  return STATUS_UNSUCCESSFUL;
252  }
253 
254  /* Set the routine, and no context */
257 
258  /* Progress increases by one */
260 
261  /* Set progress to zero for now */
264 
265  /* Set the info routine if there is one */
267 
268  /* All good */
269  return STATUS_SUCCESS;
270 }
VOID BmUpdateProgressInfo(_In_ PVOID Unknown, _In_ PWCHAR ProgressInfo)
Definition: util.c:221
PVOID UtlProgressInfoRoutine
Definition: util.c:24
PVOID UtlProgressContext
Definition: util.c:23
smooth NULL
Definition: ftsmooth.c:416
ULONG UtlCurrentPercentComplete
Definition: util.c:26
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
ULONG UtlProgressGranularity
Definition: util.c:25
ULONG UtlNextUpdatePercentage
Definition: util.c:27
VOID BmUpdateProgress(_In_ PVOID Unknown, _In_ ULONG Percent, _Out_ PBOOLEAN Completed)
Definition: util.c:230
return STATUS_SUCCESS
Definition: btrfs.c:2725
PVOID UtlProgressRoutine
Definition: util.c:22

Referenced by BmMain().

◆ BlUtlUpdateProgress()

VOID BlUtlUpdateProgress ( _In_ ULONG  Percentage,
_Out_opt_ PBOOLEAN  Completed 
)

Definition at line 181 of file util.c.

185 {
186  if (UtlProgressRoutine)
187  {
188  EfiPrintf(L"Unimplemented\r\n");
189  }
190  else if (*Completed)
191  {
192  *Completed = TRUE;
193  }
194 }
#define TRUE
Definition: types.h:120
static const WCHAR L[]
Definition: oid.c:1250
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126
PVOID UtlProgressRoutine
Definition: util.c:22

Referenced by BlImgLoadImageWithProgress2().

◆ BmUpdateProgress()

VOID BmUpdateProgress ( _In_ PVOID  Unknown,
_In_ ULONG  Percent,
_Out_ PBOOLEAN  Completed 
)

Definition at line 230 of file util.c.

235 {
236  EfiPrintf(L"Progress: %d\r\n", Percent);
237  if (Completed)
238  {
239  *Completed = TRUE;
240  }
241 }
#define TRUE
Definition: types.h:120
static const WCHAR L[]
Definition: oid.c:1250
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126

Referenced by BlUtlRegisterProgressRoutine().

◆ BmUpdateProgressInfo()

VOID BmUpdateProgressInfo ( _In_ PVOID  Unknown,
_In_ PWCHAR  ProgressInfo 
)

Definition at line 221 of file util.c.

225 {
226  EfiPrintf(L"Progress Info: %s\r\n", ProgressInfo);
227 }
static const WCHAR L[]
Definition: oid.c:1250
VOID EfiPrintf(_In_ PWCHAR Format,...)
Definition: firmware.c:126

Referenced by BlUtlRegisterProgressRoutine().

◆ DefaultHashFunction()

ULONG DefaultHashFunction ( _In_ PBL_HASH_ENTRY  Entry,
_In_ ULONG  TableSize 
)

Definition at line 442 of file util.c.

446 {
447  PUCHAR Value;
448  ULONG KeyHash, i;
449 
450  /* Check if the value is a pointer, or embedded inline */
451  Value = (Entry->Flags & BL_HT_VALUE_IS_INLINE) ? Entry->Value : (PUCHAR)&Entry->Value;
452 
453  /* Iterate over each byte, and sum it */
454  for (i = 0, KeyHash = 0; i < Entry->Size; i++)
455  {
456  KeyHash += Value[i++];
457  }
458 
459  /* Modulo the number of buckets */
460  return KeyHash % TableSize;
461 }
_In_opt_ ULONG _Out_ PULONG Value
Definition: rtlfuncs.h:2327
unsigned char * PUCHAR
Definition: retypes.h:3
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
_Must_inspect_result_ typedef _Out_ PULONG TableSize
Definition: iotypes.h:3970
unsigned int ULONG
Definition: retypes.h:1
#define BL_HT_VALUE_IS_INLINE
Definition: bl.h:138
base of all file and directory entries
Definition: entries.h:82

Referenced by BlHtCreate().

◆ HtpCompareKeys()

BOOLEAN HtpCompareKeys ( _In_ PBL_HASH_ENTRY  Entry1,
_In_ PBL_HASH_ENTRY  Entry2 
)

Definition at line 464 of file util.c.

468 {
469  ULONG Flags;
470  BOOLEAN ValueMatch;
471 
472  /* Check if the flags or sizes are not matching */
473  Flags = Entry1->Flags;
474  if ((Entry1->Size != Entry2->Size) || (Flags != Entry2->Flags))
475  {
476  ValueMatch = FALSE;
477  }
478  else if (Flags & BL_HT_VALUE_IS_INLINE)
479  {
480  /* Check if this is an in-line value, compare it */
481  ValueMatch = Entry1->Value == Entry2->Value;
482  }
483  else
484  {
485  /* This is a pointer value, compare it */
486  ValueMatch = (RtlCompareMemory(Entry1->Value, Entry2->Value, Entry1->Size) ==
487  Entry1->Size);
488  }
489 
490  /* Return if it matched */
491  return ValueMatch;
492 }
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
unsigned char BOOLEAN
unsigned int ULONG
Definition: retypes.h:1
#define BL_HT_VALUE_IS_INLINE
Definition: bl.h:138
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465

Referenced by BlHtCreate().

◆ TblDoNotPurgeEntry()

NTSTATUS TblDoNotPurgeEntry ( _In_ PVOID  Entry)

Definition at line 495 of file util.c.

498 {
499  /* Never purge this entry */
500  return STATUS_UNSUCCESSFUL;
501 }
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

Referenced by BlHtCreate(), BlImgLoadBootApplication(), BlockIoFirmwareOpen(), BlpIoRegisterDestroyRoutine(), and EtfsMount().

Variable Documentation

◆ HtTableArray

PBL_HASH_TABLE* HtTableArray

Definition at line 438 of file util.c.

Referenced by BlHtCreate(), BlHtDelete(), BlHtLookup(), and BlHtStore().

◆ HtTableEntries

ULONG HtTableEntries

Definition at line 439 of file util.c.

Referenced by BlHtCreate().

◆ HtTableSize

ULONG HtTableSize

Definition at line 437 of file util.c.

Referenced by BlHtCreate(), BlHtDelete(), BlHtLookup(), and BlHtStore().

◆ UtlCurrentPercentComplete

ULONG UtlCurrentPercentComplete

Definition at line 26 of file util.c.

Referenced by BlUtlInitialize(), and BlUtlRegisterProgressRoutine().

◆ UtlMcContext

PVOID UtlMcContext

Definition at line 18 of file util.c.

Referenced by BlUtlInitialize().

◆ UtlMcDisplayMessageRoutine

PVOID UtlMcDisplayMessageRoutine

Definition at line 19 of file util.c.

Referenced by BlUtlInitialize().

◆ UtlMcUpdateMessageRoutine

PVOID UtlMcUpdateMessageRoutine

Definition at line 20 of file util.c.

Referenced by BlUtlInitialize().

◆ UtlNextUpdatePercentage

ULONG UtlNextUpdatePercentage

Definition at line 27 of file util.c.

Referenced by BlUtlInitialize(), and BlUtlRegisterProgressRoutine().

◆ UtlProgressContext

PVOID UtlProgressContext

Definition at line 23 of file util.c.

Referenced by BlUtlInitialize(), and BlUtlRegisterProgressRoutine().

◆ UtlProgressGranularity

ULONG UtlProgressGranularity

Definition at line 25 of file util.c.

Referenced by BlUtlInitialize(), and BlUtlRegisterProgressRoutine().

◆ UtlProgressInfo

PVOID UtlProgressInfo

Definition at line 29 of file util.c.

Referenced by BlUtlInitialize().

◆ UtlProgressInfoRoutine

PVOID UtlProgressInfoRoutine

Definition at line 24 of file util.c.

Referenced by BlUtlInitialize(), and BlUtlRegisterProgressRoutine().

◆ UtlProgressNeedsInfoUpdate

BOOLEAN UtlProgressNeedsInfoUpdate

Definition at line 28 of file util.c.

Referenced by BlUtlInitialize().

◆ UtlProgressRoutine

PVOID UtlProgressRoutine

Definition at line 22 of file util.c.

Referenced by BlUtlInitialize(), BlUtlRegisterProgressRoutine(), and BlUtlUpdateProgress().

◆ UtlRsdt

PRSDT UtlRsdt

Definition at line 15 of file util.c.

Referenced by BlUtlGetAcpiTable(), and BlUtlInitialize().

◆ UtlXsdt

PXSDT UtlXsdt

Definition at line 16 of file util.c.

Referenced by BlUtlGetAcpiTable(), and BlUtlInitialize().