C++ Boost 描述递归结构迭代错误

问题描述 投票:0回答:1

我正在编写一个代码,该代码使用 Boost 库递归地迭代一个结构,并将字节从缓冲区放入该结构中。

template<typename Base, class Md = boost::describe::describe_members<Base, boost::describe::mod_any_access>>
    void Parser::copyBytesToStruct(Base& base){

        boost::mp11::mp_for_each<Md>([&](auto attr){
            this->copyBytesToStructInner(base.*attr.pointer);   
        });
    }

    template<typename Attr> 
    void Parser::copyBytesToStructInner(Attr& attr){

        //check if iterated type is struct, if it is then recursively call this function for it
        if(std::is_class<Attr>::value){
            this->copyBytesToStruct(attr);
        }
        else{
            int bytesToGet = sizeof(Attr);

            if (this->buffer->availableToCopy() < bytesToGet) {
                std::string typeName = boost::typeindex::type_id_with_cvr<Attr>().pretty_name();
                std::cerr << "No more remaining data in buffer to read " + typeName;
                return;
            }

            int beginPtr = this->buffer->getBeginPtr();

            memcpy_s(this->buffer + beginPtr, this->buffer->availableToCopy(), &attr, bytesToGet);

            //if(!this->isBigEndian) __builtin_bswap(attr); todo: add some reverse logic here

            this->buffer->cutBytes(bytesToGet);
        }
    }

copyBytesToStruct 最初将始终使用结构体进行调用。 然后我迭代结构体的成员和内部模板的内部,我检查该成员是否是结构体,如果是,我也想递归地迭代该成员。

这些是我正在使用和描述的用于提升的结构:

namespace PE_STRUCTURE {

    struct DosHeader {

        WORD
            magic{}, //DOS .EXE header
            e_cblp{}, //Magic number
            e_cp{}, //Bytes on last page of file
            e_crlc{}, //Pages in file
            e_cparhdr{}, //Relocations
            e_minalloc{}, //Size of header in paragraphs
            e_maxalloc{}, //Minimum extra paragraphs needed
            e_ss{}, //Initial (relative) SS value
            e_sp{}, //Initial SP value
            e_csum{}, //Checksum
            e_ip{}, //Initial IP value
            e_cs{}, //Initial (relative) CS value 
            e_lfarlc{}, //File address of relocation table
            e_ovno{}, //Overlay number
            e_res[4]{}, //Reserved words
            e_oemid{}, //OEM identifier
            e_oeminfo{}, //OEM information 
            e_res2[10]{}; //Reserved words

        DWORD e_lfanew{}; //Address for NT Headers
    };

    BOOST_DESCRIBE_STRUCT(DosHeader, (), (magic, e_cblp, e_cp, e_crlc, e_cparhdr,
        e_minalloc, e_maxalloc, e_ss, e_sp, e_csum, e_ip, e_cs, e_lfarlc, e_ovno,
        e_res, e_oemid, e_oeminfo, e_res2, e_lfanew));

    //For PE32+ (64-bit) Executables
    struct ImageNtHeaders64 {

        DWORD signature{}; //almost always PE/0/0
        IMAGE_FILE_HEADER FileHeader{}; //Some information, has OptionalHeader size
        IMAGE_OPTIONAL_HEADER64 OptionalHeader{}; //Some important info
    };

    BOOST_DESCRIBE_STRUCT(ImageNtHeaders64, (), (signature, FileHeader, OptionalHeader));

    BOOST_DESCRIBE_STRUCT(IMAGE_FILE_HEADER, (), (Machine, NumberOfSections, TimeDateStamp,
        PointerToSymbolTable, NumberOfSymbols, SizeOfOptionalHeader, Characteristics));
        
    BOOST_DESCRIBE_STRUCT(IMAGE_OPTIONAL_HEADER32, (), (Magic, MajorLinkerVersion, MinorLinkerVersion,
        SizeOfCode, SizeOfInitializedData, SizeOfUninitializedData, AddressOfEntryPoint, BaseOfCode,
        BaseOfData, ImageBase, SectionAlignment, FileAlignment, MajorOperatingSystemVersion,
        MinorOperatingSystemVersion, Win32VersionValue, SizeOfImage, SizeOfHeaders, CheckSum,
        Subsystem, DllCharacteristics, SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve,
        SizeOfHeapCommit, LoaderFlags, NumberOfRvaAndSizes, DataDirectory));

    BOOST_DESCRIBE_STRUCT(IMAGE_OPTIONAL_HEADER64, (), (Magic, MajorLinkerVersion, MinorLinkerVersion,
        SizeOfCode, SizeOfInitializedData, SizeOfUninitializedData, AddressOfEntryPoint, BaseOfCode,
        ImageBase, SectionAlignment, FileAlignment, MajorOperatingSystemVersion,
        MinorOperatingSystemVersion, Win32VersionValue, SizeOfImage, SizeOfHeaders, CheckSum,
        Subsystem, DllCharacteristics, SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve,
        SizeOfHeapCommit, LoaderFlags, NumberOfRvaAndSizes, DataDirectory));

    BOOST_DESCRIBE_STRUCT(IMAGE_DATA_DIRECTORY, (), (VirtualAddress, Size))

    //For PE32 Executables
    struct ImageNtHeaders {

        DWORD signature{};
        IMAGE_FILE_HEADER FileHeader{};
        IMAGE_OPTIONAL_HEADER32 OptionalHeader{};
    };

    BOOST_DESCRIBE_STRUCT(ImageNtHeaders, (), (signature, FileHeader, OptionalHeader));
};

我在尝试构建时遇到这样的错误:

error: no matching function for call to 'PE_PARSER::Parser::copyBytesToStruct(short unsigned int&)'
   28 |             this->copyBytesToStruct(attr);

error: 'boost_public_member_descriptor_fn' was not declared in this scope; did you mean 'PE_STRUCTURE::boost_public_member_descriptor_fn'?
   32 | template<class T> using _describe_public_members = decltype( boost_public_member_descriptor_fn( static_cast<T**>(0) ) );

error: no matching function for call to 'PE_PARSER::Parser::copyBytesToStruct(short unsigned int [4])'
   28 |             this->copyBytesToStruct(attr);

error: 'boost_public_member_descriptor_fn' was not declared in this scope; did you mean 'PE_STRUCTURE::boost_public_member_descriptor_fn'?
   32 | template<class T> using _describe_public_members = decltype( boost_public_member_descriptor_fn( static_cast<T**>(0) ) );

error: no matching function for call to 'PE_PARSER::Parser::copyBytesToStruct(short unsigned int [10])'
   28 |             this->copyBytesToStruct(attr);

error: 'boost_public_member_descriptor_fn' was not declared in this scope; did you mean 'PE_STRUCTURE::boost_public_member_descriptor_fn'?
   32 | template<class T> using _describe_public_members = decltype( boost_public_member_descriptor_fn( static_cast<T**>(0) ) );

error: no matching function for call to 'PE_PARSER::Parser::copyBytesToStruct(long unsigned int&)'
   28 |             this->copyBytesToStruct(attr);
      |             ^~~~

error: 'boost_public_member_descriptor_fn' was not declared in this scope; did you mean 'PE_STRUCTURE::boost_public_member_descriptor_fn'?
   32 | template<class T> using _describe_public_members = decltype( boost_public_member_descriptor_fn( static_cast<T**>(0) ) );

这几乎就像编译器尝试使用整数调用 copyBytesToStruct,而该整数没有 BOOST_DESCRIBE_STRUCT - 该模板只能与结构一起使用。

我尝试对两个模板函数执行 std::enable_if_t ,但错误仍然相同:

template<typename Base, class Md = boost::describe::describe_members<Base, boost::describe::mod_any_access>>
std::enable_if_t<(std::is_class<Base>::value)> copyBytesToStruct(Base& base);

关于做什么/这里发生了什么有什么建议吗?

最小可重现示例:

StructureRepro.hpp:

#ifndef STRUCTURE_H
#define STRUCTURE_H

#include <Windows.h>
#include <stdint.h>
#include <winnt.h>

#include <boost/describe/class.hpp>

namespace PE_STRUCTURE {

    //For PE32+ (64-bit) Executables
    struct ImageNtHeaders64 {

        DWORD signature{}; //almost always PE/0/0
        IMAGE_FILE_HEADER FileHeader{}; //Some information, has OptionalHeader size
        IMAGE_OPTIONAL_HEADER64 OptionalHeader{}; //Some important info
    };

    BOOST_DESCRIBE_STRUCT(ImageNtHeaders64, (), (signature, FileHeader, OptionalHeader));

    BOOST_DESCRIBE_STRUCT(IMAGE_FILE_HEADER, (), (Machine, NumberOfSections, TimeDateStamp,
        PointerToSymbolTable, NumberOfSymbols, SizeOfOptionalHeader, Characteristics));

    BOOST_DESCRIBE_STRUCT(IMAGE_OPTIONAL_HEADER64, (), (Magic, MajorLinkerVersion, MinorLinkerVersion,
        SizeOfCode, SizeOfInitializedData, SizeOfUninitializedData, AddressOfEntryPoint, BaseOfCode,
        ImageBase, SectionAlignment, FileAlignment, MajorOperatingSystemVersion,
        MinorOperatingSystemVersion, Win32VersionValue, SizeOfImage, SizeOfHeaders, CheckSum,
        Subsystem, DllCharacteristics, SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve,
        SizeOfHeapCommit, LoaderFlags, NumberOfRvaAndSizes, DataDirectory));

    BOOST_DESCRIBE_STRUCT(IMAGE_DATA_DIRECTORY, (), (VirtualAddress, Size))
};

#endif

ParserRepro.cpp:

#include "StructureRepro.hpp"

#include <vector>
#include <stdint.h>
#include <windows.h>
#include <fstream>
#include <iostream>
#include <cstring>
#include <type_traits>

#include <boost/mp11.hpp>
#include <boost/type_index.hpp>
#include <boost/describe.hpp>

template<typename Attr> 
void copyBytesToStructInner(Attr& attr);

template<typename Base, class Md = boost::describe::describe_members<Base, boost::describe::mod_any_access>>
void copyBytesToStruct(Base& base){
    boost::mp11::mp_for_each<Md>([&](auto attr){
        copyBytesToStructInner(base.*attr.pointer);   
    });
}

template<typename Attr> 
void copyBytesToStructInner(Attr& attr){
    //check if iterated type is struct, if it is then recursively call this function for it
    if(std::is_class<Attr>::value){
        copyBytesToStruct(attr);
    }
}

void loadPEFileFromBinary() {
    PE_STRUCTURE::ImageNtHeaders64 st;
    copyBytesToStruct(st);
}
c++ struct boost
1个回答
0
投票

这几乎就像编译器尝试使用整数调用 copyBytesToStruct,而该整数没有 BOOST_DESCRIBE_STRUCT - 该模板只能与结构一起使用。

这正是您的代码所做的,确实。

您可以通过将条件设置为 constexpr 来避免它:

if constexpr (std::is_class_v<Attr>) {
    std::cout << __PRETTY_FUNCTION__ << " " << boost::typeindex::type_id<Attr>().pretty_name() << std::endl;
    copyBytesToStruct(attr);
} else {
    std::cout << "Handle manually " << boost::typeindex::type_id<Attr>().pretty_name() << std::endl;
}

现在,您还必须修复推导类型上的 const-ref 限定符(或用

std::decay_t
包装它们。

这是我的(非 Windows)模型。作为奖励,我投入了 C 风格数组的处理(因为这可能是您需要的):

住在Coliru

#include <boost/describe.hpp>
#include <boost/mp11.hpp>
#include <boost/type_index.hpp>
#include <cstdint>
#include <iostream>

namespace PE_STRUCTURE {
    using DWORD = uint32_t;
    struct IMAGE_FILE_HEADER {
        DWORD Machine, NumberOfSections, TimeDateStamp, PointerToSymbolTable, NumberOfSymbols,
            SizeOfOptionalHeader, Characteristics;
    };
    struct IMAGE_DATA_DIRECTORY {
        DWORD VirtualAddress, Size;
    };
    struct IMAGE_OPTIONAL_HEADER64 {
        DWORD Magic, MajorLinkerVersion, MinorLinkerVersion, SizeOfCode, SizeOfInitializedData,
            SizeOfUninitializedData, AddressOfEntryPoint, BaseOfCode, ImageBase, SectionAlignment,
            FileAlignment, MajorOperatingSystemVersion, MinorOperatingSystemVersion, Win32VersionValue,
            SizeOfImage, SizeOfHeaders, CheckSum, Subsystem, DllCharacteristics, SizeOfStackReserve,
            SizeOfStackCommit, SizeOfHeapReserve, SizeOfHeapCommit, LoaderFlags, NumberOfRvaAndSizes;
        IMAGE_DATA_DIRECTORY DataDirectory[16];
    };

    // For PE32+ (64-bit) Executables
    struct ImageNtHeaders64 {
        DWORD                   signature{};      // almost always PE/0/0
        IMAGE_FILE_HEADER       FileHeader{};     // Some information, has OptionalHeader size
        IMAGE_OPTIONAL_HEADER64 OptionalHeader{}; // Some important info
    };

    BOOST_DESCRIBE_STRUCT(ImageNtHeaders64, (), (signature, FileHeader, OptionalHeader));

    BOOST_DESCRIBE_STRUCT(IMAGE_FILE_HEADER, (),
                          (Machine, NumberOfSections, TimeDateStamp, PointerToSymbolTable, NumberOfSymbols,
                           SizeOfOptionalHeader, Characteristics));

    BOOST_DESCRIBE_STRUCT(IMAGE_OPTIONAL_HEADER64, (),
                          (Magic, MajorLinkerVersion, MinorLinkerVersion, SizeOfCode, SizeOfInitializedData,
                           SizeOfUninitializedData, AddressOfEntryPoint, BaseOfCode, ImageBase,
                           SectionAlignment, FileAlignment, MajorOperatingSystemVersion,
                           MinorOperatingSystemVersion, Win32VersionValue, SizeOfImage, SizeOfHeaders,
                           CheckSum, Subsystem, DllCharacteristics, SizeOfStackReserve, SizeOfStackCommit,
                           SizeOfHeapReserve, SizeOfHeapCommit, LoaderFlags, NumberOfRvaAndSizes,
                           DataDirectory));

    BOOST_DESCRIBE_STRUCT(IMAGE_DATA_DIRECTORY, (), (VirtualAddress, Size))
}; // namespace PE_STRUCTURE

template <typename Attr> void copyBytesToStructInner(Attr const& attr);
template <typename Element, size_t N> void copyBytesToStructInner(Element const (&arr)[N]);

template <typename Base, class Md = boost::describe::describe_members<Base, boost::describe::mod_any_access>>
void copyBytesToStruct(Base const& base) {
    boost::mp11::mp_for_each<Md>([&](auto attr) { copyBytesToStructInner(base.*attr.pointer); });
}

template <typename Element, size_t N> void copyBytesToStructInner(Element const (&arr)[N]) {
    std::cout << __PRETTY_FUNCTION__ << " " << boost::typeindex::type_id<Element>().pretty_name() << std::endl;
    for (auto& el : arr) {
        copyBytesToStructInner(el);
    }
}

template <typename Attr> void copyBytesToStructInner(Attr const& attr) {
    // check if iterated type is struct, if it is then recursively call this function for it
    if constexpr (std::is_class_v<Attr>) {
        std::cout << __PRETTY_FUNCTION__ << " " << boost::typeindex::type_id<Attr>().pretty_name() << std::endl;
        copyBytesToStruct(attr);
    } else {
        // std::cout << "Handle manually " << boost::typeindex::type_id<Attr>().pretty_name() << std::endl;
    }
}

void loadPEFileFromBinary() {
    PE_STRUCTURE::ImageNtHeaders64 st;
    copyBytesToStruct(st);
}

int main() {
    loadPEFileFromBinary();
}

印刷

void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_FILE_HEADER] PE_STRUCTURE::IMAGE_FILE_HEADER
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_OPTIONAL_HEADER64] PE_STRUCTURE::IMAGE_OPTIONAL_HEADER64
void copyBytesToStructInner(const Element (&)[N]) [with Element = PE_STRUCTURE::IMAGE_DATA_DIRECTORY; long unsigned int N = 16] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY

或者,取消注释“手动处理”行:https://coliru.stacked-crooked.com/a/cc83adeeb89044c8

Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_FILE_HEADER] PE_STRUCTURE::IMAGE_FILE_HEADER
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_OPTIONAL_HEADER64] PE_STRUCTURE::IMAGE_OPTIONAL_HEADER64
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Element (&)[N]) [with Element = PE_STRUCTURE::IMAGE_DATA_DIRECTORY; long unsigned int N = 16] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
void copyBytesToStructInner(const Attr&) [with Attr = PE_STRUCTURE::IMAGE_DATA_DIRECTORY] PE_STRUCTURE::IMAGE_DATA_DIRECTORY
Handle manually unsigned int
Handle manually unsigned int
© www.soinside.com 2019 - 2024. All rights reserved.