前言
最近为了学习免杀,需要先从C++
开始打基础。对于我这个从来没学过C语言的菜鸡,真的是异常的艰险和挑战。这里往下对遇到的坑做下记录。
准备
用C++的主要目的就是为了会调用windowsapi
函数,但是windowsapi
函数不仅复杂,而且我在网上也没看到什么好的教学。基本上就相当于只有个人看文章了,这里我特地用了以下几个帮助我学习:
1.windowsAPI数据类型
2.MSDN
3.对应的需要调用的函数的前人示例。
开始
一些提前知识
windowsapi
中使用了很多windows自定义的数据类型。自定义的数据类型有以下规则:
1、基本数据类型大写:比如char为CHAR、short为SHORT、int为INT等。
2、指针类型的命令方式一般是在其指向的数据类型前面加“LP”或者“P”,比如
指向DWORD的指针类型为“LPDWORD”和“PDWORD”。
3、各种句柄类型的命名方式一般都是在对象名前加“H”,比如位图(BITMAP)对应
的句柄类型为“HBITMAP”。
4、无符号类型一般是以“U”开头,比如“INT”是符号类型,“UINT”是无符号类型。
windowsapi
函数中,一个函数有很多钟后缀,它们代表不同的意思。
- A表示使用ANSI编码作为标准输入与输出流的文本编码
- W表示使用Unicode作为编码
- Ex表示拓展, 标注了Ex的winapi函数会比没有标Ex的函数多一些参数什么的, 可以说拓展了一些功能
- ExA 与 ExW 就是 A,W与Ex的结合了
注册表的组成结构
注册表的结构是一个树状结构,一个键(key
,或称“项”)就是一个节点,子键(subkey
)就是这个节点的子节点,子健也是键。键的一条属性被称为一个value
(值项),value
由名称、类型、数据类型和数据组成。一个键可以有多个值,每个值的名称不同,如果值名称是空,则该值为该键的默认值。
正题
插入
首先我想要做到像注册表中写入一个value值得案例。
1 | #include<stdio.h> |
贴上原版代码。
这里开始对windowsapi
函数做出分析:
1 | RegCreateKeyEx(hKey,lpSubKey,Reserved,LpClass,dwOptions,samDesired,lpsecurityAttributes,phkResult,lpdwDisposition) //在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项。 |
运行后显示写入成功,并且在注册表下,也成功看到。
删除
接下来我们进行注册表删除子健。首先在删除之前先创建一个叫做123的子健
1 | #include<stdio.h> |
接下来进行删除操作。
1 | #include<stdio.h> |
1 | RegDeleteKey(hkey,lpSubkey) |
已经删除成功了。
接下来进行删除键下面的一个VALUE的操作。
1 | #include<stdio.h> |
1 | 要想删除一个VALUE,我们就要先打开一个键(因为键下面才有VALUE)。所以使用了RegCreateKey函数,RegCreateKey函数是RegCreateKeyEX函数的简单版,这里从它的参数数量少了好多就可以看出来了。 |
遍历
接下来进行遍历子键和VALUE操作。
遍历子键
1 | #include<stdio.h> |
1 | RegQueryInfoKey(hkey,lpClass,lpcchClass,lpReserved,lpSubkeys,lpcbMaxSubkeylen,lpcbMaxClasslen,lpcValues,lpcbMaxValueNamelen,lpcbMaxValuelen,lpcbSecurityDescriptor,lpftLastWriteTime) |
遍历VALUE
1 | #include<stdio.h> |
这此的差别就是我们定义了dwKeyNameLen
和dwKeyNameLen2
两个参数用来作为lpclass
和lpcclass
形参放进函数里。这样就能获取到value。