Volatile environment что это
Все о реестре Regedit / All about registry
Домен в реестре Windows / Where find domain in the Windows registry?
Домен в котором находится компьютер можно посмотреть через реестр.
Для рабочих станций которые находятся в большой корпоративной доменной сети доменом будет являться доменное имя
Я приведу два примера где можно найти данные параметры.
Статья оказалась в ветке HCKU потому-что это первое место где я нашел данный параметр.
В ветке текущего пользователя
[HKEY_CURRENT_USER\Volatile Environment]
«USERDOMAIN»
Но это нужно заходить под текущим пользователем и смотреть скажете ВЫ.
Есть возможность посмотреть данный параметр в ветке HKLM
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
«Domain»
Если у вас компьютер в рабочей группе, то данный параметр скорее всего будет пустой.
«Hostname»
Это значение является именем вашего компьютера.
Domain where the computer is located can be viewed via the registry.
For normal computers that are home domain is the computer name.
For workstations which are in a large corporate domain network domain will be the domain name
I will give two examples where you can find these settings.
The article was in the thread HCKU because this is the first place where I found this option.
In the branch of the current user
[HKEY_CURRENT_USER\Volatile Environment]
«USERDOMAIN»
But it need to go under the current user and to watch YOU say.
It is possible to view this parameter in the HKLM branch
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
«Domain»
If you have a computer in the workgroup, this option is empty.
Все о реестре Regedit / All about registry
Домен в реестре Windows / Where find domain in the Windows registry?
Домен в котором находится компьютер можно посмотреть через реестр.
Для рабочих станций которые находятся в большой корпоративной доменной сети доменом будет являться доменное имя
Я приведу два примера где можно найти данные параметры.
Статья оказалась в ветке HCKU потому-что это первое место где я нашел данный параметр.
В ветке текущего пользователя
[HKEY_CURRENT_USER\Volatile Environment]
«USERDOMAIN»
Но это нужно заходить под текущим пользователем и смотреть скажете ВЫ.
Есть возможность посмотреть данный параметр в ветке HKLM
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
«Domain»
Если у вас компьютер в рабочей группе, то данный параметр скорее всего будет пустой.
«Hostname»
Это значение является именем вашего компьютера.
Domain where the computer is located can be viewed via the registry.
For normal computers that are home domain is the computer name.
For workstations which are in a large corporate domain network domain will be the domain name
I will give two examples where you can find these settings.
The article was in the thread HCKU because this is the first place where I found this option.
In the branch of the current user
[HKEY_CURRENT_USER\Volatile Environment]
«USERDOMAIN»
But it need to go under the current user and to watch YOU say.
It is possible to view this parameter in the HKLM branch
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
«Domain»
If you have a computer in the workgroup, this option is empty.
Скользкая дорожка для поклонников volatile
Прошло уже практически 30 лет с тех пор, как в стандарте языка C появился модификатор volatile, но в наши дни это ключевое слово вызывает лишь больше вопросов и непонимания даже среди программистов, общающихся с железом на “ты”. Сейчас уже никого не удивишь многоядерным мобильным телефоном или компьютером, умещающимся в одном чипе. Прогресс не стоит на месте, компиляторы умнеют, задачи программистов усложняются, вынуждая помнить о барьерах компиляции и барьерах памяти работая на многопроцессорных системах, только volatile по-прежнему остается темным уголком стандарта, в котором лишь сказано, что доступ к такой изменчивой переменной “implementation-defined” (Стандарт C, 6.7.3/7), т.е. как решат ребята, разрабатывающие компилятор, так и будет.
Disclaimer
В данной статье я буду говорить об использовании volatile в языке С в контексте определения переменных, не касаясь ассемблерных вставок, помеченных как volatile. Так же я буду приводить примеры кода, генерируемого компилятором gcc для архитектуры x86-64, но все сказанное в полной мере относится вообще к любым современным компиляторам и архитектурам. А если ваш компилятор генерирует другой код, который работает, то это вовсе не значит, что со следующей версией поведение вашей программы, использующей volatile, не поменяется. Да и код, скорее всего, будет непереносим на другие платформы.
Зачем нужен volatile?
Стандарт языка определяет программу на C в терминах абстрактной машины, побочные эффекты которой должны быть одинаковыми и не зависить от компилятора и архитектуры, на которой запускается программа. Проще говоря программа, скомпилированная двуми разными компиляторами для двух разных процессорных архитектур, должна вести себя одинаково. Проблема в том, что между абстрактной машиной и реальным железом все-таки есть существенная разница. Например, реализация абстрактной машины C, оптимизируя код, может решить, что зануление памяти на стеке в конце функции ненужная операция, не создающая побочных эффектов, которую можно просто выкинуть:
Абстрактная машина ничего не знает о том, что память может быть прочитана злоумышленником, а операция зануления необходима из соображений безопасности.
Ключевое слово volatile и является одним из звеньев, связывающих абстрактную машину и реальную. В USENET много постов (1, 2, 3) 20-летней давности, проливающих свет на темную историю появления этого модификатора. Приведу хороший перевод одного из писем, взятый здесь:
На уровне железа многие процессоры просто резервируют блок адресов памяти для портов ввода-вывода. Большинство процессоров имеют отдельное пространство адресов ввода-вывода, со специальными инструкциями для доступа к ним, но это не универсально (на PDP-11 такого не было, например) и даже сейчас, производители железа могут предпочесть использовать для этого адресное пространство памяти, по разным причинам. Я сомневаюсь, что кто-то так делает на архитектуре 8086 — различные адресные ограничения делают это очень сложным. Я видел это на 8080, это очень частое решение на старой TI 9900. И это был единственный способ организовать ввод-вывод на наборе инструкций PDP-11, там просто не было отдельного адресного пространства ввода-вывода (Я думаю, то же самое верно и для VAX. И не забывайте, что большинство работы на С раньше проходило именно на этих двух процессорах).
Теперь рассмотрим один из первых последовательных портов, что я использовал: Intel 8051. Нормальным способом его инициализации было записать 0 три раза в порт управления. Если у вас MMIO, то код на С мог бы выглядеть примерно так:
Что прекрасно работало на всех компиляторах С. Но вы можете себе представить, что могла бы с этим сделать сама простая оптимизация. По этой причине и нужно было ключевое слово volatile, чтобы сказать компилятору не оптимизировать.
Таким образом, volatile обязывает компилятор каждый раз обращаться к памяти, избегая возможности кеширования значения в регистрах. Для разработчиков UNIX в 80-х этот модификатор был единственным способом борьбы с компилятором, который норовил соптимизировать и выкинуть действительно нужный код.
Распространенные заблуждения при использовании volatile
1. Обращение к volatile переменной атомарны
Рассмотрим такой код:
что создает компилятор:
2. volatile помогает создать lockless код
Это наиболее распространненное и опасное заблуждение, которое кочует из исходника в исходник. Рассмотрим код:
Программист уверен, что такое простое решение, основанное на volatile флаге, позволит ему избежать «ненужного» и «долгого» lock’а (под lock’ом я подразумеваю вызов mutex, если речь идет о userspace приложении, или запрет прерывания, если речь идет о низкоуровневом коде). А вот что создает компилятор:
Ожидания программиста не оправдались, вместо мифической экономии на lock’ах получилась редкая проблема, воспроизведение которой зависит от:
Как бороться? Использовать барьер компилятора. Это вот такая вот ассемблерная вставка, которая поддерживается большинством современных компиляторов (а если в вашем компиляторе такой инструкции нет, то значит есть какая-то другая):
которая является барьером, говорящая компилятору «сбрось все регистры в RAM до барьера и перечитай после».
Никакого volatile, используемого для определения переменной, больше не используется. Код стал очевиднее, так как все акценты расставлены, а программист, читающий код, будет предупрежден о возможных ловушках.
Кстати говоря, барьером компилятора являются вызовы функций, if/for/while конструкции, return, etc. Для детального погружения в тему смотреть Стандарт C, Annex C Sequence points, 438 p.
3. volatile нужно использовать всегда, если переменная может измениться из нескольких контекстов выполнения
Часто можно встретить код, в котором все переменные, изменяемые в контексте прерывания или другом потоке, объявлены как volatile. Даже встречаются объявления целых структур:
Наверное, программист надеется, что при обращении к членам данной структуры, компилятор сделает всю работу, подумав об атомарности, «правильном» порядке доступа к переменным и необходимых lock’ах. Ничего подобного не будет. На выходе будет неэффективный код, который ничего «правильного» делать не будет, так как в стандарте C ничего не сказано о том, что вообще должен делать компилятор при доступе к volatile переменной. Если код работает так, как ожидается, то это случайность. Более того, компиляторы тоже содержат баги, которые проявляются при обращении к volatile переменным, а как результат — создается неверный ассемблерный код.
Как правильно использовать volatile?
1. в контексте «asm volatile»
Эта конструкция абсолютно безопасна, компилятор не будет пытаться оптимизировать ассемблерный код и вставит его, как есть.
2. приведение к volatile указателю там, где нужно
При обращении к физической памяти устройства необходимо быть уверенным, что каждая запись/чтение действительно произойдет в том порядке и именно там, где рассчитывает программист.
Здесь volatile именно в том месте, где необходимо по коду, комментарий добавляет ясности, никаких разночтений быть не может.
В остальных случаях вы получаете лишь баги с редким и сложным воспроизведением.
Эпилог
Я не зря начал статью со вступления, что прогресс не стоит на месте. Сегодня ваш код с volatile работает, а завтра вы ставите новую версию компилятора, запускаете агрессивную оптимизацию или пытаетесь портировать код на многопроцессорную новомодную ARM систему, а в итоге получаете массу проблем из-за неверного использование этого модификатора или недопонимания всех тонкостей современной архитектуры.
Решена Откуда берется значение системной переменной USERPROFILE
wolf05632
Пользователь
Приветствую! Подскажите, Откуда берется значение системной переменной USERPROFILE и как его изменить?
ЗЫ: в реестре нашел два раздела:
HKEY_CURRENT_USER\Volatile Environment
HKEY_USERS\S-1-5-21-932276121-466748994-1468098918-1000\Volatile Environment
изменил значения, но после перезагрузки значения стали по умолчанию.
ЗЗЫ: утилиту setenv не предлагать, т.к. она не поддерживает пробелы в строке значения переменной.
Спасибо!
glax24
Кирилл
wolf05632, %USERPROFILE% только отображает, а не устанавливает путь профилю под которым вы в данный момент находитесь..
Поэтому у вас ничего и не получается.
Вам нужно создать чистый профиль на другом локальном диске или перенести другой вместе с данными?
Techno
Кирилл
wolf05632
Пользователь
Привет Коза Ноздри! От статьи не отказываюсь, но только, если получится сделать то, что задумал, иначе смысла в статье не вижу!
Просто мне надо, чтобы команда set выдавала USERPROFILE=H:\Users\бла бла
Добавлено через 12 минут 36 секунд
Кирилл
wolf05632, утилита не переназначит переменную сама.
Для этого необходимо кое что иное.
1. Зайдите под админской учетной записью.
Переместите старый профиль куда нибудь вместе с данными,что бы если что потом восстановить.
2. Откройте редактор системного реестра
3. Перейдите в раздел системного реестра HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CurrentVersion\ProfileList.
4.
Найдите значение ProfilesDirectory и укажите для него адрес новой папки – скажем, D:\Users.
6. Зайдите с учетной записью Администратора.
7. Создайте новую учетную запись пользователя
8. Выйдите из системы и зайдите с новой, только что созданной, учетной записью. Теперь папка профиля будет создана там, где мы указали ранее для значения ProfilesDirectory.
9)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList,выберите нужный sid,задайте нужное значение
ProfileImagePath,например D:\Users\SafeZone
10)рестарт,проверяем-если все хорошо то предварительно сохраненные данные учетки удаляем.
Для переноса учетки вместе с данными процедура немного отличается.
Drongo
wolf05632
Пользователь
Koza Nozdri Спасибо! Попробую на досуге. Если появятся вопросы, отпишусь! Вспомнили меня?
Добавлено через 5 минут 33 секунды
Пока то, что получилось сделать (Коза Ноздри, это будущий материал статьи, если для Вас это еще актуально):
Образ 0
Голая установленная система. Переключение раскладки ctrl+shift.
Образ 0.2
Активировал флажки для выбора файлов и папок: Упорядочить->Параметры папок и поиска->Вид->Использовать флажки для выбора элементов.
Добавил в контекстное меню файлов и папок строки:
открыть в блокноте
[HKEY_CLASSES_ROOT\*\shell\Открыть в Блокноте]
@=»»
[HKEY_CLASSES_ROOT\*\shell\Открыть в Блокноте\command]
@=»notepad.exe %1″
очистка диска
[HKEY_CLASSES_ROOT\Drive\shell\Очистка диска]
«Icon»=»cleanmgr.exe»
[HKEY_CLASSES_ROOT\Drive\shell\Очистка диска\command]
@=»cleanmgr.exe /d %1″
удалить содержимое папки
[HKEY_CLASSES_ROOT\Directory\shell\DeleteFolderContent]
«MUIVerb»=»Удалить содержимое папки»
[HKEY_CLASSES_ROOT\Directory\shell\DeleteFolderContent\command]
@=»cmd /c \»cd /d %1 && del /s /f /q *.*\»»
найти.
[HKEY_CLASSES_ROOT\Directory\shell\find]
«LegacyDisable»=-
Активировал WMP х64 через батфайл
@ECHO OFF
%windir%\system32\unregmp2.exe /SwapTo:64
REG ADD «HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\wmplayer.exe» /v Path /t REG_EXPAND_SZ /d «%ProgramFiles%\Windows Media Player» /f
Добавлено через 2 минуты 24 секунды
ЗЫ: спалился с именем и фамилией Почему нет кнопки «редактировать»
Справочник по реестру Windows XP :: Коллектив РуБоард
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\Programs
Значение: (путь к каталогу)
Значение: (путь к каталогу)
Тип: REG EXPAND_ SZ;
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\NetHood
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\Cookies
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\AppData
Каталог «Application Data» в которой хранятся данные приложений.
Значение: (путь к каталогу)
Каталог «Documents and Settings» где хранятся профили. Изменять данный путь, заданный по умолчанию, предпочтительно через Unattended установку.
Тип: REG EXPAND_ SZ;
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\Local Settings
Каталог «Local Settings».
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\Local AppData
Каталог «Local Settings\Application Data».
Значение: (путь к каталогу)
Каталог профиля пользователя вошедшего в систему.
Значение: (путь к каталогу)
Значение: (по умолчанию = С:)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\History
Каталог «History» текущего пользователя.
Значение: (путь к каталогу)
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\History
Каталог «History» пользователя, создаваемого по умолчанию.
Значение: (путь к каталогу)
Каталог «History» пользователя, создаваемого по умолчанию.
Значение: (путь к каталогу)
Каталог Application Data пользователя вошедшего в систему.
Значение: (путь к каталогу)
Каталог откуда производилась установка системы.
Значение: (любое допустимое, без папки I386)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\\Common Startup
Каталог «Startup» (Автозагрузка) для всех пользователей.
Значение: (путь к каталогу)
Путь по которому программа установки и программа защиты системных файлов (SFC) будут искать папку i386. Представьте ситуацию, что Вы устанавливали систему с CD, но самого диска у Вас нет, сейчас в наличии и дистрибутив лежит на жестком диске. При любой замене системного файла будет срабатывать SFC и просить вставить CD с системой. Исправьте путь к дистрибутиву, на жестком диске и SFC будет работать без запроса на вставку CD.
Значение: (путь к папке I386 не указывая саму папку)
Тип: REG EXPAND_ SZ;
Значение: (путь к каталогу)
Значение: (путь к каталогу)
Каталог «ProgramFilesDir» для установки программ по умолчанию.
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\Recent
Каталог «Recent» (недавние документы).
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\SendTo
Каталог «SendTo» (отправить).
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\Cache
Каталог «Temporary Internet Files» в котором кэшируются просмотренные страницы.
Значение: (путь к каталогу)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\\CD Burning
Каталог «CD Burning» (временные файлы для прожига на CD).