Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ C++;-这些代码行是什么意思?_C++ - Fatal编程技术网

C++ C++;-这些代码行是什么意思?

C++ C++;-这些代码行是什么意思?,c++,C++,我正在看一些源代码,不明白发生了什么。以下是我从源代码中整理出来的一些代码(定义来自各地,我只包含了必要的内容): 具体来说,最后两行是什么意思和作用 opd_s GET_PLAYER_NAME_t = { Offsets::GET_PLAYER_NAME, TOC }; char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))&GET_PLAYER_NAME_t; 在后面的源代码中,我看到了GET\u PLAYER\u NAM

我正在看一些源代码,不明白发生了什么。以下是我从源代码中整理出来的一些代码(定义来自各地,我只包含了必要的内容):

具体来说,最后两行是什么意思和作用

opd_s GET_PLAYER_NAME_t = { Offsets::GET_PLAYER_NAME, TOC };
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))&GET_PLAYER_NAME_t;
在后面的源代码中,我看到了
GET\u PLAYER\u NAME
的用法,如下所示:

char* player = GET_PLAYER_NAME(0);
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))&GET_PLAYER_NAME_t;
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))0x421974;
那么,
GET\u PLAYER\u NAME
是一个接受整数参数的函数吗

我只是对这一点感到困惑,我正在努力理解它,所以如果有人能解释一下它的意思和语法,那将是非常有帮助的。谢谢

opd_s GET_PLAYER_NAME_t = { Offsets::GET_PLAYER_NAME, TOC };
这声明了一个名为
GET\u PLAYER\u NAME\u t
的变量,类型为
opd\u s
。这被初始化为
{offset::GET_PLAYER_NAME,TOC}
,即
数据成员将是
offset::GET_PLAYER_NAME
,而
TOC
数据成员将是
TOC

char*(*GET_PLAYER_NAME)(uint PlayerID) = ...
这声明了一个名为
GET\u PLAYER\u NAME
的变量。它的类型是:指向一个函数的指针,该函数将
uint
作为参数,并返回'char*

(char*(*)(uint))&GET_PLAYER_NAME_t;
这会将
GET\u PLAYER\u NAME\t
的地址强制转换为指针。。。见上文

这看起来非常可疑,因为作为结构的
GET\u PLAYER\u NAME\t
变量的内容将通过
GET\u PLAYER\u NAME
解释为函数调用中的第一条指令

opd_s GET_PLAYER_NAME_t = { Offsets::GET_PLAYER_NAME, TOC };
表示在堆栈上创建名为
GET\u PLAYER\u name\t
类型为
opd\u s
的结构变量,并用字段
Sub=offset::GET\u PLAYER\u name
初始化,即
0x421974
Toc=Toc
,即
0x1C75288

因此,有一个名为
GET\u PLAYER\u NAME\u t
且类型为
opd\u s
的结构,它等于
{0x421974,0x1C75288}

char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))&GET_PLAYER_NAME_t;
它定义函数指针
GET\u PLAYER\u NAME(uint PlayerID)
,该指针指向先前声明的结构

实际上,
GET\u PLAYER\u NAME(0)
使用操作码
0x421974
0x1C75288
调用某些东西,我们不知道它是做什么的,因为我们不知道编译它的体系结构(至少是体系结构的位和端)


当然不是x86,而是x86块上的DEP以代码形式执行堆栈数据。

这就是通过prx模块在PS3上调用函数的方式。这段代码运行在一个称为prx模块的外部插件上。把它想象成一个DLL。您可以将游戏的可执行文件加载到IDA中,并获取要调用的函数的地址。因此,在本例中,
0x421974
被调用。因为我们实际上没有游戏的源代码,所以您需要这样定义函数:

char* player = GET_PLAYER_NAME(0);
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))&GET_PLAYER_NAME_t;
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))0x421974;
opd结构只是一个特定于cell处理器的int数组。 在Xbox上,情况会是这样:

char* player = GET_PLAYER_NAME(0);
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))&GET_PLAYER_NAME_t;
char*(*GET_PLAYER_NAME)(uint PlayerID) = (char*(*)(uint))0x421974;
它所做的几乎就是调用
0x421974
,这是GTA5上的
GET_PLAYER_NAME
,并从客户机索引中获取玩家名称


处理器是powerpc。

看起来有人正在将数据指针投射到函数指针。最后一行看起来不正确。你确定这可以编译吗?这里有一个很好的网站来解释复杂的表达式:它的缺点是一个具有已知值的结构被重新解释为一个函数(或者说指向该结构的指针被重新解释为指向函数的指针)。要了解更多信息,您需要知道这是用于什么处理器,可能是什么操作系统。然后反汇编这些值。@texasbruce代码正在创建一个伪函数指针。非常不可移植。(看起来像MIPS。)