RtlQueryRegistryValues

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

  1. Butcher

    Butcher New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2005
    Сообщения:
    6
    Подскажите почему в драйвере не правильно отрабатывает функция RtlQueryRegistryValues.

    Возвращает STATUS_OBJECT_NAME_NOT_FOUND хотя ключ в реестре существует.

    Драйвер загружаю через KmdManager


    Код (Text):
    1. .data
    2.  
    3. CTW0  "Startup",szStartup,4
    4.  
    5. CCOUNTED_UNICODE_STRING    "\\Registry\\User",szUserKey,4
    6.  
    7. szUserStartFolder db "\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",0
    8.  
    9. szUserStartFolderSize=$-szUserStartFolder
    10.  
    11. rr RTL_QUERY_REGISTRY_TABLE <>
    12.  
    13. rr2 RTL_QUERY_REGISTRY_TABLE <>
    14.  
    15.  
    16.  
    17. .code
    18.  
    19.  
    20.  
    21. EnumProc      proc uses esi
    22.  
    23. local us:UNICODE_STRING
    24.  
    25. local bufftmp[500]:byte
    26.  
    27. local hKey:HANDLE
    28.  
    29. LOCAL counter:DWORD
    30.  
    31. local KeyBuff:DWORD
    32.  
    33.  
    34.  
    35.     Scall GetSubKeyCount,offset szUserKey
    36.  
    37. .IF  eax != 0      
    38.  
    39.       mov counter,eax
    40.  
    41.       mov us._Length,szUserStartFolderSize
    42.  
    43.       lea ebx,us
    44.  
    45.       Scall AnsiStringToUnicodeString,ebx,offset szUserStartFolder,0
    46.  
    47.            
    48.  
    49. SetAboutBlankLoop:
    50.  
    51.       lea eax,us
    52.  
    53.       Scall GetSubKey,offset szUserKey,counter,eax
    54.  
    55.  
    56.  
    57. ;После вызова функции GetSubKey в eax имеем UNICODE_STRING где
    58.  
    59. ; UNICODE_STRING.Buffer содержит строку вида
    60.  
    61. ;\Registry\User\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Exp lorer\User Shell Folders
    62.  
    63.        
    64.  
    65. .IF  eax != 0
    66.  
    67.       mov KeyBuff,eax
    68.  
    69.       invoke RtlZeroMemory,addr bufftmp,500
    70.  
    71.              
    72.  
    73.       mov eax,KeyBuff
    74.  
    75.       invoke DbgPrint, $CTA0("\n%ws\n"),(UNICODE_STRING ptr [eax]).Buffer
    76.  
    77.       invoke DbgPrint, $CTA0("\n%ws\n"),offset szStartup
    78.  
    79.      
    80.  
    81.       mov rr.Flags,RTL_QUERY_REGISTRY_DIRECT;
    82.  
    83.       mov rr._Name,offset szStartup
    84.  
    85.       lea ecx,bufftmp
    86.  
    87.       mov rr.EntryContext,ecx
    88.  
    89.       mov eax,KeyBuff
    90.  
    91.   invoke RtlQueryRegistryValues,RTL_REGISTRY_ABSOLUTE or RTL_QUERY_REGISTRY_REQUIRED,\
    92.  
    93.   (UNICODE_STRING ptr [eax]).Buffer,offset rr,0,0
    94.  
    95.        
    96.  
    97.       mov eax,KeyBuff
    98.  
    99.       invoke ExFreePool,(UNICODE_STRING ptr [eax]).Buffer
    100.  
    101. .ENDIF
    102.  
    103.       dec counter
    104.  
    105.       cmp counter,0
    106.  
    107.       jge SetAboutBlankLoop
    108.  
    109.          
    110.  
    111.       invoke ExFreePool,us.Buffer
    112.  
    113.      
    114.  
    115. .ENDIF      
    116.  
    117.  
    118.  
    119.  
    120.  
    121.     ret
    122.  
    123.  
    124.  
    125. EnumProc      endp
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    \Registry\User\S-1-5-18\Software\...



    Нету, наверное, такого ключа в реестре. "S-1-5-18" - это так называемый well-known SID для Local System.



    Глянь в regedit ветку \HKEY_USERS. У меня так:

    "\\Registry\\User\\.DEFAULT"

    "\\Registry\\User\\S-1-5-21-839522115-1993962763-1343024091-1000"

    "\\Registry\\User\\S-1-5-21-839522115-1993962763-1343024091-1000_Class es"



    ЗЫ: А зачем такую заморочную функцию юзать для одного ключа? Она нужна только когда сразу несколько ключей одновременно надо получить.



    ЗЗЫ: А на rsdn ассемблер понимают? ;)
     
  3. Butcher

    Butcher New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2005
    Сообщения:
    6
    Four-F



    Так RtlQueryRegistryValues вроде может возвратить правильный путь для REG_EXPAND_SZ.Или нет ?

    Насчет ключа ,так функция перебирает все ключи в \Registry\User и не один не открываеться.



    ЗЫ:Four-F на тебя вся надежда,бъюсь с этой функцией уже второй день.



    ЗЫЫ:Посмотрим ;)
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    А, понял. Да, вроде только эта переменные окружения экспандит, но я такого никогда не делал.


    Какая функция? Если RtlQueryRegistryValues, то ничего она не перебирает. Ты передаешь ей массив структур RTL_QUERY_REGISTRY_TABLE, инициализированный именами ключей и адресами буферов, а она читает эти ключи. Но только эти и ничего не перебирает. Что-то навроде такого:


    Код (Text):
    1. RTL_QUERY_REGISTRY_TABLE art[4];
    2.  
    3.     RtlZeroMemory( art, sizeof(RTL_QUERY_REGISTRY_TABLE) * 4 );
    4.  
    5.     art[0].Flags        = RTL_QUERY_REGISTRY_DIRECT;
    6.     art[0].Name         = L"KeyName1";
    7.     art[0].EntryContext = &buffer1;
    8.  
    9.     art[1].Flags        = RTL_QUERY_REGISTRY_DIRECT;
    10.     art[1].Name         = L"KeyName2";
    11.     art[1].EntryContext = &buffer2;
    12.  
    13.     art[2].Flags        = RTL_QUERY_REGISTRY_DIRECT;
    14.     art[2].Name         = L"KeyName3";
    15.     art[2].EntryContext = &buffer3;
    16.  
    17.     status = RtlQueryRegistryValues(
    18.                      RTL_REGISTRY_ABSOLUTE,
    19.                      L"KeyPath",
    20.                      art,
    21.                      NULL,
    22.                      NULL );
    А мне некогда, я разбираться не буду. Попробуй в юзер моде получить свой ключ - оно попроще будет. Если RegQueryValueEx прочитает твой \Registry\User\S-1-5-18\Software\..., тогда уже в ядре возиться имеет смысл. Мне кажется, что проблема именно в "S-1-5-18".
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Butcher, Расскажите мне, пожалуйста, поподробнее о функции GetSubKeyCount, например, в какой lib`е она находится