2

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run のすべてのレジストリ キー、サブキー、および値を表示して、起動時に実行されるプログラムを確認したいと考えています。

MSのこのコードを使用しています。

void QueryKey(HKEY hKey) 
{ 
TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
DWORD    cbName;                   // size of name string 
TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
DWORD    cchClassName = MAX_PATH;  // size of class string 
DWORD    cSubKeys=0;               // number of subkeys 
DWORD    cbMaxSubKey;              // longest subkey size 
DWORD    cchMaxClass;              // longest class string 
DWORD    cValues;              // number of values for key 
DWORD    cchMaxValue;          // longest value name 
DWORD    cbMaxValueData;       // longest value data 
DWORD    cbSecurityDescriptor; // size of security descriptor 
FILETIME ftLastWriteTime;      // last write time 

DWORD i, retCode; 

TCHAR  achValue[MAX_VALUE_NAME]; 
DWORD cchValue = MAX_VALUE_NAME; 

// Get the class name and the value count. 
retCode = RegQueryInfoKey(
    hKey,                    // key handle 
    achClass,                // buffer for class name 
    &cchClassName,           // size of class string 
    NULL,                    // reserved 
    &cSubKeys,               // number of subkeys 
    &cbMaxSubKey,            // longest subkey size 
    &cchMaxClass,            // longest class string 
    &cValues,                // number of values for this key 
    &cchMaxValue,            // longest value name 
    &cbMaxValueData,         // longest value data 
    &cbSecurityDescriptor,   // security descriptor 
    &ftLastWriteTime);       // last write time 

// Enumerate the subkeys, until RegEnumKeyEx fails.

if (cSubKeys == 0)
{
    printf("No values found\n");                          
}


if (cSubKeys)
{
    printf( "\nNumber of subkeys: %d\n", cSubKeys);



    for (i=0; i<cSubKeys; i++) 
    { 
        cbName = MAX_KEY_LENGTH;
        retCode = RegEnumKeyEx(hKey, i,
                 achKey, 
                 &cbName, 
                 NULL, 
                 NULL, 
                 NULL, 
                 &ftLastWriteTime); 
        if (retCode == ERROR_SUCCESS) 
        {
            _tprintf(TEXT("(%d) %s\n"), i+1, achKey);

        }
    }
} 

// Enumerate the key values. 

if (cValues) 
{
    printf( "\nNumber of values: %d\n", cValues);

    for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) 
    { 
        cchValue = MAX_VALUE_NAME; 
        achValue[0] = '\0'; 
        retCode = RegEnumValue(hKey, i, 
            achValue, 
            &cchValue, 
            NULL, 
            NULL,
            NULL,
            NULL);

        if (retCode == ERROR_SUCCESS ) 
        { 
            _tprintf(TEXT("(%d) %s\n"), i+1, achValue); 
        } 
    }
}
}








int RegKeyCount = 0;

int main(int argc, char *argv[])
{


HKEY hTestKey;

  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows  \\CurrentVersion\\Run"), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
  {
  QueryKey(hTestKey);
  }
}

「SOFTWARE\Microsoft\Windows\CurrentVersion」に対してこのコードを実行すると、すべてのサブキーと値が表示されるという点で混乱しています(RunがCurrentVersionのサブキーであることがわかります)が、それを表示しようとするとRun のサブキーと値を見ると、エントリはあるのに何も見つからないというメッセージが表示されます。

また、サブキー/値の値の名前もわかりません。何でもかまいません。

これは実際に RegEnumValue が行うべきことですか、それとも別のレジストリ関数を使用する必要がありますか?

4

1 に答える 1

1

RegOpenKeyEx()私が見つけた唯一の問題は、へのパラメータのスペースでしたTEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run").

あなたprintfの最初は少し混乱しています。多分あなたはに変更"No values found\n"するべき"No keys found\n"ですか?

if (cSubKeys == 0)
    printf("No keys found\n");                          

また、このコードを 64 ビット OS で 32 ビット プログラムとしてビルド/実行する場合は、HKLM\SOFTWARE\ ではなく、HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run の内容を取得することに注意してください。 Microsoft\Windows\CurrentVersion\Run!

于 2013-10-28T15:41:52.123 に答える