Любой разработчик, кто хоть раз создавал ключ в реестре с помощью функции RegCreateKeyEx задавался вопросом: «а зачем нужен параметр lpClass и что он означает?»
lpClass [in, optional]
The user-defined class type of this key. This parameter may be ignored. This parameter can be NULL.
Read more…
Программирование, Win32
Вопрос:
32-х битный процесс запущен на 64-х битной системе. Почему для некоторых библиотек GetModuleFileName возвращает путь вида “%SystemRoot%\syswow64”, а для других – “%SystemRoot%\system32”, не смотря на то, что и первые, и вторые находятся в “%SystemRoot%\syswow64”?
Ответ:
Потому что загрузчик понятия не имеет о Wow64 и перенаправлении файловой системы в частности. Загрузчик просто сохраняет полное имя модуля во время загрузки и возвращает его копию в GetModuleFileName. Соответственно если библиотека была загружена как “%SystemRoot%\system32\foobar.dll”, то и GetModuleFileName вернёт эту строку.
Это же верно и для других Win32 функций.
Программирование, Win32, Wow64
Вопрос:
Скажите, а невозможность загрузки в 64bit-процесс 32bit DLL – фатальна, или же возможны какие-то хаки, недокументированные обходные пути?
Отвечаю здесь, так как ответ получился слушком длинным.
Во-первых, про любые недокументированные возможности меня спрашивать бесполезно. Даже если такая возможность существует, я всё равно о ней не расскажу. Этому есть несколько причин, включая очевидные вещи вроде NDA, законе об авторском праве и т.д. Еще одна причина, почему я не горю желанием это делать, – это то, что раскрывая детали реализации того или иного компонента, я тем самым лишаю этот компонент возможности развиваться и улучшатся в следующих версиях.
Read more…
Недокументированные функции, Win32, Windows, Wow64
Оказалось, что это была ошибка в документации. Её поправили и посмотрите, что получилось.
Read more…
Дизайн, Программирование, Win32
Точка входа в DLL, так же как и точка входа в программу, – это очень специальное место. Зона. В Зоне действуют свои правила касательно того, что можно делать, а что делать нельзя. В Зоне можно инициализировать локальные данные DLL, можно создавать критические секции. В Зоне нельзя динамически загружать другие Модули или создавать потоки. Любой Сталкер знает и следует правилам Зоны. Все остальные рано или поздно нарушают правила и расплачиваются за это.
Read more…
Программирование, Юмор, Win32
Функцию GetRawInputDeviceList можно смело приводить в качестве антипримера правильно спроектированного API. Эта функция используется для получения списка описателей устройств ввода (raw input devices). Ничего сложного. Прототип функции тоже выглядит довольно невинно – всего три параметра, и, как кажется по началу, назначение каждого довольно очевидно.
UINT GetRawInputDeviceList(
__out_opt PRAWINPUTDEVICELIST pRawInputDeviceList,
__inout PUINT puiNumDevices,
__in UINT cbSize
);
Read more…
Дизайн, Программирование, Win32
В комментариях к посту про обертку для HANDLE зашла речь о разнице между HKEY и HANDLE. С одной стороны, они имеют много общего:
- Ключ реестра это такой же объект ядра, как и файл. К примеру, CreateFile и RegCreateKeyEx используют одинаковые параметры для указания требуемого уровня доступа и прав доступа к ключу/файлу;
- HKEY, также как и HANDLE, можно скопировать с помощью функции DuplicateHandle.
Read more…
Программирование, Реестр, Win32, Windows
Recent Comments