mirror of
https://github.com/LongSoft/UEFITool.git
synced 2024-11-24 08:58:23 +08:00
Provide basic non-owning memstream implementation for Kaitai parsers to use
This commit is contained in:
parent
f514c60cba
commit
06653d024b
@ -29,6 +29,45 @@
|
|||||||
#include "generated/intel_keym_v2.h"
|
#include "generated/intel_keym_v2.h"
|
||||||
#include "generated/intel_acm.h"
|
#include "generated/intel_acm.h"
|
||||||
|
|
||||||
|
// TODO: put into separate H/CPP when we start using Kaitai for other parsers
|
||||||
|
// TODO: this implementation is certainly not a valid replacement to std::stringstream
|
||||||
|
// TODO: because it only supports getting through the buffer once
|
||||||
|
// TODO: however, we already do it this way, so it's enough for practical purposes of this file
|
||||||
|
class membuf : public std::streambuf {
|
||||||
|
public:
|
||||||
|
membuf(const char *p, size_t l) {
|
||||||
|
setg((char*)p, (char*)p, (char*)p + l);
|
||||||
|
}
|
||||||
|
|
||||||
|
pos_type seekoff(off_type off, std::ios_base::seekdir dir, std::ios_base::openmode which = std::ios_base::in) override
|
||||||
|
{
|
||||||
|
(void)which;
|
||||||
|
if (dir == std::ios_base::cur)
|
||||||
|
gbump((int)off);
|
||||||
|
else if (dir == std::ios_base::end)
|
||||||
|
setg(eback(), egptr() + off, egptr());
|
||||||
|
else if (dir == std::ios_base::beg)
|
||||||
|
setg(eback(), eback() + off, egptr());
|
||||||
|
return gptr() - eback();
|
||||||
|
}
|
||||||
|
|
||||||
|
pos_type seekpos(pos_type sp, std::ios_base::openmode which) override
|
||||||
|
{
|
||||||
|
return seekoff(sp - pos_type(off_type(0)), std::ios_base::beg, which);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class memstream : public std::istream {
|
||||||
|
public:
|
||||||
|
memstream(const char *p, size_t l) : std::istream(&buffer_),
|
||||||
|
buffer_(p, l) {
|
||||||
|
rdbuf(&buffer_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
membuf buffer_;
|
||||||
|
};
|
||||||
|
|
||||||
USTATUS FitParser::parseFit(const UModelIndex & index)
|
USTATUS FitParser::parseFit(const UModelIndex & index)
|
||||||
{
|
{
|
||||||
// Reset parser state
|
// Reset parser state
|
||||||
@ -279,7 +318,7 @@ USTATUS FitParser::parseFitEntryMicrocode(const UByteArray & microcode, const UI
|
|||||||
USTATUS FitParser::parseFitEntryAcm(const UByteArray & acm, const UINT32 localOffset, const UModelIndex & parent, UString & info, UINT32 &realSize)
|
USTATUS FitParser::parseFitEntryAcm(const UByteArray & acm, const UINT32 localOffset, const UModelIndex & parent, UString & info, UINT32 &realSize)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
std::istringstream is(std::string(acm.constData(), acm.size()));
|
memstream is(acm.constData(), acm.size());
|
||||||
is.seekg(localOffset, is.beg);
|
is.seekg(localOffset, is.beg);
|
||||||
kaitai::kstream ks(&is);
|
kaitai::kstream ks(&is);
|
||||||
intel_acm_t parsed(&ks);
|
intel_acm_t parsed(&ks);
|
||||||
@ -396,7 +435,7 @@ USTATUS FitParser::parseFitEntryBootGuardKeyManifest(const UByteArray & keyManif
|
|||||||
|
|
||||||
// v1
|
// v1
|
||||||
try {
|
try {
|
||||||
std::istringstream is(std::string(keyManifest.constData(), keyManifest.size()));
|
memstream is(keyManifest.constData(), keyManifest.size());
|
||||||
is.seekg(localOffset, is.beg);
|
is.seekg(localOffset, is.beg);
|
||||||
kaitai::kstream ks(&is);
|
kaitai::kstream ks(&is);
|
||||||
intel_keym_v1_t parsed(&ks);
|
intel_keym_v1_t parsed(&ks);
|
||||||
@ -465,7 +504,7 @@ USTATUS FitParser::parseFitEntryBootGuardKeyManifest(const UByteArray & keyManif
|
|||||||
|
|
||||||
// v2
|
// v2
|
||||||
try {
|
try {
|
||||||
std::istringstream is(std::string(keyManifest.constData(), keyManifest.size()));
|
memstream is(keyManifest.constData(), keyManifest.size());
|
||||||
is.seekg(localOffset, is.beg);
|
is.seekg(localOffset, is.beg);
|
||||||
kaitai::kstream ks(&is);
|
kaitai::kstream ks(&is);
|
||||||
intel_keym_v2_t parsed(&ks);
|
intel_keym_v2_t parsed(&ks);
|
||||||
@ -563,7 +602,7 @@ USTATUS FitParser::parseFitEntryBootGuardBootPolicy(const UByteArray & bootPolic
|
|||||||
|
|
||||||
// v1
|
// v1
|
||||||
try {
|
try {
|
||||||
std::istringstream is(std::string(bootPolicy.constData(), bootPolicy.size()));
|
memstream is(bootPolicy.constData(), bootPolicy.size());
|
||||||
is.seekg(localOffset, is.beg);
|
is.seekg(localOffset, is.beg);
|
||||||
kaitai::kstream ks(&is);
|
kaitai::kstream ks(&is);
|
||||||
intel_acbp_v1_t parsed(&ks);
|
intel_acbp_v1_t parsed(&ks);
|
||||||
@ -821,7 +860,7 @@ USTATUS FitParser::parseFitEntryBootGuardBootPolicy(const UByteArray & bootPolic
|
|||||||
|
|
||||||
// v2
|
// v2
|
||||||
try {
|
try {
|
||||||
std::istringstream is(std::string(bootPolicy.constData(), bootPolicy.size()));
|
memstream is(bootPolicy.constData(), bootPolicy.size());
|
||||||
is.seekg(localOffset, is.beg);
|
is.seekg(localOffset, is.beg);
|
||||||
kaitai::kstream ks(&is);
|
kaitai::kstream ks(&is);
|
||||||
intel_acbp_v2_t parsed(&ks); // This already verified the version to be >= 0x20
|
intel_acbp_v2_t parsed(&ks); // This already verified the version to be >= 0x20
|
||||||
|
Loading…
Reference in New Issue
Block a user