创建Windows API以从命令行添加,修改,查询和删除注册表项

时间:2019-07-17 09:13:37

标签: c windows registry

我正在执行一项要求我查询,添加(inc值),删除和修改注册表项的任务。该程序需要支持所有不同类型的注册表数据,最重要的是,它需要使用命令行参数,与reg.exe的方式非常相似。

一个声明,我不熟悉底层编程语言(例如,我是菜鸟);该任务是更广泛的非编程安全性课程的一部分,但是我渴望在到目前为止所做的工作的基础上继续完成任务。我已经在Visual Studio中创建了3个单独的.c文件,它们在调试模式下成功运行;但是,我不知道如何创建一个接受命令行参数的代码文件。

到目前为止,我创建的代码是在研究解决方案时从我挖出的各种帖子中拼凑而成的;此外,我看过一堆YouTube视频,但可惜没有任何进展。我也对Stack Overflow进行了尽可能深入的挖掘,但没有发现任何可以帮助我理解如何解决以下主要问题的信息

  1. 创建一个执行所有必需功能的.c文件,并通过单独的调用进行;和
  2. 创建呼叫分配器以从命令行解析用户命令。

下面,我放入了包含查询,添加和修改功能但不包含删除功能的.c文件。可以使用Visual Studio创建的.exe文件从命令行运行该文件,但是它只是从上到下运行代码。我不知道如何分别调用程序的每个单独的函数。

#include <stdio.h>
#include <Windows.h>

int main()
{
    LONG lReg;
    HKEY hKey;
    DWORD number = 0x00000001;
    LONG dresult;

    if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Test2\\Product\\SmartId", 0, KEY_SET_VALUE | KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS)
        {
        printf("Key location open successful \n");
        dresult = RegDeleteKey(HKEY_LOCAL_MACHINE, L"Software\\Test2\\Product\\SmartId");
        RegCloseKey(hKey);
        }
    else 
        {
        lReg = RegCreateKeyEx(
        HKEY_LOCAL_MACHINE,
        L"Software\\Test2\\Product\\SmartId",
        0,
        NULL,
        REG_OPTION_NON_VOLATILE,
        KEY_ALL_ACCESS | KEY_WOW64_64KEY,
        NULL,
        &hKey,
        NULL);

        if (lReg == ERROR_SUCCESS)
            {
            printf("Key successfully added to registry \n");
            }
        else 
            {
            printf("Key not added to registry");
            }   
        }

    if (RegSetValueExW(hKey, L"OEMBackground", 0, REG_DWORD, (LPBYTE)&number, sizeof(DWORD)) == ERROR_SUCCESS)
        {
            printf("Key changed in registry \n");
        }
        else 
        {
            printf("Key not changed in registry \n");
        }

    RegCloseKey(hKey);

    return 0;
}

我希望命令行输入类似于(用于查询)

C:\ Windows \ system32> regfunction -q hklm \ software \ test2

1 个答案:

答案 0 :(得分:0)

您必须解析命令行

其中一种方法是使用CommandLineToArgvW

例如(基于SDK样本)=>

包括/库:

#include <strsafe.h>
#include <shlwapi.h>
#pragma comment (lib,"Shlwapi.lib")

测试代码(-q(查询)和-d(删除)的示例=>

BOOL bQuery = FALSE, bDelete = FALSE;
TCHAR wsParameter[MAX_PATH];
int nArgs;
LPWSTR *pszArgs = CommandLineToArgvW(GetCommandLine(), &nArgs);
if (pszArgs)
{       
    for (int iArg = 1; iArg != nArgs; iArg++)
    {
        LPTSTR pszArg = pszArgs[iArg];
        if (!StrCmpNIC(pszArg, TEXT("-q"), 3))
        {
            bQuery = TRUE;
            StringCchCopy(wsParameter, ARRAYSIZE(wsParameter), pszArg + 3);
            break;
        }
        else if (!StrCmpNIC(pszArg, TEXT("-d"), 3))
        {   
            bDelete = TRUE;
            StringCchCopy(wsParameter, ARRAYSIZE(wsParameter), pszArg + 3);
            break;
        }
        // else if ...
    }

    if (bQuery)
    {
        // Query code with wsParameter  
    }
    else if (bDelete)
    {
        // Delete code with wsParameter 
    }
    GlobalFree(pszArgs);        
}