Здравствуйте, 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 приложения\сервиса
Здравствуйте, 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)
VAB>>>нужно спросить у user mode приложения\сервиса А>>А если драйвер работает один ?
тяжело ему тогда придется
кстати если сервис будет сам по себе, то получать от него %USERPROFILE% не очень полезно ибо и так известно из под какой учетной записи он работает. Соотв. либо сервис будет спрашивать у кого-то еще из множества возможно залогиненных пользователей — с разными %USERPROFILE% соотв, либо пользовать API для терминальных штучек... неправильно это все как-то пока кажется.
напишите лучше какую задачу решаете. просто обычно в драйвере есть возможность узнать кто там делает (от чьего лица точнее) запрос и без всяких %USERPROFILE% — достаточно поискать по форуму Re: Можно ли в драйвере получить имя юзера?
и соотв. для которого из них драйверу нужна информация.
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.
Здравствуйте, Valery A. Boronin, Вы писали:
VAB>>>>нужно спросить у user mode приложения\сервиса А>>>А если драйвер работает один ? VAB>тяжело ему тогда придется
VAB>кстати если сервис будет сам по себе, то получать от него %USERPROFILE% не очень полезно ибо и так известно из под какой учетной записи он работает. Соотв. либо сервис будет спрашивать у кого-то еще из множества возможно залогиненных пользователей — с разными %USERPROFILE% соотв, либо пользовать API для терминальных штучек... неправильно это все как-то пока кажется.
VAB>напишите лучше какую задачу решаете. просто обычно в драйвере есть возможность узнать кто там делает (от чьего лица точнее) запрос и без всяких %USERPROFILE% — достаточно поискать по форуму Re: Можно ли в драйвере получить имя юзера?
— это если надо SID получить.
VAB>Если пользователь уже идентифицирован, а надо узнать где профиль, то все равно пока не проясните условие задачи — что-то сказать сложно, кроме как отметить связь 1 драйвер — много пользователей
и соотв. для которого из них драйверу нужна информация.
Задача следующая,считать ключи из реестра и открыть папки.В общем случае нужно найти папку Documents and Settings.Насчет пользователей,нужно найти и просмотреть папки всех пользователей которые находяться в Documents and Settings.
Посмотрел в реестре нашел ключ
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
ProfilesDirectory %SystemDrive%\Documents and Settings
Но опть таки %SystemDrive% не открывается
Здравствуйте, 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.
Здравствуйте, 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.
Не могли бы вы кинуть пример работы с этой функцией?
Здравствуйте, 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]: Кто — нибудь писал tightly coupled drivers ?
а вот собственно код для извлечения параметров, я его немного прокомментировал
///////////////////////////////////////////////////////////////////////////
//
// 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(¶metersPath, 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(¶mTable[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,
¶mTable[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.
Здравствуйте, 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]: Кто — нибудь писал tightly coupled drivers ?
D>Вроде делаю все правильно но все равно получаю STATUS_OBJECT_NAME_NOT_FOUND. D>Драйвер загружается после загрузки системы
Приведите значение параметра Start для Вашего драйвера.
Если это 0, то скорее всего ветка реестра просто не смонтирована — слишком рано к ней обращаетесь
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, den2k, Вы писали:
D>>Вроде делаю все правильно но все равно получаю STATUS_OBJECT_NAME_NOT_FOUND. D>>Драйвер загружается после загрузки системы
TC>Приведите значение параметра Start для Вашего драйвера. TC>Если это 0, то скорее всего ветка реестра просто не смонтирована — слишком рано к ней обращаетесь
Драйвер загружается не автоматически,я его загружаю,выгружаю через KmdManager.exe
Здравствуйте, 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.