小编elv*_*ear的帖子

在C/Python中的asn.1解析器

我正在寻找一个解析asn.1规范文件并从中生成解码器的解决方案.

理想情况下,我想使用Python模块,但如果没有可用的话,我会使用C/C++库并将它们与Python接口,并提供大量的解决方案.

在过去,我一直在使用pyasn1并手工构建所有东西,但这已经变得过于笨拙.

我对libtasn1和asn1c看起来也很表面.第一个解析甚至最简单的文件都有问题.第二个有一个很好的解析器但是生成用于解码的C代码似乎太复杂了; 该解决方案适用于简单的规范,但在复杂的规则上窒息.

我可能忽略了其他任何好的选择吗?

c python parsing asn.1

12
推荐指数
2
解决办法
2万
查看次数

无法在 VirtualQuery 返回的空闲区域上进行 VirtualAlloc

我试图在 Windows 应用程序中加载的 DLL 中的某个内存范围内分配一定数量的内存。

我这样做的方式是使用VirtualQuery()搜索标记为空闲且在我需要进行分配的边界内的内存区域。我看到的是,即使该区域被标记为MEM_FREE VirtualAlloc()失败,有时也无法分配内存。

该代码非常接近以下内容:

LPVOID address = NULL, mem = NULL;

for (address = LOWER_RANGE; address < UPPER_RANGE;) {
    MEMORY_BASIC_INFORMATION mbi = {0};

    if (VirtualQuery(address, &mbi, sizeof(mbi))) {
        if (mbi.State == MEM_FREE && mbi.RegionSize >= ALLOC_SIZE) {
            mem = VirtualAlloc(address, ALLOC_SIZE, 
                MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READ);
            if (mem) {
                break;
            }
        }
    }

    address = mbi.BaseAddress + mbi.RegionSize;
}
Run Code Online (Sandbox Code Playgroud)

VirtualAlloc()失败时,GetLastError()返回ERROR_INVALID_ADDRESS (487).

我解决它的方法是,如果它足够大,则mbi.RegionSize使用页面大小步骤扫描以查找允许我分配所需内存的地址。

为什么根据VirtualQuery整个区域应该是空闲的并且我应该能够在我想要的任何地址内分配,但是通常当第一个VirtualAlloc失败时我必须循环几个步骤直到它最终成功。

c++ winapi memory-management virtualalloc virtualquery

0
推荐指数
1
解决办法
1163
查看次数