Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 偏移量0x80000000000000ul到底是多少?_C++_C_Memory_Offset_Xbox360 - Fatal编程技术网

C++ 偏移量0x80000000000000ul到底是多少?

C++ 偏移量0x80000000000000ul到底是多少?,c++,c,memory,offset,xbox360,C++,C,Memory,Offset,Xbox360,我在窥探源代码时看到过它,主要是用来抵消我所知道的。但我有点困惑到底是什么 它到底指向哪里 0x80000000000000UL和0x80000000UL之间的区别是什么?除了UL,我知道这使它成为一个无符号长字符 如果我要去搞乱物理内存(假设我有一个系统可以让我这样做),如果需要的话,我会如何在代码中使用它 为了澄清,我现在的主要困惑是理解在处理内存位置时如何使用如此大的值。我通常看不到在引用偏移量时使用的那种值 我在Xbox360上为自制软件做了一些编程,所以我主要是在那里看到的。下面是

我在窥探源代码时看到过它,主要是用来抵消我所知道的。但我有点困惑到底是什么

  • 它到底指向哪里
  • 0x80000000000000UL和0x80000000UL之间的区别是什么?除了UL,我知道这使它成为一个无符号长字符
如果我要去搞乱物理内存(假设我有一个系统可以让我这样做),如果需要的话,我会如何在代码中使用它

为了澄清,我现在的主要困惑是理解在处理内存位置时如何使用如此大的值。我通常看不到在引用偏移量时使用的那种值

我在Xbox360上为自制软件做了一些编程,所以我主要是在那里看到的。下面是从内存转储虚拟机监控程序的代码

dprintf("Dumping HV....\n");
UINT64 dest = 0x8000010600032500ULL;
BYTE* pbPayload = (BYTE*)XPhysicalAlloc(0x100, MAXULONG_PTR, 0, PAGE_READWRITE);
memcpy(pbPayload, hvPayload, 112);
UINT64 src = 0x8000000000000000ULL + ((DWORD)MmGetPhysicalAddress(pbPayload));
BYTE* pbHypervisor = (BYTE*)XPhysicalAlloc(0x40000, MAXULONG_PTR, 0, PAGE_READWRITE);
memset(pbHypervisor, 0, 0x40000);
UINT64 xArg = 0x8000000000000000ULL + ((DWORD)MmGetPhysicalAddress(pbHypervisor));
HvxGetVersion(0x72627472, 4, dest, src, 0x40, xArg);

dprintf("HV dumped\nSaving HV....\n");
注意:
HvxGetVersion
读取内存

我能想到的另一个地方是libxenon,它是一个库,用于帮助创建自制程序,从很少到没有预先存在的代码

void *target = (void*)(((unsigned long)0x8000000000000000UL) | shdr->sh_addr);

if (shdr->sh_type == SHT_NOBITS) {
    memset (target, 0, shdr->sh_size);
} else {
    memcpy ((void *) target, 
        (unsigned char *) addr + shdr->sh_offset,
        shdr->sh_size);
}
flush_code (target, shdr->sh_size);
puts("done");

这是一个很大的正数。它不是指针。你的第二个问题就像在问“100和10000之间的区别是什么”。如果您可以发布您看到的一些代码,您的问题将得到很大改善。0x8000000是一个32位或4字节的int值,其中另一个是8字节长,这只是一些随机内存偏移量。它们是xbox特有的。也许这是用户空间内存的开始(一个32位,另一个64位)?或者,可能这是一个物理内存映射的地址?@molbdnilo To smart ass反驳你的smart ass评论:你通过减法而不是除法得到差。:)这个问题还不清楚。这是一个数字:你给它一个意义。