⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w32_getreg.c

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 C
字号:
/*Copyright Paul Lin 2003. Copyright 2006 Bojan Resnik.Distributed under the Boost Software License, Version 1.0. (See accompanyingfile LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)*/# include "jam.h"# if defined( OS_NT ) || defined( OS_CYGWIN )# include "lists.h"# include "newstr.h"# include "parse.h"# include "frames.h"# include "strings.h"# define WIN32_LEAN_AND_MEAN# include <windows.h># define  MAX_REGISTRY_DATA_LENGTH 4096# define  MAX_REGISTRY_KEYNAME_LENGTH 256# define  MAX_REGISTRY_VALUENAME_LENGTH 16384typedef struct{    LPCSTR  name;    HKEY    value;} KeyMap;static const KeyMap dlRootKeys[] = {    { "HKLM", HKEY_LOCAL_MACHINE },    { "HKCU", HKEY_CURRENT_USER },    { "HKCR", HKEY_CLASSES_ROOT },    { "HKEY_LOCAL_MACHINE", HKEY_LOCAL_MACHINE },    { "HKEY_CURRENT_USER", HKEY_CURRENT_USER },    { "HKEY_CLASSES_ROOT", HKEY_CLASSES_ROOT },    { 0, 0 }};static HKEY get_key(char const** path){    const KeyMap *p;    for (p = dlRootKeys; p->name; ++p)    {        int n = strlen(p->name);        if (!strncmp(*path,p->name,n))        {            if ((*path)[n] == '\\' || (*path)[n] == 0)            {                *path += n + 1;                break;            }        }    }    return p->value;}LIST*builtin_system_registry(    PARSE    *parse,    FRAME    *frame ){    char const* path = lol_get(frame->args, 0)->string;    LIST* result = L0;    HKEY key = get_key(&path);        if (        key != 0        && ERROR_SUCCESS == RegOpenKeyEx(key, path, 0, KEY_QUERY_VALUE, &key)     )    {        DWORD  type;        BYTE   data[MAX_REGISTRY_DATA_LENGTH];        DWORD  len = sizeof(data);        LIST const* const field = lol_get(frame->args, 1);                if ( ERROR_SUCCESS ==             RegQueryValueEx(key, field ? field->string : 0, 0, &type, data, &len) )        {            switch (type)            {                             case REG_EXPAND_SZ:                 {                     long len;                     string expanded[1];                     string_new(expanded);                     while (                         (len = ExpandEnvironmentStrings(                             (LPCSTR)data, expanded->value, expanded->capacity))                         > expanded->capacity                     )                         string_reserve(expanded, len);                     expanded->size = len - 1;                     result = list_new( result, newstr(expanded->value) );                     string_free( expanded );                 }                 break;                         case REG_MULTI_SZ:                 {                     char* s;                     for (s = (char*)data; *s; s += strlen(s) + 1)                         result = list_new( result, newstr(s) );                 }                 break;                          case REG_DWORD:                 {                     char buf[100];                     sprintf( buf, "%u", *(PDWORD)data );                     result = list_new( result, newstr(buf) );                 }                 break;             case REG_SZ:                 result = list_new( result, newstr((char*)data) );                 break;            }        }        RegCloseKey(key);    }    return  result;}static LIST* get_subkey_names(HKEY key, char const* path){    LIST* result = 0;        if ( ERROR_SUCCESS ==          RegOpenKeyEx(key, path, 0, KEY_ENUMERATE_SUB_KEYS, &key)     )    {        char name[MAX_REGISTRY_KEYNAME_LENGTH];        DWORD name_size = sizeof(name);        DWORD index;        FILETIME last_write_time;        for ( index = 0;               ERROR_SUCCESS == RegEnumKeyEx(                  key, index, name, &name_size, 0, 0, 0, &last_write_time);              ++index,               name_size = sizeof(name)        )        {            name[name_size] = 0;            result = list_append(result, list_new(0, newstr(name)));        }                RegCloseKey(key);    }        return result;}static LIST* get_value_names(HKEY key, char const* path){    LIST* result = 0;        if ( ERROR_SUCCESS == RegOpenKeyEx(key, path, 0, KEY_QUERY_VALUE, &key) )    {        char name[MAX_REGISTRY_VALUENAME_LENGTH];        DWORD name_size = sizeof(name);        DWORD index;        for ( index = 0;               ERROR_SUCCESS == RegEnumValue(                  key, index, name, &name_size, 0, 0, 0, 0);              ++index,               name_size = sizeof(name)        )        {            name[name_size] = 0;            result = list_append(result, list_new(0, newstr(name)));        }                RegCloseKey(key);    }        return result;}LIST*builtin_system_registry_names(    PARSE    *parse,    FRAME    *frame ){    char const* path        = lol_get(frame->args, 0)->string;    char const* result_type = lol_get(frame->args, 1)->string;        HKEY key = get_key(&path);    if ( !strcmp(result_type, "subkeys") )        return get_subkey_names(key, path);    if ( !strcmp(result_type, "values") )        return get_value_names(key, path);    return 0;}# endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -