Подскажите почему в драйвере не правильно отрабатывает функция RtlQueryRegistryValues. Возвращает STATUS_OBJECT_NAME_NOT_FOUND хотя ключ в реестре существует. Драйвер загружаю через KmdManager Код (Text): .data CTW0 "Startup",szStartup,4 CCOUNTED_UNICODE_STRING "\\Registry\\User",szUserKey,4 szUserStartFolder db "\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",0 szUserStartFolderSize=$-szUserStartFolder rr RTL_QUERY_REGISTRY_TABLE <> rr2 RTL_QUERY_REGISTRY_TABLE <> .code EnumProc proc uses esi local us:UNICODE_STRING local bufftmp[500]:byte local hKey:HANDLE LOCAL counter:DWORD local KeyBuff:DWORD Scall GetSubKeyCount,offset szUserKey .IF eax != 0 mov counter,eax mov us._Length,szUserStartFolderSize lea ebx,us Scall AnsiStringToUnicodeString,ebx,offset szUserStartFolder,0 SetAboutBlankLoop: lea eax,us Scall GetSubKey,offset szUserKey,counter,eax ;После вызова функции GetSubKey в eax имеем UNICODE_STRING где ; UNICODE_STRING.Buffer содержит строку вида ;\Registry\User\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Exp lorer\User Shell Folders .IF eax != 0 mov KeyBuff,eax invoke RtlZeroMemory,addr bufftmp,500 mov eax,KeyBuff invoke DbgPrint, $CTA0("\n%ws\n"),(UNICODE_STRING ptr [eax]).Buffer invoke DbgPrint, $CTA0("\n%ws\n"),offset szStartup mov rr.Flags,RTL_QUERY_REGISTRY_DIRECT; mov rr._Name,offset szStartup lea ecx,bufftmp mov rr.EntryContext,ecx mov eax,KeyBuff invoke RtlQueryRegistryValues,RTL_REGISTRY_ABSOLUTE or RTL_QUERY_REGISTRY_REQUIRED,\ (UNICODE_STRING ptr [eax]).Buffer,offset rr,0,0 mov eax,KeyBuff invoke ExFreePool,(UNICODE_STRING ptr [eax]).Buffer .ENDIF dec counter cmp counter,0 jge SetAboutBlankLoop invoke ExFreePool,us.Buffer .ENDIF ret EnumProc endp
\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 ассемблер понимают?
Four-F Так RtlQueryRegistryValues вроде может возвратить правильный путь для REG_EXPAND_SZ.Или нет ? Насчет ключа ,так функция перебирает все ключи в \Registry\User и не один не открываеться. ЗЫ:Four-F на тебя вся надежда,бъюсь с этой функцией уже второй день. ЗЫЫ:Посмотрим
А, понял. Да, вроде только эта переменные окружения экспандит, но я такого никогда не делал. Какая функция? Если RtlQueryRegistryValues, то ничего она не перебирает. Ты передаешь ей массив структур RTL_QUERY_REGISTRY_TABLE, инициализированный именами ключей и адресами буферов, а она читает эти ключи. Но только эти и ничего не перебирает. Что-то навроде такого: Код (Text): RTL_QUERY_REGISTRY_TABLE art[4]; RtlZeroMemory( art, sizeof(RTL_QUERY_REGISTRY_TABLE) * 4 ); art[0].Flags = RTL_QUERY_REGISTRY_DIRECT; art[0].Name = L"KeyName1"; art[0].EntryContext = &buffer1; art[1].Flags = RTL_QUERY_REGISTRY_DIRECT; art[1].Name = L"KeyName2"; art[1].EntryContext = &buffer2; art[2].Flags = RTL_QUERY_REGISTRY_DIRECT; art[2].Name = L"KeyName3"; art[2].EntryContext = &buffer3; status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, L"KeyPath", art, NULL, NULL ); А мне некогда, я разбираться не буду. Попробуй в юзер моде получить свой ключ - оно попроще будет. Если RegQueryValueEx прочитает твой \Registry\User\S-1-5-18\Software\..., тогда уже в ядре возиться имеет смысл. Мне кажется, что проблема именно в "S-1-5-18".
Butcher, Расскажите мне, пожалуйста, поподробнее о функции GetSubKeyCount, например, в какой lib`е она находится