Drivers и Environment
От: den2k  
Дата: 16.04.05 12:07
Оценка:
Здравствуйте

Чем в драйвере заменить функцию ExpandEnvironmentStrings ?

То есть нужно например в драйвере получить путь к %USERPROFILE%
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Drivers и Environment
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 16.04.05 14:05
Оценка:
Здравствуйте, den2k, Вы писали:
D>Чем в драйвере заменить функцию ExpandEnvironmentStrings ?
D>То есть нужно например в драйвере получить путь к %USERPROFILE%
нужно спросить у user mode приложения\сервиса
Written with help of RSDN@Home 1.1.4 beta 4 rev. 302
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Drivers и Environment
От: Аноним  
Дата: 16.04.05 14:59
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

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

D>>Чем в драйвере заменить функцию ExpandEnvironmentStrings ?
D>>То есть нужно например в драйвере получить путь к %USERPROFILE%
VAB>нужно спросить у user mode приложения\сервиса

А если драйвер работает один ?
Re: Drivers и Environment
От: Alex Alexandrov США  
Дата: 16.04.05 16:45
Оценка: 1 (1) +1
Здравствуйте, den2k, Вы писали:

D>Здравствуйте


D>Чем в драйвере заменить функцию ExpandEnvironmentStrings ?


D>То есть нужно например в драйвере получить путь к %USERPROFILE%


Есть ощущение, что попытка получить в драйвере путь %USERPROFILE% — профанация чистой воды. Представим себе, что залогинено несколько пользователей — путь к профайлу какого из них вы хотите получить? Очевидно, здесь нет соотношения один к одному.
[ Posted via RSDN@Home 1.1.4 beta 4 (303) listening to silent ]
It's kind of fun to do the impossible (Walt Disney)
Re[3]: Drivers и Environment
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 16.04.05 17:29
Оценка:
VAB>>>нужно спросить у user mode приложения\сервиса
А>>А если драйвер работает один ?
тяжело ему тогда придется

кстати если сервис будет сам по себе, то получать от него %USERPROFILE% не очень полезно ибо и так известно из под какой учетной записи он работает. Соотв. либо сервис будет спрашивать у кого-то еще из множества возможно залогиненных пользователей — с разными %USERPROFILE% соотв, либо пользовать API для терминальных штучек... неправильно это все как-то пока кажется.

напишите лучше какую задачу решаете. просто обычно в драйвере есть возможность узнать кто там делает (от чьего лица точнее) запрос и без всяких %USERPROFILE% — достаточно поискать по форуму Re: Можно ли в драйвере получить имя юзера?
Автор: _cb_
Дата: 20.11.03
— это если надо SID получить.

Если пользователь уже идентифицирован, а надо узнать где профиль, то все равно пока не проясните условие задачи — что-то сказать сложно, кроме как отметить связь 1 драйвер &mdash; много пользователей
Автор: Alex Alexandrov
Дата: 16.04.05
и соотв. для которого из них драйверу нужна информация.
Written with help of RSDN@Home 1.1.4 beta 4 rev. 302
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: Drivers и Environment
От: den2k  
Дата: 16.04.05 18:56
Оценка:
Здравствуйте, Valery A. Boronin, Вы писали:

VAB>>>>нужно спросить у user mode приложения\сервиса

А>>>А если драйвер работает один ?
VAB>тяжело ему тогда придется

VAB>кстати если сервис будет сам по себе, то получать от него %USERPROFILE% не очень полезно ибо и так известно из под какой учетной записи он работает. Соотв. либо сервис будет спрашивать у кого-то еще из множества возможно залогиненных пользователей — с разными %USERPROFILE% соотв, либо пользовать API для терминальных штучек... неправильно это все как-то пока кажется.


VAB>напишите лучше какую задачу решаете. просто обычно в драйвере есть возможность узнать кто там делает (от чьего лица точнее) запрос и без всяких %USERPROFILE% — достаточно поискать по форуму Re: Можно ли в драйвере получить имя юзера?
Автор: _cb_
Дата: 20.11.03
— это если надо SID получить.


VAB>Если пользователь уже идентифицирован, а надо узнать где профиль, то все равно пока не проясните условие задачи — что-то сказать сложно, кроме как отметить связь 1 драйвер &mdash; много пользователей
Автор: Alex Alexandrov
Дата: 16.04.05
и соотв. для которого из них драйверу нужна информация.


Задача следующая,считать ключи из реестра и открыть папки.В общем случае нужно найти папку Documents and Settings.Насчет пользователей,нужно найти и просмотреть папки всех пользователей которые находяться в Documents and Settings.
Посмотрел в реестре нашел ключ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
ProfilesDirectory %SystemDrive%\Documents and Settings
Но опть таки %SystemDrive% не открывается
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: Drivers и Environment
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 16.04.05 20:44
Оценка:
Здравствуйте, 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% не открывается
Если проблема только в %SystemDrive% то посмотрите в сторону RtlQueryRegistryValues, насколько помню, если не указано обратное (RTL_QUERY_REGISTRY_NOEXPAND), то подобные вещи разрешаются этой ф-ей.

Если через нее не получится получить что хочется — у меня есть другие идеи, но они более трудоемкие. Проверьте сначала RtlQueryRegistryValues?
Written with help of RSDN@Home 1.1.4 beta 4 rev. 302
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[6]: Drivers и Environment
От: den2k  
Дата: 17.04.05 09:02
Оценка:
Здравствуйте, 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), то подобные вещи разрешаются этой ф-ей.

Спасибо,возможно это то что нужно,вот только что то я не могу считать значение ключа функция возвращет STATUS_INVALID_PARAMETER либо STATUS_OBJECT_NAME_NOT_FOUND.
Не могли бы вы кинуть пример работы с этой функцией?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[7]: Drivers и Environment
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 17.04.05 14:15
Оценка:
Здравствуйте, 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.

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

STATUS_OBJECT_NAME_NOT_FOUND — возможно Вы слишком рано (куст реестра еще не доступен) пытаетесь?
Попробуйте сделать вызов не на стадии загрузки, а скажем по IOCTL из приложения — чтобы быть уверенным что проблема не в этом.

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

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

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

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


а вот собственно код для извлечения параметров, я его немного прокомментировал
///////////////////////////////////////////////////////////////////////////
//
//  Function: DriverEntry()
//
//  Description:
//
//  The routine is invoked at IRQL PASSIVE_LEVEL in the context of a system worker thread.
//  All Filter driver specific data structures etc. are initialized here.
//
//  Expected Interrupt Level (for execution) :
//
//  IRQL_PASSIVE_LEVEL
//
//  Return Value: STATUS_SUCCESS/Error (will cause driver to be unloaded).
//
///////////////////////////////////////////////////////////////////////////
NTSTATUS DriverEntry(
    PDRIVER_OBJECT      DriverObject,       // created by the I/O sub-system
    PUNICODE_STRING     RegistryPath)       // path to the registry key
{
    NTSTATUS                            ntStatus = STATUS_SUCCESS;
    RTL_QUERY_REGISTRY_TABLE            paramTable[3];  
    UNICODE_STRING                      parametersPath;

    UNICODE_STRING                      clientDriverName,clientDeviceName;

    UNICODE_STRING                      defaultDriver;
    UNICODE_STRING                      defaultDevice;
        ...

    try {
        try {

            //VB++, 17/04/05,
            //код по инициализации некоторых UNICODE_STRING и т.п., а также обработка ошибок вырезана
            ...

            //
            //query the registry
            //

            //оставил для примера инициализацию clientDriverName
            clientDriverName.Buffer = ExAllocatePool(NonPagedPool, CLIENT_DRV_NAME_LENGTH);
            if(clientDriverName.Buffer == NULL)
            {
                return STATUS_UNSUCCESSFUL;
            }
            clientDriverName.MaximumLength = CLIENT_DRV_NAME_LENGTH;
            clientDriverName.Length = CLIENT_DRV_NAME_LENGTH;
            RtlZeroMemory(clientDriverName.Buffer, CLIENT_DRV_NAME_LENGTH);

            RtlInitUnicodeString(&defaultDriver, L"DummyDriver");
            RtlInitUnicodeString(&defaultDevice, L"\\Device\\DummyDevice");

            //наше добро в \Parameters - надо добавить 
            RtlInitUnicodeString(&parametersPath, NULL);
            parametersPath.MaximumLength = RegistryPath->MaximumLength + wcslen(L"\\Parameters")*sizeof(WCHAR) + sizeof(WCHAR);
            parametersPath.Length = RegistryPath->MaximumLength + wcslen(L"\\Parameters")*sizeof(WCHAR) + sizeof(WCHAR);
            parametersPath.Buffer = ExAllocatePool(NonPagedPool,parametersPath.MaximumLength);
            RtlZeroMemory(parametersPath.Buffer, parametersPath.MaximumLength);
            wcsncat(parametersPath.Buffer, RegistryPath->Buffer, (RegistryPath->Length)/sizeof(WCHAR));
            wcsncat(parametersPath.Buffer, L"\\Parameters", wcslen(L"\\Parameters"));

            //we need only 2 params, last item must be zero
            RtlZeroMemory(&paramTable[0], sizeof(RTL_QUERY_REGISTRY_TABLE)*3);

            paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
            paramTable[0].Name = L"ClientDriverName";
            paramTable[0].EntryContext = &clientDriverName;
            paramTable[0].DefaultData = &defaultDriver;
            paramTable[0].DefaultType = REG_SZ;
            paramTable[0].DefaultLength = defaultDriver.Length;

            paramTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
            paramTable[1].Name = L"ClientDeviceName";
            paramTable[1].EntryContext = &clientDeviceName;
            paramTable[1].DefaultData = &defaultDevice;
            paramTable[1].DefaultType = REG_SZ;
            paramTable[1].DefaultLength = defaultDevice.Length;

            //на выходе в clientDriverName и clientDeviceName должно быть искомое
            //если в реестре чего-то не было - будет использовано значение по умолчанию
            ntStatus = RtlQueryRegistryValues(
                RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,
                parametersPath.Buffer,
                &paramTable[0],
                NULL,
                NULL);

            //apply global structure with info we've just got
            wcscat(FilterGlobalData.ClientDriverPath.Buffer,L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Services\\");
            wcscat(FilterGlobalData.ClientDriverPath.Buffer, clientDriverName.Buffer);
            //we are able to use it later in the ZwLoadDriver, for ex. That's enough for RSDN question, I think ;-)
            ...
        }
        except (EXCEPTION_EXECUTE_HANDLER)
        {
            //
            // We encountered an exception somewhere.
            //
            ntStatus = GetExceptionCode();
            DbgBreakPoint();
        }
try_exit:   NOTHING;
    }
    finally
    {
        //
        // If we were unsuccessful.
        //
        if (!NT_SUCCESS(ntStatus))
        {
            //
            // cleanup steps
            //
        }
        else 
        {
            //
            //In order to hook FSDs that cannot be hooked via Notification
            //
            ...
        }
    }

    return(ntStatus);
}
Written with help of RSDN@Home 1.1.4 beta 4 rev. 302
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
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
Re[9]: Drivers и Environment
От: TarasCo  
Дата: 18.04.05 09:48
Оценка:
Здравствуйте, den2k, Вы писали:


D>Вроде делаю все правильно но все равно получаю STATUS_OBJECT_NAME_NOT_FOUND.

D>Драйвер загружается после загрузки системы

Приведите значение параметра Start для Вашего драйвера.
Если это 0, то скорее всего ветка реестра просто не смонтирована — слишком рано к ней обращаетесь
Да пребудет с тобою сила
Re[10]: Drivers и Environment
От: den2k  
Дата: 18.04.05 10:26
Оценка:
Здравствуйте, TarasCo, Вы писали:

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



D>>Вроде делаю все правильно но все равно получаю STATUS_OBJECT_NAME_NOT_FOUND.

D>>Драйвер загружается после загрузки системы

TC>Приведите значение параметра Start для Вашего драйвера.

TC>Если это 0, то скорее всего ветка реестра просто не смонтирована — слишком рано к ней обращаетесь

Драйвер загружается не автоматически,я его загружаю,выгружаю через KmdManager.exe
Re[11]: Drivers и Environment
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 20.04.05 17:51
Оценка:
Здравствуйте, den2k, Вы писали:

D>>>Вроде делаю все правильно но все равно получаю STATUS_OBJECT_NAME_NOT_FOUND.

D>>>Драйвер загружается после загрузки системы

TC>>Приведите значение параметра Start для Вашего драйвера.

TC>>Если это 0, то скорее всего ветка реестра просто не смонтирована — слишком рано к ней обращаетесь

D>Драйвер загружается не автоматически,я его загружаю,выгружаю через KmdManager.exe

к сожалению сразу не всегда получается отвечать сейчас, но лучше позже чем никогда, верно?

есть у меня еще небольшая идея: не проще ли посмотреть куда смотрит \SystemRoot и соотв заменить там директорию куда установлена ОС на соотв продолжение после %SystemDrive% — \Documents and Settings?

на выходе Вы получите:
от SystemRoot кусочек типа \Device\HarddiskX\PartitionY\ + то что после %SystemDrive% (т.е. Documents and Settings) = "\Device\HarddiskX\PartitionY\Documents and Settings" и это уже можно использовать в драйвере дальше

но конечно если вдруг HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList использует вдруг какие-то другие переменные окружения — это не покатит. Впрочем не думаю что это без копошения руками в реестре возможно (хотя надо смотреть на разных ОС) и соотв. как временное решение уж точно можно попробовать.

Иначе придется все-таки просить кого-то в user mode разрешить %xxx%.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.