Re[8]: Drivers и Environment
От: den2k  
Дата: 18.04.05 09:35
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

VAB>Здравствуйте, den2k, Вы писали:


D>>Здравствуйте, Valery A. Boronin, Вы писали:


VAB>>>Здравствуйте, den2k, Вы писали:


D>>>>Задача следующая,считать ключи из реестра и открыть папки.В общем случае нужно найти папку Documents and Settings.Насчет пользователей,нужно найти и просмотреть папки всех пользователей которые находяться в Documents and Settings.

D>>>>Посмотрел в реестре нашел ключ
D>>>>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
D>>>>ProfilesDirectory %SystemDrive%\Documents and Settings
D>>>>Но опть таки %SystemDrive% не открывается
VAB>>>Если проблема только в %SystemDrive% то посмотрите в сторону RtlQueryRegistryValues, насколько помню, если не указано обратное (RTL_QUERY_REGISTRY_NOEXPAND), то подобные вещи разрешаются этой ф-ей.

D>>Спасибо,возможно это то что нужно,вот только что то я не могу считать значение ключа функция возвращет STATUS_INVALID_PARAMETER либо STATUS_OBJECT_NAME_NOT_FOUND.

VAB>STATUS_INVALID_PARAMETER — возможно Вы не использовали \Registry вместо HKLM? Короче код который работает ниже.

VAB>STATUS_OBJECT_NAME_NOT_FOUND — возможно Вы слишком рано (куст реестра еще не доступен) пытаетесь?

VAB>Попробуйте сделать вызов не на стадии загрузки, а скажем по IOCTL из приложения — чтобы быть уверенным что проблема не в этом.

D>>Не могли бы вы кинуть пример работы с этой функцией?

VAB>Ок, исключительно по причине выходных есть некоторое время, под рукой нашлось это:

VAB>кусок DriverEntry из проекта, где RtlQueryRegistryValues ф-я используется для следующей цели:

VAB>получить пару строковых параметров из HKLM\...\Services\<YourDriverName>\Parameters — конкретно в данном случае это имена клиентских драйвера и устройства (проект из серии Re[3]: Кто &mdash; нибудь писал tightly coupled drivers ?
Автор: Valerio
Дата: 22.10.03
), т.е. структура реестра подразумевается, что должна быть такой:

VAB>

\Registry\Machine\System\CurrentControlSet\Services\<YourDriverName>
VAB> ...
VAB> Parameters
VAB> ClientDriverName = REG_SZ drvname
VAB> ClientDeviceName = REG_SZ devname


VAB>а вот собственно код для извлечения параметров, я его немного прокомментировал


Вроде делаю все правильно но все равно получаю STATUS_OBJECT_NAME_NOT_FOUND.
Драйвер загружается после загрузки системы


.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\Explorer\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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.