Archive

Posts Tagged ‘Win32’

Зачем нужен параметр lpClass в функции RegCreateKeyEx?

December 4th, 2008

Любой разработчик, кто хоть раз создавал ключ в реестре с помощью функции 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…

,

Почему GetModuleFileName возвращает “system32” для 32-х битных библиотек под Wow64?

June 21st, 2008
Comments Off

Вопрос:

32-х битный процесс запущен на 64-х битной системе. Почему для некоторых библиотек GetModuleFileName возвращает путь вида “%SystemRoot%\syswow64”, а для других – “%SystemRoot%\system32”, не смотря на то, что и первые, и вторые находятся в “%SystemRoot%\syswow64”?

Ответ:

Потому что загрузчик понятия не имеет о Wow64 и перенаправлении файловой системы в частности. Загрузчик просто сохраняет полное имя модуля во время загрузки и возвращает его копию в GetModuleFileName. Соответственно если библиотека была загружена как “%SystemRoot%\system32\foobar.dll”, то и GetModuleFileName вернёт эту строку.

Это же верно и для других Win32 функций.

, ,

Недокументированные функции; Загрузка 32-х битных DLL в 64-х битный процесс.

February 28th, 2008

Вопрос:

Скажите, а невозможность загрузки в 64bit-процесс 32bit DLL – фатальна, или же возможны какие-то хаки, недокументированные обходные пути?

Отвечаю здесь, так как ответ получился слушком длинным.

Во-первых, про любые недокументированные возможности меня спрашивать бесполезно. Даже если такая возможность существует, я всё равно о ней не расскажу. Этому есть несколько причин, включая очевидные вещи вроде NDA, законе об авторском праве и т.д. Еще одна причина, почему я не горю желанием это делать, – это то, что раскрывая детали реализации того или иного компонента, я тем самым лишаю этот компонент возможности развиваться и улучшатся в следующих версиях.

Read more…

, , ,

Помните, как я ругался на функцию GetRawInputDeviceList?

February 15th, 2008
Comments Off

Оказалось, что это была ошибка в документации. Её поправили и посмотрите, что получилось.

Read more…

, ,

Пикник на обочине или не ходите, дети, в DllMain гулять, а то ноги оторвёт.

January 30th, 2008

Точка входа в DLL, так же как и точка входа в программу, – это очень специальное место. Зона. В Зоне действуют свои правила касательно того, что можно делать, а что делать нельзя. В Зоне можно инициализировать локальные данные DLL, можно создавать критические секции. В Зоне нельзя динамически загружать другие Модули или создавать потоки. Любой Сталкер знает и следует правилам Зоны. Все остальные рано или поздно нарушают правила и расплачиваются за это.

Read more…

, ,

Эта страшная функция GetRawInputDeviceList.

December 5th, 2007

Функцию GetRawInputDeviceList можно смело приводить в качестве антипримера правильно спроектированного API. Эта функция используется для получения списка описателей устройств ввода (raw input devices). Ничего сложного. Прототип функции тоже выглядит довольно невинно – всего три параметра, и, как кажется по началу, назначение каждого довольно очевидно.

UINT GetRawInputDeviceList(
    __out_opt PRAWINPUTDEVICELIST pRawInputDeviceList,
    __inout PUINT puiNumDevices,
    __in UINT cbSize
    );

Read more…

, ,

В чём разница между HKEY и HANDLE?

December 25th, 2006
Comments Off

В комментариях к посту про обертку для HANDLE зашла речь о разнице между HKEY и HANDLE. С одной стороны, они имеют много общего:

  • Ключ реестра это такой же объект ядра, как и файл. К примеру, CreateFile и RegCreateKeyEx используют одинаковые параметры для указания требуемого уровня доступа и прав доступа к ключу/файлу;
  • HKEY, также как и HANDLE, можно скопировать с помощью функции DuplicateHandle.

Read more…

, , ,