make TagData::setDataValue accept NULL value for data.

This commit is contained in:
jief666 2020-08-30 22:53:40 +03:00
parent 352c75c711
commit babba4de6e
11 changed files with 86 additions and 43 deletions

View File

@ -141,6 +141,8 @@
9A670D1D24E535AB00B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */; }; 9A670D1D24E535AB00B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */; };
9A670D1E24E535AB00B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */; }; 9A670D1E24E535AB00B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */; };
9A670D1F24E535AB00B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */; }; 9A670D1F24E535AB00B5D780 /* XBuffer_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */; };
9A7D518424FC32F700FA1CC3 /* XBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A7D518124FC32F700FA1CC3 /* XBuffer.cpp */; };
9A7D518524FC32F700FA1CC3 /* XRBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A7D518324FC32F700FA1CC3 /* XRBuffer.cpp */; };
9A9223312402FD1000483CBA /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9223302402FD1000483CBA /* main.cpp */; }; 9A9223312402FD1000483CBA /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9223302402FD1000483CBA /* main.cpp */; };
9A9AEB8D243F73CE00FBD7D8 /* unicode_conversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9AEB8C243F73CE00FBD7D8 /* unicode_conversions.cpp */; }; 9A9AEB8D243F73CE00FBD7D8 /* unicode_conversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9AEB8C243F73CE00FBD7D8 /* unicode_conversions.cpp */; };
9A9AEB8E243F752C00FBD7D8 /* unicode_conversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9AEB8C243F73CE00FBD7D8 /* unicode_conversions.cpp */; }; 9A9AEB8E243F752C00FBD7D8 /* unicode_conversions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9A9AEB8C243F73CE00FBD7D8 /* unicode_conversions.cpp */; };
@ -267,6 +269,10 @@
9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBuffer_tests.cpp; sourceTree = "<group>"; }; 9A670D1B24E535AB00B5D780 /* XBuffer_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBuffer_tests.cpp; sourceTree = "<group>"; };
9A6BA73C2449977300BDA52C /* XStringAbstract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XStringAbstract.h; sourceTree = "<group>"; }; 9A6BA73C2449977300BDA52C /* XStringAbstract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XStringAbstract.h; sourceTree = "<group>"; };
9A7AEDE82459696C003AAD04 /* XToolsCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XToolsCommon.h; sourceTree = "<group>"; }; 9A7AEDE82459696C003AAD04 /* XToolsCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XToolsCommon.h; sourceTree = "<group>"; };
9A7D518024FC32F700FA1CC3 /* XBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBuffer.h; sourceTree = "<group>"; };
9A7D518124FC32F700FA1CC3 /* XBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XBuffer.cpp; sourceTree = "<group>"; };
9A7D518224FC32F700FA1CC3 /* XRBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XRBuffer.h; sourceTree = "<group>"; };
9A7D518324FC32F700FA1CC3 /* XRBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XRBuffer.cpp; sourceTree = "<group>"; };
9A92232D2402FD1000483CBA /* cpp_tests UTF16 signed char */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cpp_tests UTF16 signed char"; sourceTree = BUILT_PRODUCTS_DIR; }; 9A92232D2402FD1000483CBA /* cpp_tests UTF16 signed char */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cpp_tests UTF16 signed char"; sourceTree = BUILT_PRODUCTS_DIR; };
9A9223302402FD1000483CBA /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; }; 9A9223302402FD1000483CBA /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
9A92234D2402FD9500483CBA /* Platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Platform.h; sourceTree = "<group>"; }; 9A92234D2402FD9500483CBA /* Platform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Platform.h; sourceTree = "<group>"; };
@ -331,6 +337,10 @@
9A0B08432402FE9300E2B470 /* cpp_foundation */ = { 9A0B08432402FE9300E2B470 /* cpp_foundation */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
9A7D518124FC32F700FA1CC3 /* XBuffer.cpp */,
9A7D518024FC32F700FA1CC3 /* XBuffer.h */,
9A7D518324FC32F700FA1CC3 /* XRBuffer.cpp */,
9A7D518224FC32F700FA1CC3 /* XRBuffer.h */,
9A7AEDE82459696C003AAD04 /* XToolsCommon.h */, 9A7AEDE82459696C003AAD04 /* XToolsCommon.h */,
9A4FFA7C2451C8330050B38B /* XString.cpp */, 9A4FFA7C2451C8330050B38B /* XString.cpp */,
9A57C266241A799B0029A39F /* XString.h */, 9A57C266241A799B0029A39F /* XString.h */,
@ -777,6 +787,7 @@
9A36E50024F3B537007A1107 /* TagDict.cpp in Sources */, 9A36E50024F3B537007A1107 /* TagDict.cpp in Sources */,
9A36E50C24F3B537007A1107 /* TagData.cpp in Sources */, 9A36E50C24F3B537007A1107 /* TagData.cpp in Sources */,
9A0B085A2402FF8400E2B470 /* XObjArray_tests.cpp in Sources */, 9A0B085A2402FF8400E2B470 /* XObjArray_tests.cpp in Sources */,
9A7D518424FC32F700FA1CC3 /* XBuffer.cpp in Sources */,
9A36E52C24F3C846007A1107 /* plist_tests.cpp in Sources */, 9A36E52C24F3C846007A1107 /* plist_tests.cpp in Sources */,
9A28CD1F241BB61B00F3D247 /* abort.cpp in Sources */, 9A28CD1F241BB61B00F3D247 /* abort.cpp in Sources */,
9A36E53C24F3EDED007A1107 /* base64.cpp in Sources */, 9A36E53C24F3EDED007A1107 /* base64.cpp in Sources */,
@ -800,6 +811,7 @@
9A0B08582402FF7F00E2B470 /* XStringArray_test.cpp in Sources */, 9A0B08582402FF7F00E2B470 /* XStringArray_test.cpp in Sources */,
9A36E4F824F3B537007A1107 /* xml.cpp in Sources */, 9A36E4F824F3B537007A1107 /* xml.cpp in Sources */,
9A9AEB8D243F73CE00FBD7D8 /* unicode_conversions.cpp in Sources */, 9A9AEB8D243F73CE00FBD7D8 /* unicode_conversions.cpp in Sources */,
9A7D518524FC32F700FA1CC3 /* XRBuffer.cpp in Sources */,
9A4185C02439F73A00BEAFB8 /* XStringArray.cpp in Sources */, 9A4185C02439F73A00BEAFB8 /* XStringArray.cpp in Sources */,
9A36E51024F3B537007A1107 /* TagArray.cpp in Sources */, 9A36E51024F3B537007A1107 /* TagArray.cpp in Sources */,
9A36E4F024F3B537007A1107 /* TagString8.cpp in Sources */, 9A36E4F024F3B537007A1107 /* TagString8.cpp in Sources */,

View File

@ -928,8 +928,8 @@ FillinKextPatches (IN OUT KERNEL_AND_KEXT_PATCHES *Patches,
p = GetDataSetting (DictPointer, "ATIConnectorsPatch", &i); p = GetDataSetting (DictPointer, "ATIConnectorsPatch", &i);
Patches->KPATIConnectorsPatch.stealValueFrom(p, i); Patches->KPATIConnectorsPatch.stealValueFrom(p, i);
if (Patches->KPATIConnectorsData == NULL if (Patches->KPATIConnectorsData.isEmpty()
|| Patches->KPATIConnectorsPatch == NULL || Patches->KPATIConnectorsPatch.isEmpty()
|| Patches->KPATIConnectorsData.size() == 0 || Patches->KPATIConnectorsData.size() == 0
|| Patches->KPATIConnectorsData.size() != i) { || Patches->KPATIConnectorsData.size() != i) {
// invalid params - no patching // invalid params - no patching

View File

@ -2383,7 +2383,7 @@ LOADER_ENTRY::KernelUserPatch()
UINT8 * curs = &KernelData[procAddr]; UINT8 * curs = &KernelData[procAddr];
UINTN j = 0; UINTN j = 0;
while (j < KERNEL_MAX_SIZE) { while (j < KERNEL_MAX_SIZE) {
if (!KernelAndKextPatches.KernelPatches[i].StartPattern || //old behavior if (KernelAndKextPatches.KernelPatches[i].StartPattern.isEmpty() || //old behavior
CompareMemMask((const UINT8*)curs, CompareMemMask((const UINT8*)curs,
KernelAndKextPatches.KernelPatches[i].StartPattern.data(), KernelAndKextPatches.KernelPatches[i].StartPattern.data(),
KernelAndKextPatches.KernelPatches[i].StartPattern.size(), KernelAndKextPatches.KernelPatches[i].StartPattern.size(),
@ -2406,9 +2406,7 @@ LOADER_ENTRY::KernelUserPatch()
j += SearchLen - 1; j += SearchLen - 1;
} }
DBG( "==> %s : %lld replaces done\n", Num ? "Success" : "Error", Num); DBG( "==> %s : %lld replaces done\n", Num ? "Success" : "Error", Num);
if (once || if ( once || KernelAndKextPatches.KernelPatches[i].StartPattern.isEmpty() ) {
!KernelAndKextPatches.KernelPatches[i].StartPattern ||
!KernelAndKextPatches.KernelPatches[i].StartPattern.size()) {
break; break;
} }
} }
@ -2444,7 +2442,7 @@ LOADER_ENTRY::BooterPatch(IN UINT8 *BooterData, IN UINT64 BooterSize)
UINT8 * curs = BooterData; UINT8 * curs = BooterData;
UINTN j = 0; UINTN j = 0;
while (j < BooterSize) { while (j < BooterSize) {
if (!KernelAndKextPatches.BootPatches[i].StartPattern || //old behavior if (KernelAndKextPatches.BootPatches[i].StartPattern.isEmpty() || //old behavior
CompareMemMask((const UINT8*)curs, CompareMemMask((const UINT8*)curs,
(const UINT8*)KernelAndKextPatches.BootPatches[i].StartPattern.data(), (const UINT8*)KernelAndKextPatches.BootPatches[i].StartPattern.data(),
KernelAndKextPatches.BootPatches[i].StartPattern.size(), KernelAndKextPatches.BootPatches[i].StartPattern.size(),
@ -2468,8 +2466,7 @@ LOADER_ENTRY::BooterPatch(IN UINT8 *BooterData, IN UINT64 BooterSize)
} }
DBG( "==> %s : %lld replaces done\n", Num ? "Success" : "Error", Num); DBG( "==> %s : %lld replaces done\n", Num ? "Success" : "Error", Num);
if (!KernelAndKextPatches.BootPatches[i].StartPattern || if ( KernelAndKextPatches.BootPatches[i].StartPattern.isEmpty() ) {
!KernelAndKextPatches.BootPatches[i].StartPattern.size()) {
break; break;
} }
} }
@ -2614,7 +2611,7 @@ LOADER_ENTRY::KernelAndKextsPatcherStart()
KernelAndKextPatches.KPAppleRTC || KernelAndKextPatches.KPAppleRTC ||
KernelAndKextPatches.EightApple || KernelAndKextPatches.EightApple ||
KernelAndKextPatches.KPDELLSMBIOS || KernelAndKextPatches.KPDELLSMBIOS ||
KernelAndKextPatches.KPATIConnectorsPatch != NULL || KernelAndKextPatches.KPATIConnectorsPatch.notEmpty() ||
KernelAndKextPatches.KextPatches.size() > 0 KernelAndKextPatches.KextPatches.size() > 0
); );

View File

@ -1153,7 +1153,7 @@ VOID LOADER_ENTRY::AnyKextPatch(UINT8 *Driver, UINT32 DriverSize, CHAR8 *InfoPli
UINT8 * curs = &Driver[procAddr]; UINT8 * curs = &Driver[procAddr];
UINTN j = 0; UINTN j = 0;
while (j < DriverSize) { while (j < DriverSize) {
if (!kextpatch.StartPattern || //old behavior if (kextpatch.StartPattern.isEmpty() || //old behavior
CompareMemMask((const UINT8*)curs, CompareMemMask((const UINT8*)curs,
kextpatch.StartPattern.data(), kextpatch.StartPattern.data(),
kextpatch.StartPattern.size(), kextpatch.StartPattern.size(),
@ -1174,9 +1174,7 @@ VOID LOADER_ENTRY::AnyKextPatch(UINT8 *Driver, UINT32 DriverSize, CHAR8 *InfoPli
j += SearchLen - 1; j += SearchLen - 1;
} }
} }
if (once || if ( once || kextpatch.StartPattern.isEmpty() ) {
!kextpatch.StartPattern ||
!kextpatch.StartPattern.size()) {
break; break;
} }
j++; curs++; j++; curs++;

View File

@ -69,19 +69,14 @@ TagData* TagData::getEmptyTag()
void TagData::FreeTag() void TagData::FreeTag()
{ {
if ( _data ) FreePool(_data); dataBuffer.setEmpty();
_data = NULL;
_dataLen = 0;
tagsFree.AddReference(this, true); tagsFree.AddReference(this, true);
} }
bool TagData::operator == (const TagStruct& other) const bool TagData::operator == (const TagStruct& other) const
{ {
if ( !other.isData() ) return false; if ( !other.isData() ) return false;
if ( _dataLen != other.getData()->_dataLen ) return false; if ( dataBuffer != other.getData()->dataBuffer ) return false;
if ( _dataLen > 0 ) { // if dataLen > 0, data cannot be NULL. Enforce by ctor and set setDataValue
if ( memcmp((void*)_data, (void*)other.getData()->_data, _dataLen) != 0 ) return false;
}
return true; return true;
} }
@ -89,9 +84,9 @@ void TagData::sprintf(unsigned int ident, XString8* s) const
{ {
for (size_t i = 0 ; i < (size_t)ident ; i++) *s += " "; for (size_t i = 0 ; i < (size_t)ident ; i++) *s += " ";
*s += "<data>\n"_XS8; *s += "<data>\n"_XS8;
if ( _dataLen > 0 ) { if ( dataBuffer.size() > 0 ) {
size_t outputLen; size_t outputLen;
char* output = base64_encode(_data, _dataLen, &outputLen); char* output = base64_encode(dataBuffer.data(), dataBuffer.size(), &outputLen);
for (size_t i = 0 ; i < (size_t)ident ; i++) *s += " "; for (size_t i = 0 ; i < (size_t)ident ; i++) *s += " ";
(*s).strncat(output, outputLen); (*s).strncat(output, outputLen);
free(output); free(output);

View File

@ -9,19 +9,19 @@
#define __TagData_h__ #define __TagData_h__
#include "plist.h" #include "plist.h"
#include "../../cpp_foundation/XBuffer.h"
class TagData : public TagStruct class TagData : public TagStruct
{ {
static XObjArray<TagData> tagsFree; static XObjArray<TagData> tagsFree;
UINT8 *_data; XBuffer<UINT8> dataBuffer;
UINTN _dataLen;
public: public:
TagData() : _data(NULL), _dataLen(0) {} TagData() : dataBuffer() {}
TagData(const TagData& other) = delete; // Can be defined if needed TagData(const TagData& other) = delete; // Can be defined if needed
const TagData& operator = (const TagData&); // Can be defined if needed const TagData& operator = (const TagData&); // Can be defined if needed
virtual ~TagData() { delete _data; } virtual ~TagData() { }
virtual bool operator == (const TagStruct& other) const; virtual bool operator == (const TagStruct& other) const;
@ -41,23 +41,23 @@ public:
const UINT8* dataValue() const const UINT8* dataValue() const
{ {
// if ( !isData() ) panic("TagData::dataValue() : !isData() "); // if ( !isData() ) panic("TagData::dataValue() : !isData() ");
return _data; return dataBuffer.data();
} }
UINT8* dataValue() UINT8* dataValue()
{ {
// if ( !isData() ) panic("TagData::dataValue() : !isData() "); // if ( !isData() ) panic("TagData::dataValue() : !isData() ");
return _data; return dataBuffer.data();
} }
UINTN dataLenValue() const UINTN dataLenValue() const
{ {
// if ( !isData() ) panic("TagData::dataLenValue() : !isData() "); // if ( !isData() ) panic("TagData::dataLenValue() : !isData() ");
return _dataLen; return dataBuffer.size();
} }
void setDataValue(UINT8* data, UINTN dataLen) void setDataValue(UINT8* data, UINTN dataLen)
{ {
if ( data == NULL ) panic("TagData::setDataValue() : _data == NULL "); if ( data == NULL && dataLen != 0 ) panic("TagData::setDataValue() : data == NULL && dataLen != 0 ");
_data = data; if ( data != NULL && dataLen == 0 ) panic("TagData::setDataValue() : data != NULL && dataLen == 0 ");
_dataLen = dataLen; dataBuffer.stealValueFrom(data, dataLen);
} }
}; };

View File

@ -674,9 +674,7 @@ EFI_STATUS ParseTagData(CHAR8* buffer, TagStruct* * tag, UINT32* lenPtr)
// dmazar: base64 decode data // dmazar: base64 decode data
UINTN len = 0; UINTN len = 0;
UINT8* data = (UINT8 *)Base64DecodeClover(buffer, &len); UINT8* data = (UINT8 *)Base64DecodeClover(buffer, &len);
if (data != nullptr && len != 0) {
tmpTag->setDataValue(data, len); tmpTag->setDataValue(data, len);
}
*tag = tmpTag; *tag = tmpTag;
*lenPtr = length; *lenPtr = length;

View File

@ -23,7 +23,7 @@ class XBuffer : public XBuffer_Super
T*_WData; // same as RData (see XRBuffer) T*_WData; // same as RData (see XRBuffer)
size_t m_allocatedSize; size_t m_allocatedSize;
void Initialize(T* p, size_t count, size_t index); void Initialize(const T* p, size_t count, size_t index);
public: public:
XBuffer() : _WData(NULL), m_allocatedSize(0) { Initialize(NULL, 0, 0); } // ": _WData(NULL), m_allocatedSize(0)" to avoid effc++ warning XBuffer() : _WData(NULL), m_allocatedSize(0) { Initialize(NULL, 0, 0); } // ": _WData(NULL), m_allocatedSize(0)" to avoid effc++ warning
@ -50,7 +50,8 @@ class XBuffer : public XBuffer_Super
void CheckSize(size_t nNewSize, size_t nGrowBy = XBufferGrowByDefault); void CheckSize(size_t nNewSize, size_t nGrowBy = XBufferGrowByDefault);
void* vdata() const { return XBuffer_Super::data(); } void* vdata() const { return XBuffer_Super::data(); }
T* data() const { return _WData; } const T* data() const { return _WData; }
T* data() { return _WData; }
template<typename IntegralType, enable_if(is_integral(IntegralType))> template<typename IntegralType, enable_if(is_integral(IntegralType))>
const T* data(IntegralType i) const { return XBuffer_Super::data(i); } const T* data(IntegralType i) const { return XBuffer_Super::data(i); }
@ -82,6 +83,14 @@ class XBuffer : public XBuffer_Super
void setEmpty() { setSize(0); }; void setEmpty() { setSize(0); };
bool operator == (const XBuffer<T>& other) const {
if ( size() != other.size() ) return false;
if ( size() == 0 ) return true;
if ( memcmp(_WData, other._WData, size()) != 0 ) return false;
return true;
}
bool operator != (const XBuffer<T>& other) const { return !(*this == other); }
/* [] */ /* [] */
template<typename IntegralType, enable_if(is_integral(IntegralType))> template<typename IntegralType, enable_if(is_integral(IntegralType))>
T& operator [](IntegralType i) T& operator [](IntegralType i)
@ -90,6 +99,13 @@ class XBuffer : public XBuffer_Super
if ( (unsigned_type(IntegralType))i >= size() ) panic("XBuffer::[] : i > _Len. System halted\n"); if ( (unsigned_type(IntegralType))i >= size() ) panic("XBuffer::[] : i > _Len. System halted\n");
return _WData[(unsigned_type(IntegralType))i]; return _WData[(unsigned_type(IntegralType))i];
} }
template<typename IntegralType, enable_if(is_integral(IntegralType))>
const T& operator [](IntegralType i) const
{
if (i < 0) panic("XBuffer::[] : i < 0. System halted\n");
if ( (unsigned_type(IntegralType))i >= size() ) panic("XBuffer::[] : i > _Len. System halted\n");
return _WData[(unsigned_type(IntegralType))i];
}
// unsigned char& operator [](int i) { return UCData()[i]; } // underflow ? overflow ? // unsigned char& operator [](int i) { return UCData()[i]; } // underflow ? overflow ?
// unsigned char& operator [](size_t i) { return UCData()[i]; } // unsigned char& operator [](size_t i) { return UCData()[i]; }
@ -153,7 +169,7 @@ class XBuffer : public XBuffer_Super
//************************************************************************************************* //*************************************************************************************************
template <typename T> template <typename T>
void XBuffer<T>::Initialize(T* p, size_t count, size_t index) void XBuffer<T>::Initialize(const T* p, size_t count, size_t index)
{ {
if ( p!=NULL && count>0 ) if ( p!=NULL && count>0 )
{ {

View File

@ -53,6 +53,14 @@ class XRBuffer
size_t size() const { return m_size; } size_t size() const { return m_size; }
size_t index() const { return _Index; } size_t index() const { return _Index; }
bool operator == (const XRBuffer<T>& other) const {
if ( m_size != other.m_size ) return false;
if ( m_size == 0 ) return true;
if ( memcmp(_RData, other._RData, m_size) != 0 ) return false;
return true;
}
bool operator != (const XRBuffer<T>& other) const { return !(*this == other); }
template<typename IntegralType, enable_if(is_integral(IntegralType))> template<typename IntegralType, enable_if(is_integral(IntegralType))>
void setIndex(IntegralType Idx) void setIndex(IntegralType Idx)
{ {
@ -66,7 +74,8 @@ class XRBuffer
bool notEmpty() const { return m_size > 0 ; } bool notEmpty() const { return m_size > 0 ; }
// Cast // // Cast //
operator const char *() const { return CData(); } // Automatic cast are a bit dangerous...
// operator const char *() const { return CData(); }
// [] // // [] //
template<typename IntegralType, enable_if(is_integral(IntegralType))> template<typename IntegralType, enable_if(is_integral(IntegralType))>
@ -78,7 +87,18 @@ class XRBuffer
if ( (unsigned_type(IntegralType))i >= m_size ) { if ( (unsigned_type(IntegralType))i >= m_size ) {
panic("XRBuffer::operator [] : index > len. System halted\n"); panic("XRBuffer::operator [] : index > len. System halted\n");
} }
return UCData()[i]; return _RData[i];
} // underflow ? overflow ?
template<typename IntegralType, enable_if(is_integral(IntegralType))>
const T& operator [](IntegralType i) const
{
if (i < 0) {
panic("XRBuffer::operator [] : i < 0. System halted\n");
}
if ( (unsigned_type(IntegralType))i >= m_size ) {
panic("XRBuffer::operator [] : index > len. System halted\n");
}
return _RData[i];
} // underflow ? overflow ? } // underflow ? overflow ?
bool Get(void *buf, size_t count); bool Get(void *buf, size_t count);

View File

@ -16,5 +16,12 @@ int XBuffer_tests()
xb_uint8.cat(p2); xb_uint8.cat(p2);
xb_uint8.cat(uintptr_t(0)); xb_uint8.cat(uintptr_t(0));
XBuffer<UINT8> xb_uint8_2;
xb_uint8_2.cat(uintptr_t(1));
xb_uint8_2.cat(uintptr_t(2));
xb_uint8_2.cat(uintptr_t(0));
if ( xb_uint8_2 != xb_uint8 ) return 1;
return 0; return 0;
} }

View File

@ -1840,8 +1840,8 @@ RefitMain (IN EFI_HANDLE ImageHandle,
if ( !EFI_ERROR(Status) ) DBG("Clover : Image base = 0x%llX\n", (uintptr_t)LoadedImage->ImageBase); // do not change, it's used by grep to feed the debugger if ( !EFI_ERROR(Status) ) DBG("Clover : Image base = 0x%llX\n", (uintptr_t)LoadedImage->ImageBase); // do not change, it's used by grep to feed the debugger
#ifdef JIEF_DEBUG #ifdef JIEF_DEBUG
// gBS->Stall(1500000); // to give time to gdb to connect gBS->Stall(1500000); // to give time to gdb to connect
gBS->Stall(0500000); // to give time to gdb to connect // gBS->Stall(0500000); // to give time to gdb to connect
// PauseForKey(L"press\n"); // PauseForKey(L"press\n");
#endif #endif
} }