diff --git "a/2020302111249-\345\274\240\346\225\254\344\270\232-Windows\350\256\272\346\226\207.docx" "b/2020302111249-\345\274\240\346\225\254\344\270\232-Windows\350\256\272\346\226\207.docx" new file mode 100644 index 0000000000000000000000000000000000000000..b6c1b37a601f5e3ce32086328438d5d85c71cf81 Binary files /dev/null and "b/2020302111249-\345\274\240\346\225\254\344\270\232-Windows\350\256\272\346\226\207.docx" differ diff --git "a/QQ\346\210\252\345\233\27620221007112129.png" "b/QQ\346\210\252\345\233\27620221007112129.png" new file mode 100644 index 0000000000000000000000000000000000000000..13979fd06a8a3f9bddb85b76726425a521fa32a2 Binary files /dev/null and "b/QQ\346\210\252\345\233\27620221007112129.png" differ diff --git "a/QQ\346\210\252\345\233\27620221008160123.png" "b/QQ\346\210\252\345\233\27620221008160123.png" new file mode 100644 index 0000000000000000000000000000000000000000..02796945b17f97c8d073e010372811cea2189c9e Binary files /dev/null and "b/QQ\346\210\252\345\233\27620221008160123.png" differ diff --git a/translation of lab 2_7 .md b/translation of lab 2_7 .md new file mode 100644 index 0000000000000000000000000000000000000000..c816ce5a24cf8f45f7c090ee82a9fb8872cf3361 --- /dev/null +++ b/translation of lab 2_7 .md @@ -0,0 +1,198 @@ +翻译lab2_7、lab2_8 + +# Lab2_7 + +## 注册表结构和注册表值类型 + +[https://docs.microsoft.com/en-us/windows/win32/api/winreg/ns-winreg-valenta](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fapi%2Fwinreg%2Fns-winreg-valenta) + +[https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fsysinfo%2Fregistry-value-types) + +[https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fsysinfo%2Fregistry-value-types) + +------ + +### 1 结构 + +包含有关注册表值的信息。RegQueryMultipleValues 函数使用此结构。 + +``` +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTW, *PVALENTW; +``` + + +ve_valuename 要检索的值的名称。请确保在调用 RegQueryMultipleValues 之前设置此成员。 + + +ve_valuelen 以 ve_valueptr 表示的数据大小(以字节为单位)。 + + +ve_valueptr 指向值条目的数据的指针。这是指向在 RegQueryMultipleValues 填充的 lpValueBuf 缓冲区中返回的值数据的指针。 + + +ve_type ve_valueptr指向的数据类型。有关可能类型的列表,请参阅注册表值类型。 + +### 2 值类型 + +下面的示例遍历一个REG_MULTI_SZ字符串。 + +```c++ +#include +#include +#include + + +void SampleSzz(const wchar_t* pszz) +{ + _tprintf(_TEXT("\tBegin multi-sz string\n")); + while (*pszz) + { + _tprintf(_TEXT("\t\t%s\n"), pszz); + pszz = pszz + _tcslen(pszz) + 1; + } + _tprintf(_TEXT("\tEnd multi-sz\n")); +} + +int __cdecl main(int argc, char **argv) +{ + + _tprintf(_TEXT("Conventional multi-sz string:\n")); + SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0")); + + _tprintf(_TEXT("\nTest case with no strings:\n")); + SampleSzz(_TEXT("")); + + return 0; +} +``` + +运行结果 + +![image-20221113142304668](第二次作业.assets/image-20221113142304668.png) + +# Lab2_8 + +## 枚举注册表子项 + +[https://docs.microsoft.com/en-us/windows/win32/sysinfo/enumerating-registry-subkeys](https://gitee.com/link?target=https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fsysinfo%2Fenumerating-registry-subkeys) + +------ + +此实验示例使用 RegQueryInfoKey、RegEnumKeyEx 和 RegEnumValue 函数来枚举指定键的子项。传递给每个函数的 hKey 参数是打开密钥的句柄。此密钥必须在函数调用之前打开,并在之后关闭。 + +```c++ +// QueryKey(查询键) - 枚举键的子项及其关联值。 +// hKey - 要枚举其子项和值的键。 +#include +#include +#include + +#define MAX_KEY_LENGTH 255 +#define MAX_VALUE_NAME 16383 + +void QueryKey(HKEY hKey) +{ + TCHAR achKey[MAX_KEY_LENGTH]; // 子键名称缓冲区 +DWORD cbName; // 名称字符串大小 + TCHAR achClass[MAX_PATH] = TEXT(""); // 类名缓冲区 + DWORD cchClassName = MAX_PATH; // 类字符串大小 + DWORD cSubKeys=0; // 子密钥数量 + DWORD cbMaxSubKey; // 最大子键尺寸 + DWORD cchMaxClass; // 最长级别字符串 + DWORD cValues; // 键值数量 + DWORD cchMaxValue; // 最长值名称 + DWORD cbMaxValueData; // 最长值数据 + DWORD cbSecurityDescriptor; // 安全描述符大小 + FILETIME ftLastWriteTime; // 最后写入时间 + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // 获取类名称和值数量 + retCode = RegQueryInfoKey( + hKey, // 钥匙柄 + achClass, // 类名的缓冲区 + &cchClassName, // 类字符串的大小 + NULL, // 保留 + &cSubKeys, // 子密钥数量 + &cbMaxSubKey, // 最长子键尺寸 + &cchMaxClass, // 最长级别字符串 + &cValues, // 这个键的值数量 + &cchMaxValue, // 最长值名称 + &cbMaxValueData, // 最长值数据 + &cbSecurityDescriptor, // 安全描述符 + &ftLastWriteTime); // 最后写作时间 + + // 枚举子键,直到RegEnumKeyEx失败。 + + if (cSubKeys) + { + printf( "\nNumber of subkeys: %d\n", cSubKeys); + + for (i=0; i