我正在阅读mimikatz的源代码,并努力理解这一点。
我看到KULL_M_REGISTRY_HIVE_HANDLE是结构体的别名,*PKULL_M_REGISTRY_HIVE_HANDLE是什么意思?
typedef struct _KULL_M_REGISTRY_HIVE_HANDLE
{
HANDLE hFileMapping;
LPVOID pMapViewOfFile;
PBYTE pStartOf;
PKULL_M_REGISTRY_HIVE_KEY_NAMED pRootNamedKey;
} KULL_M_REGISTRY_HIVE_HANDLE, *PKULL_M_REGISTRY_HIVE_HANDLE;
2条答案
按热度按时间5t7ly7z51#
如果你说
你声明了两个
const int
类型的变量如果你说
你声明了两个变量,一个是
const int
类型,另一个是“指向const int
的指针”类型。用一种完全类似的方式,如果你说
你声明了两个typedef,一个用于类型struct,另一个用于指向那个结构的类型指针。
所以如果你以后说
它会将
kmrhp
声明为指针,就像你说的那样附录:指针类型定义变得更有趣的一种方式是,如果你说
它声明了 * 两个 * 指针,就好像你说
pu82cl6c2#
typedef
将普通声明/定义转换为一个或多个类型别名的定义。因此,
(no
typedef
)将把KULL_M_REGISTRY_HIVE_HANDLE
声明为struct _KULL_M_REGISTRY_HIVE_HANDLE
类型的变量,并把PKULL_M_REGISTRY_HIVE_HANDLE
声明为指向struct _KULL_M_REGISTRY_HIVE_HANDLE
类型的对象的指针,对于
typedef
,它使KULL_M_REGISTRY_HIVE_HANDLE
成为struct _KULL_M_REGISTRY_HIVE_HANDLE
类型的别名,并使PKULL_M_REGISTRY_HIVE_HANDLE
成为struct _KULL_M_REGISTRY_HIVE_HANDLE*
类型的别名。(
typedef
版本中声明变量的变量类型的别名)**旁注:**使用以
_
开头的名称(尤其是_
和大写字母)标记结构体是一种(常见的)不好的做法。这些名称是保留的。(_[a-z0-9]
名称在filescope和标记命名空间中保留,_[A-Z_]
名称在所有范围内保留。)我会保持简单,只为标记重用typedef
名称(struct KULL_M_REGISTRY_HIVE_HANDLE
)。