Как узнать путь ключа реестра, зная его хендел?

Тема в разделе "WASM.WIN32", создана пользователем HARD, 29 сен 2005.

  1. HARD

    HARD New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    15
    Возникла проблема с определением имени открытого ключа реестра в перехвачиваемой функции(ZwSetValueKey). Подскажите если знаете.
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Код (Text):
    1. BOOLEAN PathFromHandle (HANDLE hKey, PUNICODE_STRING lpszSubKeyVal,
    2.             PCHAR fullname)
    3. {
    4.     PVOID           pKey = NULL;
    5.     ANSI_STRING     keyname;
    6.     PCHAR           tmpname;
    7.     PUNICODE_STRING     fullUniName;
    8.     ULONG           actualLen;
    9.  
    10.     /* Allocate a temporary buffer */
    11.     tmpname = ExAllocatePool (PagedPool, MAXPATHLEN);
    12.     if (tmpname == NULL)
    13.         /* Not enough memory */
    14.         return FALSE;
    15.  
    16.     *fullname = *tmpname = '\0';
    17.  
    18.     /*
    19.      * Translate the hKey into a pointer to check whether it is a valid
    20.      * handle.
    21.      */
    22.     if (NT_SUCCESS (ObReferenceObjectByHandle (hKey, 0, NULL, KernelMode,
    23.         &pKey, NULL)) && pKey != NULL) {
    24.  
    25.         fullUniName = ExAllocatePool (PagedPool, MAXPATHLEN * 2 +
    26.             2 * sizeof(ULONG));
    27.         if (fullUniName == NULL) {
    28.             /* Not enough memory */
    29.             ObDereferenceObject (pKey);
    30.             ExFreePool (tmpname);
    31.             return FALSE;
    32.         }
    33.  
    34.         fullUniName->MaximumLength = MAXPATHLEN*2;
    35.         if (NT_SUCCESS (ObQueryNameString (pKey, fullUniName,
    36.             MAXPATHLEN, &actualLen ))) {
    37.             if (NT_SUCCESS (RtlUnicodeStringToAnsiString (
    38.                 &keyname, fullUniName, TRUE))) {
    39.                 if(*keyname.Buffer != '\0') {
    40.                     if (*keyname.Buffer != '\\')
    41.                         strcpy (tmpname, "\\");
    42.                     else
    43.                         strcpy (tmpname, "");
    44.                     strncat (tmpname, keyname.Buffer,
    45.                         MIN( keyname.Length,
    46.                         MAXPATHLEN - 2 ));
    47.                 }
    48.                 RtlFreeAnsiString (&keyname);
    49.             }
    50.         }
    51.  
    52.         ObDereferenceObject (pKey);
    53.         ExFreePool (fullUniName);
    54.     }
    55.  
    56.     /* Append subkey and value if they are there */
    57.     if (lpszSubKeyVal != NULL) {
    58.         keyname.Buffer = NULL;
    59.         if (NT_SUCCESS (RtlUnicodeStringToAnsiString (&keyname,
    60.             lpszSubKeyVal, TRUE))) {
    61.             if (*keyname.Buffer != '\0') {
    62.                 strcat (tmpname, "\\");
    63.                 strncat (tmpname, keyname.Buffer,
    64.                     MIN(keyname.Length, MAXPATHLEN - 1 -
    65.                     strlen(tmpname)));
    66.             }
    67.             RtlFreeAnsiString (&keyname);
    68.         }
    69.     }
    70.  
    71.     strcpy (fullname, tmpname);
    72.     ExFreePool (tmpname);
    73.  
    74.     return TRUE;
    75. }